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