メモリ アクセスの終了

メモリ アクセスによって発生する VM 出口のコンテキスト データ。

構文

//
// 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 デバイス操作のエミュレーションです。この操作では、エミュレートされたデバイスの MMIO 領域にパーティションの GPA 領域のマップされていない領域が使用され、このリージョンへのアクセスが仮想化スタックのデバイス エミュレーション ロジックに転送されます。

WHV_MEMORY_ACCESS_CONTEXT構造体は、x64 (_AMD64_) パーティションと Arm64 (_ARM64_) パーティションに対して異なる方法で定義されます。

  • x64 では、 WHvRunVpExitReasonMemoryAccess 終了理由を持つアクセス サーフェス。 コンテキストは、 WHV_MEMORY_ACCESS_INFO.AccessTypeGpaUnmapped、および GvaValidを介してアクセスの種類とアドレスの有効性を報告し、エミュレーションのためにキャプチャされた命令バイトを運びます。 構造体は 40 バイトです。
  • Arm64 では、2 つの終了理由のいずれかを含むアクセス サーフェス。アクセスされたゲスト物理アドレスがマップされていない場合に WHvRunVpExitReasonUnmappedGpa するか、アドレスがマップされているがインターセプトするように構成されたときに WHvRunVpExitReasonGpaIntercept します。 コンテキストは WHV_INTERCEPT_MESSAGE_HEADER (エラーの PcCpsrを報告) で始まり、 Syndrome メンバーは、障害が発生しているアクセスを記述する Arm64 例外症候群レジスタ (ESR) 値を保持します。 構造体は 64 バイトです。

Note

Arm64 では、アクセスの種類は、WHV_MEMORY_ACCESS_INFOAccessTypeビットフィールドではなく、WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType フィールド (WHV_MEMORY_ACCESS_TYPE値) によって報告されます。

こちらも参照ください