• Mark Rutland's avatar
    arm64: hibernate: avoid potential TLB conflict · 0194e760
    Mark Rutland authored
    In create_safe_exec_page we install a set of global mappings in TTBR0,
    then subsequently invalidate TLBs. While TTBR0 points at the zero page,
    and the TLBs should be free of stale global entries, we may have stale
    ASID-tagged entries (e.g. from the EFI runtime services mappings) for
    the same VAs. Per the ARM ARM these ASID-tagged entries may conflict
    with newly-allocated global entries, and we must follow a
    Break-Before-Make approach to avoid issues resulting from this.
    
    This patch reworks create_safe_exec_page to invalidate TLBs while the
    zero page is still in place, ensuring that there are no potential
    conflicts when the new TTBR0 value is installed. As a single CPU is
    online while this code executes, we do not need to perform broadcast TLB
    maintenance, and can call local_flush_tlb_all(), which also subsumes
    some barriers. The remaining assembly is converted to use write_sysreg()
    and isb().
    
    Other than this, we safely manipulate TTBRs in the hibernate dance. The
    code we install as part of the new TTBR0 mapping (the hibernated
    kernel's swsusp_arch_suspend_exit) installs a zero page into TTBR1,
    invalidates TLBs, then installs its preferred value. Upon being restored
    to the middle of swsusp_arch_suspend, the new image will call
    __cpu_suspend_exit, which will call cpu_uninstall_idmap, installing the
    zero page in TTBR0 and invalidating all TLB entries.
    
    Fixes: 82869ac5 ("arm64: kernel: Add support for hibernate/suspend-to-disk")
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarJames Morse <james.morse@arm.com>
    Tested-by: default avatarJames Morse <james.morse@arm.com>
    Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: <stable@vger.kernel.org> # 4.7+
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    0194e760
hibernate.c 12.9 KB