X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BeagleBoardPkg%2FSec%2FSec.c;h=5b4d2946dbef39ab7e031d505e0a28779aac552d;hp=321b35940cc9a19fa80e8d6eedcbc3a56a6ced80;hb=225290eba733e5ca7149d1789ccce5ef15c38df5;hpb=2ef2b01e07c02db339f34004445734a2dbdd80e1 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,11 +21,23 @@ #include #include #include +#include #include #include +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();