summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c
diff options
context:
space:
mode:
authorkx <kx@radix.pro>2024-06-04 06:43:08 +0300
committerkx <kx@radix.pro>2024-06-04 06:43:08 +0300
commit7e2ccccace24636f29ddc210b94606abd4c7e42b (patch)
tree545d43ea12671048956cafeb12303e84d601e571 /MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c
parent27b044605cd5f6b33a3d231576003850b3fe305b (diff)
downloadedk2-trunk.tar.xz
Renormalized end-of-lines from master@27b044605cd5f6b33a3d231576003850b3fe305btrunk
Diffstat (limited to 'MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c')
-rw-r--r--MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c1754
1 files changed, 877 insertions, 877 deletions
diff --git a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c
index 1b30b917f1..6d0f60ebea 100644
--- a/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c
+++ b/MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c
@@ -1,877 +1,877 @@
-/** @file
-
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-
-**/
-
-#include "Edb.h"
-
-/**
-
- Get file name from full path.
-
- @param FullPath - full file path
-
- @return file name
-
-**/
-CHAR16 *
-GetFileNameFromFullPath (
- IN CHAR16 *FullPath
- )
-{
- CHAR16 *FileName;
- CHAR16 *TempFileName;
-
- FileName = FullPath;
- TempFileName = StrGetNewTokenLine (FullPath, L"\\");
-
- while (TempFileName != NULL) {
- FileName = TempFileName;
- TempFileName = StrGetNextTokenLine (L"\\");
- PatchForStrTokenBefore (TempFileName, L'\\');
- }
-
- return FileName;
-}
-
-/**
-
- Get dir name from full path.
-
- @param FullPath - full file path
-
- @return dir name
-
-**/
-CHAR16 *
-GetDirNameFromFullPath (
- IN CHAR16 *FullPath
- )
-{
- CHAR16 *FileName;
-
- FileName = GetFileNameFromFullPath (FullPath);
- if (FileName != FullPath) {
- *(FileName - 1) = 0;
- return FullPath;
- }
-
- return L"";
-}
-
-/**
-
- Construct full path according to dir and file path.
-
- @param DirPath - dir path
- @param FilePath - file path
- @param Size - dir max size
-
- @return Full file name
-
-**/
-CHAR16 *
-ConstructFullPath (
- IN CHAR16 *DirPath,
- IN CHAR16 *FilePath,
- IN UINTN Size
- )
-{
- UINTN DirPathSize;
-
- DirPathSize = StrLen (DirPath);
- *(DirPath + DirPathSize) = L'\\';
- StrnCatS (DirPath, DirPathSize + Size + 1, FilePath, Size);
-
- *(DirPath + DirPathSize + Size + 1) = 0;
-
- return DirPath;
-}
-
-CHAR16 *mSymbolTypeStr[] = {
- L"( F)",
- L"(SF)",
- L"(GV)",
- L"(SV)",
-};
-
-/**
-
- Comvert Symbol Type to string.
-
- @param Type - Symbol Type
-
- @return String
-
-**/
-CHAR16 *
-EdbSymbolTypeToStr (
- IN EFI_DEBUGGER_SYMBOL_TYPE Type
- )
-{
- if ((Type < 0) || (Type >= EfiDebuggerSymbolTypeMax)) {
- return L"(?)";
- }
-
- return mSymbolTypeStr[Type];
-}
-
-/**
-
- Find the symbol according to address and display symbol.
-
- @param Address - SymbolAddress
- @param DebuggerPrivate - EBC Debugger private data structure
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerDisplaySymbolAccrodingToAddress (
- IN UINTN Address,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate
- )
-{
- EFI_DEBUGGER_SYMBOL_OBJECT *Object;
- EFI_DEBUGGER_SYMBOL_ENTRY *Entry;
- UINTN CandidateAddress;
-
- //
- // Find the nearest symbol address
- //
- CandidateAddress = EbdFindSymbolAddress (Address, EdbMatchSymbolTypeNearestAddress, &Object, &Entry);
- if ((CandidateAddress == 0) || (CandidateAddress == (UINTN)-1) || (Entry == NULL)) {
- EDBPrint (L"Symbole at Address not found!\n");
- return EFI_DEBUG_CONTINUE;
- } else if (Address != CandidateAddress) {
- EDBPrint (L"Symbole at Address not found, print nearest one!\n");
- }
-
- //
- // Display symbol
- //
- EDBPrint (L"Symbol File Name: %s\n", Object->Name);
- if (sizeof (UINTN) == sizeof (UINT64)) {
- EDBPrint (L" Address Type Symbol\n");
- EDBPrint (L" ================== ==== ========\n");
- // EDBPrint (L" 0xFFFFFFFF00000000 ( F) TestMain\n");
- EDBPrint (
- L" 0x%016lx %s %a\n",
- (UINT64)Entry->Rva + Object->BaseAddress,
- EdbSymbolTypeToStr (Entry->Type),
- Entry->Name
- );
- } else {
- EDBPrint (L" Address Type Symbol\n");
- EDBPrint (L" ========== ==== ========\n");
- // EDBPrint (L" 0xFFFF0000 ( F) TestMain\n");
- EDBPrint (
- L" 0x%08x %s %a\n",
- Entry->Rva + Object->BaseAddress,
- EdbSymbolTypeToStr (Entry->Type),
- Entry->Name
- );
- }
-
- //
- // Done
- //
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- Find the symbol according to name and display symbol.
-
- @param SymbolFileName - The Symbol File Name, NULL means for all
- @param SymbolName - The Symbol Name, NULL means for all
- @param DebuggerPrivate - EBC Debugger private data structure
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerDisplaySymbolAccrodingToName (
- IN CHAR16 *SymbolFileName,
- IN CHAR16 *SymbolName,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate
- )
-{
- UINTN Index;
- UINTN SubIndex;
- EFI_DEBUGGER_SYMBOL_OBJECT *Object;
- EFI_DEBUGGER_SYMBOL_ENTRY *Entry;
-
- if (DebuggerPrivate->DebuggerSymbolContext.ObjectCount == 0) {
- EDBPrint (L"No Symbol File!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // Go throuth each symbol file
- //
- Object = DebuggerPrivate->DebuggerSymbolContext.Object;
- for (Index = 0; Index < DebuggerPrivate->DebuggerSymbolContext.ObjectCount; Index++, Object++) {
- if ((SymbolFileName != NULL) &&
- (StriCmp (SymbolFileName, Object->Name) != 0))
- {
- continue;
- }
-
- //
- // Break each symbol file
- //
- if (Index != 0) {
- if (SetPageBreak ()) {
- break;
- }
- }
-
- EDBPrint (L"Symbol File Name: %s\n", Object->Name);
- if (Object->EntryCount == 0) {
- EDBPrint (L"No Symbol!\n");
- continue;
- }
-
- Entry = Object->Entry;
- if (sizeof (UINTN) == sizeof (UINT64)) {
- EDBPrint (L" Address Type Symbol\n");
- EDBPrint (L" ================== ==== ========\n");
- // EDBPrint (L" 0xFFFFFFFF00000000 ( F) TestMain (EbcTest.obj)\n");
- } else {
- EDBPrint (L" Address Type Symbol\n");
- EDBPrint (L" ========== ==== ========\n");
- // EDBPrint (L" 0xFFFF0000 ( F) TestMain (EbcTest.obj)\n");
- }
-
- //
- // Go through each symbol name
- //
- for (SubIndex = 0; SubIndex < Object->EntryCount; SubIndex++, Entry++) {
- if ((SymbolName != NULL) &&
- (StrCmpUnicodeAndAscii (SymbolName, Entry->Name) != 0))
- {
- continue;
- }
-
- //
- // Break symbol
- //
- if (((SubIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&
- (SubIndex != 0))
- {
- if (SetPageBreak ()) {
- break;
- }
- }
-
- if (sizeof (UINTN) == sizeof (UINT64)) {
- EDBPrint (
- L" 0x%016lx %s %a (%a)\n",
- (UINT64)Entry->Rva + Object->BaseAddress,
- EdbSymbolTypeToStr (Entry->Type),
- Entry->Name,
- Entry->ObjName
- );
- } else {
- EDBPrint (
- L" 0x%08x %s %a (%a)\n",
- Entry->Rva + Object->BaseAddress,
- EdbSymbolTypeToStr (Entry->Type),
- Entry->Name,
- Entry->ObjName
- );
- }
- }
- }
-
- //
- // Done
- //
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- DebuggerCommand - ListSymbol.
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerListSymbol (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- CHAR16 *SymbolFileName;
- CHAR16 *SymbolName;
- CHAR16 *CommandStr;
- UINTN Address;
-
- SymbolFileName = NULL;
- SymbolName = NULL;
- CommandStr = CommandArg;
-
- //
- // display symbol according to address
- //
- if (CommandStr != NULL) {
- if ((StriCmp (CommandStr, L"F") != 0) &&
- (StriCmp (CommandStr, L"S") != 0))
- {
- Address = Xtoi (CommandStr);
- return DebuggerDisplaySymbolAccrodingToAddress (Address, DebuggerPrivate);
- }
- }
-
- //
- // Get SymbolFileName
- //
- if (CommandStr != NULL) {
- if (StriCmp (CommandStr, L"F") == 0) {
- CommandStr = StrGetNextTokenLine (L" ");
- if (CommandStr == NULL) {
- EDBPrint (L"Symbol File Name missing!\n");
- return EFI_DEBUG_CONTINUE;
- } else {
- SymbolFileName = CommandStr;
- CommandStr = StrGetNextTokenLine (L" ");
- }
- }
- }
-
- //
- // Get SymbolName
- //
- if (CommandStr != NULL) {
- if (StriCmp (CommandStr, L"S") == 0) {
- CommandStr = StrGetNextTokenLine (L" ");
- if (CommandStr == NULL) {
- EDBPrint (L"Symbol Name missing!\n");
- return EFI_DEBUG_CONTINUE;
- } else {
- SymbolName = CommandStr;
- CommandStr = StrGetNextTokenLine (L" ");
- }
- }
- }
-
- if (CommandStr != NULL) {
- EDBPrint (L"Argument error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // display symbol according to name
- //
- return DebuggerDisplaySymbolAccrodingToName (SymbolFileName, SymbolName, DebuggerPrivate);
-}
-
-/**
-
- DebuggerCommand - LoadSymbol.
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerLoadSymbol (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- UINTN BufferSize;
- VOID *Buffer;
- EFI_STATUS Status;
- CHAR16 *FileName;
- CHAR16 *CommandArg2;
- BOOLEAN IsLoadCode;
- CHAR16 *DirName;
- CHAR16 CodFile[EFI_DEBUGGER_SYMBOL_NAME_MAX];
- CHAR16 *CodFileName;
- UINTN Index;
-
- //
- // Check the argument
- //
- if (CommandArg == NULL) {
- EDBPrint (L"SymbolFile not found!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- IsLoadCode = FALSE;
- CommandArg2 = StrGetNextTokenLine (L" ");
- if (CommandArg2 != NULL) {
- if (StriCmp (CommandArg2, L"a") == 0) {
- IsLoadCode = TRUE;
- } else {
- EDBPrint (L"Argument error!\n");
- return EFI_DEBUG_CONTINUE;
- }
- }
-
- if (StrLen (CommandArg) <= 4) {
- EDBPrint (L"SymbolFile name error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- if (StriCmp (CommandArg + (StrLen (CommandArg) - 4), L".map") != 0) {
- EDBPrint (L"SymbolFile name error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // Read MAP file to memory
- //
- Status = ReadFileToBuffer (DebuggerPrivate, CommandArg, &BufferSize, &Buffer, TRUE);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"SymbolFile read error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- FileName = GetFileNameFromFullPath (CommandArg);
- //
- // Load Symbol
- //
- Status = EdbLoadSymbol (DebuggerPrivate, FileName, BufferSize, Buffer);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"LoadSymbol error!\n");
- gBS->FreePool (Buffer);
- return EFI_DEBUG_CONTINUE;
- }
-
- gBS->FreePool (Buffer);
-
- //
- // Patch Symbol for RVA
- //
- Status = EdbPatchSymbolRVA (DebuggerPrivate, FileName, EdbEbcImageRvaSearchTypeLast);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"PatchSymbol RVA - %r! Using the RVA in symbol file.\n", Status);
- } else {
- DEBUG ((DEBUG_ERROR, "PatchSymbol RVA successfully!\n"));
- }
-
- if (!IsLoadCode) {
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // load each cod file
- //
- DirName = GetDirNameFromFullPath (CommandArg);
- ZeroMem (CodFile, sizeof (CodFile));
- if (StrCmp (DirName, L"") != 0) {
- StrCpyS (CodFile, sizeof (CodFile), DirName);
- } else {
- DirName = L"\\";
- }
-
- //
- // Go throuth each file under this dir
- //
- Index = 0;
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- while (CodFileName != NULL) {
- ZeroMem (CodFile, sizeof (CodFile));
- if (StrCmp (DirName, L"\\") != 0) {
- StrCpyS (CodFile, sizeof (CodFile), DirName);
- }
-
- //
- // read cod file to memory
- //
- Status = ReadFileToBuffer (DebuggerPrivate, ConstructFullPath (CodFile, CodFileName, EFI_DEBUGGER_SYMBOL_NAME_MAX - StrLen (CodFile) - 2), &BufferSize, &Buffer, FALSE);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"CodeFile read error!\n");
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- continue;
- }
-
- //
- // Load Code
- //
- Status = EdbLoadCode (DebuggerPrivate, FileName, CodFileName, BufferSize, Buffer);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"LoadCode error!\n");
- gBS->FreePool (Buffer);
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- continue;
- }
-
- //
- // Record the buffer
- //
- Status = EdbAddCodeBuffer (DebuggerPrivate, FileName, CodFileName, BufferSize, Buffer);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"AddCodeBuffer error!\n");
- gBS->FreePool (Buffer);
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- continue;
- }
-
- //
- // Get next file
- //
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- }
-
- //
- // Done
- //
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- DebuggerCommand - UnloadSymbol
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerUnloadSymbol (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- EFI_STATUS Status;
- CHAR16 *FileName;
- CHAR16 *DirName;
- CHAR16 CodFile[EFI_DEBUGGER_SYMBOL_NAME_MAX];
- CHAR16 *CodFileName;
- UINTN Index;
- VOID *BufferPtr;
-
- //
- // Check the argument
- //
- if (CommandArg == NULL) {
- EDBPrint (L"SymbolFile not found!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- FileName = GetFileNameFromFullPath (CommandArg);
-
- //
- // Unload Code
- //
- DirName = GetDirNameFromFullPath (CommandArg);
- ZeroMem (CodFile, sizeof (CodFile));
- if (StrCmp (DirName, L"") != 0) {
- StrCpyS (CodFile, sizeof (CodFile), DirName);
- } else {
- DirName = L"\\";
- }
-
- //
- // Go through each file under this dir
- //
- Index = 0;
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- while (CodFileName != NULL) {
- ZeroMem (CodFile, sizeof (CodFile));
- if (StrCmp (DirName, L"\\") != 0) {
- StrCpyS (CodFile, sizeof (CodFile), DirName);
- }
-
- //
- // Unload Code
- //
- Status = EdbUnloadCode (DebuggerPrivate, FileName, CodFileName, &BufferPtr);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"UnloadCode error!\n");
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- continue;
- }
-
- //
- // Delete the code buffer
- //
- Status = EdbDeleteCodeBuffer (DebuggerPrivate, FileName, CodFileName, BufferPtr);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"DeleteCodeBuffer error!\n");
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- continue;
- }
-
- //
- // Get next file
- //
- CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
- }
-
- //
- // Unload Symbol
- //
- Status = EdbUnloadSymbol (DebuggerPrivate, FileName);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"UnloadSymbol error!\n");
- }
-
- //
- // Done
- //
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- DebuggerCommand - DisplaySymbol.
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerDisplaySymbol (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- if (CommandArg == NULL) {
- DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = !DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol;
- EdbShowDisasm (DebuggerPrivate, SystemContext);
- } else if (StriCmp (CommandArg, L"on") == 0) {
- DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = TRUE;
- EdbShowDisasm (DebuggerPrivate, SystemContext);
- } else if (StriCmp (CommandArg, L"off") == 0) {
- DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = FALSE;
- EdbShowDisasm (DebuggerPrivate, SystemContext);
- } else {
- EDBPrint (L"DisplaySymbol - argument error\n");
- }
-
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- DebuggerCommand - LoadCode.
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerLoadCode (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- UINTN BufferSize;
- VOID *Buffer;
- EFI_STATUS Status;
- CHAR16 *CommandArg2;
- CHAR16 *FileName;
- CHAR16 *MapFileName;
-
- //
- // Check the argument
- //
- if (CommandArg == NULL) {
- EDBPrint (L"CodeFile not found!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- CommandArg2 = StrGetNextTokenLine (L" ");
- if (CommandArg2 == NULL) {
- EDBPrint (L"SymbolFile not found!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- if (StrLen (CommandArg) <= 4) {
- EDBPrint (L"CodeFile name error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- if (StriCmp (CommandArg + (StrLen (CommandArg) - 4), L".cod") != 0) {
- EDBPrint (L"CodeFile name error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- if (StrLen (CommandArg2) <= 4) {
- EDBPrint (L"SymbolFile name error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- if (StriCmp (CommandArg2 + (StrLen (CommandArg2) - 4), L".map") != 0) {
- EDBPrint (L"SymbolFile name error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // read cod file to memory
- //
- Status = ReadFileToBuffer (DebuggerPrivate, CommandArg, &BufferSize, &Buffer, TRUE);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"CodeFile read error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- FileName = GetFileNameFromFullPath (CommandArg);
- MapFileName = GetFileNameFromFullPath (CommandArg2);
- //
- // Load Code
- //
- Status = EdbLoadCode (DebuggerPrivate, MapFileName, FileName, BufferSize, Buffer);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"LoadCode error!\n");
- gBS->FreePool (Buffer);
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // Record the buffer
- //
- Status = EdbAddCodeBuffer (DebuggerPrivate, MapFileName, FileName, BufferSize, Buffer);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"AddCodeBuffer error!\n");
- gBS->FreePool (Buffer);
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // Done
- //
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- DebuggerCommand - UnloadCode.
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerUnloadCode (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- CHAR16 *CommandArg2;
- CHAR16 *FileName;
- CHAR16 *MapFileName;
- EFI_STATUS Status;
- VOID *BufferPtr;
-
- //
- // Check the argument
- //
- if (CommandArg == NULL) {
- EDBPrint (L"CodeFile not found!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- CommandArg2 = StrGetNextTokenLine (L" ");
- if (CommandArg2 == NULL) {
- EDBPrint (L"SymbolFile not found!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- FileName = GetFileNameFromFullPath (CommandArg);
- MapFileName = GetFileNameFromFullPath (CommandArg2);
-
- //
- // Unload Code
- //
- Status = EdbUnloadCode (DebuggerPrivate, MapFileName, FileName, &BufferPtr);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"UnloadCode error!\n");
- return EFI_DEBUG_CONTINUE;
- }
-
- //
- // Delete Code buffer
- //
- Status = EdbDeleteCodeBuffer (DebuggerPrivate, MapFileName, FileName, BufferPtr);
- if (EFI_ERROR (Status)) {
- EDBPrint (L"DeleteCodeBuffer error!\n");
- }
-
- //
- // Done
- //
- return EFI_DEBUG_CONTINUE;
-}
-
-/**
-
- DebuggerCommand - DisplayCode.
-
- @param CommandArg - The argument for this command
- @param DebuggerPrivate - EBC Debugger private data structure
- @param ExceptionType - Exception type.
- @param SystemContext - EBC system context.
-
- @retval EFI_DEBUG_CONTINUE - formal return value
-
-**/
-EFI_DEBUG_STATUS
-DebuggerDisplayCode (
- IN CHAR16 *CommandArg,
- IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN OUT EFI_SYSTEM_CONTEXT SystemContext
- )
-{
- if (CommandArg == NULL) {
- DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = !DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly;
- EdbShowDisasm (DebuggerPrivate, SystemContext);
- } else if (StriCmp (CommandArg, L"on") == 0) {
- DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = TRUE;
- EdbShowDisasm (DebuggerPrivate, SystemContext);
- } else if (StriCmp (CommandArg, L"off") == 0) {
- DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = FALSE;
- EdbShowDisasm (DebuggerPrivate, SystemContext);
- } else {
- EDBPrint (L"DisplayCode - argument error\n");
- }
-
- return EFI_DEBUG_CONTINUE;
-}
+/** @file
+
+Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+
+**/
+
+#include "Edb.h"
+
+/**
+
+ Get file name from full path.
+
+ @param FullPath - full file path
+
+ @return file name
+
+**/
+CHAR16 *
+GetFileNameFromFullPath (
+ IN CHAR16 *FullPath
+ )
+{
+ CHAR16 *FileName;
+ CHAR16 *TempFileName;
+
+ FileName = FullPath;
+ TempFileName = StrGetNewTokenLine (FullPath, L"\\");
+
+ while (TempFileName != NULL) {
+ FileName = TempFileName;
+ TempFileName = StrGetNextTokenLine (L"\\");
+ PatchForStrTokenBefore (TempFileName, L'\\');
+ }
+
+ return FileName;
+}
+
+/**
+
+ Get dir name from full path.
+
+ @param FullPath - full file path
+
+ @return dir name
+
+**/
+CHAR16 *
+GetDirNameFromFullPath (
+ IN CHAR16 *FullPath
+ )
+{
+ CHAR16 *FileName;
+
+ FileName = GetFileNameFromFullPath (FullPath);
+ if (FileName != FullPath) {
+ *(FileName - 1) = 0;
+ return FullPath;
+ }
+
+ return L"";
+}
+
+/**
+
+ Construct full path according to dir and file path.
+
+ @param DirPath - dir path
+ @param FilePath - file path
+ @param Size - dir max size
+
+ @return Full file name
+
+**/
+CHAR16 *
+ConstructFullPath (
+ IN CHAR16 *DirPath,
+ IN CHAR16 *FilePath,
+ IN UINTN Size
+ )
+{
+ UINTN DirPathSize;
+
+ DirPathSize = StrLen (DirPath);
+ *(DirPath + DirPathSize) = L'\\';
+ StrnCatS (DirPath, DirPathSize + Size + 1, FilePath, Size);
+
+ *(DirPath + DirPathSize + Size + 1) = 0;
+
+ return DirPath;
+}
+
+CHAR16 *mSymbolTypeStr[] = {
+ L"( F)",
+ L"(SF)",
+ L"(GV)",
+ L"(SV)",
+};
+
+/**
+
+ Comvert Symbol Type to string.
+
+ @param Type - Symbol Type
+
+ @return String
+
+**/
+CHAR16 *
+EdbSymbolTypeToStr (
+ IN EFI_DEBUGGER_SYMBOL_TYPE Type
+ )
+{
+ if ((Type < 0) || (Type >= EfiDebuggerSymbolTypeMax)) {
+ return L"(?)";
+ }
+
+ return mSymbolTypeStr[Type];
+}
+
+/**
+
+ Find the symbol according to address and display symbol.
+
+ @param Address - SymbolAddress
+ @param DebuggerPrivate - EBC Debugger private data structure
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerDisplaySymbolAccrodingToAddress (
+ IN UINTN Address,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate
+ )
+{
+ EFI_DEBUGGER_SYMBOL_OBJECT *Object;
+ EFI_DEBUGGER_SYMBOL_ENTRY *Entry;
+ UINTN CandidateAddress;
+
+ //
+ // Find the nearest symbol address
+ //
+ CandidateAddress = EbdFindSymbolAddress (Address, EdbMatchSymbolTypeNearestAddress, &Object, &Entry);
+ if ((CandidateAddress == 0) || (CandidateAddress == (UINTN)-1) || (Entry == NULL)) {
+ EDBPrint (L"Symbole at Address not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ } else if (Address != CandidateAddress) {
+ EDBPrint (L"Symbole at Address not found, print nearest one!\n");
+ }
+
+ //
+ // Display symbol
+ //
+ EDBPrint (L"Symbol File Name: %s\n", Object->Name);
+ if (sizeof (UINTN) == sizeof (UINT64)) {
+ EDBPrint (L" Address Type Symbol\n");
+ EDBPrint (L" ================== ==== ========\n");
+ // EDBPrint (L" 0xFFFFFFFF00000000 ( F) TestMain\n");
+ EDBPrint (
+ L" 0x%016lx %s %a\n",
+ (UINT64)Entry->Rva + Object->BaseAddress,
+ EdbSymbolTypeToStr (Entry->Type),
+ Entry->Name
+ );
+ } else {
+ EDBPrint (L" Address Type Symbol\n");
+ EDBPrint (L" ========== ==== ========\n");
+ // EDBPrint (L" 0xFFFF0000 ( F) TestMain\n");
+ EDBPrint (
+ L" 0x%08x %s %a\n",
+ Entry->Rva + Object->BaseAddress,
+ EdbSymbolTypeToStr (Entry->Type),
+ Entry->Name
+ );
+ }
+
+ //
+ // Done
+ //
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ Find the symbol according to name and display symbol.
+
+ @param SymbolFileName - The Symbol File Name, NULL means for all
+ @param SymbolName - The Symbol Name, NULL means for all
+ @param DebuggerPrivate - EBC Debugger private data structure
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerDisplaySymbolAccrodingToName (
+ IN CHAR16 *SymbolFileName,
+ IN CHAR16 *SymbolName,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate
+ )
+{
+ UINTN Index;
+ UINTN SubIndex;
+ EFI_DEBUGGER_SYMBOL_OBJECT *Object;
+ EFI_DEBUGGER_SYMBOL_ENTRY *Entry;
+
+ if (DebuggerPrivate->DebuggerSymbolContext.ObjectCount == 0) {
+ EDBPrint (L"No Symbol File!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // Go throuth each symbol file
+ //
+ Object = DebuggerPrivate->DebuggerSymbolContext.Object;
+ for (Index = 0; Index < DebuggerPrivate->DebuggerSymbolContext.ObjectCount; Index++, Object++) {
+ if ((SymbolFileName != NULL) &&
+ (StriCmp (SymbolFileName, Object->Name) != 0))
+ {
+ continue;
+ }
+
+ //
+ // Break each symbol file
+ //
+ if (Index != 0) {
+ if (SetPageBreak ()) {
+ break;
+ }
+ }
+
+ EDBPrint (L"Symbol File Name: %s\n", Object->Name);
+ if (Object->EntryCount == 0) {
+ EDBPrint (L"No Symbol!\n");
+ continue;
+ }
+
+ Entry = Object->Entry;
+ if (sizeof (UINTN) == sizeof (UINT64)) {
+ EDBPrint (L" Address Type Symbol\n");
+ EDBPrint (L" ================== ==== ========\n");
+ // EDBPrint (L" 0xFFFFFFFF00000000 ( F) TestMain (EbcTest.obj)\n");
+ } else {
+ EDBPrint (L" Address Type Symbol\n");
+ EDBPrint (L" ========== ==== ========\n");
+ // EDBPrint (L" 0xFFFF0000 ( F) TestMain (EbcTest.obj)\n");
+ }
+
+ //
+ // Go through each symbol name
+ //
+ for (SubIndex = 0; SubIndex < Object->EntryCount; SubIndex++, Entry++) {
+ if ((SymbolName != NULL) &&
+ (StrCmpUnicodeAndAscii (SymbolName, Entry->Name) != 0))
+ {
+ continue;
+ }
+
+ //
+ // Break symbol
+ //
+ if (((SubIndex % EFI_DEBUGGER_LINE_NUMBER_IN_PAGE) == 0) &&
+ (SubIndex != 0))
+ {
+ if (SetPageBreak ()) {
+ break;
+ }
+ }
+
+ if (sizeof (UINTN) == sizeof (UINT64)) {
+ EDBPrint (
+ L" 0x%016lx %s %a (%a)\n",
+ (UINT64)Entry->Rva + Object->BaseAddress,
+ EdbSymbolTypeToStr (Entry->Type),
+ Entry->Name,
+ Entry->ObjName
+ );
+ } else {
+ EDBPrint (
+ L" 0x%08x %s %a (%a)\n",
+ Entry->Rva + Object->BaseAddress,
+ EdbSymbolTypeToStr (Entry->Type),
+ Entry->Name,
+ Entry->ObjName
+ );
+ }
+ }
+ }
+
+ //
+ // Done
+ //
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ DebuggerCommand - ListSymbol.
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerListSymbol (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ CHAR16 *SymbolFileName;
+ CHAR16 *SymbolName;
+ CHAR16 *CommandStr;
+ UINTN Address;
+
+ SymbolFileName = NULL;
+ SymbolName = NULL;
+ CommandStr = CommandArg;
+
+ //
+ // display symbol according to address
+ //
+ if (CommandStr != NULL) {
+ if ((StriCmp (CommandStr, L"F") != 0) &&
+ (StriCmp (CommandStr, L"S") != 0))
+ {
+ Address = Xtoi (CommandStr);
+ return DebuggerDisplaySymbolAccrodingToAddress (Address, DebuggerPrivate);
+ }
+ }
+
+ //
+ // Get SymbolFileName
+ //
+ if (CommandStr != NULL) {
+ if (StriCmp (CommandStr, L"F") == 0) {
+ CommandStr = StrGetNextTokenLine (L" ");
+ if (CommandStr == NULL) {
+ EDBPrint (L"Symbol File Name missing!\n");
+ return EFI_DEBUG_CONTINUE;
+ } else {
+ SymbolFileName = CommandStr;
+ CommandStr = StrGetNextTokenLine (L" ");
+ }
+ }
+ }
+
+ //
+ // Get SymbolName
+ //
+ if (CommandStr != NULL) {
+ if (StriCmp (CommandStr, L"S") == 0) {
+ CommandStr = StrGetNextTokenLine (L" ");
+ if (CommandStr == NULL) {
+ EDBPrint (L"Symbol Name missing!\n");
+ return EFI_DEBUG_CONTINUE;
+ } else {
+ SymbolName = CommandStr;
+ CommandStr = StrGetNextTokenLine (L" ");
+ }
+ }
+ }
+
+ if (CommandStr != NULL) {
+ EDBPrint (L"Argument error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // display symbol according to name
+ //
+ return DebuggerDisplaySymbolAccrodingToName (SymbolFileName, SymbolName, DebuggerPrivate);
+}
+
+/**
+
+ DebuggerCommand - LoadSymbol.
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerLoadSymbol (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ UINTN BufferSize;
+ VOID *Buffer;
+ EFI_STATUS Status;
+ CHAR16 *FileName;
+ CHAR16 *CommandArg2;
+ BOOLEAN IsLoadCode;
+ CHAR16 *DirName;
+ CHAR16 CodFile[EFI_DEBUGGER_SYMBOL_NAME_MAX];
+ CHAR16 *CodFileName;
+ UINTN Index;
+
+ //
+ // Check the argument
+ //
+ if (CommandArg == NULL) {
+ EDBPrint (L"SymbolFile not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ IsLoadCode = FALSE;
+ CommandArg2 = StrGetNextTokenLine (L" ");
+ if (CommandArg2 != NULL) {
+ if (StriCmp (CommandArg2, L"a") == 0) {
+ IsLoadCode = TRUE;
+ } else {
+ EDBPrint (L"Argument error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+ }
+
+ if (StrLen (CommandArg) <= 4) {
+ EDBPrint (L"SymbolFile name error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ if (StriCmp (CommandArg + (StrLen (CommandArg) - 4), L".map") != 0) {
+ EDBPrint (L"SymbolFile name error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // Read MAP file to memory
+ //
+ Status = ReadFileToBuffer (DebuggerPrivate, CommandArg, &BufferSize, &Buffer, TRUE);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"SymbolFile read error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ FileName = GetFileNameFromFullPath (CommandArg);
+ //
+ // Load Symbol
+ //
+ Status = EdbLoadSymbol (DebuggerPrivate, FileName, BufferSize, Buffer);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"LoadSymbol error!\n");
+ gBS->FreePool (Buffer);
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ gBS->FreePool (Buffer);
+
+ //
+ // Patch Symbol for RVA
+ //
+ Status = EdbPatchSymbolRVA (DebuggerPrivate, FileName, EdbEbcImageRvaSearchTypeLast);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"PatchSymbol RVA - %r! Using the RVA in symbol file.\n", Status);
+ } else {
+ DEBUG ((DEBUG_ERROR, "PatchSymbol RVA successfully!\n"));
+ }
+
+ if (!IsLoadCode) {
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // load each cod file
+ //
+ DirName = GetDirNameFromFullPath (CommandArg);
+ ZeroMem (CodFile, sizeof (CodFile));
+ if (StrCmp (DirName, L"") != 0) {
+ StrCpyS (CodFile, sizeof (CodFile), DirName);
+ } else {
+ DirName = L"\\";
+ }
+
+ //
+ // Go throuth each file under this dir
+ //
+ Index = 0;
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ while (CodFileName != NULL) {
+ ZeroMem (CodFile, sizeof (CodFile));
+ if (StrCmp (DirName, L"\\") != 0) {
+ StrCpyS (CodFile, sizeof (CodFile), DirName);
+ }
+
+ //
+ // read cod file to memory
+ //
+ Status = ReadFileToBuffer (DebuggerPrivate, ConstructFullPath (CodFile, CodFileName, EFI_DEBUGGER_SYMBOL_NAME_MAX - StrLen (CodFile) - 2), &BufferSize, &Buffer, FALSE);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"CodeFile read error!\n");
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ continue;
+ }
+
+ //
+ // Load Code
+ //
+ Status = EdbLoadCode (DebuggerPrivate, FileName, CodFileName, BufferSize, Buffer);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"LoadCode error!\n");
+ gBS->FreePool (Buffer);
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ continue;
+ }
+
+ //
+ // Record the buffer
+ //
+ Status = EdbAddCodeBuffer (DebuggerPrivate, FileName, CodFileName, BufferSize, Buffer);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"AddCodeBuffer error!\n");
+ gBS->FreePool (Buffer);
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ continue;
+ }
+
+ //
+ // Get next file
+ //
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ }
+
+ //
+ // Done
+ //
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ DebuggerCommand - UnloadSymbol
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerUnloadSymbol (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ EFI_STATUS Status;
+ CHAR16 *FileName;
+ CHAR16 *DirName;
+ CHAR16 CodFile[EFI_DEBUGGER_SYMBOL_NAME_MAX];
+ CHAR16 *CodFileName;
+ UINTN Index;
+ VOID *BufferPtr;
+
+ //
+ // Check the argument
+ //
+ if (CommandArg == NULL) {
+ EDBPrint (L"SymbolFile not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ FileName = GetFileNameFromFullPath (CommandArg);
+
+ //
+ // Unload Code
+ //
+ DirName = GetDirNameFromFullPath (CommandArg);
+ ZeroMem (CodFile, sizeof (CodFile));
+ if (StrCmp (DirName, L"") != 0) {
+ StrCpyS (CodFile, sizeof (CodFile), DirName);
+ } else {
+ DirName = L"\\";
+ }
+
+ //
+ // Go through each file under this dir
+ //
+ Index = 0;
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ while (CodFileName != NULL) {
+ ZeroMem (CodFile, sizeof (CodFile));
+ if (StrCmp (DirName, L"\\") != 0) {
+ StrCpyS (CodFile, sizeof (CodFile), DirName);
+ }
+
+ //
+ // Unload Code
+ //
+ Status = EdbUnloadCode (DebuggerPrivate, FileName, CodFileName, &BufferPtr);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"UnloadCode error!\n");
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ continue;
+ }
+
+ //
+ // Delete the code buffer
+ //
+ Status = EdbDeleteCodeBuffer (DebuggerPrivate, FileName, CodFileName, BufferPtr);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"DeleteCodeBuffer error!\n");
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ continue;
+ }
+
+ //
+ // Get next file
+ //
+ CodFileName = GetFileNameUnderDir (DebuggerPrivate, DirName, L".cod", &Index);
+ }
+
+ //
+ // Unload Symbol
+ //
+ Status = EdbUnloadSymbol (DebuggerPrivate, FileName);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"UnloadSymbol error!\n");
+ }
+
+ //
+ // Done
+ //
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ DebuggerCommand - DisplaySymbol.
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerDisplaySymbol (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ if (CommandArg == NULL) {
+ DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = !DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol;
+ EdbShowDisasm (DebuggerPrivate, SystemContext);
+ } else if (StriCmp (CommandArg, L"on") == 0) {
+ DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = TRUE;
+ EdbShowDisasm (DebuggerPrivate, SystemContext);
+ } else if (StriCmp (CommandArg, L"off") == 0) {
+ DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = FALSE;
+ EdbShowDisasm (DebuggerPrivate, SystemContext);
+ } else {
+ EDBPrint (L"DisplaySymbol - argument error\n");
+ }
+
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ DebuggerCommand - LoadCode.
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerLoadCode (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ UINTN BufferSize;
+ VOID *Buffer;
+ EFI_STATUS Status;
+ CHAR16 *CommandArg2;
+ CHAR16 *FileName;
+ CHAR16 *MapFileName;
+
+ //
+ // Check the argument
+ //
+ if (CommandArg == NULL) {
+ EDBPrint (L"CodeFile not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ CommandArg2 = StrGetNextTokenLine (L" ");
+ if (CommandArg2 == NULL) {
+ EDBPrint (L"SymbolFile not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ if (StrLen (CommandArg) <= 4) {
+ EDBPrint (L"CodeFile name error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ if (StriCmp (CommandArg + (StrLen (CommandArg) - 4), L".cod") != 0) {
+ EDBPrint (L"CodeFile name error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ if (StrLen (CommandArg2) <= 4) {
+ EDBPrint (L"SymbolFile name error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ if (StriCmp (CommandArg2 + (StrLen (CommandArg2) - 4), L".map") != 0) {
+ EDBPrint (L"SymbolFile name error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // read cod file to memory
+ //
+ Status = ReadFileToBuffer (DebuggerPrivate, CommandArg, &BufferSize, &Buffer, TRUE);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"CodeFile read error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ FileName = GetFileNameFromFullPath (CommandArg);
+ MapFileName = GetFileNameFromFullPath (CommandArg2);
+ //
+ // Load Code
+ //
+ Status = EdbLoadCode (DebuggerPrivate, MapFileName, FileName, BufferSize, Buffer);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"LoadCode error!\n");
+ gBS->FreePool (Buffer);
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // Record the buffer
+ //
+ Status = EdbAddCodeBuffer (DebuggerPrivate, MapFileName, FileName, BufferSize, Buffer);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"AddCodeBuffer error!\n");
+ gBS->FreePool (Buffer);
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // Done
+ //
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ DebuggerCommand - UnloadCode.
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerUnloadCode (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ CHAR16 *CommandArg2;
+ CHAR16 *FileName;
+ CHAR16 *MapFileName;
+ EFI_STATUS Status;
+ VOID *BufferPtr;
+
+ //
+ // Check the argument
+ //
+ if (CommandArg == NULL) {
+ EDBPrint (L"CodeFile not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ CommandArg2 = StrGetNextTokenLine (L" ");
+ if (CommandArg2 == NULL) {
+ EDBPrint (L"SymbolFile not found!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ FileName = GetFileNameFromFullPath (CommandArg);
+ MapFileName = GetFileNameFromFullPath (CommandArg2);
+
+ //
+ // Unload Code
+ //
+ Status = EdbUnloadCode (DebuggerPrivate, MapFileName, FileName, &BufferPtr);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"UnloadCode error!\n");
+ return EFI_DEBUG_CONTINUE;
+ }
+
+ //
+ // Delete Code buffer
+ //
+ Status = EdbDeleteCodeBuffer (DebuggerPrivate, MapFileName, FileName, BufferPtr);
+ if (EFI_ERROR (Status)) {
+ EDBPrint (L"DeleteCodeBuffer error!\n");
+ }
+
+ //
+ // Done
+ //
+ return EFI_DEBUG_CONTINUE;
+}
+
+/**
+
+ DebuggerCommand - DisplayCode.
+
+ @param CommandArg - The argument for this command
+ @param DebuggerPrivate - EBC Debugger private data structure
+ @param ExceptionType - Exception type.
+ @param SystemContext - EBC system context.
+
+ @retval EFI_DEBUG_CONTINUE - formal return value
+
+**/
+EFI_DEBUG_STATUS
+DebuggerDisplayCode (
+ IN CHAR16 *CommandArg,
+ IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext
+ )
+{
+ if (CommandArg == NULL) {
+ DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = !DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly;
+ EdbShowDisasm (DebuggerPrivate, SystemContext);
+ } else if (StriCmp (CommandArg, L"on") == 0) {
+ DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = TRUE;
+ EdbShowDisasm (DebuggerPrivate, SystemContext);
+ } else if (StriCmp (CommandArg, L"off") == 0) {
+ DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = FALSE;
+ EdbShowDisasm (DebuggerPrivate, SystemContext);
+ } else {
+ EDBPrint (L"DisplayCode - argument error\n");
+ }
+
+ return EFI_DEBUG_CONTINUE;
+}