因記憶體存取而導致的虛擬機退出的上下文資料。
語法
//
// Context data for a VM exit caused by a memory access
// (WHvRunVpExitReasonMemoryAccess on x64; WHvRunVpExitReasonUnmappedGpa or
// WHvRunVpExitReasonGpaIntercept on Arm64)
//
typedef enum WHV_MEMORY_ACCESS_TYPE
{
WHvMemoryAccessRead = 0,
WHvMemoryAccessWrite = 1,
WHvMemoryAccessExecute = 2
} WHV_MEMORY_ACCESS_TYPE;
#if defined(_AMD64_)
typedef union WHV_MEMORY_ACCESS_INFO
{
struct {
UINT32 AccessType : 2; // WHV_MEMORY_ACCESS_TYPE
UINT32 GpaUnmapped : 1;
UINT32 GvaValid : 1;
UINT32 Reserved : 28;
};
UINT32 AsUINT32;
} WHV_MEMORY_ACCESS_INFO;
typedef struct WHV_MEMORY_ACCESS_CONTEXT
{
// Context of the virtual processor
UINT8 InstructionByteCount;
UINT8 Reserved[3];
UINT8 InstructionBytes[16];
// Memory access info
WHV_MEMORY_ACCESS_INFO AccessInfo;
WHV_GUEST_PHYSICAL_ADDRESS Gpa;
WHV_GUEST_VIRTUAL_ADDRESS Gva;
} WHV_MEMORY_ACCESS_CONTEXT;
#elif defined(_ARM64_)
typedef union WHV_MEMORY_ACCESS_INFO
{
UINT8 AsUINT8;
struct
{
UINT8 GvaValid:1;
UINT8 GvaGpaValid:1;
UINT8 HypercallOutputPending:1;
UINT8 Reserved:5;
};
} WHV_MEMORY_ACCESS_INFO;
typedef struct WHV_MEMORY_ACCESS_CONTEXT
{
WHV_INTERCEPT_MESSAGE_HEADER Header;
UINT32 Reserved0;
UINT8 InstructionByteCount;
WHV_MEMORY_ACCESS_INFO AccessInfo;
UINT16 Reserved1;
UINT8 InstructionBytes[4];
UINT32 Reserved2;
UINT64 Gva;
UINT64 Gpa;
UINT64 Syndrome;
} WHV_MEMORY_ACCESS_CONTEXT;
#endif // _ARCH_
Remarks
結構提供 WHV_MEMORY_ACCESS_CONTEXT 虛擬處理器存取未對映或無法存取之記憶體位置所造成結束程式的相關資訊。
記憶體存取出口的常見使用情境是模擬 MMIO 裝置操作,將分割區 GPA 空間中未映射的區域用作模擬裝置的 MMIO 空間,並將該區域的存取轉發至虛擬化堆疊中的裝置模擬邏輯。
WHV_MEMORY_ACCESS_CONTEXT該結構在 x64 (_AMD64_) 與 Arm64 (_ARM64_) 分割中定義不同:
- 在 x64 上,存取權會以
WHvRunVpExitReasonMemoryAccess退出原因浮現。 上下文透過 、GpaUnmapped、GvaValid及 回報存取類型與位址有效WHV_MEMORY_ACCESS_INFO.AccessType性,並攜帶擷取的指令位元組供模擬。 結構是 40 位元組。 - 在 Arm64 上,存取出現時有兩種退出原因之一:
WHvRunVpExitReasonUnmappedGpa當被存取的訪客實體位址未被映射,或WHvRunVpExitReasonGpaIntercept該位址已映射但設定為攔截時。 上下文以 aWHV_INTERCEPT_MESSAGE_HEADER(報告錯誤Pc與Cpsr)開頭,成員Syndrome攜帶 Arm64 例外症候群暫存器(ESR)值,描述錯誤存取。 結構為 64 位元組。
Note
在 Arm64 上,存取類型以WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType欄位(值WHV_MEMORY_ACCESS_TYPE)報告,而非以AccessType位元欄位報告。WHV_MEMORY_ACCESS_INFO