diff options
| author | kx <kx@radix.pro> | 2024-06-04 06:43:08 +0300 |
|---|---|---|
| committer | kx <kx@radix.pro> | 2024-06-04 06:43:08 +0300 |
| commit | 7e2ccccace24636f29ddc210b94606abd4c7e42b (patch) | |
| tree | 545d43ea12671048956cafeb12303e84d601e571 /MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbCmdSymbol.c | |
| parent | 27b044605cd5f6b33a3d231576003850b3fe305b (diff) | |
| download | edk2-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.c | 1754 |
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; +} |
