]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Feb 2025 09:05:05 +0000 (10:05 +0100)
commit bf74bb73cd87c64bd5afc1fd4b749029997b6170 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/include/asm/pgtable-hwdef.h
arch/arm64/include/asm/pgtable-prot.h
arch/arm64/include/asm/sparsemem.h

index fd330c1db289a60168b35942fa2667bc3171f39a..a970def932aacb2b25b3b4dea93936164391a9af 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 2a11d0c10760b99a9cec358baff8893c0259f6af..3ce7c632fbfbc3ad333e81be8a240e8f6f801ae8 100644 (file)
@@ -78,6 +78,7 @@ extern bool arm64_use_ng_mappings;
 #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)
 {
@@ -86,8 +87,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