Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Dados de contexto para uma saída de 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 que acessa um local de memória que não está mapeado ou não é acessível são fornecidas pela WHV_MEMORY_ACCESS_CONTEXT estrutura.
Um caso de uso comum para saídas de acesso à memória é a emulação de operações de dispositivo MMIO, em que 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 é exibido com o motivo de
WHvRunVpExitReasonMemoryAccesssaída. O contexto relata o tipo de acesso e a validade do endereço por meioWHV_MEMORY_ACCESS_INFO.AccessTypede ,GpaUnmappedeGvaValid, e carrega os bytes de instrução capturados para emulação. A estrutura é de 40 bytes. - No Arm64, o acesso é exibido com um dos dois motivos de saída:
WHvRunVpExitReasonUnmappedGpaquando o endereço físico do convidado acessado não é mapeado ouWHvRunVpExitReasonGpaInterceptquando o endereço é mapeado, mas configurado para interceptar. O contexto começa com umWHV_INTERCEPT_MESSAGE_HEADER(que relata a falhaPceCpsr), e oSyndromemembro carrega o valor do Registro de Síndrome de Exceção arm64 (ESR) que descreve o acesso a falhas. A estrutura é de 64 bytes.
Note
No Arm64, o tipo de acesso é relatado pelo WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType campo (um WHV_MEMORY_ACCESS_TYPE valor) em vez de por um AccessType campo de bits em WHV_MEMORY_ACCESS_INFO.