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