]> git.proxmox.com Git - mirror_edk2.git/blob - EdkModulePkg/Universal/Ebc/Dxe/EbcInt.h
51bd785a53229f9861c788fde53f8161ad3483bd
[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 //
55 // Bits of exception flags field of VM context
56 //
57 #define EXCEPTION_FLAG_FATAL 0x80000000 // can't continue
58 #define EXCEPTION_FLAG_ERROR 0x40000000 // bad, but try to continue
59 #define EXCEPTION_FLAG_WARNING 0x20000000 // harmless problem
60 #define EXCEPTION_FLAG_NONE 0x00000000 // for normal return
61 //
62 // Flags passed to the internal create-thunks function.
63 //
64 #define FLAG_THUNK_ENTRY_POINT 0x01 // thunk for an image entry point
65 #define FLAG_THUNK_PROTOCOL 0x00 // thunk for an EBC protocol service
66 //
67 // Put this value at the bottom of the VM's stack gap so we can check it on
68 // occasion to make sure the stack has not been corrupted.
69 //
70 #define VM_STACK_KEY_VALUE 0xDEADBEEF
71
72 EFI_STATUS
73 EbcCreateThunks (
74 IN EFI_HANDLE ImageHandle,
75 IN VOID *EbcEntryPoint,
76 OUT VOID **Thunk,
77 IN UINT32 Flags
78 )
79 ;
80
81 EFI_STATUS
82 EbcAddImageThunk (
83 IN EFI_HANDLE ImageHandle,
84 IN VOID *ThunkBuffer,
85 IN UINT32 ThunkSize
86 )
87 ;
88
89 //
90 // The interpreter calls these when an exception is detected,
91 // or as a periodic callback.
92 //
93 EFI_STATUS
94 EbcDebugSignalException (
95 IN EFI_EXCEPTION_TYPE ExceptionType,
96 IN EXCEPTION_FLAGS ExceptionFlags,
97 IN VM_CONTEXT *VmPtr
98 )
99 ;
100
101 //
102 // Define a constant of how often to call the debugger periodic callback
103 // function.
104 //
105 #define EBC_VM_PERIODIC_CALLBACK_RATE 1000
106
107 EFI_STATUS
108 EbcDebugSignalPeriodic (
109 IN VM_CONTEXT *VmPtr
110 )
111 ;
112
113 //
114 // External low level functions that are native-processor dependent
115 //
116 UINTN
117 EbcLLGetEbcEntryPoint (
118 VOID
119 )
120 ;
121
122 UINTN
123 EbcLLGetStackPointer (
124 VOID
125 )
126 ;
127
128 VOID
129 EbcLLCALLEXNative (
130 IN UINTN CallAddr,
131 IN UINTN EbcSp,
132 IN VOID *FramePtr
133 )
134 ;
135
136 VOID
137 EbcLLCALLEX (
138 IN VM_CONTEXT *VmPtr,
139 IN UINTN CallAddr,
140 IN UINTN EbcSp,
141 IN VOID *FramePtr,
142 IN UINT8 Size
143 )
144 ;
145
146 INT64
147 EbcLLGetReturnValue (
148 VOID
149 )
150 ;
151
152 //
153 // Defines for a simple EBC debugger interface
154 //
155 typedef struct _EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL;
156
157 #define EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL_GUID \
158 { \
159 0x2a72d11e, 0x7376, 0x40f6, { 0x9c, 0x68, 0x23, 0xfa, 0x2f, 0xe3, 0x63, 0xf1 } \
160 }
161
162 typedef
163 EFI_STATUS
164 (*EBC_DEBUGGER_SIGNAL_EXCEPTION) (
165 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
166 IN VM_CONTEXT * VmPtr,
167 IN EFI_EXCEPTION_TYPE ExceptionType
168 );
169
170 typedef
171 VOID
172 (*EBC_DEBUGGER_DEBUG) (
173 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
174 IN VM_CONTEXT * VmPtr
175 );
176
177 typedef
178 UINT32
179 (*EBC_DEBUGGER_DASM) (
180 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
181 IN VM_CONTEXT * VmPtr,
182 IN UINT16 *DasmString OPTIONAL,
183 IN UINT32 DasmStringSize
184 );
185
186 //
187 // This interface allows you to configure the EBC debug support
188 // driver. For example, turn on or off saving and printing of
189 // delta VM even if called. Or to even disable the entire interface,
190 // in which case all functions become no-ops.
191 //
192 typedef
193 EFI_STATUS
194 (*EBC_DEBUGGER_CONFIGURE) (
195 IN EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL * This,
196 IN UINT32 ConfigId,
197 IN UINTN ConfigValue
198 );
199
200 //
201 // Prototype for the actual EBC debug support protocol interface
202 //
203 struct _EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL {
204 EBC_DEBUGGER_DEBUG Debugger;
205 EBC_DEBUGGER_SIGNAL_EXCEPTION SignalException;
206 EBC_DEBUGGER_DASM Dasm;
207 EBC_DEBUGGER_CONFIGURE Configure;
208 };
209
210 typedef struct {
211 EFI_EBC_PROTOCOL *This;
212 VOID *EntryPoint;
213 EFI_HANDLE ImageHandle;
214 VM_CONTEXT VmContext;
215 } EFI_EBC_THUNK_DATA;
216
217 #define EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('e', 'b', 'c', 'p')
218
219 struct _EBC_PROTOCOL_PRIVATE_DATA {
220 UINT32 Signature;
221 EFI_EBC_PROTOCOL EbcProtocol;
222 UINTN StackBase;
223 UINTN StackTop;
224 UINTN StackSize;
225 } ;
226
227 #define EBC_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \
228 CR(a, EBC_PROTOCOL_PRIVATE_DATA, EbcProtocol, EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE)
229
230
231 #endif // #ifndef _EBC_INT_H_