Skip to content

Commit

Permalink
arm64/mm: Reduce PA space to 48 bits when LPA2 is not enabled
Browse files Browse the repository at this point in the history
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: 352b039 ("arm64: Enable 52-bit virtual addressing for 4k and 16k granule configs")
Cc: [email protected]
Reviewed-by: Anshuman Khandual <[email protected]>
Signed-off-by: Ard Biesheuvel <[email protected]>
Acked-by: Marc Zyngier <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Will Deacon <[email protected]>
  • Loading branch information
ardbiesheuvel authored and willdeacon committed Dec 19, 2024
1 parent fac04ef commit bf74bb7
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 7 deletions.
6 changes: 0 additions & 6 deletions arch/arm64/include/asm/pgtable-hwdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -222,12 +222,6 @@
*/
#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)

/*
Expand Down
7 changes: 7 additions & 0 deletions arch/arm64/include/asm/pgtable-prot.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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.
Expand Down
5 changes: 4 additions & 1 deletion arch/arm64/include/asm/sparsemem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit bf74bb7

Please sign in to comment.