• Will Deacon's avatar
    arm64: kpti: Fix "kpti=off" when KASLR is enabled · c8355785
    Will Deacon authored
    Enabling KASLR forces the use of non-global page-table entries for kernel
    mappings, as this is a decision that we have to make very early on before
    mapping the kernel proper. When used in conjunction with the "kpti=off"
    command-line option, it is possible to use non-global kernel mappings but
    with the kpti trampoline disabled.
    
    Since commit 09e3c22a ("arm64: Use a variable to store non-global
    mappings decision"), arm64_kernel_unmapped_at_el0() reflects only the use of
    non-global mappings and does not take into account whether the kpti
    trampoline is enabled. This breaks context switching of the TPIDRRO_EL0
    register for 64-bit tasks, where the clearing of the register is deferred to
    the ret-to-user code, but it also breaks the ARM SPE PMU driver which
    helpfully recommends passing "kpti=off" on the command line!
    
    Report whether or not KPTI is actually enabled in
    arm64_kernel_unmapped_at_el0() and check the 'arm64_use_ng_mappings' global
    variable directly when determining the protection flags for kernel mappings.
    
    Cc: Mark Brown <broonie@kernel.org>
    Reported-by: default avatarHongbo Yao <yaohongbo@huawei.com>
    Tested-by: default avatarHongbo Yao <yaohongbo@huawei.com>
    Fixes: 09e3c22a ("arm64: Use a variable to store non-global mappings decision")
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    c8355785
mmu.h 2.43 KB