| /**@file | |
| Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR> | |
| Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR> | |
| Portions copyright (c) 2011 - 2012, ARM Ltd. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include <PiDxe.h> | |
| #include <Library/PeCoffLib.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/PeCoffExtraActionLib.h> | |
| #include <Library/SemihostLib.h> | |
| #include <Library/PrintLib.h> | |
| /** | |
| Append string to debugger script file, create file if needed. | |
| This library can show up in mulitple places so we need to append the file every time we write to it. | |
| For example Sec can use this to load the DXE core, and the DXE core would use this to load all the | |
| other modules. So we have two instances of the library in the system. | |
| @param Buffer Buffer to write to file. | |
| @param Length Length of Buffer in bytes. | |
| **/ | |
| VOID | |
| WriteStringToFile ( | |
| IN VOID *Buffer, | |
| IN UINT32 Length | |
| ) | |
| { | |
| // Working around and issue with the code that is commented out. For now send it to the console. | |
| // You can copy the console into a file and source the file as a script and you get symbols. | |
| // This gets you all the symbols except for SEC. To get SEC symbols you need to copy the | |
| // debug print in the SEC into the debugger manually | |
| SemihostWriteString (Buffer); | |
| /* | |
| I'm currently having issues with this code crashing the debugger. Seems like it should work. | |
| UINT32 SemihostHandle; | |
| UINT32 SemihostMode = SEMIHOST_FILE_MODE_WRITE | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_UPDATE; | |
| SemihostFileOpen ("c:\rvi_symbols.inc", SemihostMode, &SemihostHandle); | |
| SemihostFileWrite (SemihostHandle, &Length, Buffer); | |
| SemihostFileClose (SemihostHandle); | |
| */ | |
| } | |
| /** | |
| If the build is done on cygwin the paths are cygpaths. | |
| /cygdrive/c/tmp.txt vs c:\tmp.txt so we need to convert | |
| them to work with RVD commands | |
| @param Name Path to convert if needed | |
| **/ | |
| CHAR8 * | |
| DeCygwinPathIfNeeded ( | |
| IN CHAR8 *Name | |
| ) | |
| { | |
| CHAR8 *Ptr; | |
| UINTN Index; | |
| UINTN Len; | |
| Ptr = AsciiStrStr (Name, "/cygdrive/"); | |
| if (Ptr == NULL) { | |
| return Name; | |
| } | |
| Len = AsciiStrLen (Ptr); | |
| // convert "/cygdrive" to spaces | |
| for (Index = 0; Index < 9; Index++) { | |
| Ptr[Index] = ' '; | |
| } | |
| // convert /c to c: | |
| Ptr[9] = Ptr[10]; | |
| Ptr[10] = ':'; | |
| // switch path separators | |
| for (Index = 11; Index < Len; Index++) { | |
| if (Ptr[Index] == '/') { | |
| Ptr[Index] = '\\' ; | |
| } | |
| } | |
| return Name; | |
| } | |
| /** | |
| Performs additional actions after a PE/COFF image has been loaded and relocated. | |
| If ImageContext is NULL, then ASSERT(). | |
| @param ImageContext Pointer to the image context structure that describes the | |
| PE/COFF image that has already been loaded and relocated. | |
| **/ | |
| VOID | |
| EFIAPI | |
| PeCoffLoaderRelocateImageExtraAction ( | |
| IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext | |
| ) | |
| { | |
| CHAR8 Buffer[256]; | |
| #if (__ARMCC_VERSION < 500000) | |
| AsciiSPrint (Buffer, sizeof(Buffer), "load /a /ni /np \"%a\" &0x%08x\n", ImageContext->PdbPointer, (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)); | |
| #else | |
| AsciiSPrint (Buffer, sizeof(Buffer), "add-symbol-file %a 0x%08x\n", ImageContext->PdbPointer, (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)); | |
| #endif | |
| DeCygwinPathIfNeeded (&Buffer[16]); | |
| WriteStringToFile (Buffer, AsciiStrSize (Buffer)); | |
| } | |
| /** | |
| Performs additional actions just before a PE/COFF image is unloaded. Any resources | |
| that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed. | |
| If ImageContext is NULL, then ASSERT(). | |
| @param ImageContext Pointer to the image context structure that describes the | |
| PE/COFF image that is being unloaded. | |
| **/ | |
| VOID | |
| EFIAPI | |
| PeCoffLoaderUnloadImageExtraAction ( | |
| IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext | |
| ) | |
| { | |
| CHAR8 Buffer[256]; | |
| AsciiSPrint (Buffer, sizeof(Buffer), "unload symbols_only \"%a\"\n", ImageContext->PdbPointer); | |
| DeCygwinPathIfNeeded (Buffer); | |
| WriteStringToFile (Buffer, AsciiStrSize (Buffer)); | |
| } |