Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Data konteks untuk keluarnya VM yang disebabkan oleh akses memori.
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
Informasi tentang keluar yang disebabkan oleh prosesor virtual yang mengakses lokasi memori yang tidak dipetakan atau tidak dapat diakses disediakan oleh WHV_MEMORY_ACCESS_CONTEXT struktur.
Kasus penggunaan umum untuk keluarnya akses memori adalah emulasi operasi perangkat MMIO, di mana wilayah ruang IPK partisi yang tidak dipetakan digunakan untuk ruang MMIO dari perangkat yang ditiru dan akses ke wilayah ini diteruskan ke logika emulasi perangkat di tumpukan virtualisasi.
Struktur WHV_MEMORY_ACCESS_CONTEXT didefinisikan secara berbeda untuk partisi x64 (_AMD64_) dan Arm64 (_ARM64_):
- Pada x64, akses muncul dengan
WHvRunVpExitReasonMemoryAccessalasan keluar. Konteks melaporkan jenis akses dan validitas alamat melaluiWHV_MEMORY_ACCESS_INFO.AccessType, ,GpaUnmappeddanGvaValid, dan membawa byte instruksi yang diambil untuk emulasi. Strukturnya adalah 40 byte. - Di Arm64, akses muncul dengan salah satu dari dua alasan keluar:
WHvRunVpExitReasonUnmappedGpaketika alamat fisik tamu yang diakses tidak dipetakan, atauWHvRunVpExitReasonGpaInterceptketika alamat dipetakan tetapi dikonfigurasi untuk mencegat. Konteks dimulai denganWHV_INTERCEPT_MESSAGE_HEADER(yang melaporkan kesalahanPcdanCpsr), danSyndromeanggota membawa nilai Arm64 Exception Syndrome Register (ESR) yang menjelaskan akses yang rusak. Strukturnya adalah 64 byte.
Note
Pada Arm64, jenis akses dilaporkan oleh WHV_INTERCEPT_MESSAGE_HEADER.InterceptAccessType bidang ( WHV_MEMORY_ACCESS_TYPE nilai) daripada oleh AccessType bitfield di WHV_MEMORY_ACCESS_INFO.