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 #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 */