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 static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
225 u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
226 HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
228 wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
230 current_vp_assist = vp_assist;
237 static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
239 current_vp_assist->current_nested_vmcs = vmcs_pa;
240 current_vp_assist->enlighten_vmentry = 1;
242 current_evmcs = vmcs;
247 static inline int evmcs_vmptrst(uint64_t *value)
249 *value = current_vp_assist->current_nested_vmcs &
250 ~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
255 static inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
259 *value = current_evmcs->guest_rip;
262 *value = current_evmcs->guest_rsp;
265 *value = current_evmcs->guest_rflags;
268 *value = current_evmcs->host_ia32_pat;
271 *value = current_evmcs->host_ia32_efer;
274 *value = current_evmcs->host_cr0;
277 *value = current_evmcs->host_cr3;
280 *value = current_evmcs->host_cr4;
282 case HOST_IA32_SYSENTER_ESP:
283 *value = current_evmcs->host_ia32_sysenter_esp;
285 case HOST_IA32_SYSENTER_EIP:
286 *value = current_evmcs->host_ia32_sysenter_eip;
289 *value = current_evmcs->host_rip;
292 *value = current_evmcs->io_bitmap_a;
295 *value = current_evmcs->io_bitmap_b;
298 *value = current_evmcs->msr_bitmap;
301 *value = current_evmcs->guest_es_base;
304 *value = current_evmcs->guest_cs_base;
307 *value = current_evmcs->guest_ss_base;
310 *value = current_evmcs->guest_ds_base;
313 *value = current_evmcs->guest_fs_base;
316 *value = current_evmcs->guest_gs_base;
318 case GUEST_LDTR_BASE:
319 *value = current_evmcs->guest_ldtr_base;
322 *value = current_evmcs->guest_tr_base;
324 case GUEST_GDTR_BASE:
325 *value = current_evmcs->guest_gdtr_base;
327 case GUEST_IDTR_BASE:
328 *value = current_evmcs->guest_idtr_base;
331 *value = current_evmcs->tsc_offset;
333 case VIRTUAL_APIC_PAGE_ADDR:
334 *value = current_evmcs->virtual_apic_page_addr;
336 case VMCS_LINK_POINTER:
337 *value = current_evmcs->vmcs_link_pointer;
339 case GUEST_IA32_DEBUGCTL:
340 *value = current_evmcs->guest_ia32_debugctl;
343 *value = current_evmcs->guest_ia32_pat;
345 case GUEST_IA32_EFER:
346 *value = current_evmcs->guest_ia32_efer;
349 *value = current_evmcs->guest_pdptr0;
352 *value = current_evmcs->guest_pdptr1;
355 *value = current_evmcs->guest_pdptr2;
358 *value = current_evmcs->guest_pdptr3;
360 case GUEST_PENDING_DBG_EXCEPTIONS:
361 *value = current_evmcs->guest_pending_dbg_exceptions;
363 case GUEST_SYSENTER_ESP:
364 *value = current_evmcs->guest_sysenter_esp;
366 case GUEST_SYSENTER_EIP:
367 *value = current_evmcs->guest_sysenter_eip;
369 case CR0_GUEST_HOST_MASK:
370 *value = current_evmcs->cr0_guest_host_mask;
372 case CR4_GUEST_HOST_MASK:
373 *value = current_evmcs->cr4_guest_host_mask;
375 case CR0_READ_SHADOW:
376 *value = current_evmcs->cr0_read_shadow;
378 case CR4_READ_SHADOW:
379 *value = current_evmcs->cr4_read_shadow;
382 *value = current_evmcs->guest_cr0;
385 *value = current_evmcs->guest_cr3;
388 *value = current_evmcs->guest_cr4;
391 *value = current_evmcs->guest_dr7;
394 *value = current_evmcs->host_fs_base;
397 *value = current_evmcs->host_gs_base;
400 *value = current_evmcs->host_tr_base;
403 *value = current_evmcs->host_gdtr_base;
406 *value = current_evmcs->host_idtr_base;
409 *value = current_evmcs->host_rsp;
412 *value = current_evmcs->ept_pointer;
415 *value = current_evmcs->guest_bndcfgs;
417 case XSS_EXIT_BITMAP:
418 *value = current_evmcs->xss_exit_bitmap;
420 case GUEST_PHYSICAL_ADDRESS:
421 *value = current_evmcs->guest_physical_address;
423 case EXIT_QUALIFICATION:
424 *value = current_evmcs->exit_qualification;
426 case GUEST_LINEAR_ADDRESS:
427 *value = current_evmcs->guest_linear_address;
429 case VM_EXIT_MSR_STORE_ADDR:
430 *value = current_evmcs->vm_exit_msr_store_addr;
432 case VM_EXIT_MSR_LOAD_ADDR:
433 *value = current_evmcs->vm_exit_msr_load_addr;
435 case VM_ENTRY_MSR_LOAD_ADDR:
436 *value = current_evmcs->vm_entry_msr_load_addr;
438 case CR3_TARGET_VALUE0:
439 *value = current_evmcs->cr3_target_value0;
441 case CR3_TARGET_VALUE1:
442 *value = current_evmcs->cr3_target_value1;
444 case CR3_TARGET_VALUE2:
445 *value = current_evmcs->cr3_target_value2;
447 case CR3_TARGET_VALUE3:
448 *value = current_evmcs->cr3_target_value3;
451 *value = current_evmcs->tpr_threshold;
453 case GUEST_INTERRUPTIBILITY_INFO:
454 *value = current_evmcs->guest_interruptibility_info;
456 case CPU_BASED_VM_EXEC_CONTROL:
457 *value = current_evmcs->cpu_based_vm_exec_control;
459 case EXCEPTION_BITMAP:
460 *value = current_evmcs->exception_bitmap;
462 case VM_ENTRY_CONTROLS:
463 *value = current_evmcs->vm_entry_controls;
465 case VM_ENTRY_INTR_INFO_FIELD:
466 *value = current_evmcs->vm_entry_intr_info_field;
468 case VM_ENTRY_EXCEPTION_ERROR_CODE:
469 *value = current_evmcs->vm_entry_exception_error_code;
471 case VM_ENTRY_INSTRUCTION_LEN:
472 *value = current_evmcs->vm_entry_instruction_len;
474 case HOST_IA32_SYSENTER_CS:
475 *value = current_evmcs->host_ia32_sysenter_cs;
477 case PIN_BASED_VM_EXEC_CONTROL:
478 *value = current_evmcs->pin_based_vm_exec_control;
480 case VM_EXIT_CONTROLS:
481 *value = current_evmcs->vm_exit_controls;
483 case SECONDARY_VM_EXEC_CONTROL:
484 *value = current_evmcs->secondary_vm_exec_control;
487 *value = current_evmcs->guest_es_limit;
490 *value = current_evmcs->guest_cs_limit;
493 *value = current_evmcs->guest_ss_limit;
496 *value = current_evmcs->guest_ds_limit;
499 *value = current_evmcs->guest_fs_limit;
502 *value = current_evmcs->guest_gs_limit;
504 case GUEST_LDTR_LIMIT:
505 *value = current_evmcs->guest_ldtr_limit;
508 *value = current_evmcs->guest_tr_limit;
510 case GUEST_GDTR_LIMIT:
511 *value = current_evmcs->guest_gdtr_limit;
513 case GUEST_IDTR_LIMIT:
514 *value = current_evmcs->guest_idtr_limit;
516 case GUEST_ES_AR_BYTES:
517 *value = current_evmcs->guest_es_ar_bytes;
519 case GUEST_CS_AR_BYTES:
520 *value = current_evmcs->guest_cs_ar_bytes;
522 case GUEST_SS_AR_BYTES:
523 *value = current_evmcs->guest_ss_ar_bytes;
525 case GUEST_DS_AR_BYTES:
526 *value = current_evmcs->guest_ds_ar_bytes;
528 case GUEST_FS_AR_BYTES:
529 *value = current_evmcs->guest_fs_ar_bytes;
531 case GUEST_GS_AR_BYTES:
532 *value = current_evmcs->guest_gs_ar_bytes;
534 case GUEST_LDTR_AR_BYTES:
535 *value = current_evmcs->guest_ldtr_ar_bytes;
537 case GUEST_TR_AR_BYTES:
538 *value = current_evmcs->guest_tr_ar_bytes;
540 case GUEST_ACTIVITY_STATE:
541 *value = current_evmcs->guest_activity_state;
543 case GUEST_SYSENTER_CS:
544 *value = current_evmcs->guest_sysenter_cs;
546 case VM_INSTRUCTION_ERROR:
547 *value = current_evmcs->vm_instruction_error;
550 *value = current_evmcs->vm_exit_reason;
552 case VM_EXIT_INTR_INFO:
553 *value = current_evmcs->vm_exit_intr_info;
555 case VM_EXIT_INTR_ERROR_CODE:
556 *value = current_evmcs->vm_exit_intr_error_code;
558 case IDT_VECTORING_INFO_FIELD:
559 *value = current_evmcs->idt_vectoring_info_field;
561 case IDT_VECTORING_ERROR_CODE:
562 *value = current_evmcs->idt_vectoring_error_code;
564 case VM_EXIT_INSTRUCTION_LEN:
565 *value = current_evmcs->vm_exit_instruction_len;
567 case VMX_INSTRUCTION_INFO:
568 *value = current_evmcs->vmx_instruction_info;
570 case PAGE_FAULT_ERROR_CODE_MASK:
571 *value = current_evmcs->page_fault_error_code_mask;
573 case PAGE_FAULT_ERROR_CODE_MATCH:
574 *value = current_evmcs->page_fault_error_code_match;
576 case CR3_TARGET_COUNT:
577 *value = current_evmcs->cr3_target_count;
579 case VM_EXIT_MSR_STORE_COUNT:
580 *value = current_evmcs->vm_exit_msr_store_count;
582 case VM_EXIT_MSR_LOAD_COUNT:
583 *value = current_evmcs->vm_exit_msr_load_count;
585 case VM_ENTRY_MSR_LOAD_COUNT:
586 *value = current_evmcs->vm_entry_msr_load_count;
588 case HOST_ES_SELECTOR:
589 *value = current_evmcs->host_es_selector;
591 case HOST_CS_SELECTOR:
592 *value = current_evmcs->host_cs_selector;
594 case HOST_SS_SELECTOR:
595 *value = current_evmcs->host_ss_selector;
597 case HOST_DS_SELECTOR:
598 *value = current_evmcs->host_ds_selector;
600 case HOST_FS_SELECTOR:
601 *value = current_evmcs->host_fs_selector;
603 case HOST_GS_SELECTOR:
604 *value = current_evmcs->host_gs_selector;
606 case HOST_TR_SELECTOR:
607 *value = current_evmcs->host_tr_selector;
609 case GUEST_ES_SELECTOR:
610 *value = current_evmcs->guest_es_selector;
612 case GUEST_CS_SELECTOR:
613 *value = current_evmcs->guest_cs_selector;
615 case GUEST_SS_SELECTOR:
616 *value = current_evmcs->guest_ss_selector;
618 case GUEST_DS_SELECTOR:
619 *value = current_evmcs->guest_ds_selector;
621 case GUEST_FS_SELECTOR:
622 *value = current_evmcs->guest_fs_selector;
624 case GUEST_GS_SELECTOR:
625 *value = current_evmcs->guest_gs_selector;
627 case GUEST_LDTR_SELECTOR:
628 *value = current_evmcs->guest_ldtr_selector;
630 case GUEST_TR_SELECTOR:
631 *value = current_evmcs->guest_tr_selector;
633 case VIRTUAL_PROCESSOR_ID:
634 *value = current_evmcs->virtual_processor_id;
642 static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
646 current_evmcs->guest_rip = value;
649 current_evmcs->guest_rsp = value;
652 current_evmcs->guest_rflags = value;
655 current_evmcs->host_ia32_pat = value;
658 current_evmcs->host_ia32_efer = value;
661 current_evmcs->host_cr0 = value;
664 current_evmcs->host_cr3 = value;
667 current_evmcs->host_cr4 = value;
669 case HOST_IA32_SYSENTER_ESP:
670 current_evmcs->host_ia32_sysenter_esp = value;
672 case HOST_IA32_SYSENTER_EIP:
673 current_evmcs->host_ia32_sysenter_eip = value;
676 current_evmcs->host_rip = value;
679 current_evmcs->io_bitmap_a = value;
682 current_evmcs->io_bitmap_b = value;
685 current_evmcs->msr_bitmap = value;
688 current_evmcs->guest_es_base = value;
691 current_evmcs->guest_cs_base = value;
694 current_evmcs->guest_ss_base = value;
697 current_evmcs->guest_ds_base = value;
700 current_evmcs->guest_fs_base = value;
703 current_evmcs->guest_gs_base = value;
705 case GUEST_LDTR_BASE:
706 current_evmcs->guest_ldtr_base = value;
709 current_evmcs->guest_tr_base = value;
711 case GUEST_GDTR_BASE:
712 current_evmcs->guest_gdtr_base = value;
714 case GUEST_IDTR_BASE:
715 current_evmcs->guest_idtr_base = value;
718 current_evmcs->tsc_offset = value;
720 case VIRTUAL_APIC_PAGE_ADDR:
721 current_evmcs->virtual_apic_page_addr = value;
723 case VMCS_LINK_POINTER:
724 current_evmcs->vmcs_link_pointer = value;
726 case GUEST_IA32_DEBUGCTL:
727 current_evmcs->guest_ia32_debugctl = value;
730 current_evmcs->guest_ia32_pat = value;
732 case GUEST_IA32_EFER:
733 current_evmcs->guest_ia32_efer = value;
736 current_evmcs->guest_pdptr0 = value;
739 current_evmcs->guest_pdptr1 = value;
742 current_evmcs->guest_pdptr2 = value;
745 current_evmcs->guest_pdptr3 = value;
747 case GUEST_PENDING_DBG_EXCEPTIONS:
748 current_evmcs->guest_pending_dbg_exceptions = value;
750 case GUEST_SYSENTER_ESP:
751 current_evmcs->guest_sysenter_esp = value;
753 case GUEST_SYSENTER_EIP:
754 current_evmcs->guest_sysenter_eip = value;
756 case CR0_GUEST_HOST_MASK:
757 current_evmcs->cr0_guest_host_mask = value;
759 case CR4_GUEST_HOST_MASK:
760 current_evmcs->cr4_guest_host_mask = value;
762 case CR0_READ_SHADOW:
763 current_evmcs->cr0_read_shadow = value;
765 case CR4_READ_SHADOW:
766 current_evmcs->cr4_read_shadow = value;
769 current_evmcs->guest_cr0 = value;
772 current_evmcs->guest_cr3 = value;
775 current_evmcs->guest_cr4 = value;
778 current_evmcs->guest_dr7 = value;
781 current_evmcs->host_fs_base = value;
784 current_evmcs->host_gs_base = value;
787 current_evmcs->host_tr_base = value;
790 current_evmcs->host_gdtr_base = value;
793 current_evmcs->host_idtr_base = value;
796 current_evmcs->host_rsp = value;
799 current_evmcs->ept_pointer = value;
802 current_evmcs->guest_bndcfgs = value;
804 case XSS_EXIT_BITMAP:
805 current_evmcs->xss_exit_bitmap = value;
807 case GUEST_PHYSICAL_ADDRESS:
808 current_evmcs->guest_physical_address = value;
810 case EXIT_QUALIFICATION:
811 current_evmcs->exit_qualification = value;
813 case GUEST_LINEAR_ADDRESS:
814 current_evmcs->guest_linear_address = value;
816 case VM_EXIT_MSR_STORE_ADDR:
817 current_evmcs->vm_exit_msr_store_addr = value;
819 case VM_EXIT_MSR_LOAD_ADDR:
820 current_evmcs->vm_exit_msr_load_addr = value;
822 case VM_ENTRY_MSR_LOAD_ADDR:
823 current_evmcs->vm_entry_msr_load_addr = value;
825 case CR3_TARGET_VALUE0:
826 current_evmcs->cr3_target_value0 = value;
828 case CR3_TARGET_VALUE1:
829 current_evmcs->cr3_target_value1 = value;
831 case CR3_TARGET_VALUE2:
832 current_evmcs->cr3_target_value2 = value;
834 case CR3_TARGET_VALUE3:
835 current_evmcs->cr3_target_value3 = value;
838 current_evmcs->tpr_threshold = value;
840 case GUEST_INTERRUPTIBILITY_INFO:
841 current_evmcs->guest_interruptibility_info = value;
843 case CPU_BASED_VM_EXEC_CONTROL:
844 current_evmcs->cpu_based_vm_exec_control = value;
846 case EXCEPTION_BITMAP:
847 current_evmcs->exception_bitmap = value;
849 case VM_ENTRY_CONTROLS:
850 current_evmcs->vm_entry_controls = value;
852 case VM_ENTRY_INTR_INFO_FIELD:
853 current_evmcs->vm_entry_intr_info_field = value;
855 case VM_ENTRY_EXCEPTION_ERROR_CODE:
856 current_evmcs->vm_entry_exception_error_code = value;
858 case VM_ENTRY_INSTRUCTION_LEN:
859 current_evmcs->vm_entry_instruction_len = value;
861 case HOST_IA32_SYSENTER_CS:
862 current_evmcs->host_ia32_sysenter_cs = value;
864 case PIN_BASED_VM_EXEC_CONTROL:
865 current_evmcs->pin_based_vm_exec_control = value;
867 case VM_EXIT_CONTROLS:
868 current_evmcs->vm_exit_controls = value;
870 case SECONDARY_VM_EXEC_CONTROL:
871 current_evmcs->secondary_vm_exec_control = value;
874 current_evmcs->guest_es_limit = value;
877 current_evmcs->guest_cs_limit = value;
880 current_evmcs->guest_ss_limit = value;
883 current_evmcs->guest_ds_limit = value;
886 current_evmcs->guest_fs_limit = value;
889 current_evmcs->guest_gs_limit = value;
891 case GUEST_LDTR_LIMIT:
892 current_evmcs->guest_ldtr_limit = value;
895 current_evmcs->guest_tr_limit = value;
897 case GUEST_GDTR_LIMIT:
898 current_evmcs->guest_gdtr_limit = value;
900 case GUEST_IDTR_LIMIT:
901 current_evmcs->guest_idtr_limit = value;
903 case GUEST_ES_AR_BYTES:
904 current_evmcs->guest_es_ar_bytes = value;
906 case GUEST_CS_AR_BYTES:
907 current_evmcs->guest_cs_ar_bytes = value;
909 case GUEST_SS_AR_BYTES:
910 current_evmcs->guest_ss_ar_bytes = value;
912 case GUEST_DS_AR_BYTES:
913 current_evmcs->guest_ds_ar_bytes = value;
915 case GUEST_FS_AR_BYTES:
916 current_evmcs->guest_fs_ar_bytes = value;
918 case GUEST_GS_AR_BYTES:
919 current_evmcs->guest_gs_ar_bytes = value;
921 case GUEST_LDTR_AR_BYTES:
922 current_evmcs->guest_ldtr_ar_bytes = value;
924 case GUEST_TR_AR_BYTES:
925 current_evmcs->guest_tr_ar_bytes = value;
927 case GUEST_ACTIVITY_STATE:
928 current_evmcs->guest_activity_state = value;
930 case GUEST_SYSENTER_CS:
931 current_evmcs->guest_sysenter_cs = value;
933 case VM_INSTRUCTION_ERROR:
934 current_evmcs->vm_instruction_error = value;
937 current_evmcs->vm_exit_reason = value;
939 case VM_EXIT_INTR_INFO:
940 current_evmcs->vm_exit_intr_info = value;
942 case VM_EXIT_INTR_ERROR_CODE:
943 current_evmcs->vm_exit_intr_error_code = value;
945 case IDT_VECTORING_INFO_FIELD:
946 current_evmcs->idt_vectoring_info_field = value;
948 case IDT_VECTORING_ERROR_CODE:
949 current_evmcs->idt_vectoring_error_code = value;
951 case VM_EXIT_INSTRUCTION_LEN:
952 current_evmcs->vm_exit_instruction_len = value;
954 case VMX_INSTRUCTION_INFO:
955 current_evmcs->vmx_instruction_info = value;
957 case PAGE_FAULT_ERROR_CODE_MASK:
958 current_evmcs->page_fault_error_code_mask = value;
960 case PAGE_FAULT_ERROR_CODE_MATCH:
961 current_evmcs->page_fault_error_code_match = value;
963 case CR3_TARGET_COUNT:
964 current_evmcs->cr3_target_count = value;
966 case VM_EXIT_MSR_STORE_COUNT:
967 current_evmcs->vm_exit_msr_store_count = value;
969 case VM_EXIT_MSR_LOAD_COUNT:
970 current_evmcs->vm_exit_msr_load_count = value;
972 case VM_ENTRY_MSR_LOAD_COUNT:
973 current_evmcs->vm_entry_msr_load_count = value;
975 case HOST_ES_SELECTOR:
976 current_evmcs->host_es_selector = value;
978 case HOST_CS_SELECTOR:
979 current_evmcs->host_cs_selector = value;
981 case HOST_SS_SELECTOR:
982 current_evmcs->host_ss_selector = value;
984 case HOST_DS_SELECTOR:
985 current_evmcs->host_ds_selector = value;
987 case HOST_FS_SELECTOR:
988 current_evmcs->host_fs_selector = value;
990 case HOST_GS_SELECTOR:
991 current_evmcs->host_gs_selector = value;
993 case HOST_TR_SELECTOR:
994 current_evmcs->host_tr_selector = value;
996 case GUEST_ES_SELECTOR:
997 current_evmcs->guest_es_selector = value;
999 case GUEST_CS_SELECTOR:
1000 current_evmcs->guest_cs_selector = value;
1002 case GUEST_SS_SELECTOR:
1003 current_evmcs->guest_ss_selector = value;
1005 case GUEST_DS_SELECTOR:
1006 current_evmcs->guest_ds_selector = value;
1008 case GUEST_FS_SELECTOR:
1009 current_evmcs->guest_fs_selector = value;
1011 case GUEST_GS_SELECTOR:
1012 current_evmcs->guest_gs_selector = value;
1014 case GUEST_LDTR_SELECTOR:
1015 current_evmcs->guest_ldtr_selector = value;
1017 case GUEST_TR_SELECTOR:
1018 current_evmcs->guest_tr_selector = value;
1020 case VIRTUAL_PROCESSOR_ID:
1021 current_evmcs->virtual_processor_id = value;
1029 static inline int evmcs_vmlaunch(void)
1033 current_evmcs->hv_clean_fields = 0;
1035 __asm__ __volatile__("push %%rbp;"
1041 "mov %%rsp, (%[host_rsp]);"
1042 "lea 1f(%%rip), %%rax;"
1043 "mov %%rax, (%[host_rip]);"
1054 ((uint64_t)¤t_evmcs->host_rsp),
1056 ((uint64_t)¤t_evmcs->host_rip)
1057 : "memory", "cc", "rbx", "r8", "r9", "r10",
1058 "r11", "r12", "r13", "r14", "r15");
1063 * No guest state (e.g. GPRs) is established by this vmresume.
1065 static inline int evmcs_vmresume(void)
1069 current_evmcs->hv_clean_fields = 0;
1071 __asm__ __volatile__("push %%rbp;"
1077 "mov %%rsp, (%[host_rsp]);"
1078 "lea 1f(%%rip), %%rax;"
1079 "mov %%rax, (%[host_rip]);"
1090 ((uint64_t)¤t_evmcs->host_rsp),
1092 ((uint64_t)¤t_evmcs->host_rip)
1093 : "memory", "cc", "rbx", "r8", "r9", "r10",
1094 "r11", "r12", "r13", "r14", "r15");
1098 #endif /* !SELFTEST_KVM_EVMCS_H */