]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/EbcDxe/EbcInt.h
Clean up the private GUID definition in module Level.
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcInt.h
1 /** @file
2 Main routines for the EBC interpreter. Includes the initialization and
3 main interpreter routines.
4
5 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
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 _EBC_INT_H_
17 #define _EBC_INT_H_
18
19
20 #include <Uefi.h>
21
22 #include <Protocol/DebugSupport.h>
23 #include <Protocol/Ebc.h>
24 #include <Protocol/EbcVmTest.h>
25 #include <Protocol/EbcSimpleDebugger.h>
26
27 #include <Library/BaseLib.h>
28 #include <Library/DebugLib.h>
29 #include <Library/UefiDriverEntryPoint.h>
30 #include <Library/BaseMemoryLib.h>
31 #include <Library/UefiBootServicesTableLib.h>
32 #include <Library/MemoryAllocationLib.h>
33
34 extern VM_CONTEXT *mVmPtr;
35
36 //
37 // Bits of exception flags field of VM context
38 //
39 #define EXCEPTION_FLAG_FATAL 0x80000000 // can't continue
40 #define EXCEPTION_FLAG_ERROR 0x40000000 // bad, but try to continue
41 #define EXCEPTION_FLAG_WARNING 0x20000000 // harmless problem
42 #define EXCEPTION_FLAG_NONE 0x00000000 // for normal return
43 //
44 // Flags passed to the internal create-thunks function.
45 //
46 #define FLAG_THUNK_ENTRY_POINT 0x01 // thunk for an image entry point
47 #define FLAG_THUNK_PROTOCOL 0x00 // thunk for an EBC protocol service
48 //
49 // Put this value at the bottom of the VM's stack gap so we can check it on
50 // occasion to make sure the stack has not been corrupted.
51 //
52 #define VM_STACK_KEY_VALUE 0xDEADBEEF
53
54 /**
55 Create thunks for an EBC image entry point, or an EBC protocol service.
56
57 @param ImageHandle Image handle for the EBC image. If not null, then
58 we're creating a thunk for an image entry point.
59 @param EbcEntryPoint Address of the EBC code that the thunk is to call
60 @param Thunk Returned thunk we create here
61 @param Flags Flags indicating options for creating the thunk
62
63 @retval EFI_SUCCESS The thunk was created successfully.
64 @retval EFI_INVALID_PARAMETER The parameter of EbcEntryPoint is not 16-bit
65 aligned.
66 @retval EFI_OUT_OF_RESOURCES There is not enough memory to created the EBC
67 Thunk.
68 @retval EFI_BUFFER_TOO_SMALL EBC_THUNK_SIZE is not larger enough.
69
70 **/
71 EFI_STATUS
72 EbcCreateThunks (
73 IN EFI_HANDLE ImageHandle,
74 IN VOID *EbcEntryPoint,
75 OUT VOID **Thunk,
76 IN UINT32 Flags
77 );
78
79 /**
80 Add a thunk to our list of thunks for a given image handle.
81 Also flush the instruction cache since we've written thunk code
82 to memory that will be executed eventually.
83
84 @param ImageHandle The image handle to which the thunk is tied.
85 @param ThunkBuffer The buffer that has been created/allocated.
86 @param ThunkSize The size of the thunk memory allocated.
87
88 @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
89 @retval EFI_SUCCESS The function completed successfully.
90
91 **/
92 EFI_STATUS
93 EbcAddImageThunk (
94 IN EFI_HANDLE ImageHandle,
95 IN VOID *ThunkBuffer,
96 IN UINT32 ThunkSize
97 );
98
99 //
100 // The interpreter calls these when an exception is detected,
101 // or as a periodic callback.
102 //
103 /**
104 The VM interpreter calls this function when an exception is detected.
105
106 @param ExceptionType Specifies the processor exception detected.
107 @param ExceptionFlags Specifies the exception context.
108 @param VmPtr Pointer to a VM context for passing info to the
109 EFI debugger.
110
111 @retval EFI_SUCCESS This function completed successfully.
112
113 **/
114 EFI_STATUS
115 EbcDebugSignalException (
116 IN EFI_EXCEPTION_TYPE ExceptionType,
117 IN EXCEPTION_FLAGS ExceptionFlags,
118 IN VM_CONTEXT *VmPtr
119 );
120
121 //
122 // Define a constant of how often to call the debugger periodic callback
123 // function.
124 //
125 #define EFI_TIMER_UNIT_1MS (1000 * 10)
126 #define EBC_VM_PERIODIC_CALLBACK_RATE (1000 * EFI_TIMER_UNIT_1MS)
127 #define STACK_POOL_SIZE (1024 * 1020)
128 #define MAX_STACK_NUM 4
129
130 //
131 // External low level functions that are native-processor dependent
132 //
133 /**
134 The VM thunk code stuffs an EBC entry point into a processor
135 register. Since we can't use inline assembly to get it from
136 the interpreter C code, stuff it into the return value
137 register and return.
138
139 @return The contents of the register in which the entry point is passed.
140
141 **/
142 UINTN
143 EFIAPI
144 EbcLLGetEbcEntryPoint (
145 VOID
146 );
147
148 /**
149 Returns the caller's value of the stack pointer.
150
151 We adjust it by 4 here because when they called us, the return address
152 is put on the stack, thereby lowering it by 4 bytes.
153
154 @return The current value of the stack pointer for the caller.
155
156 **/
157 UINTN
158 EFIAPI
159 EbcLLGetStackPointer (
160 VOID
161 );
162
163 /**
164 This function is called to execute an EBC CALLEX instruction.
165 This instruction requires that we thunk out to external native
166 code. For x64, we switch stacks, copy the arguments to the stack
167 and jump to the specified function.
168 On return, we restore the stack pointer to its original location.
169 Destroys no working registers.
170
171 @param CallAddr The function address.
172 @param EbcSp The new EBC stack pointer.
173 @param FramePtr The frame pointer.
174
175 **/
176 VOID
177 EFIAPI
178 EbcLLCALLEXNative (
179 IN UINTN CallAddr,
180 IN UINTN EbcSp,
181 IN VOID *FramePtr
182 );
183
184 /**
185 This function is called to execute an EBC CALLEX instruction.
186 The function check the callee's content to see whether it is common native
187 code or a thunk to another piece of EBC code.
188 If the callee is common native code, use EbcLLCAllEXASM to manipulate,
189 otherwise, set the VM->IP to target EBC code directly to avoid another VM
190 be startup which cost time and stack space.
191
192 @param VmPtr Pointer to a VM context.
193 @param FuncAddr Callee's address
194 @param NewStackPointer New stack pointer after the call
195 @param FramePtr New frame pointer after the call
196 @param Size The size of call instruction
197
198 **/
199 VOID
200 EbcLLCALLEX (
201 IN VM_CONTEXT *VmPtr,
202 IN UINTN FuncAddr,
203 IN UINTN NewStackPointer,
204 IN VOID *FramePtr,
205 IN UINT8 Size
206 );
207
208 /**
209 When EBC calls native, on return the VM has to stuff the return
210 value into a VM register. It's assumed here that the value is still
211 in the register, so simply return and the caller should get the
212 return result properly.
213
214 @return The unmodified value returned by the native code.
215
216 **/
217 INT64
218 EFIAPI
219 EbcLLGetReturnValue (
220 VOID
221 );
222
223 /**
224 Returns the stack index and buffer assosicated with the Handle parameter.
225
226 @param Handle The EFI handle as the index to the EBC stack.
227 @param StackBuffer A pointer to hold the returned stack buffer.
228 @param BufferIndex A pointer to hold the returned stack index.
229
230 @retval EFI_OUT_OF_RESOURCES The Handle parameter does not correspond to any
231 existing EBC stack.
232 @retval EFI_SUCCESS The stack index and buffer were found and
233 returned to the caller.
234
235 **/
236 EFI_STATUS
237 GetEBCStack(
238 IN EFI_HANDLE Handle,
239 OUT VOID **StackBuffer,
240 OUT UINTN *BufferIndex
241 );
242
243 /**
244 Returns from the EBC stack by stack Index.
245
246 @param Index Specifies which EBC stack to return from.
247
248 @retval EFI_SUCCESS The function completed successfully.
249
250 **/
251 EFI_STATUS
252 ReturnEBCStack(
253 IN UINTN Index
254 );
255
256 /**
257 Allocates memory to hold all the EBC stacks.
258
259 @retval EFI_SUCCESS The EBC stacks were allocated successfully.
260 @retval EFI_OUT_OF_RESOURCES Not enough memory available for EBC stacks.
261
262 **/
263 EFI_STATUS
264 InitEBCStack (
265 VOID
266 );
267
268 /**
269 Free all EBC stacks allocated before.
270
271 @retval EFI_SUCCESS All the EBC stacks were freed.
272
273 **/
274 EFI_STATUS
275 FreeEBCStack(
276 VOID
277 );
278
279 /**
280 Returns from the EBC stack associated with the Handle parameter.
281
282 @param Handle Specifies the EFI handle to find the EBC stack with.
283
284 @retval EFI_SUCCESS The function completed successfully.
285
286 **/
287 EFI_STATUS
288 ReturnEBCStackByHandle(
289 IN EFI_HANDLE Handle
290 );
291
292 typedef struct {
293 EFI_EBC_PROTOCOL *This;
294 VOID *EntryPoint;
295 EFI_HANDLE ImageHandle;
296 VM_CONTEXT VmContext;
297 } EFI_EBC_THUNK_DATA;
298
299 #define EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('e', 'b', 'c', 'p')
300
301
302 #define EBC_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \
303 CR(a, EBC_PROTOCOL_PRIVATE_DATA, EbcProtocol, EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE)
304
305
306 #endif // #ifndef _EBC_INT_H_