1 /* SPDX-License-Identifier: GPL-2.0 */
3 * tools/testing/selftests/kvm/include/x86_64/evmcs.h
5 * Copyright (C) 2018, Red Hat, Inc.
9 #ifndef SELFTEST_KVM_EVMCS_H
10 #define SELFTEST_KVM_EVMCS_H
19 #define EVMCS_VERSION 1
21 extern bool enable_evmcs;
23 struct hv_vp_assist_page {
27 __u64 nested_enlightenments_control[2];
28 __u32 enlighten_vmentry;
29 __u64 current_nested_vmcs;
32 struct hv_enlightened_vmcs {
51 u64 host_ia32_sysenter_esp;
52 u64 host_ia32_sysenter_eip;
54 u32 host_ia32_sysenter_cs;
56 u32 pin_based_vm_exec_control;
58 u32 secondary_vm_exec_control;
64 u16 guest_es_selector;
65 u16 guest_cs_selector;
66 u16 guest_ss_selector;
67 u16 guest_ds_selector;
68 u16 guest_fs_selector;
69 u16 guest_gs_selector;
70 u16 guest_ldtr_selector;
71 u16 guest_tr_selector;
84 u32 guest_es_ar_bytes;
85 u32 guest_cs_ar_bytes;
86 u32 guest_ss_ar_bytes;
87 u32 guest_ds_ar_bytes;
88 u32 guest_fs_ar_bytes;
89 u32 guest_gs_ar_bytes;
90 u32 guest_ldtr_ar_bytes;
91 u32 guest_tr_ar_bytes;
106 u64 vm_exit_msr_store_addr;
107 u64 vm_exit_msr_load_addr;
108 u64 vm_entry_msr_load_addr;
110 u64 cr3_target_value0;
111 u64 cr3_target_value1;
112 u64 cr3_target_value2;
113 u64 cr3_target_value3;
115 u32 page_fault_error_code_mask;
116 u32 page_fault_error_code_match;
118 u32 cr3_target_count;
119 u32 vm_exit_msr_store_count;
120 u32 vm_exit_msr_load_count;
121 u32 vm_entry_msr_load_count;
124 u64 virtual_apic_page_addr;
125 u64 vmcs_link_pointer;
127 u64 guest_ia32_debugctl;
136 u64 guest_pending_dbg_exceptions;
137 u64 guest_sysenter_esp;
138 u64 guest_sysenter_eip;
140 u32 guest_activity_state;
141 u32 guest_sysenter_cs;
143 u64 cr0_guest_host_mask;
144 u64 cr4_guest_host_mask;
161 u16 virtual_processor_id;
165 u64 guest_physical_address;
167 u32 vm_instruction_error;
169 u32 vm_exit_intr_info;
170 u32 vm_exit_intr_error_code;
171 u32 idt_vectoring_info_field;
172 u32 idt_vectoring_error_code;
173 u32 vm_exit_instruction_len;
174 u32 vmx_instruction_info;
176 u64 exit_qualification;
177 u64 exit_io_instruction_ecx;
178 u64 exit_io_instruction_esi;
179 u64 exit_io_instruction_edi;
180 u64 exit_io_instruction_eip;
182 u64 guest_linear_address;
186 u32 guest_interruptibility_info;
187 u32 cpu_based_vm_exec_control;
188 u32 exception_bitmap;
189 u32 vm_entry_controls;
190 u32 vm_entry_intr_info_field;
191 u32 vm_entry_exception_error_code;
192 u32 vm_entry_instruction_len;
199 u32 hv_synthetic_controls;
201 u32 nested_flush_hypercall:1;
204 } hv_enlightenments_control;
208 u64 partition_assist_page;
216 #define HV_X64_MSR_VP_ASSIST_PAGE 0x40000073
217 #define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE 0x00000001
218 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT 12
219 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK \
220 (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
222 extern struct hv_enlightened_vmcs *current_evmcs;
223 extern struct hv_vp_assist_page *current_vp_assist;
225 int vcpu_enable_evmcs(struct kvm_vm *vm, int vcpu_id);
227 static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
229 u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
230 HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
232 wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
234 current_vp_assist = vp_assist;
241 static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
243 current_vp_assist->current_nested_vmcs = vmcs_pa;
244 current_vp_assist->enlighten_vmentry = 1;
246 current_evmcs = vmcs;
251 static inline int evmcs_vmptrst(uint64_t *value)
253 *value = current_vp_assist->current_nested_vmcs &
254 ~HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
259 static inline int evmcs_vmread(uint64_t encoding, uint64_t *value)
263 *value = current_evmcs->guest_rip;
266 *value = current_evmcs->guest_rsp;
269 *value = current_evmcs->guest_rflags;
272 *value = current_evmcs->host_ia32_pat;
275 *value = current_evmcs->host_ia32_efer;
278 *value = current_evmcs->host_cr0;
281 *value = current_evmcs->host_cr3;
284 *value = current_evmcs->host_cr4;
286 case HOST_IA32_SYSENTER_ESP:
287 *value = current_evmcs->host_ia32_sysenter_esp;
289 case HOST_IA32_SYSENTER_EIP:
290 *value = current_evmcs->host_ia32_sysenter_eip;
293 *value = current_evmcs->host_rip;
296 *value = current_evmcs->io_bitmap_a;
299 *value = current_evmcs->io_bitmap_b;
302 *value = current_evmcs->msr_bitmap;
305 *value = current_evmcs->guest_es_base;
308 *value = current_evmcs->guest_cs_base;
311 *value = current_evmcs->guest_ss_base;
314 *value = current_evmcs->guest_ds_base;
317 *value = current_evmcs->guest_fs_base;
320 *value = current_evmcs->guest_gs_base;
322 case GUEST_LDTR_BASE:
323 *value = current_evmcs->guest_ldtr_base;
326 *value = current_evmcs->guest_tr_base;
328 case GUEST_GDTR_BASE:
329 *value = current_evmcs->guest_gdtr_base;
331 case GUEST_IDTR_BASE:
332 *value = current_evmcs->guest_idtr_base;
335 *value = current_evmcs->tsc_offset;
337 case VIRTUAL_APIC_PAGE_ADDR:
338 *value = current_evmcs->virtual_apic_page_addr;
340 case VMCS_LINK_POINTER:
341 *value = current_evmcs->vmcs_link_pointer;
343 case GUEST_IA32_DEBUGCTL:
344 *value = current_evmcs->guest_ia32_debugctl;
347 *value = current_evmcs->guest_ia32_pat;
349 case GUEST_IA32_EFER:
350 *value = current_evmcs->guest_ia32_efer;
353 *value = current_evmcs->guest_pdptr0;
356 *value = current_evmcs->guest_pdptr1;
359 *value = current_evmcs->guest_pdptr2;
362 *value = current_evmcs->guest_pdptr3;
364 case GUEST_PENDING_DBG_EXCEPTIONS:
365 *value = current_evmcs->guest_pending_dbg_exceptions;
367 case GUEST_SYSENTER_ESP:
368 *value = current_evmcs->guest_sysenter_esp;
370 case GUEST_SYSENTER_EIP:
371 *value = current_evmcs->guest_sysenter_eip;
373 case CR0_GUEST_HOST_MASK:
374 *value = current_evmcs->cr0_guest_host_mask;
376 case CR4_GUEST_HOST_MASK:
377 *value = current_evmcs->cr4_guest_host_mask;
379 case CR0_READ_SHADOW:
380 *value = current_evmcs->cr0_read_shadow;
382 case CR4_READ_SHADOW:
383 *value = current_evmcs->cr4_read_shadow;
386 *value = current_evmcs->guest_cr0;
389 *value = current_evmcs->guest_cr3;
392 *value = current_evmcs->guest_cr4;
395 *value = current_evmcs->guest_dr7;
398 *value = current_evmcs->host_fs_base;
401 *value = current_evmcs->host_gs_base;
404 *value = current_evmcs->host_tr_base;
407 *value = current_evmcs->host_gdtr_base;
410 *value = current_evmcs->host_idtr_base;
413 *value = current_evmcs->host_rsp;
416 *value = current_evmcs->ept_pointer;
419 *value = current_evmcs->guest_bndcfgs;
421 case XSS_EXIT_BITMAP:
422 *value = current_evmcs->xss_exit_bitmap;
424 case GUEST_PHYSICAL_ADDRESS:
425 *value = current_evmcs->guest_physical_address;
427 case EXIT_QUALIFICATION:
428 *value = current_evmcs->exit_qualification;
430 case GUEST_LINEAR_ADDRESS:
431 *value = current_evmcs->guest_linear_address;
433 case VM_EXIT_MSR_STORE_ADDR:
434 *value = current_evmcs->vm_exit_msr_store_addr;
436 case VM_EXIT_MSR_LOAD_ADDR:
437 *value = current_evmcs->vm_exit_msr_load_addr;
439 case VM_ENTRY_MSR_LOAD_ADDR:
440 *value = current_evmcs->vm_entry_msr_load_addr;
442 case CR3_TARGET_VALUE0:
443 *value = current_evmcs->cr3_target_value0;
445 case CR3_TARGET_VALUE1:
446 *value = current_evmcs->cr3_target_value1;
448 case CR3_TARGET_VALUE2:
449 *value = current_evmcs->cr3_target_value2;
451 case CR3_TARGET_VALUE3:
452 *value = current_evmcs->cr3_target_value3;
455 *value = current_evmcs->tpr_threshold;
457 case GUEST_INTERRUPTIBILITY_INFO:
458 *value = current_evmcs->guest_interruptibility_info;
460 case CPU_BASED_VM_EXEC_CONTROL:
461 *value = current_evmcs->cpu_based_vm_exec_control;
463 case EXCEPTION_BITMAP:
464 *value = current_evmcs->exception_bitmap;
466 case VM_ENTRY_CONTROLS:
467 *value = current_evmcs->vm_entry_controls;
469 case VM_ENTRY_INTR_INFO_FIELD:
470 *value = current_evmcs->vm_entry_intr_info_field;
472 case VM_ENTRY_EXCEPTION_ERROR_CODE:
473 *value = current_evmcs->vm_entry_exception_error_code;
475 case VM_ENTRY_INSTRUCTION_LEN:
476 *value = current_evmcs->vm_entry_instruction_len;
478 case HOST_IA32_SYSENTER_CS:
479 *value = current_evmcs->host_ia32_sysenter_cs;
481 case PIN_BASED_VM_EXEC_CONTROL:
482 *value = current_evmcs->pin_based_vm_exec_control;
484 case VM_EXIT_CONTROLS:
485 *value = current_evmcs->vm_exit_controls;
487 case SECONDARY_VM_EXEC_CONTROL:
488 *value = current_evmcs->secondary_vm_exec_control;
491 *value = current_evmcs->guest_es_limit;
494 *value = current_evmcs->guest_cs_limit;
497 *value = current_evmcs->guest_ss_limit;
500 *value = current_evmcs->guest_ds_limit;
503 *value = current_evmcs->guest_fs_limit;
506 *value = current_evmcs->guest_gs_limit;
508 case GUEST_LDTR_LIMIT:
509 *value = current_evmcs->guest_ldtr_limit;
512 *value = current_evmcs->guest_tr_limit;
514 case GUEST_GDTR_LIMIT:
515 *value = current_evmcs->guest_gdtr_limit;
517 case GUEST_IDTR_LIMIT:
518 *value = current_evmcs->guest_idtr_limit;
520 case GUEST_ES_AR_BYTES:
521 *value = current_evmcs->guest_es_ar_bytes;
523 case GUEST_CS_AR_BYTES:
524 *value = current_evmcs->guest_cs_ar_bytes;
526 case GUEST_SS_AR_BYTES:
527 *value = current_evmcs->guest_ss_ar_bytes;
529 case GUEST_DS_AR_BYTES:
530 *value = current_evmcs->guest_ds_ar_bytes;
532 case GUEST_FS_AR_BYTES:
533 *value = current_evmcs->guest_fs_ar_bytes;
535 case GUEST_GS_AR_BYTES:
536 *value = current_evmcs->guest_gs_ar_bytes;
538 case GUEST_LDTR_AR_BYTES:
539 *value = current_evmcs->guest_ldtr_ar_bytes;
541 case GUEST_TR_AR_BYTES:
542 *value = current_evmcs->guest_tr_ar_bytes;
544 case GUEST_ACTIVITY_STATE:
545 *value = current_evmcs->guest_activity_state;
547 case GUEST_SYSENTER_CS:
548 *value = current_evmcs->guest_sysenter_cs;
550 case VM_INSTRUCTION_ERROR:
551 *value = current_evmcs->vm_instruction_error;
554 *value = current_evmcs->vm_exit_reason;
556 case VM_EXIT_INTR_INFO:
557 *value = current_evmcs->vm_exit_intr_info;
559 case VM_EXIT_INTR_ERROR_CODE:
560 *value = current_evmcs->vm_exit_intr_error_code;
562 case IDT_VECTORING_INFO_FIELD:
563 *value = current_evmcs->idt_vectoring_info_field;
565 case IDT_VECTORING_ERROR_CODE:
566 *value = current_evmcs->idt_vectoring_error_code;
568 case VM_EXIT_INSTRUCTION_LEN:
569 *value = current_evmcs->vm_exit_instruction_len;
571 case VMX_INSTRUCTION_INFO:
572 *value = current_evmcs->vmx_instruction_info;
574 case PAGE_FAULT_ERROR_CODE_MASK:
575 *value = current_evmcs->page_fault_error_code_mask;
577 case PAGE_FAULT_ERROR_CODE_MATCH:
578 *value = current_evmcs->page_fault_error_code_match;
580 case CR3_TARGET_COUNT:
581 *value = current_evmcs->cr3_target_count;
583 case VM_EXIT_MSR_STORE_COUNT:
584 *value = current_evmcs->vm_exit_msr_store_count;
586 case VM_EXIT_MSR_LOAD_COUNT:
587 *value = current_evmcs->vm_exit_msr_load_count;
589 case VM_ENTRY_MSR_LOAD_COUNT:
590 *value = current_evmcs->vm_entry_msr_load_count;
592 case HOST_ES_SELECTOR:
593 *value = current_evmcs->host_es_selector;
595 case HOST_CS_SELECTOR:
596 *value = current_evmcs->host_cs_selector;
598 case HOST_SS_SELECTOR:
599 *value = current_evmcs->host_ss_selector;
601 case HOST_DS_SELECTOR:
602 *value = current_evmcs->host_ds_selector;
604 case HOST_FS_SELECTOR:
605 *value = current_evmcs->host_fs_selector;
607 case HOST_GS_SELECTOR:
608 *value = current_evmcs->host_gs_selector;
610 case HOST_TR_SELECTOR:
611 *value = current_evmcs->host_tr_selector;
613 case GUEST_ES_SELECTOR:
614 *value = current_evmcs->guest_es_selector;
616 case GUEST_CS_SELECTOR:
617 *value = current_evmcs->guest_cs_selector;
619 case GUEST_SS_SELECTOR:
620 *value = current_evmcs->guest_ss_selector;
622 case GUEST_DS_SELECTOR:
623 *value = current_evmcs->guest_ds_selector;
625 case GUEST_FS_SELECTOR:
626 *value = current_evmcs->guest_fs_selector;
628 case GUEST_GS_SELECTOR:
629 *value = current_evmcs->guest_gs_selector;
631 case GUEST_LDTR_SELECTOR:
632 *value = current_evmcs->guest_ldtr_selector;
634 case GUEST_TR_SELECTOR:
635 *value = current_evmcs->guest_tr_selector;
637 case VIRTUAL_PROCESSOR_ID:
638 *value = current_evmcs->virtual_processor_id;
646 static inline int evmcs_vmwrite(uint64_t encoding, uint64_t value)
650 current_evmcs->guest_rip = value;
653 current_evmcs->guest_rsp = value;
656 current_evmcs->guest_rflags = value;
659 current_evmcs->host_ia32_pat = value;
662 current_evmcs->host_ia32_efer = value;
665 current_evmcs->host_cr0 = value;
668 current_evmcs->host_cr3 = value;
671 current_evmcs->host_cr4 = value;
673 case HOST_IA32_SYSENTER_ESP:
674 current_evmcs->host_ia32_sysenter_esp = value;
676 case HOST_IA32_SYSENTER_EIP:
677 current_evmcs->host_ia32_sysenter_eip = value;
680 current_evmcs->host_rip = value;
683 current_evmcs->io_bitmap_a = value;
686 current_evmcs->io_bitmap_b = value;
689 current_evmcs->msr_bitmap = value;
692 current_evmcs->guest_es_base = value;
695 current_evmcs->guest_cs_base = value;
698 current_evmcs->guest_ss_base = value;
701 current_evmcs->guest_ds_base = value;
704 current_evmcs->guest_fs_base = value;
707 current_evmcs->guest_gs_base = value;
709 case GUEST_LDTR_BASE:
710 current_evmcs->guest_ldtr_base = value;
713 current_evmcs->guest_tr_base = value;
715 case GUEST_GDTR_BASE:
716 current_evmcs->guest_gdtr_base = value;
718 case GUEST_IDTR_BASE:
719 current_evmcs->guest_idtr_base = value;
722 current_evmcs->tsc_offset = value;
724 case VIRTUAL_APIC_PAGE_ADDR:
725 current_evmcs->virtual_apic_page_addr = value;
727 case VMCS_LINK_POINTER:
728 current_evmcs->vmcs_link_pointer = value;
730 case GUEST_IA32_DEBUGCTL:
731 current_evmcs->guest_ia32_debugctl = value;
734 current_evmcs->guest_ia32_pat = value;
736 case GUEST_IA32_EFER:
737 current_evmcs->guest_ia32_efer = value;
740 current_evmcs->guest_pdptr0 = value;
743 current_evmcs->guest_pdptr1 = value;
746 current_evmcs->guest_pdptr2 = value;
749 current_evmcs->guest_pdptr3 = value;
751 case GUEST_PENDING_DBG_EXCEPTIONS:
752 current_evmcs->guest_pending_dbg_exceptions = value;
754 case GUEST_SYSENTER_ESP:
755 current_evmcs->guest_sysenter_esp = value;
757 case GUEST_SYSENTER_EIP:
758 current_evmcs->guest_sysenter_eip = value;
760 case CR0_GUEST_HOST_MASK:
761 current_evmcs->cr0_guest_host_mask = value;
763 case CR4_GUEST_HOST_MASK:
764 current_evmcs->cr4_guest_host_mask = value;
766 case CR0_READ_SHADOW:
767 current_evmcs->cr0_read_shadow = value;
769 case CR4_READ_SHADOW:
770 current_evmcs->cr4_read_shadow = value;
773 current_evmcs->guest_cr0 = value;
776 current_evmcs->guest_cr3 = value;
779 current_evmcs->guest_cr4 = value;
782 current_evmcs->guest_dr7 = value;
785 current_evmcs->host_fs_base = value;
788 current_evmcs->host_gs_base = value;
791 current_evmcs->host_tr_base = value;
794 current_evmcs->host_gdtr_base = value;
797 current_evmcs->host_idtr_base = value;
800 current_evmcs->host_rsp = value;
803 current_evmcs->ept_pointer = value;
806 current_evmcs->guest_bndcfgs = value;
808 case XSS_EXIT_BITMAP:
809 current_evmcs->xss_exit_bitmap = value;
811 case GUEST_PHYSICAL_ADDRESS:
812 current_evmcs->guest_physical_address = value;
814 case EXIT_QUALIFICATION:
815 current_evmcs->exit_qualification = value;
817 case GUEST_LINEAR_ADDRESS:
818 current_evmcs->guest_linear_address = value;
820 case VM_EXIT_MSR_STORE_ADDR:
821 current_evmcs->vm_exit_msr_store_addr = value;
823 case VM_EXIT_MSR_LOAD_ADDR:
824 current_evmcs->vm_exit_msr_load_addr = value;
826 case VM_ENTRY_MSR_LOAD_ADDR:
827 current_evmcs->vm_entry_msr_load_addr = value;
829 case CR3_TARGET_VALUE0:
830 current_evmcs->cr3_target_value0 = value;
832 case CR3_TARGET_VALUE1:
833 current_evmcs->cr3_target_value1 = value;
835 case CR3_TARGET_VALUE2:
836 current_evmcs->cr3_target_value2 = value;
838 case CR3_TARGET_VALUE3:
839 current_evmcs->cr3_target_value3 = value;
842 current_evmcs->tpr_threshold = value;
844 case GUEST_INTERRUPTIBILITY_INFO:
845 current_evmcs->guest_interruptibility_info = value;
847 case CPU_BASED_VM_EXEC_CONTROL:
848 current_evmcs->cpu_based_vm_exec_control = value;
850 case EXCEPTION_BITMAP:
851 current_evmcs->exception_bitmap = value;
853 case VM_ENTRY_CONTROLS:
854 current_evmcs->vm_entry_controls = value;
856 case VM_ENTRY_INTR_INFO_FIELD:
857 current_evmcs->vm_entry_intr_info_field = value;
859 case VM_ENTRY_EXCEPTION_ERROR_CODE:
860 current_evmcs->vm_entry_exception_error_code = value;
862 case VM_ENTRY_INSTRUCTION_LEN:
863 current_evmcs->vm_entry_instruction_len = value;
865 case HOST_IA32_SYSENTER_CS:
866 current_evmcs->host_ia32_sysenter_cs = value;
868 case PIN_BASED_VM_EXEC_CONTROL:
869 current_evmcs->pin_based_vm_exec_control = value;
871 case VM_EXIT_CONTROLS:
872 current_evmcs->vm_exit_controls = value;
874 case SECONDARY_VM_EXEC_CONTROL:
875 current_evmcs->secondary_vm_exec_control = value;
878 current_evmcs->guest_es_limit = value;
881 current_evmcs->guest_cs_limit = value;
884 current_evmcs->guest_ss_limit = value;
887 current_evmcs->guest_ds_limit = value;
890 current_evmcs->guest_fs_limit = value;
893 current_evmcs->guest_gs_limit = value;
895 case GUEST_LDTR_LIMIT:
896 current_evmcs->guest_ldtr_limit = value;
899 current_evmcs->guest_tr_limit = value;
901 case GUEST_GDTR_LIMIT:
902 current_evmcs->guest_gdtr_limit = value;
904 case GUEST_IDTR_LIMIT:
905 current_evmcs->guest_idtr_limit = value;
907 case GUEST_ES_AR_BYTES:
908 current_evmcs->guest_es_ar_bytes = value;
910 case GUEST_CS_AR_BYTES:
911 current_evmcs->guest_cs_ar_bytes = value;
913 case GUEST_SS_AR_BYTES:
914 current_evmcs->guest_ss_ar_bytes = value;
916 case GUEST_DS_AR_BYTES:
917 current_evmcs->guest_ds_ar_bytes = value;
919 case GUEST_FS_AR_BYTES:
920 current_evmcs->guest_fs_ar_bytes = value;
922 case GUEST_GS_AR_BYTES:
923 current_evmcs->guest_gs_ar_bytes = value;
925 case GUEST_LDTR_AR_BYTES:
926 current_evmcs->guest_ldtr_ar_bytes = value;
928 case GUEST_TR_AR_BYTES:
929 current_evmcs->guest_tr_ar_bytes = value;
931 case GUEST_ACTIVITY_STATE:
932 current_evmcs->guest_activity_state = value;
934 case GUEST_SYSENTER_CS:
935 current_evmcs->guest_sysenter_cs = value;
937 case VM_INSTRUCTION_ERROR:
938 current_evmcs->vm_instruction_error = value;
941 current_evmcs->vm_exit_reason = value;
943 case VM_EXIT_INTR_INFO:
944 current_evmcs->vm_exit_intr_info = value;
946 case VM_EXIT_INTR_ERROR_CODE:
947 current_evmcs->vm_exit_intr_error_code = value;
949 case IDT_VECTORING_INFO_FIELD:
950 current_evmcs->idt_vectoring_info_field = value;
952 case IDT_VECTORING_ERROR_CODE:
953 current_evmcs->idt_vectoring_error_code = value;
955 case VM_EXIT_INSTRUCTION_LEN:
956 current_evmcs->vm_exit_instruction_len = value;
958 case VMX_INSTRUCTION_INFO:
959 current_evmcs->vmx_instruction_info = value;
961 case PAGE_FAULT_ERROR_CODE_MASK:
962 current_evmcs->page_fault_error_code_mask = value;
964 case PAGE_FAULT_ERROR_CODE_MATCH:
965 current_evmcs->page_fault_error_code_match = value;
967 case CR3_TARGET_COUNT:
968 current_evmcs->cr3_target_count = value;
970 case VM_EXIT_MSR_STORE_COUNT:
971 current_evmcs->vm_exit_msr_store_count = value;
973 case VM_EXIT_MSR_LOAD_COUNT:
974 current_evmcs->vm_exit_msr_load_count = value;
976 case VM_ENTRY_MSR_LOAD_COUNT:
977 current_evmcs->vm_entry_msr_load_count = value;
979 case HOST_ES_SELECTOR:
980 current_evmcs->host_es_selector = value;
982 case HOST_CS_SELECTOR:
983 current_evmcs->host_cs_selector = value;
985 case HOST_SS_SELECTOR:
986 current_evmcs->host_ss_selector = value;
988 case HOST_DS_SELECTOR:
989 current_evmcs->host_ds_selector = value;
991 case HOST_FS_SELECTOR:
992 current_evmcs->host_fs_selector = value;
994 case HOST_GS_SELECTOR:
995 current_evmcs->host_gs_selector = value;
997 case HOST_TR_SELECTOR:
998 current_evmcs->host_tr_selector = value;
1000 case GUEST_ES_SELECTOR:
1001 current_evmcs->guest_es_selector = value;
1003 case GUEST_CS_SELECTOR:
1004 current_evmcs->guest_cs_selector = value;
1006 case GUEST_SS_SELECTOR:
1007 current_evmcs->guest_ss_selector = value;
1009 case GUEST_DS_SELECTOR:
1010 current_evmcs->guest_ds_selector = value;
1012 case GUEST_FS_SELECTOR:
1013 current_evmcs->guest_fs_selector = value;
1015 case GUEST_GS_SELECTOR:
1016 current_evmcs->guest_gs_selector = value;
1018 case GUEST_LDTR_SELECTOR:
1019 current_evmcs->guest_ldtr_selector = value;
1021 case GUEST_TR_SELECTOR:
1022 current_evmcs->guest_tr_selector = value;
1024 case VIRTUAL_PROCESSOR_ID:
1025 current_evmcs->virtual_processor_id = value;
1033 static inline int evmcs_vmlaunch(void)
1037 current_evmcs->hv_clean_fields = 0;
1039 __asm__ __volatile__("push %%rbp;"
1045 "mov %%rsp, (%[host_rsp]);"
1046 "lea 1f(%%rip), %%rax;"
1047 "mov %%rax, (%[host_rip]);"
1058 ((uint64_t)¤t_evmcs->host_rsp),
1060 ((uint64_t)¤t_evmcs->host_rip)
1061 : "memory", "cc", "rbx", "r8", "r9", "r10",
1062 "r11", "r12", "r13", "r14", "r15");
1067 * No guest state (e.g. GPRs) is established by this vmresume.
1069 static inline int evmcs_vmresume(void)
1073 current_evmcs->hv_clean_fields = 0;
1075 __asm__ __volatile__("push %%rbp;"
1081 "mov %%rsp, (%[host_rsp]);"
1082 "lea 1f(%%rip), %%rax;"
1083 "mov %%rax, (%[host_rip]);"
1094 ((uint64_t)¤t_evmcs->host_rsp),
1096 ((uint64_t)¤t_evmcs->host_rip)
1097 : "memory", "cc", "rbx", "r8", "r9", "r10",
1098 "r11", "r12", "r13", "r14", "r15");
1102 #endif /* !SELFTEST_KVM_EVMCS_H */