Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
google
GitHub Repository: google/crosvm
Path: blob/main/hypervisor/src/whpx/whpx_sys/WinHvEmulation.h
5394 views
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
226