80 lines
1.5 KiB
C
80 lines
1.5 KiB
C
/*!
|
|
@file HostNesting.h
|
|
|
|
@brief Incomplete nesting related code. Do not study.
|
|
|
|
@author Satoshi Tanda
|
|
|
|
@copyright Copyright (c) 2020 - , Satoshi Tanda. All rights reserved.
|
|
*/
|
|
#pragma once
|
|
#include "Common.h"
|
|
#include "Ia32.h"
|
|
#include "HostUtils.h"
|
|
#include "ExtendedPageTables.h"
|
|
|
|
typedef enum _VMX_OPERATION
|
|
{
|
|
VmxOperationNotInVmxOperation,
|
|
VmxOperationRoot,
|
|
VmxOperationNonRoot,
|
|
} VMX_OPERATION;
|
|
|
|
typedef enum _VMCS_LAUNCH_STATE
|
|
{
|
|
LaunchStateUnintialized,
|
|
LaunchStateClear,
|
|
LaunchStateLaunched,
|
|
} VMCS_LAUNCH_STATE;
|
|
|
|
typedef struct _NEXTED_VMX_CONTEXT
|
|
{
|
|
VMX_OPERATION VmxOperation;
|
|
VMCS_LAUNCH_STATE VmcsLaunchState;
|
|
|
|
//
|
|
// The physical address of the VMXON region (used by L1 for L2)
|
|
//
|
|
UINT64 Vmxon12Pa;
|
|
|
|
//
|
|
// The physical addresses of VMCSs (used by L0 for L1 and L2)
|
|
//
|
|
UINT64 Vmcs01Pa;
|
|
UINT64 Vmcs02Pa;
|
|
|
|
//
|
|
// Current VMCS from the point of view of the nested VMM (used by L1 for L2)
|
|
//
|
|
UINT64 Vmcs12Pa;
|
|
|
|
//
|
|
// EPT related data (used by L0 for L2)
|
|
//
|
|
EPT_CONTEXT Ept02Context;
|
|
EPT_PML4* EptPml4_02;
|
|
|
|
//
|
|
// VMCS (used by L0 for L2).
|
|
//
|
|
DECLSPEC_ALIGN(PAGE_SIZE) VMCS Vmcs02;
|
|
} NEXTED_VMX_CONTEXT;
|
|
|
|
VOID
|
|
HandleVmx (
|
|
_Inout_ GUEST_CONTEXT* GuestContext,
|
|
_In_ UINT32 ExitReason
|
|
);
|
|
|
|
VOID
|
|
EmulateVmExitForL1Vmm (
|
|
_Inout_ GUEST_CONTEXT* GuestContext,
|
|
_In_ UINT32 ExitReason
|
|
);
|
|
|
|
BOOLEAN
|
|
IsVmExitForL1 (
|
|
CONST GUEST_CONTEXT* GuestContext,
|
|
VMX_VMEXIT_REASON VmExitReason
|
|
);
|