Ukončení přístupu k paměti

Kontextová data pro ukončení virtuálního počítače způsobená přístupem k paměti

Syntaxe

//
// 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

Informace o ukončeních způsobených virtuálním procesorem přistupujícím k umístění paměti, které není mapované nebo není přístupné, poskytuje WHV_MEMORY_ACCESS_CONTEXT struktura.

Běžným případem použití pro ukončení přístupu k paměti je emulace operací zařízení MMIO, kdy se v zásobníku virtualizace předávají nemapované oblasti prostoru GPA oddílu pro prostor MMIO emulovaného zařízení a přístupy k této oblasti se předávají do logiky emulace zařízení v zásobníku virtualizace.

Struktura WHV_MEMORY_ACCESS_CONTEXT je definována odlišně pro oddíly x64 (_AMD64_) a Arm64 (_ARM64_):

  • Na platformě x64 jsou přístupové plochy s WHvRunVpExitReasonMemoryAccess důvodem ukončení. Kontext hlásí přístupový typ a platnost adresy prostřednictvím WHV_MEMORY_ACCESS_INFO.AccessTypeGpaUnmapped, a GvaValid, a , a , nese zachycené bajty instrukce pro emulaci. Struktura je 40 bajtů.
  • V Arm64 se přístup zobrazí z jednoho ze dvou důvodů ukončení: WHvRunVpExitReasonUnmappedGpa pokud není namapovaná fyzická adresa hosta nebo WHvRunVpExitReasonGpaIntercept když je adresa namapovaná, ale nakonfigurovaná tak, aby se zachytila. Kontext začíná hodnotou WHV_INTERCEPT_MESSAGE_HEADER (která hlásí chybující Pc a Cpsr) a Syndrome člen má hodnotu ESR (Arm64 Exception Syndrome Register), která popisuje chybující přístup. Struktura je 64 bajtů.

Note

V Arm64 je typ přístupu hlášen WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType polem ( WHV_MEMORY_ACCESS_TYPE hodnota) místo AccessType bitového pole v WHV_MEMORY_ACCESS_INFO.

Viz také