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