diff options
Diffstat (limited to 'EmulatorPkg')
-rw-r--r-- | EmulatorPkg/EmulatorPkg.dec | 4 | ||||
-rw-r--r-- | EmulatorPkg/Unix/Host/Host.c | 103 | ||||
-rw-r--r-- | EmulatorPkg/Unix/Host/Host.inf | 3 |
3 files changed, 83 insertions, 27 deletions
diff --git a/EmulatorPkg/EmulatorPkg.dec b/EmulatorPkg/EmulatorPkg.dec index f005c792cc..b3d461de37 100644 --- a/EmulatorPkg/EmulatorPkg.dec +++ b/EmulatorPkg/EmulatorPkg.dec @@ -48,6 +48,10 @@ gEmuVirtualDisksGuid = { 0xf2ba331a, 0x8985, 0x11db, { 0xa4, 0x06, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } }
gEmuPhysicalDisksGuid = { 0xf2bdcc96, 0x8985, 0x11db, { 0x87, 0x19, 0x00, 0x40, 0xd0, 0x2b, 0x18, 0x35 } }
+[PcdsFeatureFlag]
+ ## If TRUE, if symbols only load on breakpoints and gdb entry
+ gEmulatorPkgTokenSpaceGuid.PcdEmulatorLazyLoadSymbols|TRUE|BOOLEAN|0x00020000
+
[PcdsFixedAtBuild]
gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageVariableBase|0x0|UINT64|0x00001014
gEmulatorPkgTokenSpaceGuid.PcdEmuFlashNvStorageFtwSpareBase|0x0|UINT64|0x00001015
diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c index 17130168f0..8e1272d4e3 100644 --- a/EmulatorPkg/Unix/Host/Host.c +++ b/EmulatorPkg/Unix/Host/Host.c @@ -1113,6 +1113,18 @@ DlLoadImage ( } +VOID +SecGdbScriptBreak ( + char *FileName, + int FileNameLength, + long unsigned int LoadAddress, + int AddSymbolFlag + ) +{ + return; +} + + /** Adds the image to a gdb script so it's symbols can be loaded. The AddFirmwareSymbolFile helper macro is used. @@ -1130,20 +1142,41 @@ GdbScriptAddImage ( if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) { FILE *GdbTempFile; - GdbTempFile = fopen (gGdbWorkingFileName, "a"); - if (GdbTempFile != NULL) { - long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders); - mScriptSymbolChangesCount++; - fprintf ( - GdbTempFile, - "AddFirmwareSymbolFile 0x%x %s 0x%08lx\n", - mScriptSymbolChangesCount, - ImageContext->PdbPointer, - SymbolsAddr - ); - fclose (GdbTempFile); + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) { + GdbTempFile = fopen (gGdbWorkingFileName, "a"); + if (GdbTempFile != NULL) { + long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders); + mScriptSymbolChangesCount++; + fprintf ( + GdbTempFile, + "AddFirmwareSymbolFile 0x%x %s 0x%08lx\n", + mScriptSymbolChangesCount, + ImageContext->PdbPointer, + SymbolsAddr + ); + fclose (GdbTempFile); + } else { + ASSERT (FALSE); + } } else { - ASSERT (FALSE); + GdbTempFile = fopen (gGdbWorkingFileName, "w"); + if (GdbTempFile != NULL) { + fprintf ( + GdbTempFile, + "add-symbol-file %s 0x%08lx\n", + ImageContext->PdbPointer, + (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders) + ); + fclose (GdbTempFile); + + // + // Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint. + // Hey what can you say scripting in gdb is not that great.... + // + SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer), (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders), 1); + } else { + ASSERT (FALSE); + } } } } @@ -1182,21 +1215,37 @@ GdbScriptRemoveImage ( return; } - // - // Write the file we need for the gdb script - // - GdbTempFile = fopen (gGdbWorkingFileName, "a"); - if (GdbTempFile != NULL) { - mScriptSymbolChangesCount++; - fprintf ( - GdbTempFile, - "RemoveFirmwareSymbolFile 0x%x %s\n", - mScriptSymbolChangesCount, - ImageContext->PdbPointer - ); - fclose (GdbTempFile); + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) { + // + // Write the file we need for the gdb script + // + GdbTempFile = fopen (gGdbWorkingFileName, "a"); + if (GdbTempFile != NULL) { + mScriptSymbolChangesCount++; + fprintf ( + GdbTempFile, + "RemoveFirmwareSymbolFile 0x%x %s\n", + mScriptSymbolChangesCount, + ImageContext->PdbPointer + ); + fclose (GdbTempFile); + } else { + ASSERT (FALSE); + } } else { - ASSERT (FALSE); + GdbTempFile = fopen (gGdbWorkingFileName, "w"); + if (GdbTempFile != NULL) { + fprintf (GdbTempFile, "remove-symbol-file %s\n", ImageContext->PdbPointer); + fclose (GdbTempFile); + + // + // Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint. + // Hey what can you say scripting in gdb is not that great.... + // + SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer), 0, 0); + } else { + ASSERT (FALSE); + } } } diff --git a/EmulatorPkg/Unix/Host/Host.inf b/EmulatorPkg/Unix/Host/Host.inf index 018ed8673f..496bd770b3 100644 --- a/EmulatorPkg/Unix/Host/Host.inf +++ b/EmulatorPkg/Unix/Host/Host.inf @@ -111,6 +111,9 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
+[FeaturePcd]
+ gEmulatorPkgTokenSpaceGuid.PcdEmulatorLazyLoadSymbols
+
[BuildOptions]
GCC:*_*_IA32_DLINK_FLAGS == -o $(BIN_DIR)/Host -m elf_i386 -dynamic-linker $(HOST_DLINK_PATHS) -L/usr/X11R6/lib -lXext -lX11
|