~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm64/include/asm/kvm_ptrauth.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /* arch/arm64/include/asm/kvm_ptrauth.h: Guest/host ptrauth save/restore
  3  * Copyright 2019 Arm Limited
  4  * Authors: Mark Rutland <mark.rutland@arm.com>
  5  *         Amit Daniel Kachhap <amit.kachhap@arm.com>
  6  */
  7 
  8 #ifndef __ASM_KVM_PTRAUTH_H
  9 #define __ASM_KVM_PTRAUTH_H
 10 
 11 #ifdef __ASSEMBLY__
 12 
 13 #include <asm/sysreg.h>
 14 
 15 #ifdef  CONFIG_ARM64_PTR_AUTH
 16 
 17 #define PTRAUTH_REG_OFFSET(x)   (x - CPU_APIAKEYLO_EL1)
 18 
 19 /*
 20  * CPU_AP*_EL1 values exceed immediate offset range (512) for stp
 21  * instruction so below macros takes CPU_APIAKEYLO_EL1 as base and
 22  * calculates the offset of the keys from this base to avoid an extra add
 23  * instruction. These macros assumes the keys offsets follow the order of
 24  * the sysreg enum in kvm_host.h.
 25  */
 26 .macro  ptrauth_save_state base, reg1, reg2
 27         mrs_s   \reg1, SYS_APIAKEYLO_EL1
 28         mrs_s   \reg2, SYS_APIAKEYHI_EL1
 29         stp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)]
 30         mrs_s   \reg1, SYS_APIBKEYLO_EL1
 31         mrs_s   \reg2, SYS_APIBKEYHI_EL1
 32         stp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)]
 33         mrs_s   \reg1, SYS_APDAKEYLO_EL1
 34         mrs_s   \reg2, SYS_APDAKEYHI_EL1
 35         stp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)]
 36         mrs_s   \reg1, SYS_APDBKEYLO_EL1
 37         mrs_s   \reg2, SYS_APDBKEYHI_EL1
 38         stp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)]
 39         mrs_s   \reg1, SYS_APGAKEYLO_EL1
 40         mrs_s   \reg2, SYS_APGAKEYHI_EL1
 41         stp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)]
 42 .endm
 43 
 44 .macro  ptrauth_restore_state base, reg1, reg2
 45         ldp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)]
 46         msr_s   SYS_APIAKEYLO_EL1, \reg1
 47         msr_s   SYS_APIAKEYHI_EL1, \reg2
 48         ldp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)]
 49         msr_s   SYS_APIBKEYLO_EL1, \reg1
 50         msr_s   SYS_APIBKEYHI_EL1, \reg2
 51         ldp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)]
 52         msr_s   SYS_APDAKEYLO_EL1, \reg1
 53         msr_s   SYS_APDAKEYHI_EL1, \reg2
 54         ldp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)]
 55         msr_s   SYS_APDBKEYLO_EL1, \reg1
 56         msr_s   SYS_APDBKEYHI_EL1, \reg2
 57         ldp     \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)]
 58         msr_s   SYS_APGAKEYLO_EL1, \reg1
 59         msr_s   SYS_APGAKEYHI_EL1, \reg2
 60 .endm
 61 
 62 /*
 63  * Both ptrauth_switch_to_guest and ptrauth_switch_to_hyp macros will
 64  * check for the presence ARM64_HAS_ADDRESS_AUTH, which is defined as
 65  * (ARM64_HAS_ADDRESS_AUTH_ARCH || ARM64_HAS_ADDRESS_AUTH_IMP_DEF) and
 66  * then proceed ahead with the save/restore of Pointer Authentication
 67  * key registers if enabled for the guest.
 68  */
 69 .macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3
 70 alternative_if_not ARM64_HAS_ADDRESS_AUTH
 71         b       .L__skip_switch\@
 72 alternative_else_nop_endif
 73         mrs     \reg1, hcr_el2
 74         and     \reg1, \reg1, #(HCR_API | HCR_APK)
 75         cbz     \reg1, .L__skip_switch\@
 76         add     \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1
 77         ptrauth_restore_state   \reg1, \reg2, \reg3
 78 .L__skip_switch\@:
 79 .endm
 80 
 81 .macro ptrauth_switch_to_hyp g_ctxt, h_ctxt, reg1, reg2, reg3
 82 alternative_if_not ARM64_HAS_ADDRESS_AUTH
 83         b       .L__skip_switch\@
 84 alternative_else_nop_endif
 85         mrs     \reg1, hcr_el2
 86         and     \reg1, \reg1, #(HCR_API | HCR_APK)
 87         cbz     \reg1, .L__skip_switch\@
 88         add     \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1
 89         ptrauth_save_state      \reg1, \reg2, \reg3
 90         add     \reg1, \h_ctxt, #CPU_APIAKEYLO_EL1
 91         ptrauth_restore_state   \reg1, \reg2, \reg3
 92         isb
 93 .L__skip_switch\@:
 94 .endm
 95 
 96 #else /* !CONFIG_ARM64_PTR_AUTH */
 97 .macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3
 98 .endm
 99 .macro ptrauth_switch_to_hyp g_ctxt, h_ctxt, reg1, reg2, reg3
100 .endm
101 #endif /* CONFIG_ARM64_PTR_AUTH */
102 
103 #else  /* !__ASSEMBLY */
104 
105 #define __ptrauth_save_key(ctxt, key)                                   \
106         do {                                                            \
107                 u64 __val;                                              \
108                 __val = read_sysreg_s(SYS_ ## key ## KEYLO_EL1);        \
109                 ctxt_sys_reg(ctxt, key ## KEYLO_EL1) = __val;           \
110                 __val = read_sysreg_s(SYS_ ## key ## KEYHI_EL1);        \
111                 ctxt_sys_reg(ctxt, key ## KEYHI_EL1) = __val;           \
112         } while(0)
113 
114 #define ptrauth_save_keys(ctxt)                                         \
115         do {                                                            \
116                 __ptrauth_save_key(ctxt, APIA);                         \
117                 __ptrauth_save_key(ctxt, APIB);                         \
118                 __ptrauth_save_key(ctxt, APDA);                         \
119                 __ptrauth_save_key(ctxt, APDB);                         \
120                 __ptrauth_save_key(ctxt, APGA);                         \
121         } while(0)
122 
123 #endif /* __ASSEMBLY__ */
124 #endif /* __ASM_KVM_PTRAUTH_H */
125 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php