evmcs.h 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2018, Red Hat, Inc.
  4. */
  5. #ifndef SELFTEST_KVM_EVMCS_H
  6. #define SELFTEST_KVM_EVMCS_H
  7. #include <stdint.h>
  8. #include "hyperv.h"
  9. #include "vmx.h"
  10. #define u16 uint16_t
  11. #define u32 uint32_t
  12. #define u64 uint64_t
  13. #define EVMCS_VERSION 1
  14. extern bool enable_evmcs;
  15. struct hv_enlightened_vmcs {
  16. u32 revision_id;
  17. u32 abort;
  18. u16 host_es_selector;
  19. u16 host_cs_selector;
  20. u16 host_ss_selector;
  21. u16 host_ds_selector;
  22. u16 host_fs_selector;
  23. u16 host_gs_selector;
  24. u16 host_tr_selector;
  25. u16 padding16_1;
  26. u64 host_ia32_pat;
  27. u64 host_ia32_efer;
  28. u64 host_cr0;
  29. u64 host_cr3;
  30. u64 host_cr4;
  31. u64 host_ia32_sysenter_esp;
  32. u64 host_ia32_sysenter_eip;
  33. u64 host_rip;
  34. u32 host_ia32_sysenter_cs;
  35. u32 pin_based_vm_exec_control;
  36. u32 vm_exit_controls;
  37. u32 secondary_vm_exec_control;
  38. u64 io_bitmap_a;
  39. u64 io_bitmap_b;
  40. u64 msr_bitmap;
  41. u16 guest_es_selector;
  42. u16 guest_cs_selector;
  43. u16 guest_ss_selector;
  44. u16 guest_ds_selector;
  45. u16 guest_fs_selector;
  46. u16 guest_gs_selector;
  47. u16 guest_ldtr_selector;
  48. u16 guest_tr_selector;
  49. u32 guest_es_limit;
  50. u32 guest_cs_limit;
  51. u32 guest_ss_limit;
  52. u32 guest_ds_limit;
  53. u32 guest_fs_limit;
  54. u32 guest_gs_limit;
  55. u32 guest_ldtr_limit;
  56. u32 guest_tr_limit;
  57. u32 guest_gdtr_limit;
  58. u32 guest_idtr_limit;
  59. u32 guest_es_ar_bytes;
  60. u32 guest_cs_ar_bytes;
  61. u32 guest_ss_ar_bytes;
  62. u32 guest_ds_ar_bytes;
  63. u32 guest_fs_ar_bytes;
  64. u32 guest_gs_ar_bytes;
  65. u32 guest_ldtr_ar_bytes;
  66. u32 guest_tr_ar_bytes;
  67. u64 guest_es_base;
  68. u64 guest_cs_base;
  69. u64 guest_ss_base;
  70. u64 guest_ds_base;
  71. u64 guest_fs_base;
  72. u64 guest_gs_base;
  73. u64 guest_ldtr_base;
  74. u64 guest_tr_base;
  75. u64 guest_gdtr_base;
  76. u64 guest_idtr_base;
  77. u64 padding64_1[3];
  78. u64 vm_exit_msr_store_addr;
  79. u64 vm_exit_msr_load_addr;
  80. u64 vm_entry_msr_load_addr;
  81. u64 cr3_target_value0;
  82. u64 cr3_target_value1;
  83. u64 cr3_target_value2;
  84. u64 cr3_target_value3;
  85. u32 page_fault_error_code_mask;
  86. u32 page_fault_error_code_match;
  87. u32 cr3_target_count;
  88. u32 vm_exit_msr_store_count;
  89. u32 vm_exit_msr_load_count;
  90. u32 vm_entry_msr_load_count;
  91. u64 tsc_offset;
  92. u64 virtual_apic_page_addr;
  93. u64 vmcs_link_pointer;
  94. u64 guest_ia32_debugctl;
  95. u64 guest_ia32_pat;
  96. u64 guest_ia32_efer;
  97. u64 guest_pdptr0;
  98. u64 guest_pdptr1;
  99. u64 guest_pdptr2;
  100. u64 guest_pdptr3;
  101. u64 guest_pending_dbg_exceptions;
  102. u64 guest_sysenter_esp;
  103. u64 guest_sysenter_eip;
  104. u32 guest_activity_state;
  105. u32 guest_sysenter_cs;
  106. u64 cr0_guest_host_mask;
  107. u64 cr4_guest_host_mask;
  108. u64 cr0_read_shadow;
  109. u64 cr4_read_shadow;
  110. u64 guest_cr0;
  111. u64 guest_cr3;
  112. u64 guest_cr4;
  113. u64 guest_dr7;
  114. u64 host_fs_base;
  115. u64 host_gs_base;
  116. u64 host_tr_base;
  117. u64 host_gdtr_base;
  118. u64 host_idtr_base;
  119. u64 host_rsp;
  120. u64 ept_pointer;
  121. u16 virtual_processor_id;
  122. u16 padding16_2[3];
  123. u64 padding64_2[5];
  124. u64 guest_physical_address;
  125. u32 vm_instruction_error;
  126. u32 vm_exit_reason;
  127. u32 vm_exit_intr_info;
  128. u32 vm_exit_intr_error_code;
  129. u32 idt_vectoring_info_field;
  130. u32 idt_vectoring_error_code;
  131. u32 vm_exit_instruction_len;
  132. u32 vmx_instruction_info;
  133. u64 exit_qualification;
  134. u64 exit_io_instruction_ecx;
  135. u64 exit_io_instruction_esi;
  136. u64 exit_io_instruction_edi;
  137. u64 exit_io_instruction_eip;
  138. u64 guest_linear_address;
  139. u64 guest_rsp;
  140. u64 guest_rflags;
  141. u32 guest_interruptibility_info;
  142. u32 cpu_based_vm_exec_control;
  143. u32 exception_bitmap;
  144. u32 vm_entry_controls;
  145. u32 vm_entry_intr_info_field;
  146. u32 vm_entry_exception_error_code;
  147. u32 vm_entry_instruction_len;
  148. u32 tpr_threshold;
  149. u64 guest_rip;
  150. u32 hv_clean_fields;
  151. u32 padding32_1;
  152. u32 hv_synthetic_controls;
  153. struct {
  154. u32 nested_flush_hypercall:1;
  155. u32 msr_bitmap:1;
  156. u32 reserved:30;
  157. } __packed hv_enlightenments_control;
  158. u32 hv_vp_id;
  159. u32 padding32_2;
  160. u64 hv_vm_id;
  161. u64 partition_assist_page;
  162. u64 padding64_4[4];
  163. u64 guest_bndcfgs;
  164. u64 guest_ia32_perf_global_ctrl;
  165. u64 guest_ia32_s_cet;
  166. u64 guest_ssp;
  167. u64 guest_ia32_int_ssp_table_addr;
  168. u64 guest_ia32_lbr_ctl;
  169. u64 padding64_5[2];
  170. u64 xss_exit_bitmap;
  171. u64 encls_exiting_bitmap;
  172. u64 host_ia32_perf_global_ctrl;
  173. u64 tsc_multiplier;
  174. u64 host_ia32_s_cet;
  175. u64 host_ssp;
  176. u64 host_ia32_int_ssp_table_addr;
  177. u64 padding64_6;
  178. } __packed;
  179. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE 0
  180. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP BIT(0)
  181. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP BIT(1)
  182. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2 BIT(2)
  183. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1 BIT(3)
  184. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC BIT(4)
  185. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT BIT(5)
  186. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY BIT(6)
  187. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN BIT(7)
  188. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR BIT(8)
  189. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT BIT(9)
  190. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC BIT(10)
  191. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1 BIT(11)
  192. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2 BIT(12)
  193. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER BIT(13)
  194. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1 BIT(14)
  195. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ENLIGHTENMENTSCONTROL BIT(15)
  196. #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL 0xFFFF
  197. #define HV_VMX_SYNTHETIC_EXIT_REASON_TRAP_AFTER_FLUSH 0x10000031
  198. extern struct hv_enlightened_vmcs *current_evmcs;
  199. int vcpu_enable_evmcs(struct kvm_vcpu *vcpu);
  200. static inline void evmcs_enable(void)
  201. {
  202. enable_evmcs = true;
  203. }
  204. static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
  205. {
  206. current_vp_assist->current_nested_vmcs = vmcs_pa;
  207. current_vp_assist->enlighten_vmentry = 1;
  208. current_evmcs = vmcs;
  209. return 0;
  210. }
  211. static inline bool load_evmcs(struct hyperv_test_pages *hv)
  212. {
  213. if (evmcs_vmptrld(hv->enlightened_vmcs_gpa, hv->enlightened_vmcs))
  214. return false;
  215. current_evmcs->revision_id = EVMCS_VERSION;
  216. return true;
  217. }
  218. static inline int evmcs_vmptrst(uint64_t *value)
  219. {
  220. *value = current_vp_assist->current_nested_vmcs &
  221. ~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
  222. return 0;
  223. }
  224. static inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
  225. {
  226. switch (encoding) {
  227. case GUEST_RIP:
  228. *value = current_evmcs->guest_rip;
  229. break;
  230. case GUEST_RSP:
  231. *value = current_evmcs->guest_rsp;
  232. break;
  233. case GUEST_RFLAGS:
  234. *value = current_evmcs->guest_rflags;
  235. break;
  236. case HOST_IA32_PAT:
  237. *value = current_evmcs->host_ia32_pat;
  238. break;
  239. case HOST_IA32_EFER:
  240. *value = current_evmcs->host_ia32_efer;
  241. break;
  242. case HOST_CR0:
  243. *value = current_evmcs->host_cr0;
  244. break;
  245. case HOST_CR3:
  246. *value = current_evmcs->host_cr3;
  247. break;
  248. case HOST_CR4:
  249. *value = current_evmcs->host_cr4;
  250. break;
  251. case HOST_IA32_SYSENTER_ESP:
  252. *value = current_evmcs->host_ia32_sysenter_esp;
  253. break;
  254. case HOST_IA32_SYSENTER_EIP:
  255. *value = current_evmcs->host_ia32_sysenter_eip;
  256. break;
  257. case HOST_RIP:
  258. *value = current_evmcs->host_rip;
  259. break;
  260. case IO_BITMAP_A:
  261. *value = current_evmcs->io_bitmap_a;
  262. break;
  263. case IO_BITMAP_B:
  264. *value = current_evmcs->io_bitmap_b;
  265. break;
  266. case MSR_BITMAP:
  267. *value = current_evmcs->msr_bitmap;
  268. break;
  269. case GUEST_ES_BASE:
  270. *value = current_evmcs->guest_es_base;
  271. break;
  272. case GUEST_CS_BASE:
  273. *value = current_evmcs->guest_cs_base;
  274. break;
  275. case GUEST_SS_BASE:
  276. *value = current_evmcs->guest_ss_base;
  277. break;
  278. case GUEST_DS_BASE:
  279. *value = current_evmcs->guest_ds_base;
  280. break;
  281. case GUEST_FS_BASE:
  282. *value = current_evmcs->guest_fs_base;
  283. break;
  284. case GUEST_GS_BASE:
  285. *value = current_evmcs->guest_gs_base;
  286. break;
  287. case GUEST_LDTR_BASE:
  288. *value = current_evmcs->guest_ldtr_base;
  289. break;
  290. case GUEST_TR_BASE:
  291. *value = current_evmcs->guest_tr_base;
  292. break;
  293. case GUEST_GDTR_BASE:
  294. *value = current_evmcs->guest_gdtr_base;
  295. break;
  296. case GUEST_IDTR_BASE:
  297. *value = current_evmcs->guest_idtr_base;
  298. break;
  299. case TSC_OFFSET:
  300. *value = current_evmcs->tsc_offset;
  301. break;
  302. case VIRTUAL_APIC_PAGE_ADDR:
  303. *value = current_evmcs->virtual_apic_page_addr;
  304. break;
  305. case VMCS_LINK_POINTER:
  306. *value = current_evmcs->vmcs_link_pointer;
  307. break;
  308. case GUEST_IA32_DEBUGCTL:
  309. *value = current_evmcs->guest_ia32_debugctl;
  310. break;
  311. case GUEST_IA32_PAT:
  312. *value = current_evmcs->guest_ia32_pat;
  313. break;
  314. case GUEST_IA32_EFER:
  315. *value = current_evmcs->guest_ia32_efer;
  316. break;
  317. case GUEST_PDPTR0:
  318. *value = current_evmcs->guest_pdptr0;
  319. break;
  320. case GUEST_PDPTR1:
  321. *value = current_evmcs->guest_pdptr1;
  322. break;
  323. case GUEST_PDPTR2:
  324. *value = current_evmcs->guest_pdptr2;
  325. break;
  326. case GUEST_PDPTR3:
  327. *value = current_evmcs->guest_pdptr3;
  328. break;
  329. case GUEST_PENDING_DBG_EXCEPTIONS:
  330. *value = current_evmcs->guest_pending_dbg_exceptions;
  331. break;
  332. case GUEST_SYSENTER_ESP:
  333. *value = current_evmcs->guest_sysenter_esp;
  334. break;
  335. case GUEST_SYSENTER_EIP:
  336. *value = current_evmcs->guest_sysenter_eip;
  337. break;
  338. case CR0_GUEST_HOST_MASK:
  339. *value = current_evmcs->cr0_guest_host_mask;
  340. break;
  341. case CR4_GUEST_HOST_MASK:
  342. *value = current_evmcs->cr4_guest_host_mask;
  343. break;
  344. case CR0_READ_SHADOW:
  345. *value = current_evmcs->cr0_read_shadow;
  346. break;
  347. case CR4_READ_SHADOW:
  348. *value = current_evmcs->cr4_read_shadow;
  349. break;
  350. case GUEST_CR0:
  351. *value = current_evmcs->guest_cr0;
  352. break;
  353. case GUEST_CR3:
  354. *value = current_evmcs->guest_cr3;
  355. break;
  356. case GUEST_CR4:
  357. *value = current_evmcs->guest_cr4;
  358. break;
  359. case GUEST_DR7:
  360. *value = current_evmcs->guest_dr7;
  361. break;
  362. case HOST_FS_BASE:
  363. *value = current_evmcs->host_fs_base;
  364. break;
  365. case HOST_GS_BASE:
  366. *value = current_evmcs->host_gs_base;
  367. break;
  368. case HOST_TR_BASE:
  369. *value = current_evmcs->host_tr_base;
  370. break;
  371. case HOST_GDTR_BASE:
  372. *value = current_evmcs->host_gdtr_base;
  373. break;
  374. case HOST_IDTR_BASE:
  375. *value = current_evmcs->host_idtr_base;
  376. break;
  377. case HOST_RSP:
  378. *value = current_evmcs->host_rsp;
  379. break;
  380. case EPT_POINTER:
  381. *value = current_evmcs->ept_pointer;
  382. break;
  383. case GUEST_BNDCFGS:
  384. *value = current_evmcs->guest_bndcfgs;
  385. break;
  386. case XSS_EXIT_BITMAP:
  387. *value = current_evmcs->xss_exit_bitmap;
  388. break;
  389. case GUEST_PHYSICAL_ADDRESS:
  390. *value = current_evmcs->guest_physical_address;
  391. break;
  392. case EXIT_QUALIFICATION:
  393. *value = current_evmcs->exit_qualification;
  394. break;
  395. case GUEST_LINEAR_ADDRESS:
  396. *value = current_evmcs->guest_linear_address;
  397. break;
  398. case VM_EXIT_MSR_STORE_ADDR:
  399. *value = current_evmcs->vm_exit_msr_store_addr;
  400. break;
  401. case VM_EXIT_MSR_LOAD_ADDR:
  402. *value = current_evmcs->vm_exit_msr_load_addr;
  403. break;
  404. case VM_ENTRY_MSR_LOAD_ADDR:
  405. *value = current_evmcs->vm_entry_msr_load_addr;
  406. break;
  407. case CR3_TARGET_VALUE0:
  408. *value = current_evmcs->cr3_target_value0;
  409. break;
  410. case CR3_TARGET_VALUE1:
  411. *value = current_evmcs->cr3_target_value1;
  412. break;
  413. case CR3_TARGET_VALUE2:
  414. *value = current_evmcs->cr3_target_value2;
  415. break;
  416. case CR3_TARGET_VALUE3:
  417. *value = current_evmcs->cr3_target_value3;
  418. break;
  419. case TPR_THRESHOLD:
  420. *value = current_evmcs->tpr_threshold;
  421. break;
  422. case GUEST_INTERRUPTIBILITY_INFO:
  423. *value = current_evmcs->guest_interruptibility_info;
  424. break;
  425. case CPU_BASED_VM_EXEC_CONTROL:
  426. *value = current_evmcs->cpu_based_vm_exec_control;
  427. break;
  428. case EXCEPTION_BITMAP:
  429. *value = current_evmcs->exception_bitmap;
  430. break;
  431. case VM_ENTRY_CONTROLS:
  432. *value = current_evmcs->vm_entry_controls;
  433. break;
  434. case VM_ENTRY_INTR_INFO_FIELD:
  435. *value = current_evmcs->vm_entry_intr_info_field;
  436. break;
  437. case VM_ENTRY_EXCEPTION_ERROR_CODE:
  438. *value = current_evmcs->vm_entry_exception_error_code;
  439. break;
  440. case VM_ENTRY_INSTRUCTION_LEN:
  441. *value = current_evmcs->vm_entry_instruction_len;
  442. break;
  443. case HOST_IA32_SYSENTER_CS:
  444. *value = current_evmcs->host_ia32_sysenter_cs;
  445. break;
  446. case PIN_BASED_VM_EXEC_CONTROL:
  447. *value = current_evmcs->pin_based_vm_exec_control;
  448. break;
  449. case VM_EXIT_CONTROLS:
  450. *value = current_evmcs->vm_exit_controls;
  451. break;
  452. case SECONDARY_VM_EXEC_CONTROL:
  453. *value = current_evmcs->secondary_vm_exec_control;
  454. break;
  455. case GUEST_ES_LIMIT:
  456. *value = current_evmcs->guest_es_limit;
  457. break;
  458. case GUEST_CS_LIMIT:
  459. *value = current_evmcs->guest_cs_limit;
  460. break;
  461. case GUEST_SS_LIMIT:
  462. *value = current_evmcs->guest_ss_limit;
  463. break;
  464. case GUEST_DS_LIMIT:
  465. *value = current_evmcs->guest_ds_limit;
  466. break;
  467. case GUEST_FS_LIMIT:
  468. *value = current_evmcs->guest_fs_limit;
  469. break;
  470. case GUEST_GS_LIMIT:
  471. *value = current_evmcs->guest_gs_limit;
  472. break;
  473. case GUEST_LDTR_LIMIT:
  474. *value = current_evmcs->guest_ldtr_limit;
  475. break;
  476. case GUEST_TR_LIMIT:
  477. *value = current_evmcs->guest_tr_limit;
  478. break;
  479. case GUEST_GDTR_LIMIT:
  480. *value = current_evmcs->guest_gdtr_limit;
  481. break;
  482. case GUEST_IDTR_LIMIT:
  483. *value = current_evmcs->guest_idtr_limit;
  484. break;
  485. case GUEST_ES_AR_BYTES:
  486. *value = current_evmcs->guest_es_ar_bytes;
  487. break;
  488. case GUEST_CS_AR_BYTES:
  489. *value = current_evmcs->guest_cs_ar_bytes;
  490. break;
  491. case GUEST_SS_AR_BYTES:
  492. *value = current_evmcs->guest_ss_ar_bytes;
  493. break;
  494. case GUEST_DS_AR_BYTES:
  495. *value = current_evmcs->guest_ds_ar_bytes;
  496. break;
  497. case GUEST_FS_AR_BYTES:
  498. *value = current_evmcs->guest_fs_ar_bytes;
  499. break;
  500. case GUEST_GS_AR_BYTES:
  501. *value = current_evmcs->guest_gs_ar_bytes;
  502. break;
  503. case GUEST_LDTR_AR_BYTES:
  504. *value = current_evmcs->guest_ldtr_ar_bytes;
  505. break;
  506. case GUEST_TR_AR_BYTES:
  507. *value = current_evmcs->guest_tr_ar_bytes;
  508. break;
  509. case GUEST_ACTIVITY_STATE:
  510. *value = current_evmcs->guest_activity_state;
  511. break;
  512. case GUEST_SYSENTER_CS:
  513. *value = current_evmcs->guest_sysenter_cs;
  514. break;
  515. case VM_INSTRUCTION_ERROR:
  516. *value = current_evmcs->vm_instruction_error;
  517. break;
  518. case VM_EXIT_REASON:
  519. *value = current_evmcs->vm_exit_reason;
  520. break;
  521. case VM_EXIT_INTR_INFO:
  522. *value = current_evmcs->vm_exit_intr_info;
  523. break;
  524. case VM_EXIT_INTR_ERROR_CODE:
  525. *value = current_evmcs->vm_exit_intr_error_code;
  526. break;
  527. case IDT_VECTORING_INFO_FIELD:
  528. *value = current_evmcs->idt_vectoring_info_field;
  529. break;
  530. case IDT_VECTORING_ERROR_CODE:
  531. *value = current_evmcs->idt_vectoring_error_code;
  532. break;
  533. case VM_EXIT_INSTRUCTION_LEN:
  534. *value = current_evmcs->vm_exit_instruction_len;
  535. break;
  536. case VMX_INSTRUCTION_INFO:
  537. *value = current_evmcs->vmx_instruction_info;
  538. break;
  539. case PAGE_FAULT_ERROR_CODE_MASK:
  540. *value = current_evmcs->page_fault_error_code_mask;
  541. break;
  542. case PAGE_FAULT_ERROR_CODE_MATCH:
  543. *value = current_evmcs->page_fault_error_code_match;
  544. break;
  545. case CR3_TARGET_COUNT:
  546. *value = current_evmcs->cr3_target_count;
  547. break;
  548. case VM_EXIT_MSR_STORE_COUNT:
  549. *value = current_evmcs->vm_exit_msr_store_count;
  550. break;
  551. case VM_EXIT_MSR_LOAD_COUNT:
  552. *value = current_evmcs->vm_exit_msr_load_count;
  553. break;
  554. case VM_ENTRY_MSR_LOAD_COUNT:
  555. *value = current_evmcs->vm_entry_msr_load_count;
  556. break;
  557. case HOST_ES_SELECTOR:
  558. *value = current_evmcs->host_es_selector;
  559. break;
  560. case HOST_CS_SELECTOR:
  561. *value = current_evmcs->host_cs_selector;
  562. break;
  563. case HOST_SS_SELECTOR:
  564. *value = current_evmcs->host_ss_selector;
  565. break;
  566. case HOST_DS_SELECTOR:
  567. *value = current_evmcs->host_ds_selector;
  568. break;
  569. case HOST_FS_SELECTOR:
  570. *value = current_evmcs->host_fs_selector;
  571. break;
  572. case HOST_GS_SELECTOR:
  573. *value = current_evmcs->host_gs_selector;
  574. break;
  575. case HOST_TR_SELECTOR:
  576. *value = current_evmcs->host_tr_selector;
  577. break;
  578. case GUEST_ES_SELECTOR:
  579. *value = current_evmcs->guest_es_selector;
  580. break;
  581. case GUEST_CS_SELECTOR:
  582. *value = current_evmcs->guest_cs_selector;
  583. break;
  584. case GUEST_SS_SELECTOR:
  585. *value = current_evmcs->guest_ss_selector;
  586. break;
  587. case GUEST_DS_SELECTOR:
  588. *value = current_evmcs->guest_ds_selector;
  589. break;
  590. case GUEST_FS_SELECTOR:
  591. *value = current_evmcs->guest_fs_selector;
  592. break;
  593. case GUEST_GS_SELECTOR:
  594. *value = current_evmcs->guest_gs_selector;
  595. break;
  596. case GUEST_LDTR_SELECTOR:
  597. *value = current_evmcs->guest_ldtr_selector;
  598. break;
  599. case GUEST_TR_SELECTOR:
  600. *value = current_evmcs->guest_tr_selector;
  601. break;
  602. case VIRTUAL_PROCESSOR_ID:
  603. *value = current_evmcs->virtual_processor_id;
  604. break;
  605. case HOST_IA32_PERF_GLOBAL_CTRL:
  606. *value = current_evmcs->host_ia32_perf_global_ctrl;
  607. break;
  608. case GUEST_IA32_PERF_GLOBAL_CTRL:
  609. *value = current_evmcs->guest_ia32_perf_global_ctrl;
  610. break;
  611. case ENCLS_EXITING_BITMAP:
  612. *value = current_evmcs->encls_exiting_bitmap;
  613. break;
  614. case TSC_MULTIPLIER:
  615. *value = current_evmcs->tsc_multiplier;
  616. break;
  617. default: return 1;
  618. }
  619. return 0;
  620. }
  621. static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
  622. {
  623. switch (encoding) {
  624. case GUEST_RIP:
  625. current_evmcs->guest_rip = value;
  626. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  627. break;
  628. case GUEST_RSP:
  629. current_evmcs->guest_rsp = value;
  630. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC;
  631. break;
  632. case GUEST_RFLAGS:
  633. current_evmcs->guest_rflags = value;
  634. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC;
  635. break;
  636. case HOST_IA32_PAT:
  637. current_evmcs->host_ia32_pat = value;
  638. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  639. break;
  640. case HOST_IA32_EFER:
  641. current_evmcs->host_ia32_efer = value;
  642. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  643. break;
  644. case HOST_CR0:
  645. current_evmcs->host_cr0 = value;
  646. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  647. break;
  648. case HOST_CR3:
  649. current_evmcs->host_cr3 = value;
  650. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  651. break;
  652. case HOST_CR4:
  653. current_evmcs->host_cr4 = value;
  654. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  655. break;
  656. case HOST_IA32_SYSENTER_ESP:
  657. current_evmcs->host_ia32_sysenter_esp = value;
  658. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  659. break;
  660. case HOST_IA32_SYSENTER_EIP:
  661. current_evmcs->host_ia32_sysenter_eip = value;
  662. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  663. break;
  664. case HOST_RIP:
  665. current_evmcs->host_rip = value;
  666. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  667. break;
  668. case IO_BITMAP_A:
  669. current_evmcs->io_bitmap_a = value;
  670. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP;
  671. break;
  672. case IO_BITMAP_B:
  673. current_evmcs->io_bitmap_b = value;
  674. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_IO_BITMAP;
  675. break;
  676. case MSR_BITMAP:
  677. current_evmcs->msr_bitmap = value;
  678. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP;
  679. break;
  680. case GUEST_ES_BASE:
  681. current_evmcs->guest_es_base = value;
  682. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  683. break;
  684. case GUEST_CS_BASE:
  685. current_evmcs->guest_cs_base = value;
  686. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  687. break;
  688. case GUEST_SS_BASE:
  689. current_evmcs->guest_ss_base = value;
  690. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  691. break;
  692. case GUEST_DS_BASE:
  693. current_evmcs->guest_ds_base = value;
  694. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  695. break;
  696. case GUEST_FS_BASE:
  697. current_evmcs->guest_fs_base = value;
  698. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  699. break;
  700. case GUEST_GS_BASE:
  701. current_evmcs->guest_gs_base = value;
  702. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  703. break;
  704. case GUEST_LDTR_BASE:
  705. current_evmcs->guest_ldtr_base = value;
  706. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  707. break;
  708. case GUEST_TR_BASE:
  709. current_evmcs->guest_tr_base = value;
  710. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  711. break;
  712. case GUEST_GDTR_BASE:
  713. current_evmcs->guest_gdtr_base = value;
  714. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  715. break;
  716. case GUEST_IDTR_BASE:
  717. current_evmcs->guest_idtr_base = value;
  718. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  719. break;
  720. case TSC_OFFSET:
  721. current_evmcs->tsc_offset = value;
  722. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
  723. break;
  724. case VIRTUAL_APIC_PAGE_ADDR:
  725. current_evmcs->virtual_apic_page_addr = value;
  726. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
  727. break;
  728. case VMCS_LINK_POINTER:
  729. current_evmcs->vmcs_link_pointer = value;
  730. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  731. break;
  732. case GUEST_IA32_DEBUGCTL:
  733. current_evmcs->guest_ia32_debugctl = value;
  734. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  735. break;
  736. case GUEST_IA32_PAT:
  737. current_evmcs->guest_ia32_pat = value;
  738. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  739. break;
  740. case GUEST_IA32_EFER:
  741. current_evmcs->guest_ia32_efer = value;
  742. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  743. break;
  744. case GUEST_PDPTR0:
  745. current_evmcs->guest_pdptr0 = value;
  746. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  747. break;
  748. case GUEST_PDPTR1:
  749. current_evmcs->guest_pdptr1 = value;
  750. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  751. break;
  752. case GUEST_PDPTR2:
  753. current_evmcs->guest_pdptr2 = value;
  754. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  755. break;
  756. case GUEST_PDPTR3:
  757. current_evmcs->guest_pdptr3 = value;
  758. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  759. break;
  760. case GUEST_PENDING_DBG_EXCEPTIONS:
  761. current_evmcs->guest_pending_dbg_exceptions = value;
  762. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  763. break;
  764. case GUEST_SYSENTER_ESP:
  765. current_evmcs->guest_sysenter_esp = value;
  766. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  767. break;
  768. case GUEST_SYSENTER_EIP:
  769. current_evmcs->guest_sysenter_eip = value;
  770. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  771. break;
  772. case CR0_GUEST_HOST_MASK:
  773. current_evmcs->cr0_guest_host_mask = value;
  774. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  775. break;
  776. case CR4_GUEST_HOST_MASK:
  777. current_evmcs->cr4_guest_host_mask = value;
  778. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  779. break;
  780. case CR0_READ_SHADOW:
  781. current_evmcs->cr0_read_shadow = value;
  782. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  783. break;
  784. case CR4_READ_SHADOW:
  785. current_evmcs->cr4_read_shadow = value;
  786. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  787. break;
  788. case GUEST_CR0:
  789. current_evmcs->guest_cr0 = value;
  790. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  791. break;
  792. case GUEST_CR3:
  793. current_evmcs->guest_cr3 = value;
  794. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  795. break;
  796. case GUEST_CR4:
  797. current_evmcs->guest_cr4 = value;
  798. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  799. break;
  800. case GUEST_DR7:
  801. current_evmcs->guest_dr7 = value;
  802. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CRDR;
  803. break;
  804. case HOST_FS_BASE:
  805. current_evmcs->host_fs_base = value;
  806. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  807. break;
  808. case HOST_GS_BASE:
  809. current_evmcs->host_gs_base = value;
  810. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  811. break;
  812. case HOST_TR_BASE:
  813. current_evmcs->host_tr_base = value;
  814. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  815. break;
  816. case HOST_GDTR_BASE:
  817. current_evmcs->host_gdtr_base = value;
  818. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  819. break;
  820. case HOST_IDTR_BASE:
  821. current_evmcs->host_idtr_base = value;
  822. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  823. break;
  824. case HOST_RSP:
  825. current_evmcs->host_rsp = value;
  826. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  827. break;
  828. case EPT_POINTER:
  829. current_evmcs->ept_pointer = value;
  830. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT;
  831. break;
  832. case GUEST_BNDCFGS:
  833. current_evmcs->guest_bndcfgs = value;
  834. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  835. break;
  836. case XSS_EXIT_BITMAP:
  837. current_evmcs->xss_exit_bitmap = value;
  838. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
  839. break;
  840. case GUEST_PHYSICAL_ADDRESS:
  841. current_evmcs->guest_physical_address = value;
  842. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  843. break;
  844. case EXIT_QUALIFICATION:
  845. current_evmcs->exit_qualification = value;
  846. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  847. break;
  848. case GUEST_LINEAR_ADDRESS:
  849. current_evmcs->guest_linear_address = value;
  850. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  851. break;
  852. case VM_EXIT_MSR_STORE_ADDR:
  853. current_evmcs->vm_exit_msr_store_addr = value;
  854. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  855. break;
  856. case VM_EXIT_MSR_LOAD_ADDR:
  857. current_evmcs->vm_exit_msr_load_addr = value;
  858. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  859. break;
  860. case VM_ENTRY_MSR_LOAD_ADDR:
  861. current_evmcs->vm_entry_msr_load_addr = value;
  862. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  863. break;
  864. case CR3_TARGET_VALUE0:
  865. current_evmcs->cr3_target_value0 = value;
  866. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  867. break;
  868. case CR3_TARGET_VALUE1:
  869. current_evmcs->cr3_target_value1 = value;
  870. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  871. break;
  872. case CR3_TARGET_VALUE2:
  873. current_evmcs->cr3_target_value2 = value;
  874. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  875. break;
  876. case CR3_TARGET_VALUE3:
  877. current_evmcs->cr3_target_value3 = value;
  878. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  879. break;
  880. case TPR_THRESHOLD:
  881. current_evmcs->tpr_threshold = value;
  882. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  883. break;
  884. case GUEST_INTERRUPTIBILITY_INFO:
  885. current_evmcs->guest_interruptibility_info = value;
  886. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC;
  887. break;
  888. case CPU_BASED_VM_EXEC_CONTROL:
  889. current_evmcs->cpu_based_vm_exec_control = value;
  890. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_PROC;
  891. break;
  892. case EXCEPTION_BITMAP:
  893. current_evmcs->exception_bitmap = value;
  894. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EXCPN;
  895. break;
  896. case VM_ENTRY_CONTROLS:
  897. current_evmcs->vm_entry_controls = value;
  898. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_ENTRY;
  899. break;
  900. case VM_ENTRY_INTR_INFO_FIELD:
  901. current_evmcs->vm_entry_intr_info_field = value;
  902. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT;
  903. break;
  904. case VM_ENTRY_EXCEPTION_ERROR_CODE:
  905. current_evmcs->vm_entry_exception_error_code = value;
  906. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT;
  907. break;
  908. case VM_ENTRY_INSTRUCTION_LEN:
  909. current_evmcs->vm_entry_instruction_len = value;
  910. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_EVENT;
  911. break;
  912. case HOST_IA32_SYSENTER_CS:
  913. current_evmcs->host_ia32_sysenter_cs = value;
  914. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  915. break;
  916. case PIN_BASED_VM_EXEC_CONTROL:
  917. current_evmcs->pin_based_vm_exec_control = value;
  918. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1;
  919. break;
  920. case VM_EXIT_CONTROLS:
  921. current_evmcs->vm_exit_controls = value;
  922. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1;
  923. break;
  924. case SECONDARY_VM_EXEC_CONTROL:
  925. current_evmcs->secondary_vm_exec_control = value;
  926. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP1;
  927. break;
  928. case GUEST_ES_LIMIT:
  929. current_evmcs->guest_es_limit = value;
  930. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  931. break;
  932. case GUEST_CS_LIMIT:
  933. current_evmcs->guest_cs_limit = value;
  934. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  935. break;
  936. case GUEST_SS_LIMIT:
  937. current_evmcs->guest_ss_limit = value;
  938. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  939. break;
  940. case GUEST_DS_LIMIT:
  941. current_evmcs->guest_ds_limit = value;
  942. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  943. break;
  944. case GUEST_FS_LIMIT:
  945. current_evmcs->guest_fs_limit = value;
  946. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  947. break;
  948. case GUEST_GS_LIMIT:
  949. current_evmcs->guest_gs_limit = value;
  950. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  951. break;
  952. case GUEST_LDTR_LIMIT:
  953. current_evmcs->guest_ldtr_limit = value;
  954. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  955. break;
  956. case GUEST_TR_LIMIT:
  957. current_evmcs->guest_tr_limit = value;
  958. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  959. break;
  960. case GUEST_GDTR_LIMIT:
  961. current_evmcs->guest_gdtr_limit = value;
  962. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  963. break;
  964. case GUEST_IDTR_LIMIT:
  965. current_evmcs->guest_idtr_limit = value;
  966. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  967. break;
  968. case GUEST_ES_AR_BYTES:
  969. current_evmcs->guest_es_ar_bytes = value;
  970. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  971. break;
  972. case GUEST_CS_AR_BYTES:
  973. current_evmcs->guest_cs_ar_bytes = value;
  974. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  975. break;
  976. case GUEST_SS_AR_BYTES:
  977. current_evmcs->guest_ss_ar_bytes = value;
  978. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  979. break;
  980. case GUEST_DS_AR_BYTES:
  981. current_evmcs->guest_ds_ar_bytes = value;
  982. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  983. break;
  984. case GUEST_FS_AR_BYTES:
  985. current_evmcs->guest_fs_ar_bytes = value;
  986. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  987. break;
  988. case GUEST_GS_AR_BYTES:
  989. current_evmcs->guest_gs_ar_bytes = value;
  990. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  991. break;
  992. case GUEST_LDTR_AR_BYTES:
  993. current_evmcs->guest_ldtr_ar_bytes = value;
  994. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  995. break;
  996. case GUEST_TR_AR_BYTES:
  997. current_evmcs->guest_tr_ar_bytes = value;
  998. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  999. break;
  1000. case GUEST_ACTIVITY_STATE:
  1001. current_evmcs->guest_activity_state = value;
  1002. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  1003. break;
  1004. case GUEST_SYSENTER_CS:
  1005. current_evmcs->guest_sysenter_cs = value;
  1006. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  1007. break;
  1008. case VM_INSTRUCTION_ERROR:
  1009. current_evmcs->vm_instruction_error = value;
  1010. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1011. break;
  1012. case VM_EXIT_REASON:
  1013. current_evmcs->vm_exit_reason = value;
  1014. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1015. break;
  1016. case VM_EXIT_INTR_INFO:
  1017. current_evmcs->vm_exit_intr_info = value;
  1018. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1019. break;
  1020. case VM_EXIT_INTR_ERROR_CODE:
  1021. current_evmcs->vm_exit_intr_error_code = value;
  1022. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1023. break;
  1024. case IDT_VECTORING_INFO_FIELD:
  1025. current_evmcs->idt_vectoring_info_field = value;
  1026. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1027. break;
  1028. case IDT_VECTORING_ERROR_CODE:
  1029. current_evmcs->idt_vectoring_error_code = value;
  1030. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1031. break;
  1032. case VM_EXIT_INSTRUCTION_LEN:
  1033. current_evmcs->vm_exit_instruction_len = value;
  1034. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1035. break;
  1036. case VMX_INSTRUCTION_INFO:
  1037. current_evmcs->vmx_instruction_info = value;
  1038. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE;
  1039. break;
  1040. case PAGE_FAULT_ERROR_CODE_MASK:
  1041. current_evmcs->page_fault_error_code_mask = value;
  1042. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  1043. break;
  1044. case PAGE_FAULT_ERROR_CODE_MATCH:
  1045. current_evmcs->page_fault_error_code_match = value;
  1046. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  1047. break;
  1048. case CR3_TARGET_COUNT:
  1049. current_evmcs->cr3_target_count = value;
  1050. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  1051. break;
  1052. case VM_EXIT_MSR_STORE_COUNT:
  1053. current_evmcs->vm_exit_msr_store_count = value;
  1054. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  1055. break;
  1056. case VM_EXIT_MSR_LOAD_COUNT:
  1057. current_evmcs->vm_exit_msr_load_count = value;
  1058. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  1059. break;
  1060. case VM_ENTRY_MSR_LOAD_COUNT:
  1061. current_evmcs->vm_entry_msr_load_count = value;
  1062. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL;
  1063. break;
  1064. case HOST_ES_SELECTOR:
  1065. current_evmcs->host_es_selector = value;
  1066. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1067. break;
  1068. case HOST_CS_SELECTOR:
  1069. current_evmcs->host_cs_selector = value;
  1070. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1071. break;
  1072. case HOST_SS_SELECTOR:
  1073. current_evmcs->host_ss_selector = value;
  1074. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1075. break;
  1076. case HOST_DS_SELECTOR:
  1077. current_evmcs->host_ds_selector = value;
  1078. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1079. break;
  1080. case HOST_FS_SELECTOR:
  1081. current_evmcs->host_fs_selector = value;
  1082. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1083. break;
  1084. case HOST_GS_SELECTOR:
  1085. current_evmcs->host_gs_selector = value;
  1086. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1087. break;
  1088. case HOST_TR_SELECTOR:
  1089. current_evmcs->host_tr_selector = value;
  1090. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1091. break;
  1092. case GUEST_ES_SELECTOR:
  1093. current_evmcs->guest_es_selector = value;
  1094. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1095. break;
  1096. case GUEST_CS_SELECTOR:
  1097. current_evmcs->guest_cs_selector = value;
  1098. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1099. break;
  1100. case GUEST_SS_SELECTOR:
  1101. current_evmcs->guest_ss_selector = value;
  1102. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1103. break;
  1104. case GUEST_DS_SELECTOR:
  1105. current_evmcs->guest_ds_selector = value;
  1106. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1107. break;
  1108. case GUEST_FS_SELECTOR:
  1109. current_evmcs->guest_fs_selector = value;
  1110. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1111. break;
  1112. case GUEST_GS_SELECTOR:
  1113. current_evmcs->guest_gs_selector = value;
  1114. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1115. break;
  1116. case GUEST_LDTR_SELECTOR:
  1117. current_evmcs->guest_ldtr_selector = value;
  1118. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1119. break;
  1120. case GUEST_TR_SELECTOR:
  1121. current_evmcs->guest_tr_selector = value;
  1122. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2;
  1123. break;
  1124. case VIRTUAL_PROCESSOR_ID:
  1125. current_evmcs->virtual_processor_id = value;
  1126. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_XLAT;
  1127. break;
  1128. case HOST_IA32_PERF_GLOBAL_CTRL:
  1129. current_evmcs->host_ia32_perf_global_ctrl = value;
  1130. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1131. break;
  1132. case GUEST_IA32_PERF_GLOBAL_CTRL:
  1133. current_evmcs->guest_ia32_perf_global_ctrl = value;
  1134. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP1;
  1135. break;
  1136. case ENCLS_EXITING_BITMAP:
  1137. current_evmcs->encls_exiting_bitmap = value;
  1138. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
  1139. break;
  1140. case TSC_MULTIPLIER:
  1141. current_evmcs->tsc_multiplier = value;
  1142. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_CONTROL_GRP2;
  1143. break;
  1144. default: return 1;
  1145. }
  1146. return 0;
  1147. }
  1148. static inline int evmcs_vmlaunch(void)
  1149. {
  1150. int ret;
  1151. current_evmcs->hv_clean_fields = 0;
  1152. __asm__ __volatile__("push %%rbp;"
  1153. "push %%rcx;"
  1154. "push %%rdx;"
  1155. "push %%rsi;"
  1156. "push %%rdi;"
  1157. "push $0;"
  1158. "mov %%rsp, (%[host_rsp]);"
  1159. "lea 1f(%%rip), %%rax;"
  1160. "mov %%rax, (%[host_rip]);"
  1161. "vmlaunch;"
  1162. "incq (%%rsp);"
  1163. "1: pop %%rax;"
  1164. "pop %%rdi;"
  1165. "pop %%rsi;"
  1166. "pop %%rdx;"
  1167. "pop %%rcx;"
  1168. "pop %%rbp;"
  1169. : [ret]"=&a"(ret)
  1170. : [host_rsp]"r"
  1171. ((uint64_t)&current_evmcs->host_rsp),
  1172. [host_rip]"r"
  1173. ((uint64_t)&current_evmcs->host_rip)
  1174. : "memory", "cc", "rbx", "r8", "r9", "r10",
  1175. "r11", "r12", "r13", "r14", "r15");
  1176. return ret;
  1177. }
  1178. /*
  1179. * No guest state (e.g. GPRs) is established by this vmresume.
  1180. */
  1181. static inline int evmcs_vmresume(void)
  1182. {
  1183. int ret;
  1184. /* HOST_RIP */
  1185. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_GRP1;
  1186. /* HOST_RSP */
  1187. current_evmcs->hv_clean_fields &= ~HV_VMX_ENLIGHTENED_CLEAN_FIELD_HOST_POINTER;
  1188. __asm__ __volatile__("push %%rbp;"
  1189. "push %%rcx;"
  1190. "push %%rdx;"
  1191. "push %%rsi;"
  1192. "push %%rdi;"
  1193. "push $0;"
  1194. "mov %%rsp, (%[host_rsp]);"
  1195. "lea 1f(%%rip), %%rax;"
  1196. "mov %%rax, (%[host_rip]);"
  1197. "vmresume;"
  1198. "incq (%%rsp);"
  1199. "1: pop %%rax;"
  1200. "pop %%rdi;"
  1201. "pop %%rsi;"
  1202. "pop %%rdx;"
  1203. "pop %%rcx;"
  1204. "pop %%rbp;"
  1205. : [ret]"=&a"(ret)
  1206. : [host_rsp]"r"
  1207. ((uint64_t)&current_evmcs->host_rsp),
  1208. [host_rip]"r"
  1209. ((uint64_t)&current_evmcs->host_rip)
  1210. : "memory", "cc", "rbx", "r8", "r9", "r10",
  1211. "r11", "r12", "r13", "r14", "r15");
  1212. return ret;
  1213. }
  1214. #endif /* !SELFTEST_KVM_EVMCS_H */