1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __ASM_ASM_POINTER_AUTH_H 3 #define __ASM_ASM_POINTER_AUTH_H 4 5 #include <asm/alternative.h> 6 #include <asm/asm-offsets.h> 7 #include <asm/cpufeature.h> 8 #include <asm/sysreg.h> 9 10 #ifdef CONFIG_ARM64_PTR_AUTH_KERNEL 11 12 .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 13 mov \tmp1, #THREAD_KEYS_KERNEL 14 add \tmp1, \tsk, \tmp1 15 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_KERNEL_KEY_APIA] 16 msr_s SYS_APIAKEYLO_EL1, \tmp2 17 msr_s SYS_APIAKEYHI_EL1, \tmp3 18 .endm 19 20 .macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 21 alternative_if ARM64_HAS_ADDRESS_AUTH 22 __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3 23 alternative_else_nop_endif 24 .endm 25 26 .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3 27 alternative_if ARM64_HAS_ADDRESS_AUTH 28 __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3 29 isb 30 alternative_else_nop_endif 31 .endm 32 33 #else /* CONFIG_ARM64_PTR_AUTH_KERNEL */ 34 35 .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 36 .endm 37 38 .macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 39 .endm 40 41 .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3 42 .endm 43 44 #endif /* CONFIG_ARM64_PTR_AUTH_KERNEL */ 45 46 #ifdef CONFIG_ARM64_PTR_AUTH 47 /* 48 * thread.keys_user.ap* as offset exceeds the #imm offset range 49 * so use the base value of ldp as thread.keys_user and offset as 50 * thread.keys_user.ap*. 51 */ 52 .macro __ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3 53 mov \tmp1, #THREAD_KEYS_USER 54 add \tmp1, \tsk, \tmp1 55 ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA] 56 msr_s SYS_APIAKEYLO_EL1, \tmp2 57 msr_s SYS_APIAKEYHI_EL1, \tmp3 58 .endm 59 60 .macro __ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3 61 mrs \tmp1, id_aa64isar1_el1 62 ubfx \tmp1, \tmp1, #ID_AA64ISAR1_APA_SHIFT, #8 63 cbz \tmp1, .Lno_addr_auth\@ 64 mov_q \tmp1, (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \ 65 SCTLR_ELx_ENDA | SCTLR_ELx_ENDB) 66 mrs \tmp2, sctlr_el1 67 orr \tmp2, \tmp2, \tmp1 68 msr sctlr_el1, \tmp2 69 __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3 70 isb 71 .Lno_addr_auth\@: 72 .endm 73 74 .macro ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3 75 alternative_if_not ARM64_HAS_ADDRESS_AUTH 76 b .Lno_addr_auth\@ 77 alternative_else_nop_endif 78 __ptrauth_keys_init_cpu \tsk, \tmp1, \tmp2, \tmp3 79 .Lno_addr_auth\@: 80 .endm 81 82 #else /* !CONFIG_ARM64_PTR_AUTH */ 83 84 .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3 85 .endm 86 87 #endif /* CONFIG_ARM64_PTR_AUTH */ 88 89 #endif /* __ASM_ASM_POINTER_AUTH_H */ 90