• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*++
2 
3 Copyright (c) Microsoft Corporation.  All rights reserved.
4 
5 Module Name:
6 
7     WinHvEmu.ext
8 
9 Abstract:
10 
11     ApiSet contract for the Windows Hyper-V Instruction Emulator APIs.
12 
13 --*/
14 
15 #ifndef _WINHVEMUAPI_H_
16 #define _WINHVEMUAPI_H_
17 
18 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
19 #pragma once
20 #pragma warning(push)
21 #pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */
22 #endif
23 
24 /*#include <apiset.h>
25 #include <apisetcconv.h>
26 #include <minwindef.h>
27 #include <winapifamily.h>
28 
29 #pragma region Desktop Family or OneCore Family
30 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
31 
32 #include <WinHvPlatformDefs.h>*/
33 
34 #define CALLBACK    __stdcall
35 #define _Inout_
36 
37 typedef union WHV_EMULATOR_STATUS
38 {
39     struct
40     {
41         UINT32 EmulationSuccessful : 1;
42         UINT32 InternalEmulationFailure : 1;
43         UINT32 IoPortCallbackFailed : 1;
44         UINT32 MemoryCallbackFailed : 1;
45         UINT32 TranslateGvaPageCallbackFailed : 1;
46         UINT32 TranslateGvaPageCallbackGpaIsNotAligned : 1;
47         UINT32 GetVirtualProcessorRegistersCallbackFailed : 1;
48         UINT32 SetVirtualProcessorRegistersCallbackFailed : 1;
49         UINT32 InterruptCausedIntercept : 1;
50         UINT32 GuestCannotBeFaulted : 1;
51         UINT32 Reserved : 22;
52     };
53 
54     UINT32 AsUINT32;
55 } WHV_EMULATOR_STATUS;
56 
57 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
58 #pragma warning(pop)
59 #endif
60 
61 //
62 // Callbacks registered in emulator creation
63 //
64 
65 typedef struct WHV_EMULATOR_MEMORY_ACCESS_INFO
66 {
67     WHV_GUEST_PHYSICAL_ADDRESS GpaAddress;
68     UINT8 Direction;
69     UINT8 AccessSize;
70     UINT8 Data[8];
71 } WHV_EMULATOR_MEMORY_ACCESS_INFO;
72 
73 typedef struct WHV_EMULATOR_IO_ACCESS_INFO
74 {
75     UINT8 Direction;
76     UINT16 Port;
77     UINT16 AccessSize;
78     UINT32 Data;
79 } WHV_EMULATOR_IO_ACCESS_INFO;
80 
81 typedef HRESULT (CALLBACK *WHV_EMULATOR_IO_PORT_CALLBACK)(
82     _In_ VOID* Context,
83     _Inout_ WHV_EMULATOR_IO_ACCESS_INFO* IoAccess
84     );
85 
86 typedef HRESULT (CALLBACK *WHV_EMULATOR_MEMORY_CALLBACK)(
87     _In_ VOID* Context,
88     _Inout_ WHV_EMULATOR_MEMORY_ACCESS_INFO* MemoryAccess
89     );
90 
91 typedef HRESULT (CALLBACK *WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)(
92     _In_ VOID* Context,
93     _In_reads_(RegisterCount) const WHV_REGISTER_NAME* RegisterNames,
94     _In_ UINT32 RegisterCount,
95     _Out_writes_(RegisterCount) WHV_REGISTER_VALUE* RegisterValues
96     );
97 
98 typedef HRESULT (CALLBACK *WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)(
99     _In_ VOID* Context,
100     _In_reads_(RegisterCount) const WHV_REGISTER_NAME* RegisterNames,
101     _In_ UINT32 RegisterCount,
102     _In_reads_(RegisterCount) const WHV_REGISTER_VALUE* RegisterValues
103     );
104 
105 typedef HRESULT (CALLBACK *WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK)(
106     _In_ VOID* Context,
107     _In_ WHV_GUEST_VIRTUAL_ADDRESS Gva,
108     _In_ WHV_TRANSLATE_GVA_FLAGS TranslateFlags,
109     _Out_ WHV_TRANSLATE_GVA_RESULT_CODE* TranslationResult,
110     _Out_ WHV_GUEST_PHYSICAL_ADDRESS* Gpa
111     );
112 
113 typedef struct WHV_EMULATOR_CALLBACKS
114 {
115     UINT32 Size;
116     UINT32 Reserved;
117     WHV_EMULATOR_IO_PORT_CALLBACK WHvEmulatorIoPortCallback;
118     WHV_EMULATOR_MEMORY_CALLBACK WHvEmulatorMemoryCallback;
119     WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorGetVirtualProcessorRegisters;
120     WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorSetVirtualProcessorRegisters;
121     WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK WHvEmulatorTranslateGvaPage;
122 } WHV_EMULATOR_CALLBACKS;
123 
124 typedef VOID* WHV_EMULATOR_HANDLE;
125 
126 //
127 // Public callable functions
128 //
129 
130 #ifdef __cplusplus
131 extern "C" {
132 #endif
133 
134 HRESULT
135 WINAPI
136 WHvEmulatorCreateEmulator(
137     _In_ const WHV_EMULATOR_CALLBACKS* Callbacks,
138     _Out_ WHV_EMULATOR_HANDLE* Emulator
139     );
140 
141 
142 HRESULT
143 WINAPI
144 WHvEmulatorDestroyEmulator(
145     _In_ WHV_EMULATOR_HANDLE Emulator
146     );
147 
148 
149 
150 HRESULT
151 WINAPI
152 WHvEmulatorTryIoEmulation(
153     _In_ WHV_EMULATOR_HANDLE Emulator,
154     _In_ VOID* Context,
155     _In_ const WHV_VP_EXIT_CONTEXT* VpContext,
156     _In_ const WHV_X64_IO_PORT_ACCESS_CONTEXT* IoInstructionContext,
157     _Out_ WHV_EMULATOR_STATUS* EmulatorReturnStatus
158     );
159 
160 
161 HRESULT
162 WINAPI
163 WHvEmulatorTryMmioEmulation(
164     _In_ WHV_EMULATOR_HANDLE Emulator,
165     _In_ VOID* Context,
166     _In_ const WHV_VP_EXIT_CONTEXT* VpContext,
167     _In_ const WHV_MEMORY_ACCESS_CONTEXT* MmioInstructionContext,
168     _Out_ WHV_EMULATOR_STATUS* EmulatorReturnStatus
169     );
170 
171 
172 #ifdef __cplusplus
173 }
174 #endif
175 
176 //#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
177 //#pragma endregion
178 
179 #endif // _WINHVEMUAPI_H_
180 
181 
182 #ifndef ext_ms_win_hyperv_hvemulation_l1_1_0_query_routines
183 #define ext_ms_win_hyperv_hvemulation_l1_1_0_query_routines
184 
185 
186 
187 //
188 //Private Extension API Query Routines
189 //
190 
191 #ifdef __cplusplus
192 extern "C" {
193 #endif
194 
195 BOOLEAN
196 __stdcall
197 IsWHvEmulatorCreateEmulatorPresent(
198     VOID
199     );
200 
201 BOOLEAN
202 __stdcall
203 IsWHvEmulatorDestroyEmulatorPresent(
204     VOID
205     );
206 
207 BOOLEAN
208 __stdcall
209 IsWHvEmulatorTryIoEmulationPresent(
210     VOID
211     );
212 
213 BOOLEAN
214 __stdcall
215 IsWHvEmulatorTryMmioEmulationPresent(
216     VOID
217     );
218 
219 #ifdef __cplusplus
220 }
221 #endif
222 
223 #endif // endof guard
224 
225