]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
arm64/mm: Reduce PA space to 48 bits when LPA2 is not enabled
authorArd Biesheuvel <ardb@kernel.org>
Thu, 12 Dec 2024 08:18:43 +0000 (09:18 +0100)
committerWill Deacon <will@kernel.org>
Thu, 19 Dec 2024 17:23:52 +0000 (17:23 +0000)
Currently, LPA2 kernel support implies support for up to 52 bits of
physical addressing, and this is reflected in global definitions such as
PHYS_MASK_SHIFT and MAX_PHYSMEM_BITS.

This is potentially problematic, given that LPA2 hardware support is
modeled as a CPU feature which can be overridden, and with LPA2 hardware
support turned off, attempting to map physical regions with address bits
[51:48] set (which may exist on LPA2 capable systems booting with
arm64.nolva) will result in corrupted mappings with a truncated output
address and bogus shareability attributes.

This means that the accepted physical address range in the mapping
routines should be at most 48 bits wide when LPA2 support is configured
but not enabled at runtime.

Fixes: 352b0395b505 ("arm64: Enable 52-bit virtual addressing for 4k and 16k granule configs")
Cc: stable@vger.kernel.org
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20241212081841.2168124-9-ardb+git@google.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/pgtable-hwdef.h
arch/arm64/include/asm/pgtable-prot.h
arch/arm64/include/asm/sparsemem.h

index c78a988cca93a57914c7c1a5a108221f88aefaee..a9136cc551ccbb11cd1d8b7c5a11dee475ca4658 100644 (file)
  */
 #define S1_TABLE_AP            (_AT(pmdval_t, 3) << 61)
 
-/*
- * Highest possible physical address supported.
- */
-#define PHYS_MASK_SHIFT                (CONFIG_ARM64_PA_BITS)
-#define PHYS_MASK              ((UL(1) << PHYS_MASK_SHIFT) - 1)
-
 #define TTBR_CNP_BIT           (UL(1) << 0)
 
 /*
index 9f9cf13bbd95e7644ff923ed117fba9d32377b0c..a95f1f77bb39ad6323f24f469c621bddd096606e 100644 (file)
@@ -81,6 +81,7 @@ extern unsigned long prot_ns_shared;
 #define lpa2_is_enabled()      false
 #define PTE_MAYBE_SHARED       PTE_SHARED
 #define PMD_MAYBE_SHARED       PMD_SECT_S
+#define PHYS_MASK_SHIFT                (CONFIG_ARM64_PA_BITS)
 #else
 static inline bool __pure lpa2_is_enabled(void)
 {
@@ -89,8 +90,14 @@ static inline bool __pure lpa2_is_enabled(void)
 
 #define PTE_MAYBE_SHARED       (lpa2_is_enabled() ? 0 : PTE_SHARED)
 #define PMD_MAYBE_SHARED       (lpa2_is_enabled() ? 0 : PMD_SECT_S)
+#define PHYS_MASK_SHIFT                (lpa2_is_enabled() ? CONFIG_ARM64_PA_BITS : 48)
 #endif
 
+/*
+ * Highest possible physical address supported.
+ */
+#define PHYS_MASK              ((UL(1) << PHYS_MASK_SHIFT) - 1)
+
 /*
  * If we have userspace only BTI we don't want to mark kernel pages
  * guarded even if the system does support BTI.
index 8a8acc220371cb4403266f06baeb4ce42307d5e5..84783efdc9d1f7783925f4b91eed7ea17abc1819 100644 (file)
@@ -5,7 +5,10 @@
 #ifndef __ASM_SPARSEMEM_H
 #define __ASM_SPARSEMEM_H
 
-#define MAX_PHYSMEM_BITS       CONFIG_ARM64_PA_BITS
+#include <asm/pgtable-prot.h>
+
+#define MAX_PHYSMEM_BITS               PHYS_MASK_SHIFT
+#define MAX_POSSIBLE_PHYSMEM_BITS      (52)
 
 /*
  * Section size must be at least 512MB for 64K base