Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Dados de contexto para a saída de uma VM causada por um acesso à memória.
Sintaxe
//
// 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
Informações sobre saídas causadas pelo processador virtual acessando um local de memória que não está mapeado WHV_MEMORY_ACCESS_CONTEXT ou não acessível são fornecidas pela estrutura.
Um caso de uso comum para saídas de acesso à memória é a emulação das operações de dispositivos MMIO, onde regiões não mapeadas do espaço GPA da partição são usadas para o espaço MMIO de um dispositivo emulado e os acessos a essa região são encaminhados para a lógica de emulação do dispositivo na pilha de virtualização.
A WHV_MEMORY_ACCESS_CONTEXT estrutura é definida de forma diferente para partições x64 (_AMD64_) e Arm64 (_ARM64_):
- No x64, o acesso aparece com a
WHvRunVpExitReasonMemoryAccessrazão de saída. O contexto reporta o tipo de acesso e a validade do endereço atravésWHV_MEMORY_ACCESS_INFO.AccessTypede ,GpaUnmapped, eGvaValid, e transporta os bytes de instrução capturados para emulação. A estrutura tem 40 bytes. - No Arm64, o acesso surge com uma de duas razões de saída:
WHvRunVpExitReasonUnmappedGpaquando o endereço físico do convidado acedido não está mapeado, ouWHvRunVpExitReasonGpaInterceptquando o endereço é mapeado mas configurado para intercetar. O contexto começa com umWHV_INTERCEPT_MESSAGE_HEADER(que reporta a falhaPceCpsr), e oSyndromemembro transporta o valor do Arm64 Exception Syndrome Register (ESR) que descreve o acesso falhado. A estrutura tem 64 bytes.
Note
No Arm64, o tipo de acesso é reportado pelo WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType campo (um WHV_MEMORY_ACCESS_TYPE valor) em vez de um AccessType campo de bits em WHV_MEMORY_ACCESS_INFO.