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