arm64: suspend: restore the kernel ptrauth keys
authorAmit Daniel Kachhap <amit.kachhap@arm.com>
Fri, 13 Mar 2020 09:05:01 +0000 (14:35 +0530)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 18 Mar 2020 09:50:21 +0000 (09:50 +0000)
This patch restores the kernel keys from current task during cpu resume
after the mmu is turned on and ptrauth is enabled.

A flag is added in macro ptrauth_keys_install_kernel to check if isb
instruction needs to be executed.

Signed-off-by: Amit Daniel Kachhap <amit.kachhap@arm.com>
Reviewed-by: Vincenzo Frascino <Vincenzo.Frascino@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/asm_pointer_auth.h
arch/arm64/kernel/entry.S
arch/arm64/mm/proc.S

index d3f4aee..ce2a848 100644 (file)
@@ -39,14 +39,16 @@ alternative_if ARM64_HAS_GENERIC_AUTH
 alternative_else_nop_endif
        .endm
 
-       .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3
+       .macro ptrauth_keys_install_kernel tsk, sync, tmp1, tmp2, tmp3
 alternative_if ARM64_HAS_ADDRESS_AUTH
        mov     \tmp1, #THREAD_KEYS_KERNEL
        add     \tmp1, \tsk, \tmp1
        ldp     \tmp2, \tmp3, [\tmp1, #PTRAUTH_KERNEL_KEY_APIA]
        msr_s   SYS_APIAKEYLO_EL1, \tmp2
        msr_s   SYS_APIAKEYHI_EL1, \tmp3
+       .if     \sync == 1
        isb
+       .endif
 alternative_else_nop_endif
        .endm
 
@@ -55,7 +57,7 @@ alternative_else_nop_endif
        .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3
        .endm
 
-       .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3
+       .macro ptrauth_keys_install_kernel tsk, sync, tmp1, tmp2, tmp3
        .endm
 
 #endif /* CONFIG_ARM64_PTR_AUTH */
index 3dad2d0..6273d7b 100644 (file)
@@ -178,7 +178,7 @@ alternative_cb_end
 
        apply_ssbd 1, x22, x23
 
-       ptrauth_keys_install_kernel tsk, x20, x22, x23
+       ptrauth_keys_install_kernel tsk, 1, x20, x22, x23
        .else
        add     x21, sp, #S_FRAME_SIZE
        get_current_task tsk
@@ -900,7 +900,7 @@ ENTRY(cpu_switch_to)
        ldr     lr, [x8]
        mov     sp, x9
        msr     sp_el0, x1
-       ptrauth_keys_install_kernel x1, x8, x9, x10
+       ptrauth_keys_install_kernel x1, 1, x8, x9, x10
        ret
 ENDPROC(cpu_switch_to)
 NOKPROBE(cpu_switch_to)
index 5a11a89..4450dc8 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/asm-offsets.h>
+#include <asm/asm_pointer_auth.h>
 #include <asm/hwcap.h>
 #include <asm/pgtable.h>
 #include <asm/pgtable-hwdef.h>
@@ -137,6 +138,7 @@ alternative_if ARM64_HAS_RAS_EXTN
        msr_s   SYS_DISR_EL1, xzr
 alternative_else_nop_endif
 
+       ptrauth_keys_install_kernel x14, 0, x1, x2, x3
        isb
        ret
 SYM_FUNC_END(cpu_do_resume)