/** @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; | |
} |