X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=BeagleBoardPkg%2FSec%2FSec.c;h=448a713f4d41c475564e0a5fb053ccc1ba12d9fb;hp=321b35940cc9a19fa80e8d6eedcbc3a56a6ced80;hb=ca3ad58bfa2284f0dc98ec904423e83874a90f52;hpb=2ef2b01e07c02db339f34004445734a2dbdd80e1 diff --git a/BeagleBoardPkg/Sec/Sec.c b/BeagleBoardPkg/Sec/Sec.c index 321b35940c..448a713f4d 100755 --- a/BeagleBoardPkg/Sec/Sec.c +++ b/BeagleBoardPkg/Sec/Sec.c @@ -21,11 +21,25 @@ #include #include #include +#include #include - +#include #include +#include "LzmaDecompress.h" + +VOID +EFIAPI +_ModuleEntryPoint( + VOID + ); + +CHAR8 * +DeCygwinPathIfNeeded ( + IN CHAR8 *Name + ); + VOID PadConfiguration ( VOID @@ -113,6 +127,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 +208,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), (CHAR8 *)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(); @@ -156,6 +262,18 @@ CEntryPoint ( ExtractGuidedSectionLibConstructor(); LzmaDecompressLibConstructor(); + // Build HOBs to pass up our version of stuff the DXE Core needs to save space +#if 0 + BuildPeCoffLoaderHob (); + BuildExtractSectionHob ( + &gLzmaCustomDecompressGuid, + LzmaGuidedSectionGetInfo, + LzmaGuidedSectionExtraction + ); +#endif + + DecompressFirstFv (); + // Load the DXE Core and transfer control to it LoadDxeCoreFromFv(NULL, 0);