• Ard Biesheuvel's avatar
    arm64: mm: Handle LVA support as a CPU feature · 9cce9c6c
    Ard Biesheuvel authored
    Currently, we detect CPU support for 52-bit virtual addressing (LVA)
    extremely early, before creating the kernel page tables or enabling the
    MMU. We cannot override the feature this early, and so large virtual
    addressing is always enabled on CPUs that implement support for it if
    the software support for it was enabled at build time. It also means we
    rely on non-trivial code in asm to deal with this feature.
    
    Given that both the ID map and the TTBR1 mapping of the kernel image are
    guaranteed to be 48-bit addressable, it is not actually necessary to
    enable support this early, and instead, we can model it as a CPU
    feature. That way, we can rely on code patching to get the correct
    TCR.T1SZ values programmed on secondary boot and resume from suspend.
    
    On the primary boot path, we simply enable the MMU with 48-bit virtual
    addressing initially, and update TCR.T1SZ if LVA is supported from C
    code, right before creating the kernel mapping. Given that TTBR1 still
    points to reserved_pg_dir at this point, updating TCR.T1SZ should be
    safe without the need for explicit TLB maintenance.
    
    Since this gets rid of all accesses to the vabits_actual variable from
    asm code that occurred before TCR.T1SZ had been programmed, we no longer
    have a need for this variable, and we can replace it with a C expression
    that produces the correct value directly, based on the value of TCR.T1SZ.
    Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Link: https://lore.kernel.org/r/20240214122845.2033971-70-ardb+git@google.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    9cce9c6c
mmu.c 38.3 KB