]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdBranch.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
1436aea4 11CHAR16 *mBranchTypeStr[] = {\r
748edcd5
PB
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 32{\r
1436aea4 33 if ((Type < 0) || (Type >= EfiDebuggerBranchTypeEbcMax)) {\r
748edcd5
PB
34 return L"(Unknown Type)";\r
35 }\r
36\r
1436aea4 37 return mBranchTypeStr[Type];\r
748edcd5
PB
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
1436aea4
MK
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
748edcd5 58 )\r
748edcd5 59{\r
1436aea4
MK
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
748edcd5
PB
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
1436aea4 79 ZeroMem (DebuggerPrivate->CallStackEntry, sizeof (DebuggerPrivate->CallStackEntry));\r
748edcd5
PB
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
1436aea4 87 CommandArg = StrGetNextTokenLine (L" ");\r
748edcd5
PB
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
1436aea4 122 // EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 EfiMain\n");\r
748edcd5
PB
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
1436aea4 137\r
748edcd5
PB
138 EDBPrint (L"\n");\r
139\r
140 if (ShowParameter) {\r
141 //\r
142 // Print parameter\r
143 //\r
1436aea4 144 if (sizeof (UINTN) == sizeof (UINT64)) {\r
748edcd5
PB
145 EDBPrint (\r
146 L" Parameter Address (0x%016lx) (\n",\r
147 CallStackEntry->ParameterAddr\r
148 );\r
149 if (ParameterNumber == 0) {\r
150 EDBPrint (L" )\n");\r
151 continue;\r
152 }\r
1436aea4 153\r
748edcd5
PB
154 //\r
155 // Print each parameter\r
156 //\r
157 for (SubIndex = 0; SubIndex < ParameterNumber - 1; SubIndex++) {\r
158 if (SubIndex % 2 == 0) {\r
159 EDBPrint (L" ");\r
160 }\r
1436aea4 161\r
748edcd5
PB
162 EDBPrint (\r
163 L"0x%016lx, ",\r
164 CallStackEntry->Parameter[SubIndex]\r
165 );\r
166 if (SubIndex % 2 == 1) {\r
167 EDBPrint (L"\n");\r
168 }\r
169 }\r
1436aea4 170\r
748edcd5
PB
171 if (SubIndex % 2 == 0) {\r
172 EDBPrint (L" ");\r
173 }\r
1436aea4 174\r
748edcd5
PB
175 EDBPrint (\r
176 L"0x%016lx\n",\r
177 CallStackEntry->Parameter[SubIndex]\r
178 );\r
179 EDBPrint (L" )\n");\r
180 //\r
181 // break only for parameter\r
182 //\r
183 if ((((DebuggerPrivate->CallStackEntryCount - Index) % (16 / ParameterNumber)) == 0) &&\r
1436aea4
MK
184 (Index != 0))\r
185 {\r
748edcd5
PB
186 if (SetPageBreak ()) {\r
187 break;\r
188 }\r
189 }\r
190 } else {\r
191 EDBPrint (\r
192 L" Parameter Address (0x%08x) (\n",\r
193 CallStackEntry->ParameterAddr\r
194 );\r
195 if (ParameterNumber == 0) {\r
196 EDBPrint (L" )\n");\r
197 continue;\r
198 }\r
1436aea4 199\r
748edcd5
PB
200 //\r
201 // Print each parameter\r
202 //\r
203 for (SubIndex = 0; SubIndex < ParameterNumber - 1; SubIndex++) {\r
204 if (SubIndex % 4 == 0) {\r
205 EDBPrint (L" ");\r
206 }\r
1436aea4 207\r
748edcd5
PB
208 EDBPrint (\r
209 L"0x%08x, ",\r
210 CallStackEntry->Parameter[SubIndex]\r
211 );\r
212 if (SubIndex % 4 == 3) {\r
213 EDBPrint (L"\n");\r
214 }\r
215 }\r
1436aea4 216\r
748edcd5
PB
217 if (SubIndex % 4 == 0) {\r
218 EDBPrint (L" ");\r
219 }\r
1436aea4 220\r
748edcd5
PB
221 EDBPrint (\r
222 L"0x%08x\n",\r
223 CallStackEntry->Parameter[SubIndex]\r
224 );\r
225 EDBPrint (L" )\n");\r
226 //\r
227 // break only for parameter\r
228 //\r
229 if ((((DebuggerPrivate->CallStackEntryCount - Index) % (32 / ParameterNumber)) == 0) &&\r
1436aea4
MK
230 (Index != 0))\r
231 {\r
748edcd5
PB
232 if (SetPageBreak ()) {\r
233 break;\r
234 }\r
235 }\r
236 }\r
237 }\r
238 }\r
239\r
240 //\r
241 // Done\r
242 //\r
243 return EFI_DEBUG_CONTINUE;\r
244}\r
245\r
e8a5ac7c
DB
246/**\r
247\r
248 DebuggerCommand - InstructionBranch.\r
249\r
250 @param CommandArg The argument for this command\r
251 @param DebuggerPrivate EBC Debugger private data structure\r
252 @param ExceptionType Exception type.\r
253 @param SystemContext EBC system context.\r
254\r
255 @retval EFI_DEBUG_CONTINUE formal return value\r
256\r
257**/\r
748edcd5
PB
258EFI_DEBUG_STATUS\r
259DebuggerInstructionBranch (\r
1436aea4
MK
260 IN CHAR16 *CommandArg,\r
261 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
262 IN EFI_EXCEPTION_TYPE ExceptionType,\r
263 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 264 )\r
748edcd5
PB
265{\r
266 UINTN Index;\r
267\r
268 //\r
269 // Check argument\r
270 //\r
271 if (CommandArg != NULL) {\r
272 if (StriCmp (CommandArg, L"c") == 0) {\r
273 //\r
274 // Clear Trace\r
275 //\r
276 DebuggerPrivate->TraceEntryCount = 0;\r
1436aea4 277 ZeroMem (DebuggerPrivate->TraceEntry, sizeof (DebuggerPrivate->TraceEntry));\r
748edcd5
PB
278 EDBPrint (L"Instruction Trace is cleared\n");\r
279 } else {\r
280 EDBPrint (L"Trace argument Invalid\n");\r
281 }\r
1436aea4 282\r
748edcd5
PB
283 return EFI_DEBUG_CONTINUE;\r
284 }\r
285\r
286 //\r
287 // Check Trace Entry Count\r
288 //\r
289 if (DebuggerPrivate->TraceEntryCount == 0) {\r
290 EDBPrint (L"No Instruction Trace\n");\r
291 return EFI_DEBUG_CONTINUE;\r
292 } else if (DebuggerPrivate->TraceEntryCount > EFI_DEBUGGER_TRACE_MAX) {\r
293 EDBPrint (L"Instruction Trace Crash, re-initialize!\n");\r
294 DebuggerPrivate->TraceEntryCount = 0;\r
295 return EFI_DEBUG_CONTINUE;\r
296 }\r
297\r
298 //\r
299 // Go through each Trace entry and print\r
300 //\r
301 EDBPrint (L"Instruction Trace (->Latest):\n");\r
302 EDBPrint (L" Source Addr Destination Addr Type\n");\r
303 EDBPrint (L" ================== ================== ========\n");\r
1436aea4 304 // EDBPrint (L" 0x00000000FFFFFFFF 0xFFFFFFFF00000000 (CALLEX)\n");\r
748edcd5
PB
305 for (Index = 0; Index < DebuggerPrivate->TraceEntryCount; Index++) {\r
306 EDBPrint (\r
307 L" 0x%016lx 0x%016lx %s\n",\r
308 DebuggerPrivate->TraceEntry[Index].SourceAddress,\r
309 DebuggerPrivate->TraceEntry[Index].DestAddress,\r
310 EdbBranchTypeToStr (DebuggerPrivate->TraceEntry[Index].Type)\r
311 );\r
312 }\r
313\r
314 //\r
315 // Done\r
316 //\r
317 return EFI_DEBUG_CONTINUE;\r
318}\r