kvm_ptrauth.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 <[email protected]>
  5. * Amit Daniel Kachhap <[email protected]>
  6. */
  7. #ifndef __ASM_KVM_PTRAUTH_H
  8. #define __ASM_KVM_PTRAUTH_H
  9. #ifdef __ASSEMBLY__
  10. #include <asm/sysreg.h>
  11. #ifdef CONFIG_ARM64_PTR_AUTH
  12. #define PTRAUTH_REG_OFFSET(x) (x - CPU_APIAKEYLO_EL1)
  13. /*
  14. * CPU_AP*_EL1 values exceed immediate offset range (512) for stp
  15. * instruction so below macros takes CPU_APIAKEYLO_EL1 as base and
  16. * calculates the offset of the keys from this base to avoid an extra add
  17. * instruction. These macros assumes the keys offsets follow the order of
  18. * the sysreg enum in kvm_host.h.
  19. */
  20. .macro ptrauth_save_state base, reg1, reg2
  21. mrs_s \reg1, SYS_APIAKEYLO_EL1
  22. mrs_s \reg2, SYS_APIAKEYHI_EL1
  23. stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)]
  24. mrs_s \reg1, SYS_APIBKEYLO_EL1
  25. mrs_s \reg2, SYS_APIBKEYHI_EL1
  26. stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)]
  27. mrs_s \reg1, SYS_APDAKEYLO_EL1
  28. mrs_s \reg2, SYS_APDAKEYHI_EL1
  29. stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)]
  30. mrs_s \reg1, SYS_APDBKEYLO_EL1
  31. mrs_s \reg2, SYS_APDBKEYHI_EL1
  32. stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)]
  33. mrs_s \reg1, SYS_APGAKEYLO_EL1
  34. mrs_s \reg2, SYS_APGAKEYHI_EL1
  35. stp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)]
  36. .endm
  37. .macro ptrauth_restore_state base, reg1, reg2
  38. ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIAKEYLO_EL1)]
  39. msr_s SYS_APIAKEYLO_EL1, \reg1
  40. msr_s SYS_APIAKEYHI_EL1, \reg2
  41. ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APIBKEYLO_EL1)]
  42. msr_s SYS_APIBKEYLO_EL1, \reg1
  43. msr_s SYS_APIBKEYHI_EL1, \reg2
  44. ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDAKEYLO_EL1)]
  45. msr_s SYS_APDAKEYLO_EL1, \reg1
  46. msr_s SYS_APDAKEYHI_EL1, \reg2
  47. ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APDBKEYLO_EL1)]
  48. msr_s SYS_APDBKEYLO_EL1, \reg1
  49. msr_s SYS_APDBKEYHI_EL1, \reg2
  50. ldp \reg1, \reg2, [\base, #PTRAUTH_REG_OFFSET(CPU_APGAKEYLO_EL1)]
  51. msr_s SYS_APGAKEYLO_EL1, \reg1
  52. msr_s SYS_APGAKEYHI_EL1, \reg2
  53. .endm
  54. /*
  55. * Both ptrauth_switch_to_guest and ptrauth_switch_to_hyp macros will
  56. * check for the presence ARM64_HAS_ADDRESS_AUTH, which is defined as
  57. * (ARM64_HAS_ADDRESS_AUTH_ARCH || ARM64_HAS_ADDRESS_AUTH_IMP_DEF) and
  58. * then proceed ahead with the save/restore of Pointer Authentication
  59. * key registers if enabled for the guest.
  60. */
  61. .macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3
  62. alternative_if_not ARM64_HAS_ADDRESS_AUTH
  63. b .L__skip_switch\@
  64. alternative_else_nop_endif
  65. mrs \reg1, hcr_el2
  66. and \reg1, \reg1, #(HCR_API | HCR_APK)
  67. cbz \reg1, .L__skip_switch\@
  68. add \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1
  69. ptrauth_restore_state \reg1, \reg2, \reg3
  70. .L__skip_switch\@:
  71. .endm
  72. .macro ptrauth_switch_to_hyp g_ctxt, h_ctxt, reg1, reg2, reg3
  73. alternative_if_not ARM64_HAS_ADDRESS_AUTH
  74. b .L__skip_switch\@
  75. alternative_else_nop_endif
  76. mrs \reg1, hcr_el2
  77. and \reg1, \reg1, #(HCR_API | HCR_APK)
  78. cbz \reg1, .L__skip_switch\@
  79. add \reg1, \g_ctxt, #CPU_APIAKEYLO_EL1
  80. ptrauth_save_state \reg1, \reg2, \reg3
  81. add \reg1, \h_ctxt, #CPU_APIAKEYLO_EL1
  82. ptrauth_restore_state \reg1, \reg2, \reg3
  83. isb
  84. .L__skip_switch\@:
  85. .endm
  86. #else /* !CONFIG_ARM64_PTR_AUTH */
  87. .macro ptrauth_switch_to_guest g_ctxt, reg1, reg2, reg3
  88. .endm
  89. .macro ptrauth_switch_to_hyp g_ctxt, h_ctxt, reg1, reg2, reg3
  90. .endm
  91. #endif /* CONFIG_ARM64_PTR_AUTH */
  92. #endif /* __ASSEMBLY__ */
  93. #endif /* __ASM_KVM_PTRAUTH_H */