Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Контекстные данные для выхода виртуальной машины, вызванные доступом к памяти.
Синтаксис
//
// 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