Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Datos de contexto para una salida de máquina virtual causados por un acceso a memoria.
Syntax
//
// 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
La estructura proporciona WHV_MEMORY_ACCESS_CONTEXT información sobre las salidas causadas por el procesador virtual que accede a una ubicación de memoria que no está asignada o no está accesible.
Un caso de uso común para las salidas de acceso a memoria es la emulación de las operaciones del dispositivo MMIO, donde las regiones sin asignar del espacio GPA de la partición se usan para el espacio MMIO de un dispositivo emulado y los accesos a esta región se reenvía a la lógica de emulación del dispositivo en la pila de virtualización.
La WHV_MEMORY_ACCESS_CONTEXT estructura se define de forma diferente para las particiones x64 (_AMD64_) y Arm64 (_ARM64_):
- En x64, las superficies de acceso con el motivo de
WHvRunVpExitReasonMemoryAccesssalida. El contexto notifica el tipo de acceso y la validez de la dirección a travésWHV_MEMORY_ACCESS_INFO.AccessTypede ,GpaUnmappedyGvaValid, y lleva los bytes de instrucción capturados para la emulación. La estructura es de 40 bytes. - En Arm64, las superficies de acceso con una de las dos razones de salida:
WHvRunVpExitReasonUnmappedGpacuando no se asigna la dirección física de invitado a la que se accede, oWHvRunVpExitReasonGpaInterceptcuando la dirección está asignada pero configurada para interceptar. El contexto comienza con unWHV_INTERCEPT_MESSAGE_HEADERvalor (que notifica los erroresPcyCpsr), y elSyndromemiembro lleva el valor de Registro de síndrome de excepciones de Arm64 (ESR) que describe el acceso con errores. La estructura es de 64 bytes.
Nota:
En Arm64, el campo (un valor) notifica el WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType tipo de acceso en lugar de un AccessType campo de bits en WHV_MEMORY_ACCESS_INFO.WHV_MEMORY_ACCESS_TYPE