Saída do Acesso à Memória

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 WHvRunVpExitReasonMemoryAccess saída. O contexto relata o tipo de acesso e a validade do endereço por meio WHV_MEMORY_ACCESS_INFO.AccessTypede , GpaUnmappede GvaValid, 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: WHvRunVpExitReasonUnmappedGpa quando o endereço físico do convidado acessado não é mapeado ou WHvRunVpExitReasonGpaIntercept quando o endereço é mapeado, mas configurado para interceptar. O contexto começa com um WHV_INTERCEPT_MESSAGE_HEADER (que relata a falha Pc e Cpsr), e o Syndrome membro 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.

Consulte também