Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* arch/arm64/include/asm/kvm_ptrauth.h: Guest/host ptrauth save/restore
0003  * Copyright 2019 Arm Limited
0004  * Authors: Mark Rutland <mark.rutland@arm.com>
0005  *         Amit Daniel Kachhap <amit.kachhap@arm.com>
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  * CPU_AP*_EL1 values exceed immediate offset range (512) for stp
0021  * instruction so below macros takes CPU_APIAKEYLO_EL1 as base and
0022  * calculates the offset of the keys from this base to avoid an extra add
0023  * instruction. These macros assumes the keys offsets follow the order of
0024  * the sysreg enum in kvm_host.h.
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  * Both ptrauth_switch_to_guest and ptrauth_switch_to_hyp macros will
0064  * check for the presence ARM64_HAS_ADDRESS_AUTH, which is defined as
0065  * (ARM64_HAS_ADDRESS_AUTH_ARCH || ARM64_HAS_ADDRESS_AUTH_IMP_DEF) and
0066  * then proceed ahead with the save/restore of Pointer Authentication
0067  * key registers if enabled for the guest.
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 /* !CONFIG_ARM64_PTR_AUTH */
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 /* CONFIG_ARM64_PTR_AUTH */
0102 #endif /* __ASSEMBLY__ */
0103 #endif /* __ASM_KVM_PTRAUTH_H */