I fixed following bugs in EDKII.
[mirror_edk2.git] / EdkModulePkg / Universal / Ebc / Dxe / EbcInt.h
1 /*++
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 EbcInt.h
15
16 Abstract:
17
18 Main routines for the EBC interpreter. Includes the initialization and
19 main interpreter routines.
20
21 --*/
22
23 #ifndef _EBC_INT_H_
24 #define _EBC_INT_H_
25
26 typedef INT64 VM_REGISTER;
27 typedef UINT8 *VMIP; // instruction pointer for the VM
28 typedef UINT32 EXCEPTION_FLAGS;
29
30 typedef struct {
31 VM_REGISTER R[8]; // General purpose registers.
32 UINT64 Flags; // Flags register:
33 // 0 Set to 1 if the result of the last compare was true
34 // 1 Set to 1 if stepping
35 // 2..63 Reserved.
36 VMIP Ip; // Instruction pointer.
37 UINTN LastException; //
38 EXCEPTION_FLAGS ExceptionFlags; // to keep track of exceptions
39 UINT32 StopFlags;
40 UINT32 CompilerVersion; // via break(6)
41 UINTN HighStackBottom; // bottom of the upper stack
42 UINTN LowStackTop; // top of the lower stack
43 UINT64 StackRetAddr; // location of final return address on stack
44 UINTN *StackMagicPtr; // pointer to magic value on stack to detect corruption
45 EFI_HANDLE ImageHandle; // for this EBC driver
46 EFI_SYSTEM_TABLE *SystemTable; // for debugging only
47 UINTN LastAddrConverted; // for debug
48 UINTN LastAddrConvertedValue; // for debug
49 VOID *FramePtr;
50 VOID *EntryPoint; // entry point of EBC image
51 UINTN ImageBase;
52 } VM_CONTEXT;
53
54 extern VM_CONTEXT *mVmPtr;
55
56 //
57 // Bits of exception flags field of VM context
58 //
59 #define EXCEPTION_FLAG_FATAL 0x80000000 // can't continue
60 #define EXCEPTION_FLAG_ERROR 0x40000000 // bad, but try to continue
61 #define EXCEPTION_FLAG_WARNING 0x20000000 // harmless problem
62 #define EXCEPTION_FLAG_NONE 0x00000000 // for normal return
63 //
64 // Flags passed to the internal create-thunks function.
65 //
66 #define FLAG_THUNK_ENTRY_POINT 0x01 // thunk for an image entry point
67 #define FLAG_THUNK_PROTOCOL 0x00 // thunk for an EBC protocol service
68 //
69 // Put this value at the bottom of the VM's stack gap so we can check it on
70 // occasion to make sure the stack has not been corrupted.
71 //
72 #define VM_STACK_KEY_VALUE 0xDEADBEEF
73
74 EFI_STATUS
75 EbcCreateThunks (
76 IN EFI_HANDLE ImageHandle,
77 IN VOID *EbcEntryPoint,
78 OUT VOID **Thunk,
79 IN UINT32 Flags
80 )
81 ;
82
83 EFI_STATUS
84 EbcAddImageThunk (
85 IN EFI_HANDLE ImageHandle,
86 IN VOID *ThunkBuffer,
87 IN UINT32 ThunkSize
88 )
89 ;
90
91 //
92 // The interpreter calls these when an exception is detected,
93 // or as a periodic callback.
94 //
95 EFI_STATUS
96 EbcDebugSignalException (
97 IN EFI_EXCEPTION_TYPE ExceptionType,
98 IN EXCEPTION_FLAGS ExceptionFlags,
99 IN VM_CONTEXT *VmPtr
100 )
101 ;
102
103 //
104 // Define a constant of how often to call the debugger periodic callback
105 // function.
106 //
107 #define EBC_VM_PERIODIC_CALLBACK_RATE 1000
108
109 EFI_STATUS
110 EbcDebugSignalPeriodic (
111 IN VM_CONTEXT *VmPtr
112 )
113 ;
114
115 //
116 // External low level functions that are native-processor dependent
117 //
118 UINTN
119 EbcLLGetEbcEntryPoint (
120 VOID
121 )
122 ;
123
124 UINTN
125 EbcLLGetStackPointer (
126 VOID
127 )
128 ;
129
130 VOID
131 EbcLLCALLEXNative (
132 IN UINTN CallAddr,
133 IN UINTN EbcSp,
134 IN VOID *FramePtr
135 )
136 ;
137
138 VOID
139 EbcLLCALLEX (
140 IN VM_CONTEXT *VmPtr,
141 IN UINTN CallAddr,
142 IN UINTN EbcSp,
143 IN VOID *FramePtr,
144 IN UINT8 Size
145 )
146 ;
147
148 INT64
149 EbcLLGetReturnValue (
150 VOID
151 )
152 ;
153
154 //
155 // Defines for a simple EBC debugger interface
156 //
157 typedef struct _EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL;
158
159 #define EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL_GUID \
160 { \
161 0x2a72d11e, 0x7376, 0x40f6, { 0x9c, 0x68, 0x23, 0xfa, 0x2f, 0xe3, 0x63, 0xf1 } \
162 }
163
164 typedef
165 EFI_STATUS
166 (*EBC_DEBUGGER_SIGNAL_EXCEPTION) (
167 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
168 IN VM_CONTEXT * VmPtr,
169 IN EFI_EXCEPTION_TYPE ExceptionType
170 );
171
172 typedef
173 VOID
174 (*EBC_DEBUGGER_DEBUG) (
175 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
176 IN VM_CONTEXT * VmPtr
177 );
178
179 typedef
180 UINT32
181 (*EBC_DEBUGGER_DASM) (
182 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
183 IN VM_CONTEXT * VmPtr,
184 IN UINT16 *DasmString OPTIONAL,
185 IN UINT32 DasmStringSize
186 );
187
188 //
189 // This interface allows you to configure the EBC debug support
190 // driver. For example, turn on or off saving and printing of
191 // delta VM even if called. Or to even disable the entire interface,
192 // in which case all functions become no-ops.
193 //
194 typedef
195 EFI_STATUS
196 (*EBC_DEBUGGER_CONFIGURE) (
197 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
198 IN UINT32 ConfigId,
199 IN UINTN ConfigValue
200 );
201
202 //
203 // Prototype for the actual EBC debug support protocol interface
204 //
205 struct _EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL {
206 EBC_DEBUGGER_DEBUG Debugger;
207 EBC_DEBUGGER_SIGNAL_EXCEPTION SignalException;
208 EBC_DEBUGGER_DASM Dasm;
209 EBC_DEBUGGER_CONFIGURE Configure;
210 };
211
212 typedef struct {
213 EFI_EBC_PROTOCOL *This;
214 VOID *EntryPoint;
215 EFI_HANDLE ImageHandle;
216 VM_CONTEXT VmContext;
217 } EFI_EBC_THUNK_DATA;
218
219 #define EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('e', 'b', 'c', 'p')
220
221 struct _EBC_PROTOCOL_PRIVATE_DATA {
222 UINT32 Signature;
223 EFI_EBC_PROTOCOL EbcProtocol;
224 UINTN StackBase;
225 UINTN StackTop;
226 UINTN StackSize;
227 } ;
228
229 #define EBC_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \
230 CR(a, EBC_PROTOCOL_PRIVATE_DATA, EbcProtocol, EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE)
231
232
233 #endif // #ifndef _EBC_INT_H_