}\r
\r
\r
-UINT32\r
-EFIAPI\r
-PeCoffGetSizeOfHeaders (\r
- IN VOID *Pe32Data\r
- )\r
-{\r
- EFI_IMAGE_DOS_HEADER *DosHdr;\r
- EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
- UINTN SizeOfHeaders;\r
-\r
- DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
- if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
- //\r
- // DOS image header is present, so read the PE header after the DOS image header.\r
- //\r
- Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));\r
- } else {\r
- //\r
- // DOS image header is not present, so PE header is at the image base.\r
- //\r
- Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
- }\r
-\r
- if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
- SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;\r
- } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
- SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
- } else {\r
- SizeOfHeaders = 0;\r
- }\r
-\r
- return SizeOfHeaders;\r
-}\r
\r
\r
CHAR8 *\r
\r
#include "CpuDxe.h"\r
\r
-//\r
-// For debug switch me back to to EFI_D_PAGE when done\r
-//\r
-#define L_EFI_D_PAGE EFI_D_ERROR\r
\r
//\r
// Translation/page table definitions\r
EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap;\r
\r
\r
- DEBUG ((L_EFI_D_PAGE, "SyncCacheConfig()\n"));\r
+ DEBUG ((EFI_D_PAGE, "SyncCacheConfig()\n"));\r
\r
// This code assumes MMU is enabled and filed with section translations\r
ASSERT (ArmMmuEnabled ());\r
// Cause a page fault if these ranges are accessed.\r
EntryMask = 0x3;\r
EntryValue = 0;\r
- DEBUG ((L_EFI_D_PAGE, "SetMemoryAttributes(): setting page %lx with unsupported attribute %x will page fault on access\n", BaseAddress, Attributes));\r
+ DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(): setting page %lx with unsupported attribute %x will page fault on access\n", BaseAddress, Attributes));\r
break;\r
\r
default:\r
// cannot be implemented UEFI definition unclear for ARM\r
// Cause a page fault if these ranges are accessed.\r
EntryValue = ARM_DESC_TYPE_FAULT;\r
- DEBUG ((L_EFI_D_PAGE, "SetMemoryAttributes(): setting section %lx with unsupported attribute %x will page fault on access\n", BaseAddress, Attributes));\r
+ DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(): setting section %lx with unsupported attribute %x will page fault on access\n", BaseAddress, Attributes));\r
break;\r
\r
\r
volatile ARM_FIRST_LEVEL_DESCRIPTOR *FirstLevelTable;\r
volatile ARM_PAGE_TABLE_ENTRY *PageTable;\r
\r
- DEBUG ((L_EFI_D_PAGE, "Converting section at 0x%x to pages\n", (UINTN)BaseAddress));\r
+ DEBUG ((EFI_D_PAGE, "Converting section at 0x%x to pages\n", (UINTN)BaseAddress));\r
\r
// obtain page table base\r
FirstLevelTable = (ARM_FIRST_LEVEL_DESCRIPTOR *)ArmGetTranslationTableBaseAddress ();\r
}\r
\r
// flush d-cache so descriptors make it back to uncached memory for subsequent table walks\r
- // TODO: change to use only PageTable base and length\r
- // ArmInvalidateDataCache ();\r
-DEBUG ((EFI_D_ERROR, "InvalidateDataCacheRange (%x, %x)\n", (UINTN)PageTableAddr, EFI_PAGE_SIZE));\r
-\r
InvalidateDataCacheRange ((VOID *)(UINTN)PageTableAddr, EFI_PAGE_SIZE);\r
\r
// formulate page table entry, Domain=0, NS=0\r
\r
if(((BaseAddress & 0xFFFFF) == 0) && ((Length & 0xFFFFF) == 0)) {\r
// is the base and length a multiple of 1 MB?\r
- DEBUG ((L_EFI_D_PAGE, "SetMemoryAttributes(): MMU section 0x%x length 0x%x to %lx\n", (UINTN)BaseAddress, (UINTN)Length, Attributes));\r
+ DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(): MMU section 0x%x length 0x%x to %lx\n", (UINTN)BaseAddress, (UINTN)Length, Attributes));\r
Status = UpdateSectionEntries (BaseAddress, Length, Attributes, VirtualMask);\r
} else {\r
// base and/or length is not a multiple of 1 MB\r
- DEBUG ((L_EFI_D_PAGE, "SetMemoryAttributes(): MMU page 0x%x length 0x%x to %lx\n", (UINTN)BaseAddress, (UINTN)Length, Attributes));\r
+ DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(): MMU page 0x%x length 0x%x to %lx\n", (UINTN)BaseAddress, (UINTN)Length, Attributes));\r
Status = UpdatePageEntries (BaseAddress, Length, Attributes, VirtualMask);\r
}\r
\r
IN UINT64 Attributes\r
)\r
{\r
- DEBUG ((L_EFI_D_PAGE, "SetMemoryAttributes(%lx, %lx, %lx)\n", BaseAddress, Length, Attributes));\r
+ DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(%lx, %lx, %lx)\n", BaseAddress, Length, Attributes));\r
if ( ((BaseAddress & (EFI_PAGE_SIZE-1)) != 0) || ((Length & (EFI_PAGE_SIZE-1)) != 0)){\r
// minimum granularity is EFI_PAGE_SIZE (4KB on ARM)\r
- DEBUG ((L_EFI_D_PAGE, "SetMemoryAttributes(%lx, %lx, %lx): minimum ganularity is EFI_PAGE_SIZE\n", BaseAddress, Length, Attributes));\r
+ DEBUG ((EFI_D_PAGE, "SetMemoryAttributes(%lx, %lx, %lx): minimum ganularity is EFI_PAGE_SIZE\n", BaseAddress, Length, Attributes));\r
return EFI_UNSUPPORTED;\r
}\r
\r
*Attributes = GcdDescriptor.Attributes;\r
}\r
}\r
-ASSERT (FALSE); \r
+\r
//\r
// Make this address range page fault if accessed. If it is a DMA buffer than this would \r
// be the PCI address. Code should always use the CPU address, and we will or in VirtualMask\r
--- /dev/null
+/**@file\r
+\r
+Copyright (c) 2006 - 2009, Intel Corporation\r
+Portions copyright (c) 2008-2010 Apple Inc. All rights reserved.\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+#include <Library/PeCoffLib.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/PeCoffExtraActionLib.h>\r
+#include <Library/SemihostLib.h>\r
+#include <Library/PrintLib.h>\r
+\r
+/**\r
+ Append string to debugger script file, create file if needed. \r
+\r
+ This library can show up in mulitple places so we need to append the file every time we write to it.\r
+ For example Sec can use this to load the DXE core, and the DXE core would use this to load all the\r
+ other modules. So we have two instances of the library in the system.\r
+\r
+ @param Buffer Buffer to write to file.\r
+ @param Length Length of Buffer in bytes.\r
+**/\r
+VOID\r
+WriteStringToFile (\r
+ IN VOID *Buffer,\r
+ IN UINT32 Length\r
+ )\r
+{\r
+ // Working around and issue with the code that is commented out. For now send it to the console.\r
+ // You can copy the console into a file and source the file as a script and you get symbols. \r
+ // This gets you all the symbols except for SEC. To get SEC symbols you need to copy the \r
+ // debug print in the SEC into the debugger manually\r
+ SemihostWriteString (Buffer);\r
+/*\r
+ I'm currently having issues with this code crashing the debugger. Seems like it should work.\r
+\r
+ UINT32 SemihostHandle;\r
+ UINT32 SemihostMode = SEMIHOST_FILE_MODE_WRITE | SEMIHOST_FILE_MODE_BINARY | SEMIHOST_FILE_MODE_CREATE;\r
+\r
+ SemihostFileOpen ("c:\rvi_symbols.inc", SemihostMode, &SemihostHandle);\r
+ SemihostFileWrite (SemihostHandle, &Length, Buffer);\r
+ SemihostFileClose (SemihostHandle);\r
+ */\r
+}\r
+\r
+\r
+/**\r
+ If the build is done on cygwin the paths are cygpaths. \r
+ /cygdrive/c/tmp.txt vs c:\tmp.txt so we need to convert\r
+ them to work with RVD commands\r
+\r
+ @param Name Path to convert if needed\r
+\r
+**/\r
+CHAR8 *\r
+DeCygwinPathIfNeeded (\r
+ IN CHAR8 *Name\r
+ )\r
+{\r
+ CHAR8 *Ptr;\r
+ UINTN Index;\r
+ UINTN Len;\r
+ \r
+ Ptr = AsciiStrStr (Name, "/cygdrive/");\r
+ if (Ptr == NULL) {\r
+ return Name;\r
+ }\r
+ \r
+ Len = AsciiStrLen (Ptr);\r
+ \r
+ // convert "/cygdrive" to spaces\r
+ for (Index = 0; Index < 9; Index++) {\r
+ Ptr[Index] = ' ';\r
+ }\r
+\r
+ // convert /c to c:\r
+ Ptr[9] = Ptr[10];\r
+ Ptr[10] = ':';\r
+ \r
+ // switch path seperators\r
+ for (Index = 11; Index < Len; Index++) {\r
+ if (Ptr[Index] == '/') {\r
+ Ptr[Index] = '\\' ;\r
+ }\r
+ }\r
+\r
+ return Name;\r
+}\r
+\r
+\r
+/**\r
+ Performs additional actions after a PE/COFF image has been loaded and relocated.\r
+\r
+ If ImageContext is NULL, then ASSERT().\r
+\r
+ @param ImageContext Pointer to the image context structure that describes the\r
+ PE/COFF image that has already been loaded and relocated.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PeCoffLoaderRelocateImageExtraAction (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ )\r
+{\r
+ CHAR8 Buffer[256];\r
+ \r
+ AsciiSPrint (Buffer, sizeof(Buffer), "load /a /ni /np %a &0x%08x\n", ImageContext->PdbPointer, (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders));\r
+ DeCygwinPathIfNeeded (&Buffer[16]);\r
+ \r
+ WriteStringToFile (Buffer, AsciiStrSize (Buffer));\r
+}\r
+\r
+\r
+\r
+/**\r
+ Performs additional actions just before a PE/COFF image is unloaded. Any resources\r
+ that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.\r
+ \r
+ If ImageContext is NULL, then ASSERT().\r
+ \r
+ @param ImageContext Pointer to the image context structure that describes the\r
+ PE/COFF image that is being unloaded.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PeCoffLoaderUnloadImageExtraAction (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ )\r
+{\r
+ CHAR8 Buffer[256];\r
+ \r
+ AsciiSPrint (Buffer, sizeof(Buffer), "unload symbols_only %a", ImageContext->PdbPointer);\r
+ DeCygwinPathIfNeeded (Buffer);\r
+ \r
+ WriteStringToFile (Buffer, AsciiStrSize (Buffer));\r
+}\r
--- /dev/null
+#/** @file
+# PeCoff extra action libary for DXE phase that run Unix emulator.
+#
+# Lib to provide memory journal status code reporting Routines
+# Copyright (c) 2007 - 2010, Intel Corporation
+# Portiions copyright (c) 2010 Apple, Inc. All rights reserved.
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+#**/
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = RvdUnixPeCoffExtraActionLib
+ FILE_GUID = 5EDEB7E7-EA55-4E92-8216-335AC98A3B11
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = PeCoffExtraActionLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = ARM
+#
+
+[Sources.common]
+ RvdPeCoffExtraActionLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ ArmPkg/ArmPkg.dec
+
+[LibraryClasses]
+ DebugLib
+ SemihostLib
+++ /dev/null
-/**@file\r
-\r
-Copyright (c) 2006 - 2009, Intel Corporation\r
-Portions copyright (c) 2008-2010 Apple Inc. All rights reserved.\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-\r
-**/\r
-\r
-#include <PiDxe.h>\r
-#include <Library/PeCoffLib.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/PeCoffExtraActionLib.h>\r
-#include <Library/SerialPortLib.h>\r
-#include <Library/PrintLib.h>\r
-\r
-\r
-VOID\r
-DeCygwinIfNeeded (\r
- IN CHAR8 *Name\r
- )\r
-{\r
- CHAR8 *Ptr;\r
- UINTN Index;\r
- UINTN Len;\r
- \r
- Ptr = AsciiStrStr (Name, "/cygdrive/");\r
- if (Ptr == NULL) {\r
- return;\r
- }\r
- \r
- Len = AsciiStrLen (Ptr);\r
- \r
- // convert "/cygdrive" to spaces\r
- for (Index = 0; Index < 9; Index++) {\r
- Ptr[Index] = ' ';\r
- }\r
-\r
- // convert /c to c:\r
- Ptr[9] = Ptr[10];\r
- Ptr[10] = ':';\r
- \r
- // switch path seperators\r
- for (Index = 11; Index < Len; Index++) {\r
- if (Ptr[Index] == '/') {\r
- Ptr[Index] = '\\' ;\r
- }\r
- }\r
-}\r
-\r
-\r
-/**\r
- Performs additional actions after a PE/COFF image has been loaded and relocated.\r
-\r
- If ImageContext is NULL, then ASSERT().\r
-\r
- @param ImageContext Pointer to the image context structure that describes the\r
- PE/COFF image that has already been loaded and relocated.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-PeCoffLoaderRelocateImageExtraAction (\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- CHAR8 Buffer[256];\r
- \r
- AsciiSPrint (Buffer, sizeof(Buffer), "load /a /ni /np %a &0x%08x\n", ImageContext->PdbPointer, (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders));\r
- DeCygwinIfNeeded (&Buffer[16]);\r
- \r
- SerialPortWrite ((UINT8 *) Buffer, AsciiStrLen (Buffer));\r
-}\r
-\r
-\r
-\r
-/**\r
- Performs additional actions just before a PE/COFF image is unloaded. Any resources\r
- that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.\r
- \r
- If ImageContext is NULL, then ASSERT().\r
- \r
- @param ImageContext Pointer to the image context structure that describes the\r
- PE/COFF image that is being unloaded.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-PeCoffLoaderUnloadImageExtraAction (\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- CHAR8 Buffer[256];\r
- \r
- AsciiSPrint (Buffer, sizeof(Buffer), "unload symbols_only %a", ImageContext->PdbPointer);\r
- DeCygwinIfNeeded (Buffer);\r
- \r
- SerialPortWrite ((UINT8 *) Buffer, AsciiStrLen (Buffer));\r
-}\r
+++ /dev/null
-#/** @file
-# PeCoff extra action libary for DXE phase that run Unix emulator.
-#
-# Lib to provide memory journal status code reporting Routines
-# Copyright (c) 2007 - 2010, Intel Corporation
-# Portiions copyright (c) 2010 Apple, Inc. All rights reserved.
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#
-#**/
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = RviUnixPeCoffExtraActionLib
- FILE_GUID = 5EDEB7E7-EA55-4E92-8216-335AC98A3B11
- MODULE_TYPE = DXE_DRIVER
- VERSION_STRING = 1.0
- LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER
- EDK_RELEASE_VERSION = 0x00020000
- EFI_SPECIFICATION_VERSION = 0x00020000
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = ARM
-#
-
-[Sources.common]
- RviPeCoffExtraActionLib.c
-
-[Packages]
- MdePkg/MdePkg.dec
- ArmPkg/ArmPkg.dec
-
-[LibraryClasses]
- DebugLib
- HobLib
- BaseMemoryLib
- SerialLib
Check to see if any data is avaiable to be read from the debug device.\r
\r
@retval TRUE At least one byte of data is avaiable to be read\r
- @retval FALS No data is avaiable to be read\r
+ @retval FALSE No data is avaiable to be read\r
\r
**/\r
BOOLEAN\r
SEMIHOST_FILE_OPEN_BLOCK OpenBlock;
INT32 Result;
- if (FileHandle == NULL)
+ if (FileHandle == NULL) {
return EFI_INVALID_PARAMETER;
+ }
OpenBlock.FileName = FileName;
OpenBlock.Mode = Mode;
Result = Semihost_SYS_OPEN(&OpenBlock);
- if (Result == -1)
- {
+ if (Result == -1) {
return EFI_NOT_FOUND;
- }
- else
- {
+ } else {
*FileHandle = Result;
return EFI_SUCCESS;
}
Result = Semihost_SYS_SEEK(&SeekBlock);
- if (Result == 0)
+ if (Result == 0) {
return EFI_SUCCESS;
- else
+ } else {
return EFI_ABORTED;
+ }
}
EFI_STATUS
SEMIHOST_FILE_READ_WRITE_BLOCK ReadBlock;
UINT32 Result;
- if ((Length == NULL) || (Buffer == NULL))
- return EFI_INVALID_PARAMETER;
+ if ((Length == NULL) || (Buffer == NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
ReadBlock.Handle = FileHandle;
ReadBlock.Buffer = Buffer;
Result = Semihost_SYS_READ(&ReadBlock);
- if (Result == *Length)
- {
+ if (Result == *Length) {
return EFI_ABORTED;
- }
- else
- {
+ } else {
*Length -= Result;
return EFI_SUCCESS;
}
{
SEMIHOST_FILE_READ_WRITE_BLOCK WriteBlock;
- if ((Length == NULL) || (Buffer == NULL))
+ if ((Length == NULL) || (Buffer == NULL)) {
return EFI_INVALID_PARAMETER;
+ }
WriteBlock.Handle = FileHandle;
WriteBlock.Buffer = Buffer;
{
INT32 Result = Semihost_SYS_CLOSE(&FileHandle);
- if (Result == -1)
+ if (Result == -1) {
return EFI_INVALID_PARAMETER;
- else
+ } else {
return EFI_SUCCESS;
+ }
}
EFI_STATUS
{
INT32 Result;
- if (Length == NULL)
+ if (Length == NULL) {
return EFI_INVALID_PARAMETER;
+ }
Result = Semihost_SYS_FLEN(&FileHandle);
- if (Result == -1)
- {
+ if (Result == -1) {
return EFI_ABORTED;
- }
- else
- {
+ } else {
*Length = Result;
return EFI_SUCCESS;
}
Result = Semihost_SYS_REMOVE(&RemoveBlock);
- if (Result == 0)
+ if (Result == 0) {
return EFI_SUCCESS;
- else
+ } else {
return EFI_ABORTED;
+ }
}
CHAR8
#/** @file\r
-# Semihosting serail port lib\r
+# Semihosting JTAG lib\r
#\r
# Copyright (c) 2008 - 2010, Apple Inc.\r
#\r
INF_VERSION = 0x00010005\r
BASE_NAME = SemihostLib\r
FILE_GUID = C40D08BA-DB7B-4F07-905A-C5FE4B5AF987\r
- MODULE_TYPE = UEFI_DRIVER\r
+ MODULE_TYPE = BASE\r
VERSION_STRING = 1.0\r
LIBRARY_CLASS = SemihostLib\r
\r
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+
+ #
+ # Uncomment (and comment out the next line) For RealView Debugger. The Standard IO window
+ # in the debugger will show load and unload commands for symbols. You can cut and paste this
+ # into the command window to load symbols. We should be able to use a script to do this, but
+ # the version of RVD I have does not support scipts accessing system memory.
+ #
+# PeCoffExtraActionLib|ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.inf
PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
+
+
CacheMaintenanceLib|ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf
PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
#include <Library/IoLib.h>\r
#include <Library/OmapLib.h>\r
#include <Library/ArmLib.h>\r
+#include <Library/PeCoffGetEntryPointLib.h>\r
\r
#include <Ppi/GuidedSectionExtraction.h>\r
\r
#include <Omap3530/Omap3530.h>\r
\r
+VOID\r
+EFIAPI \r
+_ModuleEntryPoint(\r
+ VOID\r
+ );\r
+\r
+CHAR8 *\r
+DeCygwinPathIfNeeded (\r
+ IN CHAR8 *Name\r
+ );\r
+\r
VOID\r
PadConfiguration (\r
VOID\r
VOID\r
);\r
\r
+/**\r
+ If the build is done on cygwin the paths are cygpaths. \r
+ /cygdrive/c/tmp.txt vs c:\tmp.txt so we need to convert\r
+ them to work with RVD commands\r
+\r
+ This is just code to help print out RVD symbol load command.\r
+ If you build with cygwin paths aren't compatible with RVD.\r
+\r
+ @param Name Path to convert if needed\r
+\r
+**/\r
+CHAR8 *\r
+SecDeCygwinPathIfNeeded (\r
+ IN CHAR8 *Name\r
+ )\r
+{\r
+ CHAR8 *Ptr;\r
+ UINTN Index;\r
+ UINTN Len;\r
+ \r
+ Ptr = AsciiStrStr (Name, "/cygdrive/");\r
+ if (Ptr == NULL) {\r
+ return Name;\r
+ }\r
+ \r
+ Len = AsciiStrLen (Ptr);\r
+ \r
+ // convert "/cygdrive" to spaces\r
+ for (Index = 0; Index < 9; Index++) {\r
+ Ptr[Index] = ' ';\r
+ }\r
+\r
+ // convert /c to c:\r
+ Ptr[9] = Ptr[10];\r
+ Ptr[10] = ':';\r
+ \r
+ // switch path seperators\r
+ for (Index = 11; Index < Len; Index++) {\r
+ if (Ptr[Index] == '/') {\r
+ Ptr[Index] = '\\' ;\r
+ }\r
+ }\r
+\r
+ return Name;\r
+}\r
+\r
+\r
VOID\r
CEntryPoint (\r
IN VOID *MemoryBase,\r
\r
// Start talking\r
UartInit();\r
- DEBUG((EFI_D_ERROR, "UART Test Line\n"));\r
+ DEBUG((EFI_D_ERROR, "UART Enabled\n"));\r
+\r
+ DEBUG_CODE_BEGIN ();\r
+ //\r
+ // On a debug build print out information about the SEC. This is really info about\r
+ // the PE/COFF file we are currently running from. Useful for loading symbols in a\r
+ // debugger. Remember our image is really part of the FV.\r
+ //\r
+ RETURN_STATUS Status;\r
+ EFI_PEI_FV_HANDLE VolumeHandle;\r
+ EFI_PEI_FILE_HANDLE FileHandle;\r
+ VOID *PeCoffImage;\r
+ UINT32 Offset;\r
+ CHAR8 *FilePath;\r
+
+ 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);\r
+ 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__\r
+ // 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\r
+ DEBUG ((EFI_D_ERROR, "SEC starts at 0x%08x with an entry point at 0x%08x %a\n", PeCoffImage, _ModuleEntryPoint, FilePath));
+#endif\r
+ }\r
+ }
+
+ DEBUG_CODE_END ();\r
+\r
+\r
\r
// Start up a free running time so that the timer lib will work\r
TimerInit();\r
ExtractGuidedSectionLib
LzmaDecompressLib
OmapLib
+ PeCoffGetEntryPointLib
[FeaturePcd]
gEmbeddedTokenSpaceGuid.PcdCacheEnable
IN VOID *Pe32Data\r
);\r
\r
+\r
+/**\r
+ Returns the size of the PE/COFF headers\r
+\r
+ Returns the size of the PE/COFF header specified by Pe32Data.\r
+ If Pe32Data is NULL, then ASSERT().\r
+\r
+ @param Pe32Data Pointer to the PE/COFF image that is loaded in system\r
+ memory.\r
+\r
+ @return Size of PE/COFF header in bytes or zero if not a valid iamge.\r
+\r
+**/\r
+UINT32
+EFIAPI
+PeCoffGetSizeOfHeaders (
+ IN VOID *Pe32Data
+ );
+\r
#endif\r
return NULL;\r
}\r
\r
+/**\r
+ Returns the size of the PE/COFF headers\r
+\r
+ Returns the size of the PE/COFF header specified by Pe32Data.\r
+ If Pe32Data is NULL, then ASSERT().\r
+\r
+ @param Pe32Data Pointer to the PE/COFF image that is loaded in system\r
+ memory.\r
+\r
+ @return Size of PE/COFF header in bytes or zero if not a valid iamge.\r
+\r
+**/\r
+UINT32
+EFIAPI
+PeCoffGetSizeOfHeaders (
+ IN VOID *Pe32Data
+ )
+{
+ EFI_IMAGE_DOS_HEADER *DosHdr;
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
+ UINTN SizeOfHeaders;
+
+ ASSERT (Pe32Data != NULL);\r
+
+ DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
+ if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
+ //
+ // DOS image header is present, so read the PE header after the DOS image header.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
+ } else {
+ //
+ // DOS image header is not present, so PE header is at the image base.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;
+ }
+
+ if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
+ SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;
+ } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
+ SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;
+ }
+
+ return SizeOfHeaders;
+}\r
\r
\r
return NULL;\r
}\r
+\r
+/**\r
+ Returns the size of the PE/COFF headers\r
+\r
+ Returns the size of the PE/COFF header specified by Pe32Data.\r
+ If Pe32Data is NULL, then ASSERT().\r
+\r
+ @param Pe32Data Pointer to the PE/COFF image that is loaded in system\r
+ memory.\r
+\r
+ @return Size of PE/COFF header in bytes or zero if not a valid iamge.\r
+\r
+**/\r
+UINT32
+EFIAPI
+PeCoffGetSizeOfHeaders (
+ IN VOID *Pe32Data
+ )
+{
+ EFI_IMAGE_DOS_HEADER *DosHdr;
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
+ UINTN SizeOfHeaders;
+
+ ASSERT (Pe32Data != NULL);\r
+
+ DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
+ if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
+ //
+ // DOS image header is present, so read the PE header after the DOS image header.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
+ } else {
+ //
+ // DOS image header is not present, so PE header is at the image base.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;
+ }
+
+ if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
+ SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;
+ } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
+ SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;
+ }
+
+ return SizeOfHeaders;
+}\r
+\r
\r
return NULL;\r
}\r
+\r
+\r
+/**\r
+ Returns the size of the PE/COFF headers\r
+\r
+ Returns the size of the PE/COFF header specified by Pe32Data.\r
+ If Pe32Data is NULL, then ASSERT().\r
+\r
+ @param Pe32Data Pointer to the PE/COFF image that is loaded in system\r
+ memory.\r
+\r
+ @return Size of PE/COFF header in bytes or zero if not a valid iamge.\r
+\r
+**/\r
+UINT32
+EFIAPI
+PeCoffGetSizeOfHeaders (
+ IN VOID *Pe32Data
+ )
+{
+ EFI_IMAGE_DOS_HEADER *DosHdr;
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
+ UINTN SizeOfHeaders;
+
+ ASSERT (Pe32Data != NULL);\r
+
+ DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
+ if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
+ //
+ // DOS image header is present, so read the PE header after the DOS image header.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
+ } else {
+ //
+ // DOS image header is not present, so PE header is at the image base.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;
+ }
+
+ if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
+ SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;
+ } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
+ SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;
+ }
+
+ return SizeOfHeaders;
+}\r
+\r