Path: blob/main/hypervisor/src/whpx/whpx_sys/WinHvEmulation.h
5394 views
/*++12Copyright (c) Microsoft Corporation. All rights reserved.34Module Name:56WinHvEmu.ext78Abstract:910ApiSet contract for the Windows Hyper-V Instruction Emulator APIs.1112--*/1314#ifndef _WINHVEMUAPI_H_15#define _WINHVEMUAPI_H_1617#if defined(_MSC_VER) && (_MSC_VER >= 1200)18#pragma once19#pragma warning(push)20#pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */21#endif2223/*#include <apiset.h>24#include <apisetcconv.h>25#include <minwindef.h>26#include <winapifamily.h>2728#pragma region Desktop Family or OneCore Family29#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)3031#include <WinHvPlatformDefs.h>*/3233#define CALLBACK __stdcall34#define _Inout_3536typedef union WHV_EMULATOR_STATUS37{38struct39{40UINT32 EmulationSuccessful : 1;41UINT32 InternalEmulationFailure : 1;42UINT32 IoPortCallbackFailed : 1;43UINT32 MemoryCallbackFailed : 1;44UINT32 TranslateGvaPageCallbackFailed : 1;45UINT32 TranslateGvaPageCallbackGpaIsNotAligned : 1;46UINT32 GetVirtualProcessorRegistersCallbackFailed : 1;47UINT32 SetVirtualProcessorRegistersCallbackFailed : 1;48UINT32 InterruptCausedIntercept : 1;49UINT32 GuestCannotBeFaulted : 1;50UINT32 Reserved : 22;51};5253UINT32 AsUINT32;54} WHV_EMULATOR_STATUS;5556#if defined(_MSC_VER) && (_MSC_VER >= 1200)57#pragma warning(pop)58#endif5960//61// Callbacks registered in emulator creation62//6364typedef struct WHV_EMULATOR_MEMORY_ACCESS_INFO65{66WHV_GUEST_PHYSICAL_ADDRESS GpaAddress;67UINT8 Direction;68UINT8 AccessSize;69UINT8 Data[8];70} WHV_EMULATOR_MEMORY_ACCESS_INFO;7172typedef struct WHV_EMULATOR_IO_ACCESS_INFO73{74UINT8 Direction;75UINT16 Port;76UINT16 AccessSize;77UINT32 Data;78} WHV_EMULATOR_IO_ACCESS_INFO;7980typedef HRESULT (CALLBACK *WHV_EMULATOR_IO_PORT_CALLBACK)(81_In_ VOID* Context,82_Inout_ WHV_EMULATOR_IO_ACCESS_INFO* IoAccess83);8485typedef HRESULT (CALLBACK *WHV_EMULATOR_MEMORY_CALLBACK)(86_In_ VOID* Context,87_Inout_ WHV_EMULATOR_MEMORY_ACCESS_INFO* MemoryAccess88);8990typedef HRESULT (CALLBACK *WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)(91_In_ VOID* Context,92_In_reads_(RegisterCount) const WHV_REGISTER_NAME* RegisterNames,93_In_ UINT32 RegisterCount,94_Out_writes_(RegisterCount) WHV_REGISTER_VALUE* RegisterValues95);9697typedef HRESULT (CALLBACK *WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)(98_In_ VOID* Context,99_In_reads_(RegisterCount) const WHV_REGISTER_NAME* RegisterNames,100_In_ UINT32 RegisterCount,101_In_reads_(RegisterCount) const WHV_REGISTER_VALUE* RegisterValues102);103104typedef HRESULT (CALLBACK *WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK)(105_In_ VOID* Context,106_In_ WHV_GUEST_VIRTUAL_ADDRESS Gva,107_In_ WHV_TRANSLATE_GVA_FLAGS TranslateFlags,108_Out_ WHV_TRANSLATE_GVA_RESULT_CODE* TranslationResult,109_Out_ WHV_GUEST_PHYSICAL_ADDRESS* Gpa110);111112typedef struct WHV_EMULATOR_CALLBACKS113{114UINT32 Size;115UINT32 Reserved;116WHV_EMULATOR_IO_PORT_CALLBACK WHvEmulatorIoPortCallback;117WHV_EMULATOR_MEMORY_CALLBACK WHvEmulatorMemoryCallback;118WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorGetVirtualProcessorRegisters;119WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorSetVirtualProcessorRegisters;120WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK WHvEmulatorTranslateGvaPage;121} WHV_EMULATOR_CALLBACKS;122123typedef VOID* WHV_EMULATOR_HANDLE;124125//126// Public callable functions127//128129#ifdef __cplusplus130extern "C" {131#endif132133HRESULT134WINAPI135WHvEmulatorCreateEmulator(136_In_ const WHV_EMULATOR_CALLBACKS* Callbacks,137_Out_ WHV_EMULATOR_HANDLE* Emulator138);139140141HRESULT142WINAPI143WHvEmulatorDestroyEmulator(144_In_ WHV_EMULATOR_HANDLE Emulator145);146147148149HRESULT150WINAPI151WHvEmulatorTryIoEmulation(152_In_ WHV_EMULATOR_HANDLE Emulator,153_In_ VOID* Context,154_In_ const WHV_VP_EXIT_CONTEXT* VpContext,155_In_ const WHV_X64_IO_PORT_ACCESS_CONTEXT* IoInstructionContext,156_Out_ WHV_EMULATOR_STATUS* EmulatorReturnStatus157);158159160HRESULT161WINAPI162WHvEmulatorTryMmioEmulation(163_In_ WHV_EMULATOR_HANDLE Emulator,164_In_ VOID* Context,165_In_ const WHV_VP_EXIT_CONTEXT* VpContext,166_In_ const WHV_MEMORY_ACCESS_CONTEXT* MmioInstructionContext,167_Out_ WHV_EMULATOR_STATUS* EmulatorReturnStatus168);169170171#ifdef __cplusplus172}173#endif174175//#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)176//#pragma endregion177178#endif // _WINHVEMUAPI_H_179180181#ifndef ext_ms_win_hyperv_hvemulation_l1_1_0_query_routines182#define ext_ms_win_hyperv_hvemulation_l1_1_0_query_routines183184185186//187//Private Extension API Query Routines188//189190#ifdef __cplusplus191extern "C" {192#endif193194BOOLEAN195__stdcall196IsWHvEmulatorCreateEmulatorPresent(197VOID198);199200BOOLEAN201__stdcall202IsWHvEmulatorDestroyEmulatorPresent(203VOID204);205206BOOLEAN207__stdcall208IsWHvEmulatorTryIoEmulationPresent(209VOID210);211212BOOLEAN213__stdcall214IsWHvEmulatorTryMmioEmulationPresent(215VOID216);217218#ifdef __cplusplus219}220#endif221222#endif // endof guard223224225226