Create and Configure a Vmcs Layout.
685{
686 UINT32 CpuBasedVmExecControls;
687 UINT32 SecondaryProcBasedVmExecControls;
689 UINT64 GdtBase = 0;
690 IA32_VMX_BASIC_REGISTER VmxBasicMsr = {0};
692
693
694
695
696 VmxBasicMsr.AsUInt =
CpuReadMsr(IA32_VMX_BASIC);
697
705
706
707
708
710
713
714
715
716
718
721
724
726 VmxVmwrite64(VMCS_CTRL_VMENTRY_INTERRUPTION_INFORMATION_FIELD, 0);
727
729
738
741
743 IA32_VMX_PROCBASED_CTLS_USE_IO_BITMAPS_FLAG |
744 IA32_VMX_PROCBASED_CTLS_USE_MSR_BITMAPS_FLAG |
745 IA32_VMX_PROCBASED_CTLS_ACTIVATE_SECONDARY_CONTROLS_FLAG,
746 VmxBasicMsr.VmxControls ? IA32_VMX_TRUE_PROCBASED_CTLS : IA32_VMX_PROCBASED_CTLS);
747
748 VmxVmwrite64(VMCS_CTRL_PROCESSOR_BASED_VM_EXECUTION_CONTROLS, CpuBasedVmExecControls);
749
750 LogDebugInfo(
"CPU Based VM Exec Controls (Based on %s) : 0x%x",
751 VmxBasicMsr.VmxControls ? "IA32_VMX_TRUE_PROCBASED_CTLS" : "IA32_VMX_PROCBASED_CTLS",
752 CpuBasedVmExecControls);
753 UINT32 SecondaryProcBasedVmExecControlsFlags = IA32_VMX_PROCBASED_CTLS2_ENABLE_RDTSCP_FLAG |
754 IA32_VMX_PROCBASED_CTLS2_ENABLE_EPT_FLAG |
755 IA32_VMX_PROCBASED_CTLS2_ENABLE_INVPCID_FLAG |
756 IA32_VMX_PROCBASED_CTLS2_ENABLE_XSAVES_FLAG |
757 IA32_VMX_PROCBASED_CTLS2_ENABLE_USER_WAIT_PAUSE_FLAG;
758
760 {
761 SecondaryProcBasedVmExecControlsFlags |= IA32_VMX_PROCBASED_CTLS2_ENABLE_VPID_FLAG;
762 }
763 SecondaryProcBasedVmExecControls =
HvAdjustControls(SecondaryProcBasedVmExecControlsFlags, IA32_VMX_PROCBASED_CTLS2);
764
765 VmxVmwrite64(VMCS_CTRL_SECONDARY_PROCESSOR_BASED_VM_EXECUTION_CONTROLS, SecondaryProcBasedVmExecControls);
766
767 LogDebugInfo(
"Secondary Proc Based VM Exec Controls (IA32_VMX_PROCBASED_CTLS2) : 0x%x", SecondaryProcBasedVmExecControls);
768
771 0,
772 VmxBasicMsr.VmxControls ? IA32_VMX_TRUE_PINBASED_CTLS : IA32_VMX_PINBASED_CTLS));
773
776 IA32_VMX_EXIT_CTLS_HOST_ADDRESS_SPACE_SIZE_FLAG |
777 IA32_VMX_EXIT_CTLS_LOAD_IA32_CET_STATE_FLAG,
778 VmxBasicMsr.VmxControls ? IA32_VMX_TRUE_EXIT_CTLS : IA32_VMX_EXIT_CTLS));
779
782 IA32_VMX_ENTRY_CTLS_IA32E_MODE_GUEST_FLAG |
783 IA32_VMX_ENTRY_CTLS_LOAD_CET_STATE_FLAG,
784 VmxBasicMsr.VmxControls ? IA32_VMX_TRUE_ENTRY_CTLS : IA32_VMX_ENTRY_CTLS));
785
788
791
795
797
800
801
802
803
804
805
807
810
813
815
819
820#if USE_DEFAULT_OS_GDT_AS_HOST_GDT == FALSE
821
823
826
827#else
828
830
833
834#endif
835
838
839#if USE_DEFAULT_OS_IDT_AS_HOST_IDT == FALSE
840
842
843#else
844
846
847#endif
848
852
853
854
855
857
858
859
860
863
864
865
866
868
869
870
871
872
873
874
875
877
878
879
880
882
883
884
885
887
888
889
890
891
893 HostRsp = ((
PVOID)((ULONG_PTR)(HostRsp) & ~(16 - 1)));
896
898}
UINT32 HvAdjustControls(UINT32 Ctl, UINT32 Msr)
Adjust controls for VMCS based on processor capability.
Definition Hv.c:23
VOID HvFillGuestSelectorData(PVOID GdtBase, UINT32 SegmentRegister, UINT16 Selector)
Fill the guest's selector data.
Definition Hv.c:272
UINT16 AsmGetSs()
Get SS Register.
UINT16 AsmGetFs()
Get FS Register.
UINT64 AsmGetIdtBase()
Get IDT base.
VOID AsmVmexitHandler()
Vm-exit handler.
UINT16 AsmGetCs()
Get CS Register.
UINT16 AsmGetGdtLimit()
Get GDT Limit.
VOID AsmVmxRestoreState()
Restore state on vmx.
UINT16 AsmGetEs()
Get ES Register.
UINT64 AsmGetGdtBase()
get GDT base
UINT16 AsmGetDs()
Get DS Register.
UINT16 AsmGetGs()
Get GS Register.
UINT16 AsmGetRflags()
Get R/EFLAGS.
UINT16 AsmGetTr()
Get TR Register.
UINT16 AsmGetLdtr()
Get LDTR Register.
UINT16 AsmGetIdtLimit()
Get IDT limit.
UINT64 LayoutGetSystemDirectoryTableBase()
Find cr3 of system process.
Definition Layout.c:90
_Use_decl_annotations_ BOOLEAN SegmentGetDescriptor(PUCHAR GdtBase, UINT16 Selector, PVMX_SEGMENT_SELECTOR SegmentSelector)
Get Segment Descriptor.
Definition Segmentation.c:24
_In_ UINT16 _Out_ PVMX_SEGMENT_SELECTOR SegmentSelector
Definition Segmentation.h:51
#define VIRTUAL_PROCESSOR_ID
Definition Vmx.h:222
#define VMM_STACK_SIZE
Stack Size.
Definition Vmx.h:65
#define VMCS_GUEST_DEBUGCTL_HIGH
Definition Vmx.h:221
#define VPID_TAG
VPID Tag.
Definition Vpid.h:30
UINT64 MsrBitmapPhysicalAddress
Definition State.h:338
UINT64 HostGdt
Definition State.h:356
EPT_POINTER EptPointer
Definition State.h:363
UINT64 IoBitmapPhysicalAddressA
Definition State.h:340
UINT64 VmmStack
Definition State.h:336
UINT64 HostIdt
Definition State.h:355
UINT64 IoBitmapPhysicalAddressB
Definition State.h:342