0001
0002
0003
0004
0005
0006
0007
0008 #ifndef __ASM_KVM_PTRAUTH_H
0009 #define __ASM_KVM_PTRAUTH_H
0010
0011 #ifdef __ASSEMBLY__
0012
0013 #include <asm/sysreg.h>
0014
0015 #ifdef CONFIG_ARM64_PTR_AUTH
0016
0017 #define PTRAUTH_REG_OFFSET(x) (x - CPU_APIAKEYLO_EL1)
0018
0019
0020
0021
0022
0023
0024
0025
0026 .macro ptrauth_save_state base, reg1, reg2
0027 mrs_s \reg1, SYS_APIAKEYLO_EL1
0028 mrs_s \reg2, SYS_APIAKEYHI_EL1
0029 stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)]
0030 mrs_s \reg1, SYS_APIBKEYLO_EL1
0031 mrs_s \reg2, SYS_APIBKEYHI_EL1
0032 stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)]
0033 mrs_s \reg1, SYS_APDAKEYLO_EL1
0034 mrs_s \reg2, SYS_APDAKEYHI_EL1
0035 stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)]
0036 mrs_s \reg1, SYS_APDBKEYLO_EL1
0037 mrs_s \reg2, SYS_APDBKEYHI_EL1
0038 stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)]
0039 mrs_s \reg1, SYS_APGAKEYLO_EL1
0040 mrs_s \reg2, SYS_APGAKEYHI_EL1
0041 stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)]
0042 .endm
0043
0044 .macro ptrauth_restore_state base, reg1, reg2
0045 ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)]
0046 msr_s SYS_APIAKEYLO_EL1, \reg1
0047 msr_s SYS_APIAKEYHI_EL1, \reg2
0048 ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)]
0049 msr_s SYS_APIBKEYLO_EL1, \reg1
0050 msr_s SYS_APIBKEYHI_EL1, \reg2
0051 ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)]
0052 msr_s SYS_APDAKEYLO_EL1, \reg1
0053 msr_s SYS_APDAKEYHI_EL1, \reg2
0054 ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)]
0055 msr_s SYS_APDBKEYLO_EL1, \reg1
0056 msr_s SYS_APDBKEYHI_EL1, \reg2
0057 ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)]
0058 msr_s SYS_APGAKEYLO_EL1, \reg1
0059 msr_s SYS_APGAKEYHI_EL1, \reg2
0060 .endm
0061
0062
0063
0064
0065
0066
0067
0068
0069 .macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3
0070 alternative_if_not ARM64_HAS_ADDRESS_AUTH
0071 b .L__skip_switch\@
0072 alternative_else_nop_endif
0073 mrs \reg1, hcr_el2
0074 and \reg1, \reg1, #(HCR_API | HCR_APK)
0075 cbz \reg1, .L__skip_switch\@
0076 add \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1
0077 ptrauth_restore_state \reg1, \reg2, \reg3
0078 .L__skip_switch\@:
0079 .endm
0080
0081 .macro ptrauth_switch_to_hyp g_ctxt, h_ctxt, reg1, reg2, reg3
0082 alternative_if_not ARM64_HAS_ADDRESS_AUTH
0083 b .L__skip_switch\@
0084 alternative_else_nop_endif
0085 mrs \reg1, hcr_el2
0086 and \reg1, \reg1, #(HCR_API | HCR_APK)
0087 cbz \reg1, .L__skip_switch\@
0088 add \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1
0089 ptrauth_save_state \reg1, \reg2, \reg3
0090 add \reg1, \h_ctxt, #CPU_APIAKEYLO_EL1
0091 ptrauth_restore_state \reg1, \reg2, \reg3
0092 isb
0093 .L__skip_switch\@:
0094 .endm
0095
0096 #else
0097 .macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3
0098 .endm
0099 .macro ptrauth_switch_to_hyp g_ctxt, h_ctxt, reg1, reg2, reg3
0100 .endm
0101 #endif
0102 #endif
0103 #endif