]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdBranch.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbCmdBranch.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c 3Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
9d510e61 4SPDX-License-Identifier: BSD-2-Clause-Patent\r
748edcd5 5\r
748edcd5 6\r
e8a5ac7c 7**/\r
748edcd5
PB
8\r
9#include "Edb.h"\r
10\r
11CHAR16 *mBranchTypeStr[] = {\r
12 L"(CALL)",\r
13 L"(CALLEX)",\r
14 L"(RET)",\r
15 L"(JMP)",\r
16 L"(JMP8)",\r
17};\r
18\r
e8a5ac7c 19/**\r
748edcd5 20\r
e8a5ac7c 21 Comvert Branch Type to string.\r
748edcd5 22\r
e8a5ac7c 23 @param Type Branch Type\r
748edcd5 24\r
e8a5ac7c 25 @retval String string of Branch Type.\r
748edcd5 26\r
e8a5ac7c
DB
27**/\r
28CHAR16 *\r
29EdbBranchTypeToStr (\r
30 IN EFI_DEBUGGER_BRANCH_TYPE Type\r
31 )\r
748edcd5
PB
32{\r
33 if (Type < 0 || Type >= EfiDebuggerBranchTypeEbcMax) {\r
34 return L"(Unknown Type)";\r
35 }\r
36\r
37 return mBranchTypeStr [Type];\r
38}\r
39\r
e8a5ac7c
DB
40/**\r
41\r
42 DebuggerCommand - CallStack.\r
43\r
44 @param CommandArg The argument for this command\r
45 @param DebuggerPrivate EBC Debugger private data structure\r
46 @param ExceptionType Exception type.\r
47 @param SystemContext EBC system context.\r
48\r
49 @retval EFI_DEBUG_CONTINUE formal return value\r
50\r
51**/\r
748edcd5
PB
52EFI_DEBUG_STATUS\r
53DebuggerCallStack (\r
54 IN CHAR16 *CommandArg,\r
55 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
56 IN EFI_EXCEPTION_TYPE ExceptionType,\r
57 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
58 )\r
748edcd5
PB
59{\r
60 INTN Index;\r
61 UINTN SubIndex;\r
62 CHAR8 *FuncName;\r
63 EFI_DEBUGGER_CALLSTACK_CONTEXT *CallStackEntry;\r
64 BOOLEAN ShowParameter;\r
65 UINTN ParameterNumber;\r
66\r
67 ShowParameter = FALSE;\r
68 ParameterNumber = EFI_DEBUGGER_CALL_DEFAULT_PARAMETER;\r
69\r
70 //\r
71 // Check argument\r
72 //\r
73 if (CommandArg != NULL) {\r
74 if (StriCmp (CommandArg, L"c") == 0) {\r
75 //\r
76 // Clear Call-Stack\r
77 //\r
78 DebuggerPrivate->CallStackEntryCount = 0;\r
79 ZeroMem (DebuggerPrivate->CallStackEntry, sizeof(DebuggerPrivate->CallStackEntry));\r
80 EDBPrint (L"Call-Stack is cleared\n");\r
81 return EFI_DEBUG_CONTINUE;\r
82 } else if (StriCmp (CommandArg, L"p") == 0) {\r
83 //\r
84 // Print Call-Stack with parameter\r
85 //\r
86 ShowParameter = TRUE;\r
87 CommandArg = StrGetNextTokenLine (L" ");\r
88 if (CommandArg != NULL) {\r
89 //\r
90 // Try to get the parameter number\r
91 //\r
92 ParameterNumber = Atoi (CommandArg);\r
93 if (ParameterNumber > 16) {\r
94 EDBPrint (L"Call-Stack argument Invalid\n");\r
95 return EFI_DEBUG_CONTINUE;\r
96 }\r
97 }\r
98 } else {\r
99 EDBPrint (L"Call-Stack argument Invalid\n");\r
100 return EFI_DEBUG_CONTINUE;\r
101 }\r
102 }\r
103\r
104 //\r
105 // Check CallStack Entry Count\r
106 //\r
107 if (DebuggerPrivate->CallStackEntryCount == 0) {\r
108 EDBPrint (L"No Call-Stack\n");\r
109 return EFI_DEBUG_CONTINUE;\r
110 } else if (DebuggerPrivate->CallStackEntryCount > EFI_DEBUGGER_CALLSTACK_MAX) {\r
111 EDBPrint (L"Call-Stack Crash, re-initialize!\n");\r
112 DebuggerPrivate->CallStackEntryCount = 0;\r
113 return EFI_DEBUG_CONTINUE;\r
114 }\r
115\r
116 //\r
117 // Go through each CallStack entry and print\r
118 //\r
119 EDBPrint (L"Call-Stack (TOP):\n");\r
120 EDBPrint (L" Caller Callee Name\n");\r
121 EDBPrint (L" ================== ================== ========\n");\r
122//EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 EfiMain\n");\r
123 for (Index = (INTN)(DebuggerPrivate->CallStackEntryCount - 1); Index >= 0; Index--) {\r
124 //\r
125 // Get CallStack and print\r
126 //\r
127 CallStackEntry = &DebuggerPrivate->CallStackEntry[Index];\r
128 EDBPrint (\r
129 L" 0x%016lx 0x%016lx",\r
130 CallStackEntry->SourceAddress,\r
131 CallStackEntry->DestAddress\r
132 );\r
133 FuncName = FindSymbolStr ((UINTN)CallStackEntry->DestAddress);\r
134 if (FuncName != NULL) {\r
135 EDBPrint (L" %a()", FuncName);\r
136 }\r
137 EDBPrint (L"\n");\r
138\r
139 if (ShowParameter) {\r
140 //\r
141 // Print parameter\r
142 //\r
143 if (sizeof(UINTN) == sizeof(UINT64)) {\r
144 EDBPrint (\r
145 L" Parameter Address (0x%016lx) (\n",\r
146 CallStackEntry->ParameterAddr\r
147 );\r
148 if (ParameterNumber == 0) {\r
149 EDBPrint (L" )\n");\r
150 continue;\r
151 }\r
152 //\r
153 // Print each parameter\r
154 //\r
155 for (SubIndex = 0; SubIndex < ParameterNumber - 1; SubIndex++) {\r
156 if (SubIndex % 2 == 0) {\r
157 EDBPrint (L" ");\r
158 }\r
159 EDBPrint (\r
160 L"0x%016lx, ",\r
161 CallStackEntry->Parameter[SubIndex]\r
162 );\r
163 if (SubIndex % 2 == 1) {\r
164 EDBPrint (L"\n");\r
165 }\r
166 }\r
167 if (SubIndex % 2 == 0) {\r
168 EDBPrint (L" ");\r
169 }\r
170 EDBPrint (\r
171 L"0x%016lx\n",\r
172 CallStackEntry->Parameter[SubIndex]\r
173 );\r
174 EDBPrint (L" )\n");\r
175 //\r
176 // break only for parameter\r
177 //\r
178 if ((((DebuggerPrivate->CallStackEntryCount - Index) % (16 / ParameterNumber)) == 0) &&\r
179 (Index != 0)) {\r
180 if (SetPageBreak ()) {\r
181 break;\r
182 }\r
183 }\r
184 } else {\r
185 EDBPrint (\r
186 L" Parameter Address (0x%08x) (\n",\r
187 CallStackEntry->ParameterAddr\r
188 );\r
189 if (ParameterNumber == 0) {\r
190 EDBPrint (L" )\n");\r
191 continue;\r
192 }\r
193 //\r
194 // Print each parameter\r
195 //\r
196 for (SubIndex = 0; SubIndex < ParameterNumber - 1; SubIndex++) {\r
197 if (SubIndex % 4 == 0) {\r
198 EDBPrint (L" ");\r
199 }\r
200 EDBPrint (\r
201 L"0x%08x, ",\r
202 CallStackEntry->Parameter[SubIndex]\r
203 );\r
204 if (SubIndex % 4 == 3) {\r
205 EDBPrint (L"\n");\r
206 }\r
207 }\r
208 if (SubIndex % 4 == 0) {\r
209 EDBPrint (L" ");\r
210 }\r
211 EDBPrint (\r
212 L"0x%08x\n",\r
213 CallStackEntry->Parameter[SubIndex]\r
214 );\r
215 EDBPrint (L" )\n");\r
216 //\r
217 // break only for parameter\r
218 //\r
219 if ((((DebuggerPrivate->CallStackEntryCount - Index) % (32 / ParameterNumber)) == 0) &&\r
220 (Index != 0)) {\r
221 if (SetPageBreak ()) {\r
222 break;\r
223 }\r
224 }\r
225 }\r
226 }\r
227 }\r
228\r
229 //\r
230 // Done\r
231 //\r
232 return EFI_DEBUG_CONTINUE;\r
233}\r
234\r
e8a5ac7c
DB
235/**\r
236\r
237 DebuggerCommand - InstructionBranch.\r
238\r
239 @param CommandArg The argument for this command\r
240 @param DebuggerPrivate EBC Debugger private data structure\r
241 @param ExceptionType Exception type.\r
242 @param SystemContext EBC system context.\r
243\r
244 @retval EFI_DEBUG_CONTINUE formal return value\r
245\r
246**/\r
748edcd5
PB
247EFI_DEBUG_STATUS\r
248DebuggerInstructionBranch (\r
249 IN CHAR16 *CommandArg,\r
250 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
251 IN EFI_EXCEPTION_TYPE ExceptionType,\r
252 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
253 )\r
748edcd5
PB
254{\r
255 UINTN Index;\r
256\r
257 //\r
258 // Check argument\r
259 //\r
260 if (CommandArg != NULL) {\r
261 if (StriCmp (CommandArg, L"c") == 0) {\r
262 //\r
263 // Clear Trace\r
264 //\r
265 DebuggerPrivate->TraceEntryCount = 0;\r
266 ZeroMem (DebuggerPrivate->TraceEntry, sizeof(DebuggerPrivate->TraceEntry));\r
267 EDBPrint (L"Instruction Trace is cleared\n");\r
268 } else {\r
269 EDBPrint (L"Trace argument Invalid\n");\r
270 }\r
271 return EFI_DEBUG_CONTINUE;\r
272 }\r
273\r
274 //\r
275 // Check Trace Entry Count\r
276 //\r
277 if (DebuggerPrivate->TraceEntryCount == 0) {\r
278 EDBPrint (L"No Instruction Trace\n");\r
279 return EFI_DEBUG_CONTINUE;\r
280 } else if (DebuggerPrivate->TraceEntryCount > EFI_DEBUGGER_TRACE_MAX) {\r
281 EDBPrint (L"Instruction Trace Crash, re-initialize!\n");\r
282 DebuggerPrivate->TraceEntryCount = 0;\r
283 return EFI_DEBUG_CONTINUE;\r
284 }\r
285\r
286 //\r
287 // Go through each Trace entry and print\r
288 //\r
289 EDBPrint (L"Instruction Trace (->Latest):\n");\r
290 EDBPrint (L" Source Addr Destination Addr Type\n");\r
291 EDBPrint (L" ================== ================== ========\n");\r
292//EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 (CALLEX)\n");\r
293 for (Index = 0; Index < DebuggerPrivate->TraceEntryCount; Index++) {\r
294 EDBPrint (\r
295 L" 0x%016lx 0x%016lx %s\n",\r
296 DebuggerPrivate->TraceEntry[Index].SourceAddress,\r
297 DebuggerPrivate->TraceEntry[Index].DestAddress,\r
298 EdbBranchTypeToStr (DebuggerPrivate->TraceEntry[Index].Type)\r
299 );\r
300 }\r
301\r
302 //\r
303 // Done\r
304 //\r
305 return EFI_DEBUG_CONTINUE;\r
306}\r