]> git.proxmox.com Git - mirror_edk2.git/blob - EmulatorPkg/Include/Protocol/EmuThunk.h
eccf0f47d92fd9104565a06bc58c056017ef1346
[mirror_edk2.git] / EmulatorPkg / Include / Protocol / EmuThunk.h
1 /** @file
2 Emulator Thunk to abstract OS services from pure EFI code
3
4 Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
5
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #ifndef __EMU_THUNK_PROTOCOL_H__
17 #define __EMU_THUNK_PROTOCOL_H__
18
19 #define EMU_THUNK_PROTOCOL_GUID \
20 { 0x5CF32E0B, 0x8EDF, 0x2E44, { 0x9C, 0xDA, 0x93, 0x20, 0x5E, 0x99, 0xEC, 0x1C } }
21
22 // neded for things like EFI_TIME_CAPABILITIES
23 #include <Uefi.h>
24
25 #include <Library/PeCoffExtraActionLib.h>
26
27 #include <Protocol/EmuIoThunk.h>
28 #include <Protocol/DevicePath.h>
29
30
31 typedef struct {
32 VENDOR_DEVICE_PATH VendorDevicePath;
33 UINT32 Instance;
34 } EMU_VENDOR_DEVICE_PATH_NODE;
35
36 typedef struct {
37 EMU_VENDOR_DEVICE_PATH_NODE Vendor;
38 EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
39 } EMU_THUNK_DEVICE_PATH;
40
41
42
43 typedef struct _EMU_THUNK_PROTOCOL EMU_THUNK_PROTOCOL;
44
45
46
47 typedef
48 UINTN
49 (EFIAPI *EMU_WRITE_STD_ERROR) (
50 IN UINT8 *Buffer,
51 IN UINTN NumberOfBytes
52 );
53
54 typedef
55 EFI_STATUS
56 (EFIAPI *EMU_CONFIG_STD_IN) (
57 VOID
58 );
59
60 typedef
61 UINTN
62 (EFIAPI *EMU_WRITE_STD_OUT) (
63 IN UINT8 *Buffer,
64 IN UINTN NumberOfBytes
65 );
66
67 typedef
68 UINTN
69 (EFIAPI *EMU_READ_STD_IN) (
70 OUT UINT8 *Buffer,
71 IN UINTN NumberOfBytes
72 );
73
74 typedef
75 BOOLEAN
76 (EFIAPI *EMU_POLL_STD_IN) (
77 VOID
78 );
79
80
81 typedef
82 VOID *
83 (EFIAPI *EMU_OS_MALLOC) (
84 IN UINTN Size
85 );
86
87 typedef
88 VOID *
89 (EFIAPI *EMU_OS_VMALLOC) (
90 IN UINTN Size
91 );
92
93 typedef
94 BOOLEAN
95 (EFIAPI *EMU_OS_FREE) (
96 IN VOID *Ptr
97 );
98
99
100 typedef
101 EFI_STATUS
102 (EFIAPI *EMU_PE_COFF_GET_ENTRY_POINT) (
103 IN VOID *Pe32Data,
104 IN OUT VOID **EntryPoint
105 );
106
107 typedef
108 VOID
109 (EFIAPI *EMU_PE_COFF_RELOCATE_EXTRA_ACTION) (
110 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
111 );
112
113 typedef
114 VOID
115 (EFIAPI *EMU_PE_COFF_UNLOAD_EXTRA_ACTION) (
116 IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
117 );
118
119 typedef
120 VOID
121 (EFIAPI *EMU_ENABLE_INERRUPTS) (
122 VOID
123 );
124
125 typedef
126 VOID
127 (EFIAPI *EMU_DISABLE_INERRUPTS) (
128 VOID
129 );
130
131 typedef
132 UINT64
133 (EFIAPI *EMU_QUERY_PERFORMANCE_FREQENCY) (
134 VOID
135 );
136
137 typedef
138 UINT64
139 (EFIAPI *EMU_QUERY_PERFORMANCE_COUNTER) (
140 VOID
141 );
142
143 typedef
144 VOID
145 (EFIAPI *EMU_SLEEP) (
146 IN UINT64 Milliseconds
147 );
148
149 typedef
150 VOID
151 (EFIAPI *EMU_CPU_SLEEP) (
152 VOID
153 );
154
155 typedef
156 VOID
157 (EFIAPI *EMU_EXIT) (
158 IN UINTN Status
159 );
160
161 typedef
162 VOID
163 (EFIAPI *EMU_GET_TIME) (
164 OUT EFI_TIME *Time,
165 OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
166 );
167
168 typedef
169 VOID
170 (EFIAPI *EMU_SET_TIME) (
171 IN EFI_TIME *Time
172 );
173
174
175 typedef
176 VOID
177 (EFIAPI EMU_SET_TIMER_CALLBACK) (
178 IN UINT64 DeltaMs
179 );
180
181 typedef
182 VOID
183 (EFIAPI *EMU_SET_TIMER) (
184 IN UINT64 PeriodMs,
185 IN EMU_SET_TIMER_CALLBACK CallBack
186 );
187
188
189
190 /**
191 Enumerates the current set of protocol instances that abstract OS services from EFI.
192
193 A given protocol can have multiple instances. Usually a protocol is configured via a
194 single PCD string. The data associated for each instance is seperated via a ! in the string.
195 EMU_IO_THUNK_PROTOCOL_CLOSE.ConfigString will contain the information in the PCD string up to the next !.
196 Thus each instance has a unique ConfigString.
197
198 @param EmuBusDriver TRUE means only return protocol instances that need to be produced
199 by the EmuBusDriver. FALSE means return all possible protocols
200 @param Instance On input the protocol to search for, or NULL to start a search
201 of all the supported protocol instances.
202 @param NextProtocol On output it represents the next value to be passed into Protocol.
203 @param Interface A pointer to the EMU_IO_THUNK_PROTOCOL_CLOSE interface.
204
205 @retval EFI_SUCCESS The function completed successfully.
206 @retval EFI_NOT_FOUND The next protocol instance was not found.
207 @retval EFI_INVALID_PARAMETER Instance is NULL.
208
209 **/
210 typedef
211 EFI_STATUS
212 (EFIAPI *EMU_GET_NEXT_PROTOCOL) (
213 IN BOOLEAN EmuBusDriver,
214 OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
215 );
216
217
218 struct _EMU_THUNK_PROTOCOL {
219 // Used for early debug printing
220 EMU_WRITE_STD_ERROR WriteStdErr;
221 EMU_CONFIG_STD_IN ConfigStdIn;
222 EMU_WRITE_STD_OUT WriteStdOut;
223 EMU_READ_STD_IN ReadStdIn;
224 EMU_POLL_STD_IN PollStdIn;
225
226 //
227 // Map OS malloc/free so we can use OS based guard malloc
228 //
229 EMU_OS_MALLOC Malloc;
230 EMU_OS_VMALLOC Valloc;
231 EMU_OS_FREE Free;
232
233
234 ///
235 /// PE/COFF loader hooks to get symbols loaded
236 ///
237 EMU_PE_COFF_GET_ENTRY_POINT PeCoffGetEntryPoint;
238 EMU_PE_COFF_RELOCATE_EXTRA_ACTION PeCoffRelocateImageExtraAction;
239 EMU_PE_COFF_UNLOAD_EXTRA_ACTION PeCoffUnloadImageExtraAction;
240
241 ///
242 /// DXE Architecture Protocol Services
243 ///
244 EMU_ENABLE_INERRUPTS EnableInterrupt;
245 EMU_DISABLE_INERRUPTS DisableInterrupt;
246 EMU_QUERY_PERFORMANCE_FREQENCY QueryPerformanceFrequency;
247 EMU_QUERY_PERFORMANCE_COUNTER QueryPerformanceCounter;
248
249 EMU_SLEEP Sleep;
250 EMU_CPU_SLEEP CpuSleep;
251 EMU_EXIT Exit;
252 EMU_GET_TIME GetTime;
253 EMU_SET_TIME SetTime;
254 EMU_SET_TIMER SetTimer;
255
256 ///
257 /// Generic System Services
258 ///
259 EMU_GET_NEXT_PROTOCOL GetNextProtocol;
260 };
261
262 extern EFI_GUID gEmuThunkProtocolGuid;
263
264 #endif