1be129842SKristina Martsenko /* SPDX-License-Identifier: GPL-2.0 */ 2be129842SKristina Martsenko #ifndef __ASM_ASM_POINTER_AUTH_H 3be129842SKristina Martsenko #define __ASM_ASM_POINTER_AUTH_H 4be129842SKristina Martsenko 5be129842SKristina Martsenko #include <asm/alternative.h> 6be129842SKristina Martsenko #include <asm/asm-offsets.h> 7be129842SKristina Martsenko #include <asm/cpufeature.h> 8be129842SKristina Martsenko #include <asm/sysreg.h> 9be129842SKristina Martsenko 10d053e71aSDaniel Kiss #ifdef CONFIG_ARM64_PTR_AUTH_KERNEL 11be129842SKristina Martsenko 12d0055da5SMark Rutland .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 1333e45234SKristina Martsenko mov \tmp1, #THREAD_KEYS_KERNEL 1433e45234SKristina Martsenko add \tmp1, \tsk, \tmp1 1533e45234SKristina Martsenko ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_KERNEL_KEY_APIA] 1633e45234SKristina Martsenko msr_s SYS_APIAKEYLO_EL1, \tmp2 1733e45234SKristina Martsenko msr_s SYS_APIAKEYHI_EL1, \tmp3 18d0055da5SMark Rutland .endm 19d0055da5SMark Rutland 20d0055da5SMark Rutland .macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 21d0055da5SMark Rutland alternative_if ARM64_HAS_ADDRESS_AUTH 22d0055da5SMark Rutland __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3 23d0055da5SMark Rutland alternative_else_nop_endif 24d0055da5SMark Rutland .endm 25d0055da5SMark Rutland 26d0055da5SMark Rutland .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3 27d0055da5SMark Rutland alternative_if ARM64_HAS_ADDRESS_AUTH 28d0055da5SMark Rutland __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3 2933e45234SKristina Martsenko isb 3033e45234SKristina Martsenko alternative_else_nop_endif 3133e45234SKristina Martsenko .endm 3233e45234SKristina Martsenko 33d053e71aSDaniel Kiss #else /* CONFIG_ARM64_PTR_AUTH_KERNEL */ 34d053e71aSDaniel Kiss 35d053e71aSDaniel Kiss .macro __ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 36d053e71aSDaniel Kiss .endm 37d053e71aSDaniel Kiss 38d053e71aSDaniel Kiss .macro ptrauth_keys_install_kernel_nosync tsk, tmp1, tmp2, tmp3 39d053e71aSDaniel Kiss .endm 40d053e71aSDaniel Kiss 41d053e71aSDaniel Kiss .macro ptrauth_keys_install_kernel tsk, tmp1, tmp2, tmp3 42d053e71aSDaniel Kiss .endm 43d053e71aSDaniel Kiss 44d053e71aSDaniel Kiss #endif /* CONFIG_ARM64_PTR_AUTH_KERNEL */ 45d053e71aSDaniel Kiss 46d053e71aSDaniel Kiss #ifdef CONFIG_ARM64_PTR_AUTH 47d053e71aSDaniel Kiss /* 48d053e71aSDaniel Kiss * thread.keys_user.ap* as offset exceeds the #imm offset range 49d053e71aSDaniel Kiss * so use the base value of ldp as thread.keys_user and offset as 50d053e71aSDaniel Kiss * thread.keys_user.ap*. 51d053e71aSDaniel Kiss */ 52d053e71aSDaniel Kiss .macro __ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3 53d053e71aSDaniel Kiss mov \tmp1, #THREAD_KEYS_USER 54d053e71aSDaniel Kiss add \tmp1, \tsk, \tmp1 55d053e71aSDaniel Kiss ldp \tmp2, \tmp3, [\tmp1, #PTRAUTH_USER_KEY_APIA] 56d053e71aSDaniel Kiss msr_s SYS_APIAKEYLO_EL1, \tmp2 57d053e71aSDaniel Kiss msr_s SYS_APIAKEYHI_EL1, \tmp3 58d053e71aSDaniel Kiss .endm 59d053e71aSDaniel Kiss 6062a679cbSMark Rutland .macro __ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3 6162a679cbSMark Rutland mrs \tmp1, id_aa64isar1_el1 62aa50479bSMark Brown ubfx \tmp1, \tmp1, #ID_AA64ISAR1_EL1_APA_SHIFT, #8 63def8c222SVladimir Murzin mrs_s \tmp2, SYS_ID_AA64ISAR2_EL1 64*b2d71f27SMark Brown ubfx \tmp2, \tmp2, #ID_AA64ISAR2_EL1_APA3_SHIFT, #4 65def8c222SVladimir Murzin orr \tmp1, \tmp1, \tmp2 6662a679cbSMark Rutland cbz \tmp1, .Lno_addr_auth\@ 6762a679cbSMark Rutland mov_q \tmp1, (SCTLR_ELx_ENIA | SCTLR_ELx_ENIB | \ 6862a679cbSMark Rutland SCTLR_ELx_ENDA | SCTLR_ELx_ENDB) 6962a679cbSMark Rutland mrs \tmp2, sctlr_el1 7062a679cbSMark Rutland orr \tmp2, \tmp2, \tmp1 7162a679cbSMark Rutland msr sctlr_el1, \tmp2 7262a679cbSMark Rutland __ptrauth_keys_install_kernel_nosync \tsk, \tmp1, \tmp2, \tmp3 7362a679cbSMark Rutland isb 7462a679cbSMark Rutland .Lno_addr_auth\@: 7562a679cbSMark Rutland .endm 7662a679cbSMark Rutland 7762a679cbSMark Rutland .macro ptrauth_keys_init_cpu tsk, tmp1, tmp2, tmp3 7862a679cbSMark Rutland alternative_if_not ARM64_HAS_ADDRESS_AUTH 7962a679cbSMark Rutland b .Lno_addr_auth\@ 8062a679cbSMark Rutland alternative_else_nop_endif 8162a679cbSMark Rutland __ptrauth_keys_init_cpu \tsk, \tmp1, \tmp2, \tmp3 8262a679cbSMark Rutland .Lno_addr_auth\@: 8362a679cbSMark Rutland .endm 8462a679cbSMark Rutland 85d053e71aSDaniel Kiss #else /* !CONFIG_ARM64_PTR_AUTH */ 86be129842SKristina Martsenko 87be129842SKristina Martsenko .macro ptrauth_keys_install_user tsk, tmp1, tmp2, tmp3 88be129842SKristina Martsenko .endm 89be129842SKristina Martsenko 90be129842SKristina Martsenko #endif /* CONFIG_ARM64_PTR_AUTH */ 91be129842SKristina Martsenko 92be129842SKristina Martsenko #endif /* __ASM_ASM_POINTER_AUTH_H */ 93