PageRenderTime 52ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/tools/testing/selftests/kvm/include/evmcs.h

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