Added new PeCoffGetEntryPoint lib function to get size of PE/COFF header. This is...
authorAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 23:39:29 +0000 (23:39 +0000)
committerAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 23:39:29 +0000 (23:39 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9763 6f19259b-4bc3-4df7-8a09-765794883524

16 files changed:
ArmPkg/Drivers/CpuDxe/Exception.c
ArmPkg/Drivers/CpuDxe/Mmu.c
ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.c [new file with mode: 0644]
ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.inf [new file with mode: 0644]
ArmPkg/Library/RviPeCoffExtraActionLib/RviPeCoffExtraActionLib.c [deleted file]
ArmPkg/Library/RviPeCoffExtraActionLib/RviPeCoffExtraActionLib.inf [deleted file]
ArmPkg/Library/SemiHostingSerialPortLib/SerialPortLib.c
ArmPkg/Library/SemihostLib/Arm/SemihostLib.c
ArmPkg/Library/SemihostLib/SemihostLib.inf
BeagleBoardPkg/BeagleBoardPkg.dsc
BeagleBoardPkg/Sec/Sec.c
BeagleBoardPkg/Sec/Sec.inf
MdePkg/Include/Library/PeCoffGetEntryPointLib.h
MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
Nt32Pkg/Library/Nt32PeiPeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
UnixPkg/Library/EdkUnixPeiPeCoffGetEntryPointLib/PeCoffGetEntryPoint.c

index 1487fe8..92faaa3 100644 (file)
@@ -122,39 +122,6 @@ RegisterDebuggerInterruptHandler (
 }\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
index a0977dd..55e0498 100644 (file)
@@ -16,10 +16,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \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
@@ -353,7 +349,7 @@ SyncCacheConfig (
   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
@@ -483,7 +479,7 @@ UpdatePageEntries (
       // 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
@@ -617,7 +613,7 @@ UpdateSectionEntries (
       // 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
@@ -680,7 +676,7 @@ ConvertSectionToPages (
   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
@@ -727,10 +723,6 @@ ConvertSectionToPages (
   }\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
@@ -756,11 +748,11 @@ SetMemoryAttributes (
   \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
@@ -807,10 +799,10 @@ CpuSetMemoryAttributes (
   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
@@ -843,7 +835,7 @@ CpuConvertPagesToUncachedVirtualAddress (
       *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
diff --git a/ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.c b/ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.c
new file mode 100644 (file)
index 0000000..071c510
--- /dev/null
@@ -0,0 +1,150 @@
+/**@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
diff --git a/ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.inf b/ArmPkg/Library/RvdPeCoffExtraActionLib/RvdPeCoffExtraActionLib.inf
new file mode 100644 (file)
index 0000000..50eb57b
--- /dev/null
@@ -0,0 +1,41 @@
+#/** @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
diff --git a/ArmPkg/Library/RviPeCoffExtraActionLib/RviPeCoffExtraActionLib.c b/ArmPkg/Library/RviPeCoffExtraActionLib/RviPeCoffExtraActionLib.c
deleted file mode 100644 (file)
index 2e44c62..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/**@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
diff --git a/ArmPkg/Library/RviPeCoffExtraActionLib/RviPeCoffExtraActionLib.inf b/ArmPkg/Library/RviPeCoffExtraActionLib/RviPeCoffExtraActionLib.inf
deleted file mode 100644 (file)
index 947fcf4..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#/** @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
index df43f31..114dfe8 100644 (file)
@@ -129,7 +129,7 @@ SerialPortRead (
   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 FALS     No data is avaiable to be read\r
 \r
 **/\r
 BOOLEAN\r
index e1a515e..31efc0a 100644 (file)
@@ -36,8 +36,9 @@ SemihostFileOpen (
   SEMIHOST_FILE_OPEN_BLOCK  OpenBlock;
   INT32                     Result;
 
-  if (FileHandle == NULL)
+  if (FileHandle == NULL) {
     return EFI_INVALID_PARAMETER;
+  }
 
   OpenBlock.FileName    = FileName;
   OpenBlock.Mode        = Mode;
@@ -45,12 +46,9 @@ SemihostFileOpen (
 
   Result = Semihost_SYS_OPEN(&OpenBlock);
 
-  if (Result == -1)
-  {
+  if (Result == -1) {
     return EFI_NOT_FOUND;
-  }
-  else
-  {
+  } else {
     *FileHandle = Result;
     return EFI_SUCCESS;
   }
@@ -70,10 +68,11 @@ SemihostFileSeek (
 
   Result = Semihost_SYS_SEEK(&SeekBlock);
 
-  if (Result == 0)
+  if (Result == 0) {
     return EFI_SUCCESS;
-  else
+  } else {
     return EFI_ABORTED;
+  }
 }
 
 EFI_STATUS
@@ -86,8 +85,9 @@ SemihostFileRead (
   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;
@@ -95,12 +95,9 @@ SemihostFileRead (
 
   Result = Semihost_SYS_READ(&ReadBlock);
 
-  if (Result == *Length)
-  {
+  if (Result == *Length) {
     return EFI_ABORTED;
-  }
-  else
-  {
+  } else {
     *Length -= Result;
     return EFI_SUCCESS;
   }
@@ -115,8 +112,9 @@ SemihostFileWrite (
 {
   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;
@@ -134,10 +132,11 @@ SemihostFileClose (
 {
   INT32 Result = Semihost_SYS_CLOSE(&FileHandle);
 
-  if (Result == -1)
+  if (Result == -1) {
     return EFI_INVALID_PARAMETER;
-  else
+  } else {
     return EFI_SUCCESS;
+  }
 }
 
 EFI_STATUS
@@ -148,17 +147,15 @@ SemihostFileLength (
 {
   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;
   }
@@ -177,10 +174,11 @@ SemihostFileRemove (
 
   Result = Semihost_SYS_REMOVE(&RemoveBlock);
 
-  if (Result == 0)
+  if (Result == 0) {
     return EFI_SUCCESS;
-  else
+  } else {
     return EFI_ABORTED;
+  }
 }
 
 CHAR8
index d05188c..c4b5c68 100644 (file)
@@ -1,5 +1,5 @@
 #/** @file\r
-# Semihosting  serail port lib\r
+# Semihosting JTAG lib\r
 #\r
 # Copyright (c) 2008 - 2010, Apple Inc.\r
 #\r
@@ -17,7 +17,7 @@
   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
index 928224b..bed0753 100644 (file)
   
   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
   
index 321b359..5b4d294 100755 (executable)
 #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
@@ -113,6 +125,53 @@ LzmaDecompressLibConstructor (
   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
@@ -147,7 +206,52 @@ CEntryPoint (
 \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
index ba4c904..79a5eb4 100755 (executable)
@@ -46,6 +46,7 @@
   ExtractGuidedSectionLib
   LzmaDecompressLib
   OmapLib
+  PeCoffGetEntryPointLib
 
 [FeaturePcd]  
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
index 237f65c..fe7a6b8 100644 (file)
@@ -82,4 +82,23 @@ PeCoffLoaderGetPdbPointer (
   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
index d91f058..347ff92 100644 (file)
@@ -268,4 +268,49 @@ PeCoffLoaderGetPdbPointer (
   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
index 648c2a0..b22bed4 100644 (file)
@@ -273,3 +273,50 @@ PeCoffLoaderGetPdbPointer (
 \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
index ef0d6c1..fb7c156 100644 (file)
@@ -253,3 +253,51 @@ PeCoffLoaderGetPdbPointer (
 \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