]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbCmdSymbol.c
CommitLineData
e8a5ac7c 1/** @file\r
748edcd5 2\r
e8a5ac7c 3Copyright (c) 2007 - 2016, 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 8\r
e8a5ac7c 9#include "Edb.h"\r
748edcd5 10\r
e8a5ac7c 11/**\r
748edcd5 12\r
e8a5ac7c 13 Get file name from full path.\r
748edcd5 14\r
e8a5ac7c
DB
15 @param FullPath - full file path\r
16\r
17 @return file name\r
748edcd5 18\r
e8a5ac7c 19**/\r
748edcd5
PB
20CHAR16 *\r
21GetFileNameFromFullPath (\r
1436aea4 22 IN CHAR16 *FullPath\r
748edcd5 23 )\r
748edcd5 24{\r
1436aea4
MK
25 CHAR16 *FileName;\r
26 CHAR16 *TempFileName;\r
748edcd5 27\r
1436aea4 28 FileName = FullPath;\r
748edcd5
PB
29 TempFileName = StrGetNewTokenLine (FullPath, L"\\");\r
30\r
31 while (TempFileName != NULL) {\r
1436aea4 32 FileName = TempFileName;\r
748edcd5
PB
33 TempFileName = StrGetNextTokenLine (L"\\");\r
34 PatchForStrTokenBefore (TempFileName, L'\\');\r
35 }\r
36\r
37 return FileName;\r
38}\r
39\r
e8a5ac7c 40/**\r
748edcd5 41\r
e8a5ac7c 42 Get dir name from full path.\r
748edcd5 43\r
e8a5ac7c 44 @param FullPath - full file path\r
748edcd5 45\r
e8a5ac7c 46 @return dir name\r
748edcd5 47\r
e8a5ac7c
DB
48**/\r
49CHAR16 *\r
50GetDirNameFromFullPath (\r
1436aea4 51 IN CHAR16 *FullPath\r
e8a5ac7c 52 )\r
748edcd5 53{\r
1436aea4 54 CHAR16 *FileName;\r
748edcd5
PB
55\r
56 FileName = GetFileNameFromFullPath (FullPath);\r
57 if (FileName != FullPath) {\r
58 *(FileName - 1) = 0;\r
59 return FullPath;\r
60 }\r
61\r
62 return L"";\r
63}\r
64\r
e8a5ac7c
DB
65/**\r
66\r
24648548 67 Construct full path according to dir and file path.\r
e8a5ac7c
DB
68\r
69 @param DirPath - dir path\r
70 @param FilePath - file path\r
71 @param Size - dir max size\r
72\r
73 @return Full file name\r
74\r
75**/\r
748edcd5
PB
76CHAR16 *\r
77ConstructFullPath (\r
1436aea4
MK
78 IN CHAR16 *DirPath,\r
79 IN CHAR16 *FilePath,\r
80 IN UINTN Size\r
748edcd5 81 )\r
748edcd5 82{\r
1436aea4 83 UINTN DirPathSize;\r
748edcd5 84\r
1436aea4 85 DirPathSize = StrLen (DirPath);\r
748edcd5
PB
86 *(DirPath + DirPathSize) = L'\\';\r
87 StrnCatS (DirPath, DirPathSize + Size + 1, FilePath, Size);\r
88\r
89 *(DirPath + DirPathSize + Size + 1) = 0;\r
90\r
91 return DirPath;\r
92}\r
93\r
1436aea4 94CHAR16 *mSymbolTypeStr[] = {\r
748edcd5
PB
95 L"( F)",\r
96 L"(SF)",\r
97 L"(GV)",\r
98 L"(SV)",\r
99};\r
100\r
e8a5ac7c 101/**\r
748edcd5 102\r
e8a5ac7c 103 Comvert Symbol Type to string.\r
748edcd5 104\r
e8a5ac7c 105 @param Type - Symbol Type\r
748edcd5 106\r
e8a5ac7c 107 @return String\r
748edcd5 108\r
e8a5ac7c
DB
109**/\r
110CHAR16 *\r
111EdbSymbolTypeToStr (\r
112 IN EFI_DEBUGGER_SYMBOL_TYPE Type\r
113 )\r
748edcd5 114{\r
1436aea4 115 if ((Type < 0) || (Type >= EfiDebuggerSymbolTypeMax)) {\r
748edcd5
PB
116 return L"(?)";\r
117 }\r
118\r
1436aea4 119 return mSymbolTypeStr[Type];\r
748edcd5
PB
120}\r
121\r
e8a5ac7c
DB
122/**\r
123\r
24648548 124 Find the symbol according to address and display symbol.\r
e8a5ac7c
DB
125\r
126 @param Address - SymbolAddress\r
127 @param DebuggerPrivate - EBC Debugger private data structure\r
128\r
129 @retval EFI_DEBUG_CONTINUE - formal return value\r
130\r
131**/\r
748edcd5
PB
132EFI_DEBUG_STATUS\r
133DebuggerDisplaySymbolAccrodingToAddress (\r
134 IN UINTN Address,\r
1436aea4 135 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate\r
748edcd5 136 )\r
748edcd5 137{\r
1436aea4
MK
138 EFI_DEBUGGER_SYMBOL_OBJECT *Object;\r
139 EFI_DEBUGGER_SYMBOL_ENTRY *Entry;\r
140 UINTN CandidateAddress;\r
748edcd5
PB
141\r
142 //\r
143 // Find the nearest symbol address\r
144 //\r
145 CandidateAddress = EbdFindSymbolAddress (Address, EdbMatchSymbolTypeNearestAddress, &Object, &Entry);\r
1436aea4 146 if ((CandidateAddress == 0) || (CandidateAddress == (UINTN)-1) || (Entry == NULL)) {\r
748edcd5
PB
147 EDBPrint (L"Symbole at Address not found!\n");\r
148 return EFI_DEBUG_CONTINUE;\r
149 } else if (Address != CandidateAddress) {\r
150 EDBPrint (L"Symbole at Address not found, print nearest one!\n");\r
151 }\r
152\r
153 //\r
154 // Display symbol\r
155 //\r
156 EDBPrint (L"Symbol File Name: %s\n", Object->Name);\r
1436aea4 157 if (sizeof (UINTN) == sizeof (UINT64)) {\r
748edcd5
PB
158 EDBPrint (L" Address Type Symbol\n");\r
159 EDBPrint (L" ================== ==== ========\n");\r
1436aea4 160 // EDBPrint (L" 0xFFFFFFFF00000000 ( F) TestMain\n");\r
748edcd5
PB
161 EDBPrint (\r
162 L" 0x%016lx %s %a\n",\r
789b86ac 163 (UINT64)Entry->Rva + Object->BaseAddress,\r
748edcd5
PB
164 EdbSymbolTypeToStr (Entry->Type),\r
165 Entry->Name\r
166 );\r
167 } else {\r
168 EDBPrint (L" Address Type Symbol\n");\r
169 EDBPrint (L" ========== ==== ========\n");\r
1436aea4 170 // EDBPrint (L" 0xFFFF0000 ( F) TestMain\n");\r
748edcd5
PB
171 EDBPrint (\r
172 L" 0x%08x %s %a\n",\r
789b86ac 173 Entry->Rva + Object->BaseAddress,\r
748edcd5
PB
174 EdbSymbolTypeToStr (Entry->Type),\r
175 Entry->Name\r
176 );\r
177 }\r
178\r
179 //\r
180 // Done\r
181 //\r
182 return EFI_DEBUG_CONTINUE;\r
183}\r
184\r
e8a5ac7c
DB
185/**\r
186\r
24648548 187 Find the symbol according to name and display symbol.\r
e8a5ac7c
DB
188\r
189 @param SymbolFileName - The Symbol File Name, NULL means for all\r
190 @param SymbolName - The Symbol Name, NULL means for all\r
191 @param DebuggerPrivate - EBC Debugger private data structure\r
192\r
193 @retval EFI_DEBUG_CONTINUE - formal return value\r
194\r
195**/\r
748edcd5
PB
196EFI_DEBUG_STATUS\r
197DebuggerDisplaySymbolAccrodingToName (\r
198 IN CHAR16 *SymbolFileName,\r
199 IN CHAR16 *SymbolName,\r
1436aea4 200 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate\r
748edcd5 201 )\r
748edcd5 202{\r
1436aea4
MK
203 UINTN Index;\r
204 UINTN SubIndex;\r
205 EFI_DEBUGGER_SYMBOL_OBJECT *Object;\r
206 EFI_DEBUGGER_SYMBOL_ENTRY *Entry;\r
748edcd5
PB
207\r
208 if (DebuggerPrivate->DebuggerSymbolContext.ObjectCount == 0) {\r
209 EDBPrint (L"No Symbol File!\n");\r
210 return EFI_DEBUG_CONTINUE;\r
211 }\r
212\r
213 //\r
214 // Go throuth each symbol file\r
215 //\r
216 Object = DebuggerPrivate->DebuggerSymbolContext.Object;\r
217 for (Index = 0; Index < DebuggerPrivate->DebuggerSymbolContext.ObjectCount; Index++, Object++) {\r
218 if ((SymbolFileName != NULL) &&\r
1436aea4
MK
219 (StriCmp (SymbolFileName, Object->Name) != 0))\r
220 {\r
748edcd5
PB
221 continue;\r
222 }\r
223\r
224 //\r
225 // Break each symbol file\r
226 //\r
227 if (Index != 0) {\r
228 if (SetPageBreak ()) {\r
229 break;\r
230 }\r
231 }\r
232\r
233 EDBPrint (L"Symbol File Name: %s\n", Object->Name);\r
234 if (Object->EntryCount == 0) {\r
235 EDBPrint (L"No Symbol!\n");\r
236 continue;\r
237 }\r
1436aea4 238\r
748edcd5 239 Entry = Object->Entry;\r
1436aea4 240 if (sizeof (UINTN) == sizeof (UINT64)) {\r
748edcd5
PB
241 EDBPrint (L" Address Type Symbol\n");\r
242 EDBPrint (L" ================== ==== ========\n");\r
1436aea4 243 // EDBPrint (L" 0xFFFFFFFF00000000 ( F) TestMain (EbcTest.obj)\n");\r
748edcd5
PB
244 } else {\r
245 EDBPrint (L" Address Type Symbol\n");\r
246 EDBPrint (L" ========== ==== ========\n");\r
1436aea4 247 // EDBPrint (L" 0xFFFF0000 ( F) TestMain (EbcTest.obj)\n");\r
748edcd5
PB
248 }\r
249\r
250 //\r
251 // Go through each symbol name\r
252 //\r
253 for (SubIndex = 0; SubIndex < Object->EntryCount; SubIndex++, Entry++) {\r
254 if ((SymbolName != NULL) &&\r
1436aea4
MK
255 (StrCmpUnicodeAndAscii (SymbolName, Entry->Name) != 0))\r
256 {\r
748edcd5
PB
257 continue;\r
258 }\r
259\r
260 //\r
261 // Break symbol\r
262 //\r
263 if (((SubIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&\r
1436aea4
MK
264 (SubIndex != 0))\r
265 {\r
748edcd5
PB
266 if (SetPageBreak ()) {\r
267 break;\r
268 }\r
269 }\r
270\r
1436aea4 271 if (sizeof (UINTN) == sizeof (UINT64)) {\r
748edcd5
PB
272 EDBPrint (\r
273 L" 0x%016lx %s %a (%a)\n",\r
789b86ac 274 (UINT64)Entry->Rva + Object->BaseAddress,\r
748edcd5
PB
275 EdbSymbolTypeToStr (Entry->Type),\r
276 Entry->Name,\r
277 Entry->ObjName\r
278 );\r
279 } else {\r
280 EDBPrint (\r
281 L" 0x%08x %s %a (%a)\n",\r
789b86ac 282 Entry->Rva + Object->BaseAddress,\r
748edcd5
PB
283 EdbSymbolTypeToStr (Entry->Type),\r
284 Entry->Name,\r
285 Entry->ObjName\r
286 );\r
287 }\r
288 }\r
289 }\r
290\r
291 //\r
292 // Done\r
293 //\r
294 return EFI_DEBUG_CONTINUE;\r
295}\r
296\r
e8a5ac7c
DB
297/**\r
298\r
299 DebuggerCommand - ListSymbol.\r
300\r
301 @param CommandArg - The argument for this command\r
302 @param DebuggerPrivate - EBC Debugger private data structure\r
303 @param ExceptionType - Exception type.\r
304 @param SystemContext - EBC system context.\r
305\r
306 @retval EFI_DEBUG_CONTINUE - formal return value\r
307\r
308**/\r
748edcd5
PB
309EFI_DEBUG_STATUS\r
310DebuggerListSymbol (\r
1436aea4
MK
311 IN CHAR16 *CommandArg,\r
312 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
313 IN EFI_EXCEPTION_TYPE ExceptionType,\r
314 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 315 )\r
748edcd5 316{\r
1436aea4
MK
317 CHAR16 *SymbolFileName;\r
318 CHAR16 *SymbolName;\r
319 CHAR16 *CommandStr;\r
320 UINTN Address;\r
748edcd5
PB
321\r
322 SymbolFileName = NULL;\r
1436aea4
MK
323 SymbolName = NULL;\r
324 CommandStr = CommandArg;\r
748edcd5
PB
325\r
326 //\r
327 // display symbol according to address\r
328 //\r
329 if (CommandStr != NULL) {\r
330 if ((StriCmp (CommandStr, L"F") != 0) &&\r
1436aea4
MK
331 (StriCmp (CommandStr, L"S") != 0))\r
332 {\r
748edcd5
PB
333 Address = Xtoi (CommandStr);\r
334 return DebuggerDisplaySymbolAccrodingToAddress (Address, DebuggerPrivate);\r
335 }\r
336 }\r
337\r
338 //\r
339 // Get SymbolFileName\r
340 //\r
341 if (CommandStr != NULL) {\r
342 if (StriCmp (CommandStr, L"F") == 0) {\r
343 CommandStr = StrGetNextTokenLine (L" ");\r
344 if (CommandStr == NULL) {\r
345 EDBPrint (L"Symbol File Name missing!\n");\r
346 return EFI_DEBUG_CONTINUE;\r
347 } else {\r
348 SymbolFileName = CommandStr;\r
1436aea4 349 CommandStr = StrGetNextTokenLine (L" ");\r
748edcd5
PB
350 }\r
351 }\r
352 }\r
1436aea4 353\r
748edcd5
PB
354 //\r
355 // Get SymbolName\r
356 //\r
357 if (CommandStr != NULL) {\r
358 if (StriCmp (CommandStr, L"S") == 0) {\r
359 CommandStr = StrGetNextTokenLine (L" ");\r
360 if (CommandStr == NULL) {\r
361 EDBPrint (L"Symbol Name missing!\n");\r
362 return EFI_DEBUG_CONTINUE;\r
363 } else {\r
364 SymbolName = CommandStr;\r
365 CommandStr = StrGetNextTokenLine (L" ");\r
366 }\r
367 }\r
368 }\r
1436aea4 369\r
748edcd5
PB
370 if (CommandStr != NULL) {\r
371 EDBPrint (L"Argument error!\n");\r
372 return EFI_DEBUG_CONTINUE;\r
373 }\r
374\r
375 //\r
376 // display symbol according to name\r
377 //\r
378 return DebuggerDisplaySymbolAccrodingToName (SymbolFileName, SymbolName, DebuggerPrivate);\r
379}\r
380\r
e8a5ac7c
DB
381/**\r
382\r
383 DebuggerCommand - LoadSymbol.\r
384\r
385 @param CommandArg - The argument for this command\r
386 @param DebuggerPrivate - EBC Debugger private data structure\r
387 @param ExceptionType - Exception type.\r
388 @param SystemContext - EBC system context.\r
389\r
390 @retval EFI_DEBUG_CONTINUE - formal return value\r
391\r
392**/\r
748edcd5
PB
393EFI_DEBUG_STATUS\r
394DebuggerLoadSymbol (\r
1436aea4
MK
395 IN CHAR16 *CommandArg,\r
396 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
397 IN EFI_EXCEPTION_TYPE ExceptionType,\r
398 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 399 )\r
748edcd5 400{\r
1436aea4
MK
401 UINTN BufferSize;\r
402 VOID *Buffer;\r
403 EFI_STATUS Status;\r
404 CHAR16 *FileName;\r
405 CHAR16 *CommandArg2;\r
406 BOOLEAN IsLoadCode;\r
407 CHAR16 *DirName;\r
408 CHAR16 CodFile[EFI_DEBUGGER_SYMBOL_NAME_MAX];\r
409 CHAR16 *CodFileName;\r
410 UINTN Index;\r
748edcd5
PB
411\r
412 //\r
413 // Check the argument\r
414 //\r
415 if (CommandArg == NULL) {\r
416 EDBPrint (L"SymbolFile not found!\n");\r
417 return EFI_DEBUG_CONTINUE;\r
418 }\r
1436aea4
MK
419\r
420 IsLoadCode = FALSE;\r
748edcd5
PB
421 CommandArg2 = StrGetNextTokenLine (L" ");\r
422 if (CommandArg2 != NULL) {\r
423 if (StriCmp (CommandArg2, L"a") == 0) {\r
424 IsLoadCode = TRUE;\r
425 } else {\r
426 EDBPrint (L"Argument error!\n");\r
427 return EFI_DEBUG_CONTINUE;\r
428 }\r
429 }\r
430\r
431 if (StrLen (CommandArg) <= 4) {\r
432 EDBPrint (L"SymbolFile name error!\n");\r
433 return EFI_DEBUG_CONTINUE;\r
434 }\r
1436aea4 435\r
748edcd5
PB
436 if (StriCmp (CommandArg + (StrLen (CommandArg) - 4), L".map") != 0) {\r
437 EDBPrint (L"SymbolFile name error!\n");\r
438 return EFI_DEBUG_CONTINUE;\r
439 }\r
440\r
441 //\r
442 // Read MAP file to memory\r
443 //\r
444 Status = ReadFileToBuffer (DebuggerPrivate, CommandArg, &BufferSize, &Buffer, TRUE);\r
1436aea4 445 if (EFI_ERROR (Status)) {\r
748edcd5
PB
446 EDBPrint (L"SymbolFile read error!\n");\r
447 return EFI_DEBUG_CONTINUE;\r
448 }\r
449\r
450 FileName = GetFileNameFromFullPath (CommandArg);\r
451 //\r
452 // Load Symbol\r
453 //\r
454 Status = EdbLoadSymbol (DebuggerPrivate, FileName, BufferSize, Buffer);\r
1436aea4 455 if (EFI_ERROR (Status)) {\r
748edcd5
PB
456 EDBPrint (L"LoadSymbol error!\n");\r
457 gBS->FreePool (Buffer);\r
458 return EFI_DEBUG_CONTINUE;\r
459 }\r
1436aea4 460\r
748edcd5
PB
461 gBS->FreePool (Buffer);\r
462\r
463 //\r
464 // Patch Symbol for RVA\r
465 //\r
466 Status = EdbPatchSymbolRVA (DebuggerPrivate, FileName, EdbEbcImageRvaSearchTypeLast);\r
1436aea4 467 if (EFI_ERROR (Status)) {\r
748edcd5
PB
468 EDBPrint (L"PatchSymbol RVA - %r! Using the RVA in symbol file.\n", Status);\r
469 } else {\r
470 DEBUG ((DEBUG_ERROR, "PatchSymbol RVA successfully!\n"));\r
471 }\r
472\r
473 if (!IsLoadCode) {\r
474 return EFI_DEBUG_CONTINUE;\r
475 }\r
476\r
477 //\r
478 // load each cod file\r
479 //\r
480 DirName = GetDirNameFromFullPath (CommandArg);\r
1436aea4 481 ZeroMem (CodFile, sizeof (CodFile));\r
748edcd5 482 if (StrCmp (DirName, L"") != 0) {\r
1436aea4 483 StrCpyS (CodFile, sizeof (CodFile), DirName);\r
748edcd5
PB
484 } else {\r
485 DirName = L"\\";\r
486 }\r
487\r
488 //\r
489 // Go throuth each file under this dir\r
490 //\r
1436aea4 491 Index = 0;\r
748edcd5
PB
492 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
493 while (CodFileName != NULL) {\r
1436aea4 494 ZeroMem (CodFile, sizeof (CodFile));\r
748edcd5 495 if (StrCmp (DirName, L"\\") != 0) {\r
1436aea4 496 StrCpyS (CodFile, sizeof (CodFile), DirName);\r
748edcd5
PB
497 }\r
498\r
499 //\r
500 // read cod file to memory\r
501 //\r
502 Status = ReadFileToBuffer (DebuggerPrivate, ConstructFullPath (CodFile, CodFileName, EFI_DEBUGGER_SYMBOL_NAME_MAX - StrLen (CodFile) - 2), &BufferSize, &Buffer, FALSE);\r
1436aea4 503 if (EFI_ERROR (Status)) {\r
748edcd5
PB
504 EDBPrint (L"CodeFile read error!\n");\r
505 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
506 continue;\r
507 }\r
508\r
509 //\r
510 // Load Code\r
511 //\r
512 Status = EdbLoadCode (DebuggerPrivate, FileName, CodFileName, BufferSize, Buffer);\r
513 if (EFI_ERROR (Status)) {\r
514 EDBPrint (L"LoadCode error!\n");\r
515 gBS->FreePool (Buffer);\r
516 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
517 continue;\r
518 }\r
519\r
520 //\r
521 // Record the buffer\r
522 //\r
523 Status = EdbAddCodeBuffer (DebuggerPrivate, FileName, CodFileName, BufferSize, Buffer);\r
524 if (EFI_ERROR (Status)) {\r
525 EDBPrint (L"AddCodeBuffer error!\n");\r
526 gBS->FreePool (Buffer);\r
527 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
528 continue;\r
529 }\r
530\r
531 //\r
532 // Get next file\r
533 //\r
534 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
535 }\r
536\r
537 //\r
538 // Done\r
539 //\r
540 return EFI_DEBUG_CONTINUE;\r
541}\r
542\r
e8a5ac7c
DB
543/**\r
544\r
545 DebuggerCommand - UnloadSymbol\r
546\r
547 @param CommandArg - The argument for this command\r
548 @param DebuggerPrivate - EBC Debugger private data structure\r
549 @param ExceptionType - Exception type.\r
550 @param SystemContext - EBC system context.\r
551\r
552 @retval EFI_DEBUG_CONTINUE - formal return value\r
553\r
554**/\r
748edcd5
PB
555EFI_DEBUG_STATUS\r
556DebuggerUnloadSymbol (\r
1436aea4
MK
557 IN CHAR16 *CommandArg,\r
558 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
559 IN EFI_EXCEPTION_TYPE ExceptionType,\r
560 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 561 )\r
748edcd5 562{\r
1436aea4
MK
563 EFI_STATUS Status;\r
564 CHAR16 *FileName;\r
565 CHAR16 *DirName;\r
566 CHAR16 CodFile[EFI_DEBUGGER_SYMBOL_NAME_MAX];\r
567 CHAR16 *CodFileName;\r
568 UINTN Index;\r
569 VOID *BufferPtr;\r
748edcd5
PB
570\r
571 //\r
572 // Check the argument\r
573 //\r
574 if (CommandArg == NULL) {\r
575 EDBPrint (L"SymbolFile not found!\n");\r
576 return EFI_DEBUG_CONTINUE;\r
577 }\r
578\r
579 FileName = GetFileNameFromFullPath (CommandArg);\r
580\r
581 //\r
582 // Unload Code\r
583 //\r
584 DirName = GetDirNameFromFullPath (CommandArg);\r
1436aea4 585 ZeroMem (CodFile, sizeof (CodFile));\r
748edcd5 586 if (StrCmp (DirName, L"") != 0) {\r
1436aea4 587 StrCpyS (CodFile, sizeof (CodFile), DirName);\r
748edcd5
PB
588 } else {\r
589 DirName = L"\\";\r
590 }\r
591\r
592 //\r
593 // Go through each file under this dir\r
594 //\r
1436aea4 595 Index = 0;\r
748edcd5
PB
596 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
597 while (CodFileName != NULL) {\r
1436aea4 598 ZeroMem (CodFile, sizeof (CodFile));\r
748edcd5 599 if (StrCmp (DirName, L"\\") != 0) {\r
1436aea4 600 StrCpyS (CodFile, sizeof (CodFile), DirName);\r
748edcd5
PB
601 }\r
602\r
603 //\r
604 // Unload Code\r
605 //\r
606 Status = EdbUnloadCode (DebuggerPrivate, FileName, CodFileName, &BufferPtr);\r
607 if (EFI_ERROR (Status)) {\r
608 EDBPrint (L"UnloadCode error!\n");\r
609 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
610 continue;\r
611 }\r
612\r
613 //\r
614 // Delete the code buffer\r
615 //\r
616 Status = EdbDeleteCodeBuffer (DebuggerPrivate, FileName, CodFileName, BufferPtr);\r
617 if (EFI_ERROR (Status)) {\r
618 EDBPrint (L"DeleteCodeBuffer error!\n");\r
619 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
620 continue;\r
621 }\r
622\r
623 //\r
624 // Get next file\r
625 //\r
626 CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);\r
627 }\r
628\r
629 //\r
630 // Unload Symbol\r
631 //\r
632 Status = EdbUnloadSymbol (DebuggerPrivate, FileName);\r
1436aea4 633 if (EFI_ERROR (Status)) {\r
748edcd5
PB
634 EDBPrint (L"UnloadSymbol error!\n");\r
635 }\r
636\r
637 //\r
638 // Done\r
639 //\r
640 return EFI_DEBUG_CONTINUE;\r
641}\r
642\r
e8a5ac7c
DB
643/**\r
644\r
645 DebuggerCommand - DisplaySymbol.\r
646\r
647 @param CommandArg - The argument for this command\r
648 @param DebuggerPrivate - EBC Debugger private data structure\r
649 @param ExceptionType - Exception type.\r
650 @param SystemContext - EBC system context.\r
651\r
652 @retval EFI_DEBUG_CONTINUE - formal return value\r
653\r
654**/\r
748edcd5
PB
655EFI_DEBUG_STATUS\r
656DebuggerDisplaySymbol (\r
1436aea4
MK
657 IN CHAR16 *CommandArg,\r
658 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
659 IN EFI_EXCEPTION_TYPE ExceptionType,\r
660 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 661 )\r
748edcd5
PB
662{\r
663 if (CommandArg == NULL) {\r
664 DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = !DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol;\r
665 EdbShowDisasm (DebuggerPrivate, SystemContext);\r
666 } else if (StriCmp (CommandArg, L"on") == 0) {\r
667 DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = TRUE;\r
668 EdbShowDisasm (DebuggerPrivate, SystemContext);\r
669 } else if (StriCmp (CommandArg, L"off") == 0) {\r
670 DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = FALSE;\r
671 EdbShowDisasm (DebuggerPrivate, SystemContext);\r
672 } else {\r
673 EDBPrint (L"DisplaySymbol - argument error\n");\r
674 }\r
675\r
676 return EFI_DEBUG_CONTINUE;\r
677}\r
678\r
e8a5ac7c
DB
679/**\r
680\r
681 DebuggerCommand - LoadCode.\r
682\r
683 @param CommandArg - The argument for this command\r
684 @param DebuggerPrivate - EBC Debugger private data structure\r
685 @param ExceptionType - Exception type.\r
686 @param SystemContext - EBC system context.\r
687\r
688 @retval EFI_DEBUG_CONTINUE - formal return value\r
689\r
690**/\r
748edcd5
PB
691EFI_DEBUG_STATUS\r
692DebuggerLoadCode (\r
1436aea4
MK
693 IN CHAR16 *CommandArg,\r
694 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
695 IN EFI_EXCEPTION_TYPE ExceptionType,\r
696 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 697 )\r
748edcd5 698{\r
1436aea4
MK
699 UINTN BufferSize;\r
700 VOID *Buffer;\r
701 EFI_STATUS Status;\r
702 CHAR16 *CommandArg2;\r
703 CHAR16 *FileName;\r
704 CHAR16 *MapFileName;\r
748edcd5
PB
705\r
706 //\r
707 // Check the argument\r
708 //\r
709 if (CommandArg == NULL) {\r
710 EDBPrint (L"CodeFile not found!\n");\r
711 return EFI_DEBUG_CONTINUE;\r
712 }\r
1436aea4 713\r
748edcd5
PB
714 CommandArg2 = StrGetNextTokenLine (L" ");\r
715 if (CommandArg2 == NULL) {\r
716 EDBPrint (L"SymbolFile not found!\n");\r
717 return EFI_DEBUG_CONTINUE;\r
718 }\r
719\r
720 if (StrLen (CommandArg) <= 4) {\r
721 EDBPrint (L"CodeFile name error!\n");\r
722 return EFI_DEBUG_CONTINUE;\r
723 }\r
1436aea4 724\r
748edcd5
PB
725 if (StriCmp (CommandArg + (StrLen (CommandArg) - 4), L".cod") != 0) {\r
726 EDBPrint (L"CodeFile name error!\n");\r
727 return EFI_DEBUG_CONTINUE;\r
728 }\r
1436aea4 729\r
748edcd5
PB
730 if (StrLen (CommandArg2) <= 4) {\r
731 EDBPrint (L"SymbolFile name error!\n");\r
732 return EFI_DEBUG_CONTINUE;\r
733 }\r
1436aea4 734\r
748edcd5
PB
735 if (StriCmp (CommandArg2 + (StrLen (CommandArg2) - 4), L".map") != 0) {\r
736 EDBPrint (L"SymbolFile name error!\n");\r
737 return EFI_DEBUG_CONTINUE;\r
738 }\r
739\r
740 //\r
741 // read cod file to memory\r
742 //\r
743 Status = ReadFileToBuffer (DebuggerPrivate, CommandArg, &BufferSize, &Buffer, TRUE);\r
1436aea4 744 if (EFI_ERROR (Status)) {\r
748edcd5
PB
745 EDBPrint (L"CodeFile read error!\n");\r
746 return EFI_DEBUG_CONTINUE;\r
747 }\r
748\r
1436aea4 749 FileName = GetFileNameFromFullPath (CommandArg);\r
748edcd5
PB
750 MapFileName = GetFileNameFromFullPath (CommandArg2);\r
751 //\r
752 // Load Code\r
753 //\r
754 Status = EdbLoadCode (DebuggerPrivate, MapFileName, FileName, BufferSize, Buffer);\r
755 if (EFI_ERROR (Status)) {\r
756 EDBPrint (L"LoadCode error!\n");\r
757 gBS->FreePool (Buffer);\r
758 return EFI_DEBUG_CONTINUE;\r
759 }\r
760\r
761 //\r
762 // Record the buffer\r
763 //\r
764 Status = EdbAddCodeBuffer (DebuggerPrivate, MapFileName, FileName, BufferSize, Buffer);\r
765 if (EFI_ERROR (Status)) {\r
766 EDBPrint (L"AddCodeBuffer error!\n");\r
767 gBS->FreePool (Buffer);\r
768 return EFI_DEBUG_CONTINUE;\r
769 }\r
770\r
771 //\r
772 // Done\r
773 //\r
774 return EFI_DEBUG_CONTINUE;\r
775}\r
776\r
e8a5ac7c
DB
777/**\r
778\r
779 DebuggerCommand - UnloadCode.\r
780\r
781 @param CommandArg - The argument for this command\r
782 @param DebuggerPrivate - EBC Debugger private data structure\r
783 @param ExceptionType - Exception type.\r
784 @param SystemContext - EBC system context.\r
785\r
786 @retval EFI_DEBUG_CONTINUE - formal return value\r
787\r
788**/\r
748edcd5
PB
789EFI_DEBUG_STATUS\r
790DebuggerUnloadCode (\r
1436aea4
MK
791 IN CHAR16 *CommandArg,\r
792 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
793 IN EFI_EXCEPTION_TYPE ExceptionType,\r
794 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 795 )\r
748edcd5 796{\r
1436aea4
MK
797 CHAR16 *CommandArg2;\r
798 CHAR16 *FileName;\r
799 CHAR16 *MapFileName;\r
800 EFI_STATUS Status;\r
801 VOID *BufferPtr;\r
748edcd5
PB
802\r
803 //\r
804 // Check the argument\r
805 //\r
806 if (CommandArg == NULL) {\r
807 EDBPrint (L"CodeFile not found!\n");\r
808 return EFI_DEBUG_CONTINUE;\r
809 }\r
1436aea4 810\r
748edcd5
PB
811 CommandArg2 = StrGetNextTokenLine (L" ");\r
812 if (CommandArg2 == NULL) {\r
813 EDBPrint (L"SymbolFile not found!\n");\r
814 return EFI_DEBUG_CONTINUE;\r
815 }\r
816\r
1436aea4 817 FileName = GetFileNameFromFullPath (CommandArg);\r
748edcd5
PB
818 MapFileName = GetFileNameFromFullPath (CommandArg2);\r
819\r
820 //\r
821 // Unload Code\r
822 //\r
823 Status = EdbUnloadCode (DebuggerPrivate, MapFileName, FileName, &BufferPtr);\r
824 if (EFI_ERROR (Status)) {\r
825 EDBPrint (L"UnloadCode error!\n");\r
826 return EFI_DEBUG_CONTINUE;\r
827 }\r
828\r
829 //\r
830 // Delete Code buffer\r
831 //\r
832 Status = EdbDeleteCodeBuffer (DebuggerPrivate, MapFileName, FileName, BufferPtr);\r
833 if (EFI_ERROR (Status)) {\r
834 EDBPrint (L"DeleteCodeBuffer error!\n");\r
835 }\r
836\r
837 //\r
838 // Done\r
839 //\r
840 return EFI_DEBUG_CONTINUE;\r
841}\r
842\r
e8a5ac7c
DB
843/**\r
844\r
845 DebuggerCommand - DisplayCode.\r
846\r
847 @param CommandArg - The argument for this command\r
848 @param DebuggerPrivate - EBC Debugger private data structure\r
849 @param ExceptionType - Exception type.\r
850 @param SystemContext - EBC system context.\r
851\r
852 @retval EFI_DEBUG_CONTINUE - formal return value\r
853\r
854**/\r
748edcd5
PB
855EFI_DEBUG_STATUS\r
856DebuggerDisplayCode (\r
1436aea4
MK
857 IN CHAR16 *CommandArg,\r
858 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
859 IN EFI_EXCEPTION_TYPE ExceptionType,\r
860 IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
748edcd5 861 )\r
748edcd5
PB
862{\r
863 if (CommandArg == NULL) {\r
864 DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = !DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly;\r
865 EdbShowDisasm (DebuggerPrivate, SystemContext);\r
866 } else if (StriCmp (CommandArg, L"on") == 0) {\r
867 DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = TRUE;\r
868 EdbShowDisasm (DebuggerPrivate, SystemContext);\r
869 } else if (StriCmp (CommandArg, L"off") == 0) {\r
870 DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = FALSE;\r
871 EdbShowDisasm (DebuggerPrivate, SystemContext);\r
872 } else {\r
873 EDBPrint (L"DisplayCode - argument error\n");\r
874 }\r
875\r
876 return EFI_DEBUG_CONTINUE;\r
877}\r