Выход из доступа к памяти

Контекстные данные для выхода виртуальной машины, вызванные доступом к памяти.

Синтаксис

//
// 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 причиной выхода. Контекст сообщает тип доступа и допустимость адреса через WHV_MEMORY_ACCESS_INFO.AccessType, GpaUnmappedа также GvaValidсодержит сохраненные байты инструкций для эмуляции. Структура составляет 40 байт.
  • В Arm64 доступ к поверхностям с одной из двух причин выхода: WHvRunVpExitReasonUnmappedGpa при сопоставлении доступного гостевого физического адреса или WHvRunVpExitReasonGpaIntercept при сопоставлении адреса, но настроенного для перехвата. Контекст начинается с WHV_INTERCEPT_MESSAGE_HEADER значения (который сообщает об ошибке Pc и Cpsr), а Syndrome член несет значение регистра синдрома исключения Arm64 (ESR), описывающее доступ к сбоям. Структура составляет 64 байта.

Замечание

В Arm64 тип доступа сообщается полем WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType (значением), а не битовым полемAccessType.WHV_MEMORY_ACCESS_INFOWHV_MEMORY_ACCESS_TYPE

См. также