svm.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __SVM_H
  3. #define __SVM_H
  4. #include <uapi/asm/svm.h>
  5. enum {
  6. INTERCEPT_INTR,
  7. INTERCEPT_NMI,
  8. INTERCEPT_SMI,
  9. INTERCEPT_INIT,
  10. INTERCEPT_VINTR,
  11. INTERCEPT_SELECTIVE_CR0,
  12. INTERCEPT_STORE_IDTR,
  13. INTERCEPT_STORE_GDTR,
  14. INTERCEPT_STORE_LDTR,
  15. INTERCEPT_STORE_TR,
  16. INTERCEPT_LOAD_IDTR,
  17. INTERCEPT_LOAD_GDTR,
  18. INTERCEPT_LOAD_LDTR,
  19. INTERCEPT_LOAD_TR,
  20. INTERCEPT_RDTSC,
  21. INTERCEPT_RDPMC,
  22. INTERCEPT_PUSHF,
  23. INTERCEPT_POPF,
  24. INTERCEPT_CPUID,
  25. INTERCEPT_RSM,
  26. INTERCEPT_IRET,
  27. INTERCEPT_INTn,
  28. INTERCEPT_INVD,
  29. INTERCEPT_PAUSE,
  30. INTERCEPT_HLT,
  31. INTERCEPT_INVLPG,
  32. INTERCEPT_INVLPGA,
  33. INTERCEPT_IOIO_PROT,
  34. INTERCEPT_MSR_PROT,
  35. INTERCEPT_TASK_SWITCH,
  36. INTERCEPT_FERR_FREEZE,
  37. INTERCEPT_SHUTDOWN,
  38. INTERCEPT_VMRUN,
  39. INTERCEPT_VMMCALL,
  40. INTERCEPT_VMLOAD,
  41. INTERCEPT_VMSAVE,
  42. INTERCEPT_STGI,
  43. INTERCEPT_CLGI,
  44. INTERCEPT_SKINIT,
  45. INTERCEPT_RDTSCP,
  46. INTERCEPT_ICEBP,
  47. INTERCEPT_WBINVD,
  48. INTERCEPT_MONITOR,
  49. INTERCEPT_MWAIT,
  50. INTERCEPT_MWAIT_COND,
  51. INTERCEPT_XSETBV,
  52. };
  53. struct __attribute__ ((__packed__)) vmcb_control_area {
  54. u32 intercept_cr;
  55. u32 intercept_dr;
  56. u32 intercept_exceptions;
  57. u64 intercept;
  58. u8 reserved_1[40];
  59. u16 pause_filter_thresh;
  60. u16 pause_filter_count;
  61. u64 iopm_base_pa;
  62. u64 msrpm_base_pa;
  63. u64 tsc_offset;
  64. u32 asid;
  65. u8 tlb_ctl;
  66. u8 reserved_2[3];
  67. u32 int_ctl;
  68. u32 int_vector;
  69. u32 int_state;
  70. u8 reserved_3[4];
  71. u32 exit_code;
  72. u32 exit_code_hi;
  73. u64 exit_info_1;
  74. u64 exit_info_2;
  75. u32 exit_int_info;
  76. u32 exit_int_info_err;
  77. u64 nested_ctl;
  78. u64 avic_vapic_bar;
  79. u8 reserved_4[8];
  80. u32 event_inj;
  81. u32 event_inj_err;
  82. u64 nested_cr3;
  83. u64 virt_ext;
  84. u32 clean;
  85. u32 reserved_5;
  86. u64 next_rip;
  87. u8 insn_len;
  88. u8 insn_bytes[15];
  89. u64 avic_backing_page; /* Offset 0xe0 */
  90. u8 reserved_6[8]; /* Offset 0xe8 */
  91. u64 avic_logical_id; /* Offset 0xf0 */
  92. u64 avic_physical_id; /* Offset 0xf8 */
  93. u8 reserved_7[768];
  94. };
  95. #define TLB_CONTROL_DO_NOTHING 0
  96. #define TLB_CONTROL_FLUSH_ALL_ASID 1
  97. #define TLB_CONTROL_FLUSH_ASID 3
  98. #define TLB_CONTROL_FLUSH_ASID_LOCAL 7
  99. #define V_TPR_MASK 0x0f
  100. #define V_IRQ_SHIFT 8
  101. #define V_IRQ_MASK (1 << V_IRQ_SHIFT)
  102. #define V_GIF_SHIFT 9
  103. #define V_GIF_MASK (1 << V_GIF_SHIFT)
  104. #define V_INTR_PRIO_SHIFT 16
  105. #define V_INTR_PRIO_MASK (0x0f << V_INTR_PRIO_SHIFT)
  106. #define V_IGN_TPR_SHIFT 20
  107. #define V_IGN_TPR_MASK (1 << V_IGN_TPR_SHIFT)
  108. #define V_INTR_MASKING_SHIFT 24
  109. #define V_INTR_MASKING_MASK (1 << V_INTR_MASKING_SHIFT)
  110. #define V_GIF_ENABLE_SHIFT 25
  111. #define V_GIF_ENABLE_MASK (1 << V_GIF_ENABLE_SHIFT)
  112. #define AVIC_ENABLE_SHIFT 31
  113. #define AVIC_ENABLE_MASK (1 << AVIC_ENABLE_SHIFT)
  114. #define LBR_CTL_ENABLE_MASK BIT_ULL(0)
  115. #define VIRTUAL_VMLOAD_VMSAVE_ENABLE_MASK BIT_ULL(1)
  116. #define SVM_INTERRUPT_SHADOW_MASK 1
  117. #define SVM_IOIO_STR_SHIFT 2
  118. #define SVM_IOIO_REP_SHIFT 3
  119. #define SVM_IOIO_SIZE_SHIFT 4
  120. #define SVM_IOIO_ASIZE_SHIFT 7
  121. #define SVM_IOIO_TYPE_MASK 1
  122. #define SVM_IOIO_STR_MASK (1 << SVM_IOIO_STR_SHIFT)
  123. #define SVM_IOIO_REP_MASK (1 << SVM_IOIO_REP_SHIFT)
  124. #define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT)
  125. #define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT)
  126. #define SVM_VM_CR_VALID_MASK 0x001fULL
  127. #define SVM_VM_CR_SVM_LOCK_MASK 0x0008ULL
  128. #define SVM_VM_CR_SVM_DIS_MASK 0x0010ULL
  129. #define SVM_NESTED_CTL_NP_ENABLE BIT(0)
  130. #define SVM_NESTED_CTL_SEV_ENABLE BIT(1)
  131. struct __attribute__ ((__packed__)) vmcb_seg {
  132. u16 selector;
  133. u16 attrib;
  134. u32 limit;
  135. u64 base;
  136. };
  137. struct __attribute__ ((__packed__)) vmcb_save_area {
  138. struct vmcb_seg es;
  139. struct vmcb_seg cs;
  140. struct vmcb_seg ss;
  141. struct vmcb_seg ds;
  142. struct vmcb_seg fs;
  143. struct vmcb_seg gs;
  144. struct vmcb_seg gdtr;
  145. struct vmcb_seg ldtr;
  146. struct vmcb_seg idtr;
  147. struct vmcb_seg tr;
  148. u8 reserved_1[43];
  149. u8 cpl;
  150. u8 reserved_2[4];
  151. u64 efer;
  152. u8 reserved_3[112];
  153. u64 cr4;
  154. u64 cr3;
  155. u64 cr0;
  156. u64 dr7;
  157. u64 dr6;
  158. u64 rflags;
  159. u64 rip;
  160. u8 reserved_4[88];
  161. u64 rsp;
  162. u8 reserved_5[24];
  163. u64 rax;
  164. u64 star;
  165. u64 lstar;
  166. u64 cstar;
  167. u64 sfmask;
  168. u64 kernel_gs_base;
  169. u64 sysenter_cs;
  170. u64 sysenter_esp;
  171. u64 sysenter_eip;
  172. u64 cr2;
  173. u8 reserved_6[32];
  174. u64 g_pat;
  175. u64 dbgctl;
  176. u64 br_from;
  177. u64 br_to;
  178. u64 last_excp_from;
  179. u64 last_excp_to;
  180. };
  181. struct __attribute__ ((__packed__)) vmcb {
  182. struct vmcb_control_area control;
  183. struct vmcb_save_area save;
  184. };
  185. #define SVM_CPUID_FUNC 0x8000000a
  186. #define SVM_VM_CR_SVM_DISABLE 4
  187. #define SVM_SELECTOR_S_SHIFT 4
  188. #define SVM_SELECTOR_DPL_SHIFT 5
  189. #define SVM_SELECTOR_P_SHIFT 7
  190. #define SVM_SELECTOR_AVL_SHIFT 8
  191. #define SVM_SELECTOR_L_SHIFT 9
  192. #define SVM_SELECTOR_DB_SHIFT 10
  193. #define SVM_SELECTOR_G_SHIFT 11
  194. #define SVM_SELECTOR_TYPE_MASK (0xf)
  195. #define SVM_SELECTOR_S_MASK (1 << SVM_SELECTOR_S_SHIFT)
  196. #define SVM_SELECTOR_DPL_MASK (3 << SVM_SELECTOR_DPL_SHIFT)
  197. #define SVM_SELECTOR_P_MASK (1 << SVM_SELECTOR_P_SHIFT)
  198. #define SVM_SELECTOR_AVL_MASK (1 << SVM_SELECTOR_AVL_SHIFT)
  199. #define SVM_SELECTOR_L_MASK (1 << SVM_SELECTOR_L_SHIFT)
  200. #define SVM_SELECTOR_DB_MASK (1 << SVM_SELECTOR_DB_SHIFT)
  201. #define SVM_SELECTOR_G_MASK (1 << SVM_SELECTOR_G_SHIFT)
  202. #define SVM_SELECTOR_WRITE_MASK (1 << 1)
  203. #define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK
  204. #define SVM_SELECTOR_CODE_MASK (1 << 3)
  205. #define INTERCEPT_CR0_READ 0
  206. #define INTERCEPT_CR3_READ 3
  207. #define INTERCEPT_CR4_READ 4
  208. #define INTERCEPT_CR8_READ 8
  209. #define INTERCEPT_CR0_WRITE (16 + 0)
  210. #define INTERCEPT_CR3_WRITE (16 + 3)
  211. #define INTERCEPT_CR4_WRITE (16 + 4)
  212. #define INTERCEPT_CR8_WRITE (16 + 8)
  213. #define INTERCEPT_DR0_READ 0
  214. #define INTERCEPT_DR1_READ 1
  215. #define INTERCEPT_DR2_READ 2
  216. #define INTERCEPT_DR3_READ 3
  217. #define INTERCEPT_DR4_READ 4
  218. #define INTERCEPT_DR5_READ 5
  219. #define INTERCEPT_DR6_READ 6
  220. #define INTERCEPT_DR7_READ 7
  221. #define INTERCEPT_DR0_WRITE (16 + 0)
  222. #define INTERCEPT_DR1_WRITE (16 + 1)
  223. #define INTERCEPT_DR2_WRITE (16 + 2)
  224. #define INTERCEPT_DR3_WRITE (16 + 3)
  225. #define INTERCEPT_DR4_WRITE (16 + 4)
  226. #define INTERCEPT_DR5_WRITE (16 + 5)
  227. #define INTERCEPT_DR6_WRITE (16 + 6)
  228. #define INTERCEPT_DR7_WRITE (16 + 7)
  229. #define SVM_EVTINJ_VEC_MASK 0xff
  230. #define SVM_EVTINJ_TYPE_SHIFT 8
  231. #define SVM_EVTINJ_TYPE_MASK (7 << SVM_EVTINJ_TYPE_SHIFT)
  232. #define SVM_EVTINJ_TYPE_INTR (0 << SVM_EVTINJ_TYPE_SHIFT)
  233. #define SVM_EVTINJ_TYPE_NMI (2 << SVM_EVTINJ_TYPE_SHIFT)
  234. #define SVM_EVTINJ_TYPE_EXEPT (3 << SVM_EVTINJ_TYPE_SHIFT)
  235. #define SVM_EVTINJ_TYPE_SOFT (4 << SVM_EVTINJ_TYPE_SHIFT)
  236. #define SVM_EVTINJ_VALID (1 << 31)
  237. #define SVM_EVTINJ_VALID_ERR (1 << 11)
  238. #define SVM_EXITINTINFO_VEC_MASK SVM_EVTINJ_VEC_MASK
  239. #define SVM_EXITINTINFO_TYPE_MASK SVM_EVTINJ_TYPE_MASK
  240. #define SVM_EXITINTINFO_TYPE_INTR SVM_EVTINJ_TYPE_INTR
  241. #define SVM_EXITINTINFO_TYPE_NMI SVM_EVTINJ_TYPE_NMI
  242. #define SVM_EXITINTINFO_TYPE_EXEPT SVM_EVTINJ_TYPE_EXEPT
  243. #define SVM_EXITINTINFO_TYPE_SOFT SVM_EVTINJ_TYPE_SOFT
  244. #define SVM_EXITINTINFO_VALID SVM_EVTINJ_VALID
  245. #define SVM_EXITINTINFO_VALID_ERR SVM_EVTINJ_VALID_ERR
  246. #define SVM_EXITINFOSHIFT_TS_REASON_IRET 36
  247. #define SVM_EXITINFOSHIFT_TS_REASON_JMP 38
  248. #define SVM_EXITINFOSHIFT_TS_HAS_ERROR_CODE 44
  249. #define SVM_EXITINFO_REG_MASK 0x0F
  250. #define SVM_CR0_SELECTIVE_MASK (X86_CR0_TS | X86_CR0_MP)
  251. #define SVM_VMLOAD ".byte 0x0f, 0x01, 0xda"
  252. #define SVM_VMRUN ".byte 0x0f, 0x01, 0xd8"
  253. #define SVM_VMSAVE ".byte 0x0f, 0x01, 0xdb"
  254. #define SVM_CLGI ".byte 0x0f, 0x01, 0xdd"
  255. #define SVM_STGI ".byte 0x0f, 0x01, 0xdc"
  256. #define SVM_INVLPGA ".byte 0x0f, 0x01, 0xdf"
  257. #endif