summaryrefslogtreecommitdiff
path: root/BeagleBoardPkg/Sec/Sec.c
diff options
context:
space:
mode:
authorAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>2010-01-14 23:39:29 +0000
committerAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>2010-01-14 23:39:29 +0000
commit225290eba733e5ca7149d1789ccce5ef15c38df5 (patch)
treeaead584e85f8169bea5b4282e66b047706e42569 /BeagleBoardPkg/Sec/Sec.c
parent7c1c4dcf78041c489abc3314f19775929b7c8d29 (diff)
downloadedk2-platforms-225290eba733e5ca7149d1789ccce5ef15c38df5.tar.xz
Added new PeCoffGetEntryPoint lib function to get size of PE/COFF header. This is needed for debug prints with PE/COFF images that started as ELF or Mach-O. Moved and debugged ARM semihosting lib for RVD that prints out the debugger symbol load commands in a window on the debugger. Trying to write a script file, but that crashes RVD. Added debug print to BeagleBoard Sec that prints out RVD debugger command to load symbols for the Sec. Synced the rest of the code.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9763 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'BeagleBoardPkg/Sec/Sec.c')
-rwxr-xr-xBeagleBoardPkg/Sec/Sec.c106
1 files changed, 105 insertions, 1 deletions
diff --git a/BeagleBoardPkg/Sec/Sec.c b/BeagleBoardPkg/Sec/Sec.c
index 321b35940c..5b4d2946db 100755
--- a/BeagleBoardPkg/Sec/Sec.c
+++ b/BeagleBoardPkg/Sec/Sec.c
@@ -21,12 +21,24 @@
#include <Library/IoLib.h>
#include <Library/OmapLib.h>
#include <Library/ArmLib.h>
+#include <Library/PeCoffGetEntryPointLib.h>
#include <Ppi/GuidedSectionExtraction.h>
#include <Omap3530/Omap3530.h>
VOID
+EFIAPI
+_ModuleEntryPoint(
+ VOID
+ );
+
+CHAR8 *
+DeCygwinPathIfNeeded (
+ IN CHAR8 *Name
+ );
+
+VOID
PadConfiguration (
VOID
);
@@ -113,6 +125,53 @@ LzmaDecompressLibConstructor (
VOID
);
+/**
+ 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
+
+ This is just code to help print out RVD symbol load command.
+ If you build with cygwin paths aren't compatible with RVD.
+
+ @param Name Path to convert if needed
+
+**/
+CHAR8 *
+SecDeCygwinPathIfNeeded (
+ 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 seperators
+ for (Index = 11; Index < Len; Index++) {
+ if (Ptr[Index] == '/') {
+ Ptr[Index] = '\\' ;
+ }
+ }
+
+ return Name;
+}
+
+
VOID
CEntryPoint (
IN VOID *MemoryBase,
@@ -147,7 +206,52 @@ CEntryPoint (
// Start talking
UartInit();
- DEBUG((EFI_D_ERROR, "UART Test Line\n"));
+ DEBUG((EFI_D_ERROR, "UART Enabled\n"));
+
+ DEBUG_CODE_BEGIN ();
+ //
+ // On a debug build print out information about the SEC. This is really info about
+ // the PE/COFF file we are currently running from. Useful for loading symbols in a
+ // debugger. Remember our image is really part of the FV.
+ //
+ RETURN_STATUS Status;
+ EFI_PEI_FV_HANDLE VolumeHandle;
+ EFI_PEI_FILE_HANDLE FileHandle;
+ VOID *PeCoffImage;
+ UINT32 Offset;
+ CHAR8 *FilePath;
+
+ FfsAnyFvFindFirstFile (EFI_FV_FILETYPE_SECURITY_CORE, &VolumeHandle, &FileHandle);
+ Status = FfsFindSectionData (EFI_SECTION_TE, FileHandle, &PeCoffImage);
+ if (EFI_ERROR (Status)) {
+ // Usually is a TE (PI striped down PE/COFF), but could be a full PE/COFF
+ Status = FfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
+ }
+ if (!EFI_ERROR (Status)) {
+ Offset = PeCoffGetSizeOfHeaders (PeCoffImage);
+ FilePath = PeCoffLoaderGetPdbPointer (PeCoffImage);
+ if (FilePath != NULL) {
+
+ //
+ // In general you should never have to use #ifdef __CC_ARM in the code. It
+ // is hidden in the away in the MdePkg. But here we would like to print differnt things
+ // for different toolchains.
+ //
+#ifdef __CC_ARM
+ // Print out the command for the RVD debugger to load symbols for this image
+ DEBUG ((EFI_D_ERROR, "load /a /ni /np %a &0x%08x\n", SecDeCygwinPathIfNeeded (FilePath), PeCoffImage + Offset));
+#elif __GNUC__
+ // This may not work correctly if you generate PE/COFF directlyas then the Offset would not be required
+ DEBUG ((EFI_D_ERROR, "add-symbol-file %a 0x%08x\n", FilePath, PeCoffImage + Offset));
+#else
+ DEBUG ((EFI_D_ERROR, "SEC starts at 0x%08x with an entry point at 0x%08x %a\n", PeCoffImage, _ModuleEntryPoint, FilePath));
+#endif
+ }
+ }
+
+ DEBUG_CODE_END ();
+
+
// Start up a free running time so that the timer lib will work
TimerInit();