内存访问退出

内存访问导致 VM 退出的上下文数据。

Syntax

//
// 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 退出原因。 上下文通过/> 报告访问类型和地址有效性,并携带捕获的指令字节进行仿真。 结构为 40 字节。
  • 在 Arm64 上,访问图面有以下两个退出原因之一: WHvRunVpExitReasonUnmappedGpa 未映射访问的来宾物理地址或 WHvRunVpExitReasonGpaIntercept 映射地址但配置为截获时。 上下文以描述 WHV_INTERCEPT_MESSAGE_HEADER 故障访问的 Arm64 异常综合症寄存器 (ESR) 值开头(报告故障 PcCpsr),成员 Syndrome 携带 Arm64 异常综合症寄存器(ESR)。 结构为 64 字节。

注释

在 Arm64 上,访问类型由 WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType 字段(值 WHV_MEMORY_ACCESS_TYPE )而不是 AccessType 位域报告 WHV_MEMORY_ACCESS_INFO

另见