1 /** @file
2 
3 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
4 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 **/
13 
14 #ifndef _EFI_EDB_COMMON_H_
15 #define _EFI_EDB_COMMON_H_
16 
17 #include <Uefi.h>
18 #include <Library/BaseLib.h>
19 #include <Library/BaseMemoryLib.h>
20 #include <Library/MemoryAllocationLib.h>
21 #include <Library/DebugLib.h>
22 #include <Library/UefiLib.h>
23 #include <Library/PrintLib.h>
24 #include <Library/UefiBootServicesTableLib.h>
25 #include <Protocol/Ebc.h>
26 #include <Protocol/EbcVmTest.h>
27 #include <Protocol/DebugSupport.h>
28 #include <Protocol/PciRootBridgeIo.h>
29 #include <Protocol/SimpleFileSystem.h>
30 #include <Protocol/DebuggerConfiguration.h>
31 #include <Guid/FileInfo.h>
32 #include <Guid/FileSystemInfo.h>
33 #include <Guid/FileSystemVolumeLabelInfo.h>
34 #include <Guid/DebugImageInfoTable.h>
35 
36 typedef UINTN EFI_DEBUG_STATUS;
37 
38 typedef struct _EFI_DEBUGGER_PRIVATE_DATA EFI_DEBUGGER_PRIVATE_DATA;
39 
40 //
41 // Definition for Debugger Command
42 //
43 typedef
44 EFI_DEBUG_STATUS
45 (* EFI_DEBUGGER_COMMAND) (
46   IN     CHAR16                    *CommandArg,
47   IN     EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
48   IN     EFI_EXCEPTION_TYPE        ExceptionType,
49   IN OUT EFI_SYSTEM_CONTEXT        SystemContext
50 );
51 
52 typedef struct {
53   CHAR16                *CommandName;
54   CHAR16                *CommandTitle;
55   CHAR16                *CommandHelp;
56   CHAR16                *CommandSyntax;
57   CHAR16                *ClassName;
58   EFI_INPUT_KEY         CommandKey;
59   EFI_DEBUGGER_COMMAND  CommandFunc;
60 } EFI_DEBUGGER_COMMAND_SET;
61 
62 //
63 // Definition for Debugger Symbol
64 //
65 #define EFI_DEBUGGER_SYMBOL_NAME_MAX     256
66 #define EFI_DEBUGGER_SYMBOL_ENTRY_MAX    512
67 #define EFI_DEBUGGER_SYMBOL_OBJECT_MAX   32
68 
69 //
70 // We have following SYMBOL data structure:
71 //
72 // SYMBOL_CONTEXT -> SYMBOL_OBJECT -> SYMBOL_ENTRY (FuncXXX, 0xXXX)
73 //                                    SYMBOL_ENTRY (VarYYY,  0xYYY)
74 //                                    SYMBOL_ENTRY
75 //
76 //                   SYMBOL_OBJECT -> SYMBOL_ENTRY
77 //                                    SYMBOL_ENTRY
78 //
79 //                   SYMBOL_OBJECT -> SYMBOL_ENTRY
80 //                                    SYMBOL_ENTRY
81 //
82 
83 typedef enum {
84   EfiDebuggerSymbolFunction,
85   EfiDebuggerSymbolStaticFunction,
86   EfiDebuggerSymbolGlobalVariable,
87   EfiDebuggerSymbolStaticVariable,
88   EfiDebuggerSymbolTypeMax,
89 } EFI_DEBUGGER_SYMBOL_TYPE;
90 
91 typedef struct {
92   CHAR8                      Name[EFI_DEBUGGER_SYMBOL_NAME_MAX];
93   UINTN                      Rva;
94   EFI_DEBUGGER_SYMBOL_TYPE   Type;
95   CHAR8                      ObjName[EFI_DEBUGGER_SYMBOL_NAME_MAX];
96   CHAR8                      *CodBuffer;
97   UINTN                      CodBufferSize;
98   UINTN                      FuncOffsetBase;
99   CHAR8                      *SourceBuffer;
100 } EFI_DEBUGGER_SYMBOL_ENTRY;
101 
102 typedef struct {
103   CHAR16                     Name[EFI_DEBUGGER_SYMBOL_NAME_MAX];
104   UINTN                      EntryCount;
105   UINTN                      MaxEntryCount;
106   UINTN                      BaseAddress;
107   UINTN                      StartEntrypointRVA;
108   UINTN                      MainEntrypointRVA;
109   EFI_DEBUGGER_SYMBOL_ENTRY  *Entry;
110   VOID                       **SourceBuffer;
111 } EFI_DEBUGGER_SYMBOL_OBJECT;
112 
113 typedef struct {
114   UINTN                       ObjectCount;
115   UINTN                       MaxObjectCount;
116   EFI_DEBUGGER_SYMBOL_OBJECT  *Object;
117   BOOLEAN                     DisplaySymbol;
118   BOOLEAN                     DisplayCodeOnly;
119 } EFI_DEBUGGER_SYMBOL_CONTEXT;
120 
121 //
122 // Definition for Debugger Breakpoint
123 //
124 #define EFI_DEBUGGER_BREAKPOINT_MAX    0x10
125 
126 typedef struct {
127   EFI_PHYSICAL_ADDRESS      BreakpointAddress;
128   UINT64                    OldInstruction;    // UINT64 is enough for an instruction
129   BOOLEAN                   State;
130 } EFI_DEBUGGER_BREAKPOINT_CONTEXT;
131 
132 //
133 // Definition for Debugger Call-Stack
134 //
135 #define EFI_DEBUGGER_CALLSTACK_MAX     0x10
136 
137 typedef enum {
138   EfiDebuggerBranchTypeEbcCall,
139   EfiDebuggerBranchTypeEbcCallEx,
140   EfiDebuggerBranchTypeEbcRet,
141   EfiDebuggerBranchTypeEbcJmp,
142   EfiDebuggerBranchTypeEbcJmp8,
143   EfiDebuggerBranchTypeEbcMax,
144 } EFI_DEBUGGER_BRANCH_TYPE;
145 
146 #define EFI_DEBUGGER_CALL_MAX_PARAMETER      0x16
147 #define EFI_DEBUGGER_CALL_DEFAULT_PARAMETER  0x8
148 
149 typedef struct {
150   EFI_PHYSICAL_ADDRESS      SourceAddress;
151   EFI_PHYSICAL_ADDRESS      DestAddress;
152   //
153   // We save all parameter here, because code may update the parameter as local variable.
154   //
155   UINTN                     ParameterAddr;
156   UINTN                     Parameter[EFI_DEBUGGER_CALL_MAX_PARAMETER];
157   EFI_DEBUGGER_BRANCH_TYPE  Type;
158 } EFI_DEBUGGER_CALLSTACK_CONTEXT;
159 
160 //
161 // Definition for Debugger Trace
162 //
163 #define EFI_DEBUGGER_TRACE_MAX         0x10
164 
165 typedef struct {
166   EFI_PHYSICAL_ADDRESS      SourceAddress;
167   EFI_PHYSICAL_ADDRESS      DestAddress;
168   EFI_DEBUGGER_BRANCH_TYPE  Type;
169 } EFI_DEBUGGER_TRACE_CONTEXT;
170 
171 //
172 // Definition for Debugger Step
173 //
174 typedef struct {
175   EFI_PHYSICAL_ADDRESS      BreakAddress;
176   EFI_PHYSICAL_ADDRESS      FramePointer;
177 } EFI_DEBUGGER_STEP_CONTEXT;
178 
179 //
180 // Definition for Debugger GoTil
181 //
182 typedef struct {
183   EFI_PHYSICAL_ADDRESS      BreakAddress;
184 } EFI_DEBUGGER_GOTIL_CONTEXT;
185 
186 //
187 // Definition for Debugger private data structure
188 //
189 #define EFI_DEBUGGER_SIGNATURE         SIGNATURE_32 ('e', 'd', 'b', '!')
190 
191 #define EFI_DEBUG_DEFAULT_INSTRUCTION_NUMBER  5
192 
193 #define EFI_DEBUG_BREAK_TIMER_INTERVAL        10000000   // 1 second
194 
195 #define EFI_DEBUG_FLAG_EBC            0x80000000
196 #define EFI_DEBUG_FLAG_EBC_B_BOC      0x1
197 #define EFI_DEBUG_FLAG_EBC_B_BOCX     0x2
198 #define EFI_DEBUG_FLAG_EBC_B_BOR      0x4
199 #define EFI_DEBUG_FLAG_EBC_B_BOE      0x8
200 #define EFI_DEBUG_FLAG_EBC_B_BOT      0x10
201 #define EFI_DEBUG_FLAG_EBC_B_STEPOVER 0x20
202 #define EFI_DEBUG_FLAG_EBC_B_STEPOUT  0x40
203 #define EFI_DEBUG_FLAG_EBC_B_BP       0x80
204 #define EFI_DEBUG_FLAG_EBC_B_GT       0x100
205 #define EFI_DEBUG_FLAG_EBC_B_BOK      0x200
206 #define EFI_DEBUG_FLAG_EBC_BOC        (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOC)
207 #define EFI_DEBUG_FLAG_EBC_BOCX       (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOCX)
208 #define EFI_DEBUG_FLAG_EBC_BOR        (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOR)
209 #define EFI_DEBUG_FLAG_EBC_BOE        (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOE)
210 #define EFI_DEBUG_FLAG_EBC_BOT        (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOT)
211 #define EFI_DEBUG_FLAG_EBC_STEPOVER   (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_STEPOVER)
212 #define EFI_DEBUG_FLAG_EBC_STEPOUT    (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_STEPOUT)
213 #define EFI_DEBUG_FLAG_EBC_BP         (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BP)
214 #define EFI_DEBUG_FLAG_EBC_GT         (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_GT)
215 #define EFI_DEBUG_FLAG_EBC_BOK        (EFI_DEBUG_FLAG_EBC | EFI_DEBUG_FLAG_EBC_B_BOK)
216 
217 //
218 // Debugger private data structure
219 //
220 typedef struct _EFI_DEBUGGER_PRIVATE_DATA {
221   UINT32                                      Signature;
222   EFI_INSTRUCTION_SET_ARCHITECTURE            Isa;
223   UINT32                                      EfiDebuggerRevision;
224   UINT32                                      EbcVmRevision;
225   EFI_DEBUGGER_CONFIGURATION_PROTOCOL         DebuggerConfiguration;
226   EFI_DEBUG_IMAGE_INFO_TABLE_HEADER           *DebugImageInfoTableHeader;
227   EFI_SIMPLE_FILE_SYSTEM_PROTOCOL             *Vol;
228   EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL             *PciRootBridgeIo;
229   EFI_DEBUGGER_COMMAND_SET                    *DebuggerCommandSet;
230   EFI_DEBUGGER_SYMBOL_CONTEXT                 DebuggerSymbolContext;
231   UINTN                                       DebuggerBreakpointCount;
232   EFI_DEBUGGER_BREAKPOINT_CONTEXT             DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX + 1];
233   UINTN                                       CallStackEntryCount;
234   EFI_DEBUGGER_CALLSTACK_CONTEXT              CallStackEntry[EFI_DEBUGGER_CALLSTACK_MAX + 1];
235   UINTN                                       TraceEntryCount;
236   EFI_DEBUGGER_TRACE_CONTEXT                  TraceEntry[EFI_DEBUGGER_TRACE_MAX + 1];
237   EFI_DEBUGGER_STEP_CONTEXT                   StepContext;
238   EFI_DEBUGGER_GOTIL_CONTEXT                  GoTilContext;
239   EFI_PHYSICAL_ADDRESS                        InstructionScope;
240   UINTN                                       InstructionNumber;
241   UINT32                                      FeatureFlags;
242   UINT32                                      StatusFlags;
243   BOOLEAN                                     EnablePageBreak;
244   EFI_EVENT                                   BreakEvent;
245 } EFI_DEBUGGER_PRIVATE_DATA;
246 
247 #endif
248