1 /* SPDX-License-Identifier: GPL-2.0 */
3 * tools/testing/selftests/kvm/include/vmx.h
5 * Copyright (C) 2018, Red Hat, Inc.
9 #ifndef SELFTEST_KVM_EVMCS_H
10 #define SELFTEST_KVM_EVMCS_H
19 extern bool enable_evmcs;
21 struct hv_vp_assist_page {
25 __u64 nested_enlightenments_control[2];
26 __u32 enlighten_vmentry;
27 __u64 current_nested_vmcs;
30 struct hv_enlightened_vmcs {
49 u64 host_ia32_sysenter_esp;
50 u64 host_ia32_sysenter_eip;
52 u32 host_ia32_sysenter_cs;
54 u32 pin_based_vm_exec_control;
56 u32 secondary_vm_exec_control;
62 u16 guest_es_selector;
63 u16 guest_cs_selector;
64 u16 guest_ss_selector;
65 u16 guest_ds_selector;
66 u16 guest_fs_selector;
67 u16 guest_gs_selector;
68 u16 guest_ldtr_selector;
69 u16 guest_tr_selector;
82 u32 guest_es_ar_bytes;
83 u32 guest_cs_ar_bytes;
84 u32 guest_ss_ar_bytes;
85 u32 guest_ds_ar_bytes;
86 u32 guest_fs_ar_bytes;
87 u32 guest_gs_ar_bytes;
88 u32 guest_ldtr_ar_bytes;
89 u32 guest_tr_ar_bytes;
104 u64 vm_exit_msr_store_addr;
105 u64 vm_exit_msr_load_addr;
106 u64 vm_entry_msr_load_addr;
108 u64 cr3_target_value0;
109 u64 cr3_target_value1;
110 u64 cr3_target_value2;
111 u64 cr3_target_value3;
113 u32 page_fault_error_code_mask;
114 u32 page_fault_error_code_match;
116 u32 cr3_target_count;
117 u32 vm_exit_msr_store_count;
118 u32 vm_exit_msr_load_count;
119 u32 vm_entry_msr_load_count;
122 u64 virtual_apic_page_addr;
123 u64 vmcs_link_pointer;
125 u64 guest_ia32_debugctl;
134 u64 guest_pending_dbg_exceptions;
135 u64 guest_sysenter_esp;
136 u64 guest_sysenter_eip;
138 u32 guest_activity_state;
139 u32 guest_sysenter_cs;
141 u64 cr0_guest_host_mask;
142 u64 cr4_guest_host_mask;
159 u16 virtual_processor_id;
163 u64 guest_physical_address;
165 u32 vm_instruction_error;
167 u32 vm_exit_intr_info;
168 u32 vm_exit_intr_error_code;
169 u32 idt_vectoring_info_field;
170 u32 idt_vectoring_error_code;
171 u32 vm_exit_instruction_len;
172 u32 vmx_instruction_info;
174 u64 exit_qualification;
175 u64 exit_io_instruction_ecx;
176 u64 exit_io_instruction_esi;
177 u64 exit_io_instruction_edi;
178 u64 exit_io_instruction_eip;
180 u64 guest_linear_address;
184 u32 guest_interruptibility_info;
185 u32 cpu_based_vm_exec_control;
186 u32 exception_bitmap;
187 u32 vm_entry_controls;
188 u32 vm_entry_intr_info_field;
189 u32 vm_entry_exception_error_code;
190 u32 vm_entry_instruction_len;
197 u32 hv_synthetic_controls;
199 u32 nested_flush_hypercall:1;
202 } hv_enlightenments_control;
206 u64 partition_assist_page;
214 #define HV_X64_MSR_VP_ASSIST_PAGE 0x40000073
215 #define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE 0x00000001
216 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT 12
217 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK \
218 (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
220 struct hv_enlightened_vmcs *current_evmcs;
221 struct hv_vp_assist_page *current_vp_assist;
223 int vcpu_enable_evmcs(struct kvm_vm *vm, int vcpu_id);
225 static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
227 u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
228 HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
230 wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
232 current_vp_assist = vp_assist;
239 static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
241 current_vp_assist->current_nested_vmcs = vmcs_pa;
242 current_vp_assist->enlighten_vmentry = 1;
244 current_evmcs = vmcs;
249 static inline int evmcs_vmptrst(uint64_t *value)
251 *value = current_vp_assist->current_nested_vmcs &
252 ~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
257 static inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
261 *value = current_evmcs->guest_rip;
264 *value = current_evmcs->guest_rsp;
267 *value = current_evmcs->guest_rflags;
270 *value = current_evmcs->host_ia32_pat;
273 *value = current_evmcs->host_ia32_efer;
276 *value = current_evmcs->host_cr0;
279 *value = current_evmcs->host_cr3;
282 *value = current_evmcs->host_cr4;
284 case HOST_IA32_SYSENTER_ESP:
285 *value = current_evmcs->host_ia32_sysenter_esp;
287 case HOST_IA32_SYSENTER_EIP:
288 *value = current_evmcs->host_ia32_sysenter_eip;
291 *value = current_evmcs->host_rip;
294 *value = current_evmcs->io_bitmap_a;
297 *value = current_evmcs->io_bitmap_b;
300 *value = current_evmcs->msr_bitmap;
303 *value = current_evmcs->guest_es_base;
306 *value = current_evmcs->guest_cs_base;
309 *value = current_evmcs->guest_ss_base;
312 *value = current_evmcs->guest_ds_base;
315 *value = current_evmcs->guest_fs_base;
318 *value = current_evmcs->guest_gs_base;
320 case GUEST_LDTR_BASE:
321 *value = current_evmcs->guest_ldtr_base;
324 *value = current_evmcs->guest_tr_base;
326 case GUEST_GDTR_BASE:
327 *value = current_evmcs->guest_gdtr_base;
329 case GUEST_IDTR_BASE:
330 *value = current_evmcs->guest_idtr_base;
333 *value = current_evmcs->tsc_offset;
335 case VIRTUAL_APIC_PAGE_ADDR:
336 *value = current_evmcs->virtual_apic_page_addr;
338 case VMCS_LINK_POINTER:
339 *value = current_evmcs->vmcs_link_pointer;
341 case GUEST_IA32_DEBUGCTL:
342 *value = current_evmcs->guest_ia32_debugctl;
345 *value = current_evmcs->guest_ia32_pat;
347 case GUEST_IA32_EFER:
348 *value = current_evmcs->guest_ia32_efer;
351 *value = current_evmcs->guest_pdptr0;
354 *value = current_evmcs->guest_pdptr1;
357 *value = current_evmcs->guest_pdptr2;
360 *value = current_evmcs->guest_pdptr3;
362 case GUEST_PENDING_DBG_EXCEPTIONS:
363 *value = current_evmcs->guest_pending_dbg_exceptions;
365 case GUEST_SYSENTER_ESP:
366 *value = current_evmcs->guest_sysenter_esp;
368 case GUEST_SYSENTER_EIP:
369 *value = current_evmcs->guest_sysenter_eip;
371 case CR0_GUEST_HOST_MASK:
372 *value = current_evmcs->cr0_guest_host_mask;
374 case CR4_GUEST_HOST_MASK:
375 *value = current_evmcs->cr4_guest_host_mask;
377 case CR0_READ_SHADOW:
378 *value = current_evmcs->cr0_read_shadow;
380 case CR4_READ_SHADOW:
381 *value = current_evmcs->cr4_read_shadow;
384 *value = current_evmcs->guest_cr0;
387 *value = current_evmcs->guest_cr3;
390 *value = current_evmcs->guest_cr4;
393 *value = current_evmcs->guest_dr7;
396 *value = current_evmcs->host_fs_base;
399 *value = current_evmcs->host_gs_base;
402 *value = current_evmcs->host_tr_base;
405 *value = current_evmcs->host_gdtr_base;
408 *value = current_evmcs->host_idtr_base;
411 *value = current_evmcs->host_rsp;
414 *value = current_evmcs->ept_pointer;
417 *value = current_evmcs->guest_bndcfgs;
419 case XSS_EXIT_BITMAP:
420 *value = current_evmcs->xss_exit_bitmap;
422 case GUEST_PHYSICAL_ADDRESS:
423 *value = current_evmcs->guest_physical_address;
425 case EXIT_QUALIFICATION:
426 *value = current_evmcs->exit_qualification;
428 case GUEST_LINEAR_ADDRESS:
429 *value = current_evmcs->guest_linear_address;
431 case VM_EXIT_MSR_STORE_ADDR:
432 *value = current_evmcs->vm_exit_msr_store_addr;
434 case VM_EXIT_MSR_LOAD_ADDR:
435 *value = current_evmcs->vm_exit_msr_load_addr;
437 case VM_ENTRY_MSR_LOAD_ADDR:
438 *value = current_evmcs->vm_entry_msr_load_addr;
440 case CR3_TARGET_VALUE0:
441 *value = current_evmcs->cr3_target_value0;
443 case CR3_TARGET_VALUE1:
444 *value = current_evmcs->cr3_target_value1;
446 case CR3_TARGET_VALUE2:
447 *value = current_evmcs->cr3_target_value2;
449 case CR3_TARGET_VALUE3:
450 *value = current_evmcs->cr3_target_value3;
453 *value = current_evmcs->tpr_threshold;
455 case GUEST_INTERRUPTIBILITY_INFO:
456 *value = current_evmcs->guest_interruptibility_info;
458 case CPU_BASED_VM_EXEC_CONTROL:
459 *value = current_evmcs->cpu_based_vm_exec_control;
461 case EXCEPTION_BITMAP:
462 *value = current_evmcs->exception_bitmap;
464 case VM_ENTRY_CONTROLS:
465 *value = current_evmcs->vm_entry_controls;
467 case VM_ENTRY_INTR_INFO_FIELD:
468 *value = current_evmcs->vm_entry_intr_info_field;
470 case VM_ENTRY_EXCEPTION_ERROR_CODE:
471 *value = current_evmcs->vm_entry_exception_error_code;
473 case VM_ENTRY_INSTRUCTION_LEN:
474 *value = current_evmcs->vm_entry_instruction_len;
476 case HOST_IA32_SYSENTER_CS:
477 *value = current_evmcs->host_ia32_sysenter_cs;
479 case PIN_BASED_VM_EXEC_CONTROL:
480 *value = current_evmcs->pin_based_vm_exec_control;
482 case VM_EXIT_CONTROLS:
483 *value = current_evmcs->vm_exit_controls;
485 case SECONDARY_VM_EXEC_CONTROL:
486 *value = current_evmcs->secondary_vm_exec_control;
489 *value = current_evmcs->guest_es_limit;
492 *value = current_evmcs->guest_cs_limit;
495 *value = current_evmcs->guest_ss_limit;
498 *value = current_evmcs->guest_ds_limit;
501 *value = current_evmcs->guest_fs_limit;
504 *value = current_evmcs->guest_gs_limit;
506 case GUEST_LDTR_LIMIT:
507 *value = current_evmcs->guest_ldtr_limit;
510 *value = current_evmcs->guest_tr_limit;
512 case GUEST_GDTR_LIMIT:
513 *value = current_evmcs->guest_gdtr_limit;
515 case GUEST_IDTR_LIMIT:
516 *value = current_evmcs->guest_idtr_limit;
518 case GUEST_ES_AR_BYTES:
519 *value = current_evmcs->guest_es_ar_bytes;
521 case GUEST_CS_AR_BYTES:
522 *value = current_evmcs->guest_cs_ar_bytes;
524 case GUEST_SS_AR_BYTES:
525 *value = current_evmcs->guest_ss_ar_bytes;
527 case GUEST_DS_AR_BYTES:
528 *value = current_evmcs->guest_ds_ar_bytes;
530 case GUEST_FS_AR_BYTES:
531 *value = current_evmcs->guest_fs_ar_bytes;
533 case GUEST_GS_AR_BYTES:
534 *value = current_evmcs->guest_gs_ar_bytes;
536 case GUEST_LDTR_AR_BYTES:
537 *value = current_evmcs->guest_ldtr_ar_bytes;
539 case GUEST_TR_AR_BYTES:
540 *value = current_evmcs->guest_tr_ar_bytes;
542 case GUEST_ACTIVITY_STATE:
543 *value = current_evmcs->guest_activity_state;
545 case GUEST_SYSENTER_CS:
546 *value = current_evmcs->guest_sysenter_cs;
548 case VM_INSTRUCTION_ERROR:
549 *value = current_evmcs->vm_instruction_error;
552 *value = current_evmcs->vm_exit_reason;
554 case VM_EXIT_INTR_INFO:
555 *value = current_evmcs->vm_exit_intr_info;
557 case VM_EXIT_INTR_ERROR_CODE:
558 *value = current_evmcs->vm_exit_intr_error_code;
560 case IDT_VECTORING_INFO_FIELD:
561 *value = current_evmcs->idt_vectoring_info_field;
563 case IDT_VECTORING_ERROR_CODE:
564 *value = current_evmcs->idt_vectoring_error_code;
566 case VM_EXIT_INSTRUCTION_LEN:
567 *value = current_evmcs->vm_exit_instruction_len;
569 case VMX_INSTRUCTION_INFO:
570 *value = current_evmcs->vmx_instruction_info;
572 case PAGE_FAULT_ERROR_CODE_MASK:
573 *value = current_evmcs->page_fault_error_code_mask;
575 case PAGE_FAULT_ERROR_CODE_MATCH:
576 *value = current_evmcs->page_fault_error_code_match;
578 case CR3_TARGET_COUNT:
579 *value = current_evmcs->cr3_target_count;
581 case VM_EXIT_MSR_STORE_COUNT:
582 *value = current_evmcs->vm_exit_msr_store_count;
584 case VM_EXIT_MSR_LOAD_COUNT:
585 *value = current_evmcs->vm_exit_msr_load_count;
587 case VM_ENTRY_MSR_LOAD_COUNT:
588 *value = current_evmcs->vm_entry_msr_load_count;
590 case HOST_ES_SELECTOR:
591 *value = current_evmcs->host_es_selector;
593 case HOST_CS_SELECTOR:
594 *value = current_evmcs->host_cs_selector;
596 case HOST_SS_SELECTOR:
597 *value = current_evmcs->host_ss_selector;
599 case HOST_DS_SELECTOR:
600 *value = current_evmcs->host_ds_selector;
602 case HOST_FS_SELECTOR:
603 *value = current_evmcs->host_fs_selector;
605 case HOST_GS_SELECTOR:
606 *value = current_evmcs->host_gs_selector;
608 case HOST_TR_SELECTOR:
609 *value = current_evmcs->host_tr_selector;
611 case GUEST_ES_SELECTOR:
612 *value = current_evmcs->guest_es_selector;
614 case GUEST_CS_SELECTOR:
615 *value = current_evmcs->guest_cs_selector;
617 case GUEST_SS_SELECTOR:
618 *value = current_evmcs->guest_ss_selector;
620 case GUEST_DS_SELECTOR:
621 *value = current_evmcs->guest_ds_selector;
623 case GUEST_FS_SELECTOR:
624 *value = current_evmcs->guest_fs_selector;
626 case GUEST_GS_SELECTOR:
627 *value = current_evmcs->guest_gs_selector;
629 case GUEST_LDTR_SELECTOR:
630 *value = current_evmcs->guest_ldtr_selector;
632 case GUEST_TR_SELECTOR:
633 *value = current_evmcs->guest_tr_selector;
635 case VIRTUAL_PROCESSOR_ID:
636 *value = current_evmcs->virtual_processor_id;
644 static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
648 current_evmcs->guest_rip = value;
651 current_evmcs->guest_rsp = value;
654 current_evmcs->guest_rflags = value;
657 current_evmcs->host_ia32_pat = value;
660 current_evmcs->host_ia32_efer = value;
663 current_evmcs->host_cr0 = value;
666 current_evmcs->host_cr3 = value;
669 current_evmcs->host_cr4 = value;
671 case HOST_IA32_SYSENTER_ESP:
672 current_evmcs->host_ia32_sysenter_esp = value;
674 case HOST_IA32_SYSENTER_EIP:
675 current_evmcs->host_ia32_sysenter_eip = value;
678 current_evmcs->host_rip = value;
681 current_evmcs->io_bitmap_a = value;
684 current_evmcs->io_bitmap_b = value;
687 current_evmcs->msr_bitmap = value;
690 current_evmcs->guest_es_base = value;
693 current_evmcs->guest_cs_base = value;
696 current_evmcs->guest_ss_base = value;
699 current_evmcs->guest_ds_base = value;
702 current_evmcs->guest_fs_base = value;
705 current_evmcs->guest_gs_base = value;
707 case GUEST_LDTR_BASE:
708 current_evmcs->guest_ldtr_base = value;
711 current_evmcs->guest_tr_base = value;
713 case GUEST_GDTR_BASE:
714 current_evmcs->guest_gdtr_base = value;
716 case GUEST_IDTR_BASE:
717 current_evmcs->guest_idtr_base = value;
720 current_evmcs->tsc_offset = value;
722 case VIRTUAL_APIC_PAGE_ADDR:
723 current_evmcs->virtual_apic_page_addr = value;
725 case VMCS_LINK_POINTER:
726 current_evmcs->vmcs_link_pointer = value;
728 case GUEST_IA32_DEBUGCTL:
729 current_evmcs->guest_ia32_debugctl = value;
732 current_evmcs->guest_ia32_pat = value;
734 case GUEST_IA32_EFER:
735 current_evmcs->guest_ia32_efer = value;
738 current_evmcs->guest_pdptr0 = value;
741 current_evmcs->guest_pdptr1 = value;
744 current_evmcs->guest_pdptr2 = value;
747 current_evmcs->guest_pdptr3 = value;
749 case GUEST_PENDING_DBG_EXCEPTIONS:
750 current_evmcs->guest_pending_dbg_exceptions = value;
752 case GUEST_SYSENTER_ESP:
753 current_evmcs->guest_sysenter_esp = value;
755 case GUEST_SYSENTER_EIP:
756 current_evmcs->guest_sysenter_eip = value;
758 case CR0_GUEST_HOST_MASK:
759 current_evmcs->cr0_guest_host_mask = value;
761 case CR4_GUEST_HOST_MASK:
762 current_evmcs->cr4_guest_host_mask = value;
764 case CR0_READ_SHADOW:
765 current_evmcs->cr0_read_shadow = value;
767 case CR4_READ_SHADOW:
768 current_evmcs->cr4_read_shadow = value;
771 current_evmcs->guest_cr0 = value;
774 current_evmcs->guest_cr3 = value;
777 current_evmcs->guest_cr4 = value;
780 current_evmcs->guest_dr7 = value;
783 current_evmcs->host_fs_base = value;
786 current_evmcs->host_gs_base = value;
789 current_evmcs->host_tr_base = value;
792 current_evmcs->host_gdtr_base = value;
795 current_evmcs->host_idtr_base = value;
798 current_evmcs->host_rsp = value;
801 current_evmcs->ept_pointer = value;
804 current_evmcs->guest_bndcfgs = value;
806 case XSS_EXIT_BITMAP:
807 current_evmcs->xss_exit_bitmap = value;
809 case GUEST_PHYSICAL_ADDRESS:
810 current_evmcs->guest_physical_address = value;
812 case EXIT_QUALIFICATION:
813 current_evmcs->exit_qualification = value;
815 case GUEST_LINEAR_ADDRESS:
816 current_evmcs->guest_linear_address = value;
818 case VM_EXIT_MSR_STORE_ADDR:
819 current_evmcs->vm_exit_msr_store_addr = value;
821 case VM_EXIT_MSR_LOAD_ADDR:
822 current_evmcs->vm_exit_msr_load_addr = value;
824 case VM_ENTRY_MSR_LOAD_ADDR:
825 current_evmcs->vm_entry_msr_load_addr = value;
827 case CR3_TARGET_VALUE0:
828 current_evmcs->cr3_target_value0 = value;
830 case CR3_TARGET_VALUE1:
831 current_evmcs->cr3_target_value1 = value;
833 case CR3_TARGET_VALUE2:
834 current_evmcs->cr3_target_value2 = value;
836 case CR3_TARGET_VALUE3:
837 current_evmcs->cr3_target_value3 = value;
840 current_evmcs->tpr_threshold = value;
842 case GUEST_INTERRUPTIBILITY_INFO:
843 current_evmcs->guest_interruptibility_info = value;
845 case CPU_BASED_VM_EXEC_CONTROL:
846 current_evmcs->cpu_based_vm_exec_control = value;
848 case EXCEPTION_BITMAP:
849 current_evmcs->exception_bitmap = value;
851 case VM_ENTRY_CONTROLS:
852 current_evmcs->vm_entry_controls = value;
854 case VM_ENTRY_INTR_INFO_FIELD:
855 current_evmcs->vm_entry_intr_info_field = value;
857 case VM_ENTRY_EXCEPTION_ERROR_CODE:
858 current_evmcs->vm_entry_exception_error_code = value;
860 case VM_ENTRY_INSTRUCTION_LEN:
861 current_evmcs->vm_entry_instruction_len = value;
863 case HOST_IA32_SYSENTER_CS:
864 current_evmcs->host_ia32_sysenter_cs = value;
866 case PIN_BASED_VM_EXEC_CONTROL:
867 current_evmcs->pin_based_vm_exec_control = value;
869 case VM_EXIT_CONTROLS:
870 current_evmcs->vm_exit_controls = value;
872 case SECONDARY_VM_EXEC_CONTROL:
873 current_evmcs->secondary_vm_exec_control = value;
876 current_evmcs->guest_es_limit = value;
879 current_evmcs->guest_cs_limit = value;
882 current_evmcs->guest_ss_limit = value;
885 current_evmcs->guest_ds_limit = value;
888 current_evmcs->guest_fs_limit = value;
891 current_evmcs->guest_gs_limit = value;
893 case GUEST_LDTR_LIMIT:
894 current_evmcs->guest_ldtr_limit = value;
897 current_evmcs->guest_tr_limit = value;
899 case GUEST_GDTR_LIMIT:
900 current_evmcs->guest_gdtr_limit = value;
902 case GUEST_IDTR_LIMIT:
903 current_evmcs->guest_idtr_limit = value;
905 case GUEST_ES_AR_BYTES:
906 current_evmcs->guest_es_ar_bytes = value;
908 case GUEST_CS_AR_BYTES:
909 current_evmcs->guest_cs_ar_bytes = value;
911 case GUEST_SS_AR_BYTES:
912 current_evmcs->guest_ss_ar_bytes = value;
914 case GUEST_DS_AR_BYTES:
915 current_evmcs->guest_ds_ar_bytes = value;
917 case GUEST_FS_AR_BYTES:
918 current_evmcs->guest_fs_ar_bytes = value;
920 case GUEST_GS_AR_BYTES:
921 current_evmcs->guest_gs_ar_bytes = value;
923 case GUEST_LDTR_AR_BYTES:
924 current_evmcs->guest_ldtr_ar_bytes = value;
926 case GUEST_TR_AR_BYTES:
927 current_evmcs->guest_tr_ar_bytes = value;
929 case GUEST_ACTIVITY_STATE:
930 current_evmcs->guest_activity_state = value;
932 case GUEST_SYSENTER_CS:
933 current_evmcs->guest_sysenter_cs = value;
935 case VM_INSTRUCTION_ERROR:
936 current_evmcs->vm_instruction_error = value;
939 current_evmcs->vm_exit_reason = value;
941 case VM_EXIT_INTR_INFO:
942 current_evmcs->vm_exit_intr_info = value;
944 case VM_EXIT_INTR_ERROR_CODE:
945 current_evmcs->vm_exit_intr_error_code = value;
947 case IDT_VECTORING_INFO_FIELD:
948 current_evmcs->idt_vectoring_info_field = value;
950 case IDT_VECTORING_ERROR_CODE:
951 current_evmcs->idt_vectoring_error_code = value;
953 case VM_EXIT_INSTRUCTION_LEN:
954 current_evmcs->vm_exit_instruction_len = value;
956 case VMX_INSTRUCTION_INFO:
957 current_evmcs->vmx_instruction_info = value;
959 case PAGE_FAULT_ERROR_CODE_MASK:
960 current_evmcs->page_fault_error_code_mask = value;
962 case PAGE_FAULT_ERROR_CODE_MATCH:
963 current_evmcs->page_fault_error_code_match = value;
965 case CR3_TARGET_COUNT:
966 current_evmcs->cr3_target_count = value;
968 case VM_EXIT_MSR_STORE_COUNT:
969 current_evmcs->vm_exit_msr_store_count = value;
971 case VM_EXIT_MSR_LOAD_COUNT:
972 current_evmcs->vm_exit_msr_load_count = value;
974 case VM_ENTRY_MSR_LOAD_COUNT:
975 current_evmcs->vm_entry_msr_load_count = value;
977 case HOST_ES_SELECTOR:
978 current_evmcs->host_es_selector = value;
980 case HOST_CS_SELECTOR:
981 current_evmcs->host_cs_selector = value;
983 case HOST_SS_SELECTOR:
984 current_evmcs->host_ss_selector = value;
986 case HOST_DS_SELECTOR:
987 current_evmcs->host_ds_selector = value;
989 case HOST_FS_SELECTOR:
990 current_evmcs->host_fs_selector = value;
992 case HOST_GS_SELECTOR:
993 current_evmcs->host_gs_selector = value;
995 case HOST_TR_SELECTOR:
996 current_evmcs->host_tr_selector = value;
998 case GUEST_ES_SELECTOR:
999 current_evmcs->guest_es_selector = value;
1001 case GUEST_CS_SELECTOR:
1002 current_evmcs->guest_cs_selector = value;
1004 case GUEST_SS_SELECTOR:
1005 current_evmcs->guest_ss_selector = value;
1007 case GUEST_DS_SELECTOR:
1008 current_evmcs->guest_ds_selector = value;
1010 case GUEST_FS_SELECTOR:
1011 current_evmcs->guest_fs_selector = value;
1013 case GUEST_GS_SELECTOR:
1014 current_evmcs->guest_gs_selector = value;
1016 case GUEST_LDTR_SELECTOR:
1017 current_evmcs->guest_ldtr_selector = value;
1019 case GUEST_TR_SELECTOR:
1020 current_evmcs->guest_tr_selector = value;
1022 case VIRTUAL_PROCESSOR_ID:
1023 current_evmcs->virtual_processor_id = value;
1031 static inline int evmcs_vmlaunch(void)
1035 current_evmcs->hv_clean_fields = 0;
1037 __asm__ __volatile__("push %%rbp;"
1043 "mov %%rsp, (%[host_rsp]);"
1044 "lea 1f(%%rip), %%rax;"
1045 "mov %%rax, (%[host_rip]);"
1056 ((uint64_t)¤t_evmcs->host_rsp),
1058 ((uint64_t)¤t_evmcs->host_rip)
1059 : "memory", "cc", "rbx", "r8", "r9", "r10",
1060 "r11", "r12", "r13", "r14", "r15");
1065 * No guest state (e.g. GPRs) is established by this vmresume.
1067 static inline int evmcs_vmresume(void)
1071 current_evmcs->hv_clean_fields = 0;
1073 __asm__ __volatile__("push %%rbp;"
1079 "mov %%rsp, (%[host_rsp]);"
1080 "lea 1f(%%rip), %%rax;"
1081 "mov %%rax, (%[host_rip]);"
1092 ((uint64_t)¤t_evmcs->host_rsp),
1094 ((uint64_t)¤t_evmcs->host_rip)
1095 : "memory", "cc", "rbx", "r8", "r9", "r10",
1096 "r11", "r12", "r13", "r14", "r15");
1100 #endif /* !SELFTEST_KVM_EVMCS_H */