From: Juerg Haefliger <juerg.haefli...@hpe.com>

XPFO (eXclusive Page Frame Ownership) doesn't support section mappings
yet, so disable it if XPFO is turned on.

Signed-off-by: Juerg Haefliger <juerg.haefli...@canonical.com>
Tested-by: Tycho Andersen <ty...@docker.com>
---
 arch/arm64/mm/mmu.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index f1eb15e0e864..38026b3ccb46 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -176,6 +176,18 @@ static void alloc_init_cont_pte(pmd_t *pmd, unsigned long 
addr,
        } while (addr = next, addr != end);
 }
 
+static inline bool use_section_mapping(unsigned long addr, unsigned long next,
+                               unsigned long phys)
+{
+       if (IS_ENABLED(CONFIG_XPFO))
+               return false;
+
+       if (((addr | next | phys) & ~SECTION_MASK) != 0)
+               return false;
+
+       return true;
+}
+
 static void init_pmd(pud_t *pud, unsigned long addr, unsigned long end,
                     phys_addr_t phys, pgprot_t prot,
                     phys_addr_t (*pgtable_alloc)(void), int flags)
@@ -190,7 +202,7 @@ static void init_pmd(pud_t *pud, unsigned long addr, 
unsigned long end,
                next = pmd_addr_end(addr, end);
 
                /* try section mapping first */
-               if (((addr | next | phys) & ~SECTION_MASK) == 0 &&
+               if (use_section_mapping(addr, next, phys) &&
                    (flags & NO_BLOCK_MAPPINGS) == 0) {
                        pmd_set_huge(pmd, phys, prot);
 
-- 
2.11.0

Reply via email to