summaryrefslogtreecommitdiff
path: root/EmulatorPkg
diff options
context:
space:
mode:
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2011-12-15 22:26:15 +0000
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>2011-12-15 22:26:15 +0000
commitdd6f7d02a1dd51e33e92e6935e72fff464132588 (patch)
tree99b879fe846123d425a77de27c51d8a5ed6583c5 /EmulatorPkg
parent947a14a0a87cf1965db19c1c15b23faa6ad8f665 (diff)
Add a PcdEmulatorLazyLoadSymbols that allows non-lazy symbol loading. The problem with lazy symbol loading is it only happens after you hit a breakpoint. This means you can't add breakpoints from the GUI and have them hit, this requires symbols being loaded as modules load so the breakpoints can get resolved.
Added arguments to SecGdbScriptBreak() to enable lldb python symbol load/unload script. signed-off-by:andrewfish git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12879 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EmulatorPkg')
-rw-r--r--EmulatorPkg/EmulatorPkg.dec4
-rw-r--r--EmulatorPkg/Unix/Host/Host.c103
-rw-r--r--EmulatorPkg/Unix/Host/Host.inf3
3 files changed, 83 insertions, 27 deletions
diff --git a/EmulatorPkg/EmulatorPkg.dec b/EmulatorPkg/EmulatorPkg.dec
index f005c792c..b3d461de3 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 17130168f..8e1272d4e 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 018ed8673..496bd770b 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