kvm_mte.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2020-2021 ARM Ltd.
  4. */
  5. #ifndef __ASM_KVM_MTE_H
  6. #define __ASM_KVM_MTE_H
  7. #ifdef __ASSEMBLY__
  8. #include <asm/sysreg.h>
  9. #ifdef CONFIG_ARM64_MTE
  10. .macro mte_switch_to_guest g_ctxt, h_ctxt, reg1
  11. alternative_if_not ARM64_MTE
  12. b .L__skip_switch\@
  13. alternative_else_nop_endif
  14. mrs \reg1, hcr_el2
  15. tbz \reg1, #(HCR_ATA_SHIFT), .L__skip_switch\@
  16. mrs_s \reg1, SYS_RGSR_EL1
  17. str \reg1, [\h_ctxt, #CPU_RGSR_EL1]
  18. mrs_s \reg1, SYS_GCR_EL1
  19. str \reg1, [\h_ctxt, #CPU_GCR_EL1]
  20. ldr \reg1, [\g_ctxt, #CPU_RGSR_EL1]
  21. msr_s SYS_RGSR_EL1, \reg1
  22. ldr \reg1, [\g_ctxt, #CPU_GCR_EL1]
  23. msr_s SYS_GCR_EL1, \reg1
  24. .L__skip_switch\@:
  25. .endm
  26. .macro mte_switch_to_hyp g_ctxt, h_ctxt, reg1
  27. alternative_if_not ARM64_MTE
  28. b .L__skip_switch\@
  29. alternative_else_nop_endif
  30. mrs \reg1, hcr_el2
  31. tbz \reg1, #(HCR_ATA_SHIFT), .L__skip_switch\@
  32. mrs_s \reg1, SYS_RGSR_EL1
  33. str \reg1, [\g_ctxt, #CPU_RGSR_EL1]
  34. mrs_s \reg1, SYS_GCR_EL1
  35. str \reg1, [\g_ctxt, #CPU_GCR_EL1]
  36. ldr \reg1, [\h_ctxt, #CPU_RGSR_EL1]
  37. msr_s SYS_RGSR_EL1, \reg1
  38. ldr \reg1, [\h_ctxt, #CPU_GCR_EL1]
  39. msr_s SYS_GCR_EL1, \reg1
  40. isb
  41. .L__skip_switch\@:
  42. .endm
  43. #else /* !CONFIG_ARM64_MTE */
  44. .macro mte_switch_to_guest g_ctxt, h_ctxt, reg1
  45. .endm
  46. .macro mte_switch_to_hyp g_ctxt, h_ctxt, reg1
  47. .endm
  48. #endif /* CONFIG_ARM64_MTE */
  49. #endif /* __ASSEMBLY__ */
  50. #endif /* __ASM_KVM_MTE_H */