Sortie de l’accès à la mémoire

Données contextuelles pour une sortie de machine virtuelle provoquée par un accès à la mémoire.

Syntaxe

//
// 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

Des informations sur les sorties provoquées par le processeur virtuel accédant à un emplacement de mémoire qui n’est pas mappé ou non accessible sont fournies par la WHV_MEMORY_ACCESS_CONTEXT structure.

Un cas d’usage courant pour les sorties d’accès à la mémoire est l’émulation des opérations d’appareil MMIO, où les régions non mappées de l’espace GPA de la partition sont utilisées pour l’espace MMIO d’un appareil émulé et les accès à cette région sont transférés à la logique d’émulation de l’appareil dans la pile de virtualisation.

La WHV_MEMORY_ACCESS_CONTEXT structure est définie différemment pour les partitions x64 (_AMD64_) et Arm64 (_ARM64_) :

  • Sur x64, les surfaces d’accès avec la raison de WHvRunVpExitReasonMemoryAccess sortie. Le contexte signale le type d’accès et la validité de l’adresse via WHV_MEMORY_ACCESS_INFO.AccessType, GpaUnmappedet GvaValidtransporte les octets d’instruction capturés pour l’émulation. La structure est de 40 octets.
  • Sur Arm64, les surfaces d’accès avec l’une des deux raisons de sortie suivantes : WHvRunVpExitReasonUnmappedGpa lorsque l’adresse physique invitée sollicitée n’est pas mappée, ou WHvRunVpExitReasonGpaIntercept lorsque l’adresse est mappée, mais configurée pour intercepter. Le contexte commence par un WHV_INTERCEPT_MESSAGE_HEADER (qui signale l’erreur Pc et Cpsr) et le Syndrome membre porte la valeur ESR (Exception Syndrome Register) Arm64 qui décrit l’accès défectueux. La structure est de 64 octets.

Note

Sur Arm64, le type d’accès est signalé par le WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType champ (une WHV_MEMORY_ACCESS_TYPE valeur) plutôt que par un champ de AccessType bits dans WHV_MEMORY_ACCESS_INFO.

Voir aussi