Beenden des Speicherzugriffs

Kontextdaten für einen virtuellen Computer, der durch einen Speicherzugriff verursacht wurde.

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

Informationen zu Beendigungen durch den virtuellen Prozessor, der auf einen nicht zugeordneten oder nicht zugänglichen Speicherspeicherort zugreift, werden von der WHV_MEMORY_ACCESS_CONTEXT Struktur bereitgestellt.

Ein gängiger Anwendungsfall für Den Speicherzugriff ist die Emulation von MMIO-Gerätevorgängen, bei denen nicht zugeordnete Bereiche des GPA-Speicherplatzes der Partition für den MMIO-Raum eines emulierten Geräts verwendet werden und Zugriffe auf diesen Bereich an die Geräteemulationslogik im Virtualisierungsstapel weitergeleitet werden.

Die WHV_MEMORY_ACCESS_CONTEXT Struktur wird für x64 (_AMD64_) und Arm64 (_ARM64_)-Partitionen unterschiedlich definiert:

  • Auf x64 werden die Zugangsflächen mit dem WHvRunVpExitReasonMemoryAccess Ausgangsgrund angezeigt. Der Kontext meldet den Zugriffstyp und die Adressgültigkeit durch WHV_MEMORY_ACCESS_INFO.AccessType, GpaUnmappedund GvaValidträgt die erfassten Anweisungsbytes für die Emulation. Die Struktur beträgt 40 Byte.
  • Auf Arm64 sind die Zugriffsflächen mit einem von zwei Exit-Gründen verfügbar: WHvRunVpExitReasonUnmappedGpa wenn die physische Adresse des Gasts nicht zugeordnet ist oder WHvRunVpExitReasonGpaIntercept wenn die Adresse zugeordnet, aber so konfiguriert ist, dass sie abgefangen wird. Der Kontext beginnt mit einem WHV_INTERCEPT_MESSAGE_HEADER (der den Fehler Pc meldet) und Cpsrdas Syndrome Mitglied trägt den Wert des Arm64 Exception Syndrome Register (ESR), der den fehlerhaften Zugriff beschreibt. Die Struktur beträgt 64 Byte.

Note

Auf Arm64 wird der Zugriffstyp vom WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType Feld (einem WHV_MEMORY_ACCESS_TYPE Wert) und nicht von einem AccessType Bitfeld in WHV_MEMORY_ACCESS_INFOgemeldet.

Siehe auch