]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Removed cross references from PciCf8Lib and PciExpressLib class to PciLib class.
authorajfish <ajfish@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Jul 2006 15:23:35 +0000 (15:23 +0000)
committerajfish <ajfish@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Jul 2006 15:23:35 +0000 (15:23 +0000)
Added PeCoffLoaderGetMachineType to the PeCoffGetEntryPointLibrary Class. Document to be updated.

Added the PeCoffLoaderImageReadFromMemory() and PeCoffLoaderRelocateImageForRuntime () to the PcCoffLib.

Updated EfiImage.h and removed EFI_IMAGE_OPTIONAL_HEADER and EFI_IMAGE_NT_HEADERS as they were replaced with checking the MachineType.

PeCoffLib – Added checks for MachineType so the PeCoff lib can load any PE32 or PE32+ image. The relocations are still limited to IA32, X64, IPF, and EBC. I also added a re-relocator function to remove PeLoader Code from Runtime Lib. Even though there is only one instance of the re-relocator I wanted to get all the PeCoff loader code together.

Replaced DEBUG_CODE() macro with DEBUG_CODE_START() and DEBUG_CODE_END() so you can debug through the DEBUG_CODE() macros. Also removed PE/COFF code and replaced with library usage.

I also updated the IO Instrinsic lib to use _ReadWriteBarrior() to help with sync problems

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1103 6f19259b-4bc3-4df7-8a09-765794883524

47 files changed:
EdkModulePkg/Bus/Pci/AtapiPassThru/Dxe/AtapiPassThru.c
EdkModulePkg/Bus/Pci/IdeBus/Dxe/ata.c
EdkModulePkg/Bus/Pci/PciBus/Dxe/PciBus.msa
EdkModulePkg/Bus/Pci/PciBus/Dxe/PciDriverOverride.c
EdkModulePkg/Core/Dxe/DxeMain/DxeMain.c
EdkModulePkg/Core/Dxe/Image/Image.c
EdkModulePkg/Core/Pei/Dispatcher/Dispatcher.c
EdkModulePkg/Core/Pei/Hob/Hob.c
EdkModulePkg/Core/Pei/Image/Image.c
EdkModulePkg/Core/Pei/Memory/MemoryServices.c
EdkModulePkg/Core/Pei/PeiMain.msa
EdkModulePkg/Core/Pei/PeiMain/PeiMain.c
EdkModulePkg/EdkModulePkg.fpd
EdkModulePkg/Universal/Console/GraphicsConsole/Dxe/GraphicsConsole.c
EdkModulePkg/Universal/DebugSupport/Dxe/ipf/plDebugSupport.c
EdkModulePkg/Universal/Debugger/Debugport/Dxe/DebugPort.c
EdkModulePkg/Universal/Disk/Partition/Dxe/Gpt.c
EdkModulePkg/Universal/Ebc/Dxe/EbcExecute.c
EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c
EdkModulePkg/Universal/FirmwareVolume/FaultTolerantWriteLite/Dxe/Ia32/Ia32FtwMisc.c
EdkModulePkg/Universal/Runtime/RuntimeDxe/Ia32/PeHotRelocateEx.c
EdkModulePkg/Universal/Runtime/RuntimeDxe/Ipf/PeHotRelocateEx.c
EdkModulePkg/Universal/Runtime/RuntimeDxe/PeHotRelocate.c
EdkModulePkg/Universal/Runtime/RuntimeDxe/Runtime.c
EdkModulePkg/Universal/Runtime/RuntimeDxe/Runtime.h
EdkModulePkg/Universal/Runtime/RuntimeDxe/Runtime.msa
EdkModulePkg/Universal/Runtime/RuntimeDxe/x64/PeHotRelocateEx.c
EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BootOption.c
EdkNt32Pkg/Library/EdkGenericBdsLib/Performance.c
EdkNt32Pkg/Nt32.fpd
MdePkg/Include/Common/EfiImage.h
MdePkg/Include/Library/PciCf8Lib.h
MdePkg/Include/Library/PciExpressLib.h
MdePkg/Include/Library/PeCoffGetEntryPointLib.h
MdePkg/Include/Library/PeCoffLib.h
MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibGcc.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c
MdePkg/Library/BasePciCf8Lib/PciLib.c
MdePkg/Library/BasePciExpressLib/PciLib.c
MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
MdePkg/Library/BasePeCoffLib/BasePeCoff.c
MdePkg/Library/BasePeCoffLib/BasePeCoffLib.msa
MdePkg/Library/BasePeCoffLib/Ebc/PeCoffLoaderEx.c
MdePkg/Library/BasePeCoffLib/Ia32/PeCoffLoaderEx.c
MdePkg/Library/BasePeCoffLib/Ipf/PeCoffLoaderEx.c
MdePkg/Library/BasePeCoffLib/x64/PeCoffLoaderEx.c

index 1bdce40f67d0c36552ec3551a04d16f74a225202..e48cf73235f54fdf53a9ba0ffae1b6cb331c6aa0 100644 (file)
@@ -2085,94 +2085,90 @@ AtapiPassThruCheckErrorStatus (
   )\r
 {\r
   UINT8 StatusRegister;\r
   )\r
 {\r
   UINT8 StatusRegister;\r
-\r
-//#ifdef EFI_DEBUG\r
-\r
   UINT8 ErrorRegister;\r
 \r
   UINT8 ErrorRegister;\r
 \r
-//#endif\r
-\r
   StatusRegister = ReadPortB (\r
                     AtapiScsiPrivate->PciIo,\r
                     AtapiScsiPrivate->IoPort->Reg.Status\r
                     );\r
   StatusRegister = ReadPortB (\r
                     AtapiScsiPrivate->PciIo,\r
                     AtapiScsiPrivate->IoPort->Reg.Status\r
                     );\r
-  DEBUG_CODE (\r
+  \r
+  DEBUG_CODE_BEGIN ();\r
 \r
     if (StatusRegister & DWF) {\r
 \r
     if (StatusRegister & DWF) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Write Fault\n",\r
-      StatusRegister)\r
-      );\r
-  }\r
+      DEBUG (\r
+        (EFI_D_BLKIO,\r
+        "AtapiPassThruCheckErrorStatus()-- %02x : Error : Write Fault\n",\r
+        StatusRegister)\r
+        );\r
+    }\r
 \r
 \r
-  if (StatusRegister & CORR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Corrected Data\n",\r
-      StatusRegister)\r
-      );\r
-  }\r
+    if (StatusRegister & CORR) {\r
+      DEBUG (\r
+        (EFI_D_BLKIO,\r
+        "AtapiPassThruCheckErrorStatus()-- %02x : Error : Corrected Data\n",\r
+        StatusRegister)\r
+        );\r
+    }\r
 \r
 \r
-  if (StatusRegister & ERR) {\r
-    ErrorRegister = ReadPortB (AtapiScsiPrivate->PciIo, AtapiScsiPrivate->IoPort->Reg1.Error);\r
+    if (StatusRegister & ERR) {\r
+      ErrorRegister = ReadPortB (AtapiScsiPrivate->PciIo, AtapiScsiPrivate->IoPort->Reg1.Error);\r
+      \r
 \r
 \r
-    if (ErrorRegister & BBK_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Bad Block Detected\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & BBK_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "AtapiPassThruCheckErrorStatus()-- %02x : Error : Bad Block Detected\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & UNC_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & UNC_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "AtapiPassThruCheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & MC_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Media Change\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & MC_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "AtapiPassThruCheckErrorStatus()-- %02x : Error : Media Change\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & ABRT_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Abort\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & ABRT_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "AtapiPassThruCheckErrorStatus()-- %02x : Error : Abort\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & TK0NF_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & TK0NF_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "AtapiPassThruCheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & AMNF_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "AtapiPassThruCheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & AMNF_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "AtapiPassThruCheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",\r
+          ErrorRegister)\r
+          );\r
+       }\r
+    }\r
 \r
 \r
-  }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   if ((StatusRegister & (ERR | DWF | CORR)) == 0) {\r
 \r
   if ((StatusRegister & (ERR | DWF | CORR)) == 0) {\r
-\r
     return EFI_SUCCESS;\r
   }\r
 \r
     return EFI_SUCCESS;\r
   }\r
 \r
\r
   return EFI_DEVICE_ERROR;\r
   return EFI_DEVICE_ERROR;\r
-\r
-}\r
+}
\ No newline at end of file
index 9a1542d0ea649f1efac2f92d5790336fce762e26..cb184a497df5daad7bd301599b10204c3cd9fdc1 100644 (file)
@@ -640,77 +640,77 @@ CheckErrorStatus (
 \r
   StatusRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status);\r
 \r
 \r
   StatusRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg.Status);\r
 \r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
 \r
     if (StatusRegister & DWF) {\r
 \r
     if (StatusRegister & DWF) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Write Fault\n",\r
-      StatusRegister)\r
-      );\r
-  }\r
+      DEBUG (\r
+        (EFI_D_BLKIO,\r
+        "CheckErrorStatus()-- %02x : Error : Write Fault\n",\r
+        StatusRegister)\r
+        );\r
+    }\r
 \r
 \r
-  if (StatusRegister & CORR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Corrected Data\n",\r
-      StatusRegister)\r
-      );\r
-  }\r
+    if (StatusRegister & CORR) {\r
+      DEBUG (\r
+        (EFI_D_BLKIO,\r
+        "CheckErrorStatus()-- %02x : Error : Corrected Data\n",\r
+        StatusRegister)\r
+        );\r
+    }\r
 \r
 \r
-  if (StatusRegister & ERR) {\r
-    ErrorRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error);\r
+    if (StatusRegister & ERR) {\r
+      ErrorRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error);\r
 \r
 \r
-    if (ErrorRegister & BBK_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Bad Block Detected\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & BBK_ERR) {\r
+      DEBUG (\r
+        (EFI_D_BLKIO,\r
+        "CheckErrorStatus()-- %02x : Error : Bad Block Detected\n",\r
+        ErrorRegister)\r
+        );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & UNC_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & UNC_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "CheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & MC_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Media Change\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & MC_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "CheckErrorStatus()-- %02x : Error : Media Change\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & ABRT_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Abort\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & ABRT_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "CheckErrorStatus()-- %02x : Error : Abort\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & TK0NF_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & TK0NF_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "CheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
 \r
 \r
-  if (ErrorRegister & AMNF_ERR) {\r
-    DEBUG (\r
-      (EFI_D_BLKIO,\r
-      "CheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",\r
-      ErrorRegister)\r
-      );\r
-  }\r
+      if (ErrorRegister & AMNF_ERR) {\r
+        DEBUG (\r
+          (EFI_D_BLKIO,\r
+          "CheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",\r
+          ErrorRegister)\r
+          );\r
+      }\r
+    }\r
 \r
 \r
-  }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   if ((StatusRegister & (ERR | DWF | CORR)) == 0) {\r
     return EFI_SUCCESS;\r
 \r
   if ((StatusRegister & (ERR | DWF | CORR)) == 0) {\r
     return EFI_SUCCESS;\r
index 182baa7c6b055462ea1ece006db08ec66cd98f74..c6194d6aa86d62adc5ae62557cdf38e6db148f2f 100644 (file)
@@ -1,23 +1,13 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--Copyright (c) 2006, Intel Corporation
-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.-->\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
   <MsaHeader>\r
     <ModuleName>PciBus</ModuleName>\r
     <ModuleType>DXE_DRIVER</ModuleType>\r
     <GuidValue>93B80004-9FB3-11d4-9A3A-0090273FC14D</GuidValue>\r
     <Version>1.0</Version>\r
     <Abstract>Component description file for PciBus module.</Abstract>\r
   <MsaHeader>\r
     <ModuleName>PciBus</ModuleName>\r
     <ModuleType>DXE_DRIVER</ModuleType>\r
     <GuidValue>93B80004-9FB3-11d4-9A3A-0090273FC14D</GuidValue>\r
     <Version>1.0</Version>\r
     <Abstract>Component description file for PciBus module.</Abstract>\r
-    <Description>\r
-       PCI bus driver. This module will probe all PCI devices and allocate MMIO and IO\r
-       space for these devices.\r
-    </Description>\r
+    <Description>PCI bus driver. This module will probe all PCI devices and allocate MMIO and IO
+       space for these devices.</Description>\r
     <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>\r
     <License>All rights reserved. This program and the accompanying materials
       are licensed and made available under the terms and conditions of the BSD License
     <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>\r
     <License>All rights reserved. This program and the accompanying materials
       are licensed and made available under the terms and conditions of the BSD License
@@ -63,6 +53,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>DevicePathLib</Keyword>\r
     </LibraryClass>\r
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>DevicePathLib</Keyword>\r
     </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>PeCoffGetEntryPointLib</Keyword>\r
+    </LibraryClass>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>PciBus.h</Filename>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>PciBus.h</Filename>\r
index 76c5a207841a00524be6d882f3e4e0cb0a6b9c82..cd2d58530356f3895367977708f78c79c0b9c58b 100644 (file)
@@ -139,8 +139,6 @@ Returns:
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS                    Status;\r
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS                    Status;\r
-  EFI_IMAGE_DOS_HEADER          *DosHdr;\r
-  EFI_IMAGE_NT_HEADERS          *PeHdr;\r
   EFI_LOADED_IMAGE_PROTOCOL     *LoadedImage;\r
   PCI_DRIVER_OVERRIDE_LIST      *Node;\r
   EFI_DRIVER_OS_HANDOFF_HEADER  *DriverOsHandoffHeader;\r
   EFI_LOADED_IMAGE_PROTOCOL     *LoadedImage;\r
   PCI_DRIVER_OVERRIDE_LIST      *Node;\r
   EFI_DRIVER_OS_HANDOFF_HEADER  *DriverOsHandoffHeader;\r
@@ -169,14 +167,7 @@ Returns:
 \r
   PciIoDevice->BusOverride  = TRUE;\r
 \r
 \r
   PciIoDevice->BusOverride  = TRUE;\r
 \r
-  DosHdr                    = (EFI_IMAGE_DOS_HEADER *) LoadedImage->ImageBase;\r
-  if (DosHdr->e_magic != EFI_IMAGE_DOS_SIGNATURE) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  PeHdr = (EFI_IMAGE_NT_HEADERS *) ((UINTN) LoadedImage->ImageBase + DosHdr->e_lfanew);\r
-\r
-  if (PeHdr->FileHeader.Machine != EFI_IMAGE_MACHINE_EBC) {\r
+  if (PeCoffLoaderGetMachineType ((VOID *)(UINTN)LoadedImage->ImageBase) != EFI_IMAGE_MACHINE_EBC) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
     return EFI_SUCCESS;\r
   }\r
 \r
index 24568ea334456141f08d306c05ce489712aa1139..9f5f2f1510c8a7a7d00757fa25026e912e50c068 100644 (file)
@@ -557,9 +557,9 @@ Returns:
   //\r
   // Display Architectural protocols that were not loaded if this is DEBUG build\r
   //\r
   //\r
   // Display Architectural protocols that were not loaded if this is DEBUG build\r
   //\r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     CoreDisplayMissingArchProtocols ();\r
     CoreDisplayMissingArchProtocols ();\r
-  );\r
+  DEBUG_CODE_END ();\r
   \r
   //\r
   // Assert if the Architectural Protocols are not present.\r
   \r
   //\r
   // Assert if the Architectural Protocols are not present.\r
@@ -574,9 +574,9 @@ Returns:
   // Display any drivers that were not dispatched because dependency expression\r
   // evaluated to false if this is a debug build\r
   //\r
   // Display any drivers that were not dispatched because dependency expression\r
   // evaluated to false if this is a debug build\r
   //\r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     CoreDisplayDiscoveredNotDispatched ();\r
     CoreDisplayDiscoveredNotDispatched ();\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   //\r
   // Transfer control to the BDS Architectural Protocol\r
 \r
   //\r
   // Transfer control to the BDS Architectural Protocol\r
index c818cc213135fdee2618082f086d5915232d4c6c..d77f4c4fca23c5af4ab7b14cd66fd07bddac1c0c 100644 (file)
@@ -268,6 +268,15 @@ Returns:
     return Status;\r
   }\r
 \r
     return Status;\r
   }\r
 \r
+  if (!EFI_IMAGE_MACHINE_TYPE_SUPPORTED (Image->ImageContext.Machine)) {\r
+    //\r
+    // The PE/COFF loader can support loading image types that can be executed. \r
+    // If we loaded an image type that we can not execute return EFI_UNSUPORTED. \r
+    //\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+\r
   //\r
   // Allocate memory of the correct memory type aligned on the required image boundry\r
   //\r
   //\r
   // Allocate memory of the correct memory type aligned on the required image boundry\r
   //\r
@@ -440,8 +449,8 @@ Returns:
   // Print the load address and the PDB file name if it is available\r
   //\r
 \r
   // Print the load address and the PDB file name if it is available\r
   //\r
 \r
-  DEBUG_CODE (\r
-  {\r
+  DEBUG_CODE_BEGIN ();\r
\r
     UINTN Index;\r
     UINTN StartIndex;\r
     CHAR8 EfiFileName[256];\r
     UINTN Index;\r
     UINTN StartIndex;\r
     CHAR8 EfiFileName[256];\r
@@ -473,8 +482,8 @@ Returns:
       DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a", EfiFileName)); // &Image->ImageContext.PdbPointer[StartIndex]));\r
     }\r
     DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
       DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a", EfiFileName)); // &Image->ImageContext.PdbPointer[StartIndex]));\r
     }\r
     DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
-  }\r
-  );\r
+  \r
+  DEBUG_CODE_END ();\r
 \r
   return EFI_SUCCESS;\r
 \r
 \r
   return EFI_SUCCESS;\r
 \r
@@ -924,22 +933,13 @@ Returns:
   //\r
   PERF_START (ImageHandle, START_IMAGE_TOK, NULL, 0);\r
 \r
   //\r
   PERF_START (ImageHandle, START_IMAGE_TOK, NULL, 0);\r
 \r
-  if (sizeof (UINTN) == 4 && Image->Machine == EFI_IMAGE_MACHINE_X64) {\r
-    return EFI_UNSUPPORTED;\r
-  } else if (sizeof (UINTN) == 8 && Image->Machine == EFI_IMAGE_MACHINE_IA32) {\r
-    return EFI_UNSUPPORTED;\r
-  } else {\r
-    //\r
-    // For orther possible cases\r
-    //\r
-  }\r
 \r
   //\r
   // Push the current start image context, and\r
   // link the current image to the head.   This is the\r
   // only image that can call Exit()\r
   //\r
 \r
   //\r
   // Push the current start image context, and\r
   // link the current image to the head.   This is the\r
   // only image that can call Exit()\r
   //\r
-  HandleDatabaseKey = CoreGetHandleDatabaseKey();\r
+  HandleDatabaseKey = CoreGetHandleDatabaseKey ();\r
   LastImage         = mCurrentImage;\r
   mCurrentImage     = Image;\r
   Image->Tpl        = gEfiCurrentTpl;\r
   LastImage         = mCurrentImage;\r
   mCurrentImage     = Image;\r
   Image->Tpl        = gEfiCurrentTpl;\r
@@ -970,11 +970,11 @@ Returns:
     // This make the user aware and check if the driver image have already released\r
     // all the resource in this situation.\r
     //\r
     // This make the user aware and check if the driver image have already released\r
     // all the resource in this situation.\r
     //\r
-    DEBUG_CODE (\r
+    DEBUG_CODE_BEGIN ();\r
       if (EFI_ERROR (Image->Status)) {\r
         DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));\r
       }\r
       if (EFI_ERROR (Image->Status)) {\r
         DEBUG ((EFI_D_ERROR, "Error: Image at %08X start failed: %x\n", Image->Info.ImageBase, Image->Status));\r
       }\r
-    );\r
+    DEBUG_CODE_END ();\r
 \r
     //\r
     // If the image returns, exit it through Exit()\r
 \r
     //\r
     // If the image returns, exit it through Exit()\r
@@ -1003,7 +1003,7 @@ Returns:
   //\r
   // Handle the image's returned ExitData\r
   //\r
   //\r
   // Handle the image's returned ExitData\r
   //\r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     if (Image->ExitDataSize != 0 || Image->ExitData != NULL) {\r
 \r
       DEBUG (\r
     if (Image->ExitDataSize != 0 || Image->ExitData != NULL) {\r
 \r
       DEBUG (\r
@@ -1017,7 +1017,7 @@ Returns:
       }\r
       DEBUG ((EFI_D_LOAD, "\n"));\r
     }\r
       }\r
       DEBUG ((EFI_D_LOAD, "\n"));\r
     }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   //\r
   //  Return the exit data to the caller\r
 \r
   //\r
   //  Return the exit data to the caller\r
index 1eb5a4a0204486ce76c6def7dae81ecbed425855..6d32368fb72d6da753f5906c0b97326101a2b93f 100644 (file)
@@ -105,7 +105,7 @@ Returns:
       //\r
       if (Status == EFI_SUCCESS) {\r
 \r
       //\r
       if (Status == EFI_SUCCESS) {\r
 \r
-        DEBUG_CODE (\r
+        DEBUG_CODE_BEGIN ();\r
 \r
           //\r
           // Fill list of found Peims for later list of those not installed\r
 \r
           //\r
           // Fill list of found Peims for later list of those not installed\r
@@ -116,7 +116,7 @@ Returns:
             sizeof (EFI_GUID)\r
             );\r
 \r
             sizeof (EFI_GUID)\r
             );\r
 \r
-        );\r
+        DEBUG_CODE_END ();\r
 \r
         if (!Dispatched (\r
                DispatchData->CurrentPeim,\r
 \r
         if (!Dispatched (\r
                DispatchData->CurrentPeim,\r
@@ -320,7 +320,7 @@ Returns:
     DispatchData->CurrentFvAddress = DefaultFvAddress;\r
   }\r
 \r
     DispatchData->CurrentFvAddress = DefaultFvAddress;\r
   }\r
 \r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     //\r
     // Debug data for uninstalled Peim list\r
     //\r
     //\r
     // Debug data for uninstalled Peim list\r
     //\r
@@ -345,10 +345,10 @@ Returns:
       DebugFoundPeimPoint++;\r
       DebugNotDispatchedBitmap >>= 1;\r
     }\r
       DebugFoundPeimPoint++;\r
       DebugNotDispatchedBitmap >>= 1;\r
     }\r
+  \r
+  DEBUG_CODE_END ();\r
 \r
 \r
-  );\r
-\r
-   return EFI_NOT_FOUND;\r
+  return EFI_NOT_FOUND;\r
 }\r
 \r
 VOID\r
 }\r
 \r
 VOID\r
index 1eadf9458c20af4a74c276671d90b2456f7a2f77..259d44b457cd5a7c1a31955e6fea953c77433ef7 100644 (file)
@@ -53,11 +53,11 @@ Returns:
   // Only check this parameter in debug mode\r
   //\r
   \r
   // Only check this parameter in debug mode\r
   //\r
   \r
-  DEBUG_CODE (  \r
+  DEBUG_CODE_BEGIN ();  \r
     if (HobList == NULL) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
     if (HobList == NULL) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-  );\r
+  DEBUG_CODE_END ();\r
   \r
   PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
 \r
   \r
   PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS(PeiServices);\r
 \r
index 5edc8479eb04ca4aadd31c43ca684952f07a8a88..9df12f8ab3ef3f0da77fcffc658249293522718e 100644 (file)
@@ -21,6 +21,8 @@ Abstract:
 \r
 #include <PeiMain.h>\r
 \r
 \r
 #include <PeiMain.h>\r
 \r
+\r
+\r
 EFI_STATUS\r
 PeiLoadImage (\r
   IN EFI_PEI_SERVICES         **PeiServices,\r
 EFI_STATUS\r
 PeiLoadImage (\r
   IN EFI_PEI_SERVICES         **PeiServices,\r
@@ -130,106 +132,35 @@ Returns:
   // Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi\r
   //\r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%08x EntryPoint=0x%08x ", Pe32Data, *EntryPoint));\r
   // Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi\r
   //\r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%08x EntryPoint=0x%08x ", Pe32Data, *EntryPoint));\r
-  DEBUG_CODE (\r
-    EFI_IMAGE_DATA_DIRECTORY * DirectoryEntry;\r
-    EFI_IMAGE_DEBUG_DIRECTORY_ENTRY * DebugEntry;\r
-    UINTN DirCount;\r
-    UINTN Index;\r
-    UINTN Index1;\r
-    BOOLEAN FileNameFound;\r
-    CHAR8 *AsciiString;\r
-    CHAR8 AsciiBuffer[512];\r
-    VOID *CodeViewEntryPointer;\r
-    INTN TEImageAdjust;\r
-    EFI_IMAGE_DOS_HEADER  *DosHeader;\r
-    EFI_IMAGE_NT_HEADERS  *PeHeader;\r
+  DEBUG_CODE_BEGIN ();\r
+    PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
+    UINTN                                 Index;\r
+    CHAR8                                 *PdbStr;\r
+    CHAR8                                 AsciiBuffer[512];\r
 \r
 \r
-    //\r
-    // Pe32Data is NULL when load TE image \r
-    //    \r
-    PeHeader = NULL;\r
-    if (TEImageHeader == NULL) {\r
-      DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
-      if (DosHeader->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
-        PeHeader = (EFI_IMAGE_NT_HEADERS *) ((UINTN) Pe32Data + (UINTN) ((DosHeader->e_lfanew) & 0x0ffff));\r
-      } else {\r
-        //\r
-        // DOS image header is not present, so PE header is at the image base\r
-        //\r
-        PeHeader = (EFI_IMAGE_NT_HEADERS *) Pe32Data;\r
-      }\r
-    }\r
 \r
 \r
-    //\r
-    // Find the codeview info in the image and display the file name\r
-    // being loaded.\r
-    //\r
-    // Per the PE/COFF spec, you can't assume that a given data directory\r
-    // is present in the image. You have to check the NumberOfRvaAndSizes in\r
-    // the optional header to verify a desired directory entry is there.\r
-    //\r
-    DebugEntry      = NULL;\r
-    DirectoryEntry  = NULL;\r
-    TEImageAdjust   = 0;\r
-    if (TEImageHeader == NULL) {\r
-      if (PeHeader->OptionalHeader.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
-        DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *) &(PeHeader->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
-        DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) ImageAddress + DirectoryEntry->VirtualAddress);\r
-      }\r
-    } else {\r
-      if (TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {\r
-        DirectoryEntry  = &TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG];\r
-        TEImageAdjust   = sizeof (EFI_TE_IMAGE_HEADER) - TEImageHeader->StrippedSize;\r
-        DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN) TEImageHeader +\r
-                      TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +\r
-                      TEImageAdjust);\r
-      }\r
-    }\r
+    ZeroMem (&ImageContext, sizeof (ImageContext));\r
+    ImageContext.Handle    = Pe32Data;\r
+    ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;\r
 \r
 \r
-    if (DebugEntry != NULL && DirectoryEntry != NULL) {\r
-      for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount++, DebugEntry++) {\r
-        if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
-          if (DebugEntry->SizeOfData > 0) {\r
-            CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + (UINTN) ImageAddress + (UINTN)TEImageAdjust);\r
-            switch (* (UINT32 *) CodeViewEntryPointer) {\r
-              case CODEVIEW_SIGNATURE_NB10:\r
-                AsciiString = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
-                break;\r
-\r
-              case CODEVIEW_SIGNATURE_RSDS:\r
-                AsciiString = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
-                break;\r
-\r
-              default:\r
-                AsciiString = NULL;\r
-                break;\r
-            }\r
-            if (AsciiString != NULL) {\r
-              FileNameFound = FALSE;\r
-              for (Index = 0, Index1 = 0; AsciiString[Index] != 0; Index++) {\r
-                if (AsciiString[Index] == '\\') {\r
-                  Index1 = Index;\r
-                  FileNameFound = TRUE;\r
-                }\r
-              }\r
-\r
-              if (FileNameFound) {\r
-                for (Index = Index1 + 1; AsciiString[Index] != '.'; Index++) {\r
-                  AsciiBuffer[Index - (Index1 + 1)] = AsciiString[Index];\r
-                }\r
-                AsciiBuffer[Index - (Index1 + 1)] = 0;\r
-                DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a.efi", AsciiBuffer));\r
-                break;\r
-              }\r
-            }\r
-          }\r
+    PeCoffLoaderGetImageInfo (&ImageContext);\r
+    \r
+    if (ImageContext.PdbPointer != NULL) {\r
+      //\r
+      // Copy PDB pointer to AsciiBuffer and replace .PDB with .EFI\r
+      //\r
+      PdbStr = ImageContext.PdbPointer;\r
+      for (Index = 0; PdbStr != 0; Index++, PdbStr++) {\r
+        AsciiBuffer[Index] = *PdbStr;\r
+        if (*PdbStr == '.') {\r
+          AsciiBuffer[Index] = '\0';  \r
         }\r
       }\r
         }\r
       }\r
+      \r
+      DEBUG ((EFI_D_INFO | EFI_D_LOAD, "%a.efi", AsciiBuffer));\r
     }\r
     }\r
-  );\r
+\r
+  DEBUG_CODE_END ();\r
 \r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
 \r
 \r
   DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
 \r
index 3da3e53185c660dc701218d75f809ef90288d35b..d49b7427b4817cd50c0ffbabd0588f10985f4189 100644 (file)
@@ -65,10 +65,10 @@ Returns:
     SizeOfCarHeap = (UINT64) PeiStartupDescriptor->SizeOfCacheAsRam;\r
     SizeOfCarHeap = RShiftU64 (SizeOfCarHeap, 1);\r
  \r
     SizeOfCarHeap = (UINT64) PeiStartupDescriptor->SizeOfCacheAsRam;\r
     SizeOfCarHeap = RShiftU64 (SizeOfCarHeap, 1);\r
  \r
-    DEBUG_CODE (\r
-        PrivateData->SizeOfCacheAsRam = PeiStartupDescriptor->SizeOfCacheAsRam;\r
-        PrivateData->MaxTopOfCarHeap  = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) SizeOfCarHeap);\r
-    );\r
+    DEBUG_CODE_BEGIN ();\r
+      PrivateData->SizeOfCacheAsRam = PeiStartupDescriptor->SizeOfCacheAsRam;\r
+      PrivateData->MaxTopOfCarHeap  = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) SizeOfCarHeap);\r
+    DEBUG_CODE_END ();\r
 \r
     PrivateData->HobList.Raw = PrivateData->BottomOfCarHeap;\r
     \r
 \r
     PrivateData->HobList.Raw = PrivateData->BottomOfCarHeap;\r
     \r
index 18ec53d665ca3612e8ed2d2998ca5cb9700cefc2..549820ef8775efe97bb9ac7e563dc6dca7736bb5 100644 (file)
@@ -1,13 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--Copyright (c) 2006, Intel Corporation
-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.-->\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
   <MsaHeader>\r
     <ModuleName>PeiMain</ModuleName>\r
     <ModuleType>PEI_CORE</ModuleType>\r
   <MsaHeader>\r
     <ModuleName>PeiMain</ModuleName>\r
     <ModuleType>PEI_CORE</ModuleType>\r
@@ -60,6 +52,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>TimerLib</Keyword>\r
     </LibraryClass>\r
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>TimerLib</Keyword>\r
     </LibraryClass>\r
+    <LibraryClass Usage="SOMETIMES_CONSUMED">\r
+      <Keyword>PeCoffLib</Keyword>\r
+    </LibraryClass>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>PeiMain.h</Filename>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>PeiMain.h</Filename>\r
index b6d57f96d5592498b122ffda76e4abb8b760d1e9..c94331c010f6474da094c7e1b3329d0a23ab8619 100644 (file)
@@ -150,10 +150,10 @@ Returns:
     //\r
     // The following code dumps out interesting cache as RAM usage information\r
     // so we can keep tabs on how the cache as RAM is being utilized.  The\r
     //\r
     // The following code dumps out interesting cache as RAM usage information\r
     // so we can keep tabs on how the cache as RAM is being utilized.  The\r
-    // DEBUG_CODE macro is used to prevent this code from being compiled\r
+    // DEBUG_CODE_BEGIN macro is used to prevent this code from being compiled\r
     // on a debug build.\r
     //\r
     // on a debug build.\r
     //\r
-    DEBUG_CODE (\r
+    DEBUG_CODE_BEGIN ();\r
       UINTN  *StackPointer;\r
       UINTN  StackValue;\r
 \r
       UINTN  *StackPointer;\r
       UINTN  StackValue;\r
 \r
@@ -173,7 +173,7 @@ Returns:
         ((UINTN) OldCoreData->HobList.HandoffInformationTable->EfiFreeMemoryBottom -\r
         (UINTN) OldCoreData->HobList.Raw)\r
         ));\r
         ((UINTN) OldCoreData->HobList.HandoffInformationTable->EfiFreeMemoryBottom -\r
         (UINTN) OldCoreData->HobList.Raw)\r
         ));\r
-    );\r
+    DEBUG_CODE_END ();\r
 \r
     //\r
     // Alert any listeners that there is permanent memory available\r
 \r
     //\r
     // Alert any listeners that there is permanent memory available\r
index 3e826c8775f0ab41111ba9569e5ba6e5c74d4c12..b1738f4fd8da38dbdca9bc205de2f56d19ef2620 100644 (file)
@@ -1032,6 +1032,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -1293,6 +1294,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="b1ee6c28-54aa-4d17-b705-3e28ccb27b2e" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
         <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="b1ee6c28-54aa-4d17-b705-3e28ccb27b2e" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
         <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
@@ -3139,7 +3141,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
-      </Libraries>
+        <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+     </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
           <C_Name>PcdMaximumUnicodeStringLength</C_Name>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
           <C_Name>PcdMaximumUnicodeStringLength</C_Name>
@@ -5422,6 +5425,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -5684,6 +5688,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -7448,6 +7453,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -9357,6 +9363,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -9620,6 +9627,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="61999c3c-72a5-4506-a4ff-4271d18a1d14" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="61999c3c-72a5-4506-a4ff-4271d18a1d14" PackageGuid="B6EC423C-21D2-490D-85C6-DD5864EAA674"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -11387,6 +11395,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -13296,6 +13305,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -14905,6 +14915,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
index a475723dfd70dd3364ddea4e22cced4b600a33f1..d70c979b72964b569b2b2dd88c24ae25f8335cd6 100644 (file)
@@ -423,9 +423,9 @@ GraphicsConsoleControllerDriverStart (
     goto Error;\r
   }\r
 \r
     goto Error;\r
   }\r
 \r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     GraphicsConsoleConOutOutputString (&Private->SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r");\r
     GraphicsConsoleConOutOutputString (&Private->SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r");\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   //\r
   // Install protocol interfaces for the Graphics Console device.\r
 \r
   //\r
   // Install protocol interfaces for the Graphics Console device.\r
index 6f2ded213ea7855da82e5928f54abbd40e16ce77..b79390a95f858421580c011cc1b8507568b166ad 100644 (file)
@@ -191,7 +191,7 @@ Returns:
 {\r
   static BOOLEAN  InHandler = FALSE;\r
 \r
 {\r
   static BOOLEAN  InHandler = FALSE;\r
 \r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     if (InHandler) {\r
       EfiDebugPrint (EFI_D_GENERIC, "ERROR: Re-entered debugger!\n"\r
                                     "       ExceptionType == %X\n"\r
     if (InHandler) {\r
       EfiDebugPrint (EFI_D_GENERIC, "ERROR: Re-entered debugger!\n"\r
                                     "       ExceptionType == %X\n"\r
@@ -205,7 +205,8 @@ Returns:
                                     Context.SystemContextIpf->CrIpsr,\r
                                     InHandler);\r
     }\r
                                     Context.SystemContextIpf->CrIpsr,\r
                                     InHandler);\r
     }\r
-  )\r
+  DEBUG_CODE_END ();\r
+\r
   ASSERT (!InHandler);\r
   InHandler = TRUE;\r
   if (IvtEntryTable[ExceptionType].RegisteredCallback != NULL) {\r
   ASSERT (!InHandler);\r
   InHandler = TRUE;\r
   if (IvtEntryTable[ExceptionType].RegisteredCallback != NULL) {\r
index a24bfd06d575a035a689cd6092c9cb5dcf1c6880..2152f75cf43e2aca63525b50811b5142b3e13d81 100644 (file)
@@ -368,7 +368,7 @@ Returns:
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
                   );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    DEBUG_CODE (\r
+    DEBUG_CODE_BEGIN ();\r
       UINTN  BufferSize;\r
 \r
       BufferSize = 48;\r
       UINTN  BufferSize;\r
 \r
       BufferSize = 48;\r
@@ -378,7 +378,7 @@ Returns:
         &BufferSize,\r
         "DebugPort driver failed to open child controller\n\n"\r
         );\r
         &BufferSize,\r
         "DebugPort driver failed to open child controller\n\n"\r
         );\r
-    );\r
+    DEBUG_CODE_END ();\r
 \r
     gBS->CloseProtocol (\r
           ControllerHandle,\r
 \r
     gBS->CloseProtocol (\r
           ControllerHandle,\r
@@ -389,7 +389,7 @@ Returns:
     return Status;\r
   }\r
 \r
     return Status;\r
   }\r
 \r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     UINTN  BufferSize;\r
 \r
     BufferSize = 38;\r
     UINTN  BufferSize;\r
 \r
     BufferSize = 38;\r
@@ -399,7 +399,7 @@ Returns:
       &BufferSize,\r
       "Hello World from the DebugPort driver\n\n"\r
       );\r
       &BufferSize,\r
       "Hello World from the DebugPort driver\n\n"\r
       );\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
index 35ff1a86060eca8330fa8ffc49770586d41bdf8c..9077ac63c2e067a99bf83996bb9bfe46d10d92ec 100644 (file)
@@ -758,11 +758,11 @@ Returns:
   //\r
   // return status\r
   //\r
   //\r
   // return status\r
   //\r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     if (OrgCrc != Crc) {\r
       DEBUG ((EFI_D_ERROR, "CheckCrc32: Crc check failed\n"));\r
     }\r
     if (OrgCrc != Crc) {\r
       DEBUG ((EFI_D_ERROR, "CheckCrc32: Crc check failed\n"));\r
     }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   return (BOOLEAN) (OrgCrc == Crc);\r
 }\r
 \r
   return (BOOLEAN) (OrgCrc == Crc);\r
 }\r
index 9d375a54615873027c0d54f675f12702fa684c75..a672a794e04a010c9f4a03fb93e00e2b27a020a6 100644 (file)
@@ -685,9 +685,6 @@ Returns:
   EFI_STATUS                        Status;\r
   EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL  *EbcSimpleDebugger;\r
 \r
   EFI_STATUS                        Status;\r
   EFI_EBC_SIMPLE_DEBUGGER_PROTOCOL  *EbcSimpleDebugger;\r
 \r
-  //\r
-  // end DEBUG_CODE\r
-  //\r
   EbcSimpleDebugger = NULL;\r
   Status            = EFI_SUCCESS;\r
   StackCorrupted    = 0;\r
   EbcSimpleDebugger = NULL;\r
   Status            = EFI_SUCCESS;\r
   StackCorrupted    = 0;\r
@@ -704,7 +701,7 @@ Returns:
   //\r
   // Try to get the debug support for EBC\r
   //\r
   //\r
   // Try to get the debug support for EBC\r
   //\r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     Status = gBS->LocateProtocol (\r
                     &mEbcSimpleDebuggerProtocolGuid,\r
                     NULL,\r
     Status = gBS->LocateProtocol (\r
                     &mEbcSimpleDebuggerProtocolGuid,\r
                     NULL,\r
@@ -713,7 +710,7 @@ Returns:
     if (EFI_ERROR (Status)) {\r
       EbcSimpleDebugger = NULL;\r
     }\r
     if (EFI_ERROR (Status)) {\r
       EbcSimpleDebugger = NULL;\r
     }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   //\r
   // Save the start IP for debug. For example, if we take an exception we\r
 \r
   //\r
   // Save the start IP for debug. For example, if we take an exception we\r
@@ -731,11 +728,11 @@ Returns:
     //\r
     // If we've found a simple debugger protocol, call it\r
     //\r
     //\r
     // If we've found a simple debugger protocol, call it\r
     //\r
-    DEBUG_CODE (\r
+    DEBUG_CODE_BEGIN ();\r
       if (EbcSimpleDebugger != NULL) {\r
         EbcSimpleDebugger->Debugger (EbcSimpleDebugger, VmPtr);\r
       }\r
       if (EbcSimpleDebugger != NULL) {\r
         EbcSimpleDebugger->Debugger (EbcSimpleDebugger, VmPtr);\r
       }\r
-    );\r
+    DEBUG_CODE_END ();\r
 \r
     //\r
     // Verify the opcode is in range. Otherwise generate an exception.\r
 \r
     //\r
     // Verify the opcode is in range. Otherwise generate an exception.\r
index 220c8fefaca43fb9230978cbf4ad8efb2480571d..7b15a1a84b4679e347da795c874106dc551f82c4 100644 (file)
@@ -298,9 +298,9 @@ Returns:
   //\r
   // Produce a VM test interface protocol. Not required for execution.\r
   //\r
   //\r
   // Produce a VM test interface protocol. Not required for execution.\r
   //\r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     InitEbcVmTestProtocol (&ImageHandle);\r
     InitEbcVmTestProtocol (&ImageHandle);\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
@@ -908,10 +908,10 @@ Returns:
   }\r
   EbcVmTestProtocol->Execute      = (EBC_VM_TEST_EXECUTE) EbcExecuteInstructions;\r
 \r
   }\r
   EbcVmTestProtocol->Execute      = (EBC_VM_TEST_EXECUTE) EbcExecuteInstructions;\r
 \r
-  DEBUG_CODE(\r
+  DEBUG_CODE_BEGIN ();\r
     EbcVmTestProtocol->Assemble     = (EBC_VM_TEST_ASM) EbcVmTestUnsupported;\r
     EbcVmTestProtocol->Disassemble  = (EBC_VM_TEST_DASM) EbcVmTestUnsupported;\r
     EbcVmTestProtocol->Assemble     = (EBC_VM_TEST_ASM) EbcVmTestUnsupported;\r
     EbcVmTestProtocol->Disassemble  = (EBC_VM_TEST_DASM) EbcVmTestUnsupported;\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   //\r
   // Publish the protocol\r
 \r
   //\r
   // Publish the protocol\r
index 80258f4cc3e29a1c15ec674c98e57ad31ac0122c..85fa60e3488ba81cedcf6d0a28264618bb40eba9 100644 (file)
@@ -173,21 +173,23 @@ Note:
   Status = PciRootBridgeIo->Pci.Write (\r
                                   PciRootBridgeIo,\r
                                   EfiPciWidthUint32,\r
   Status = PciRootBridgeIo->Pci.Write (\r
                                   PciRootBridgeIo,\r
                                   EfiPciWidthUint32,\r
-                                  EFI_PCI_ADDRESS (LPC_BUS_NUMBER,\r
-    LPC_DEVICE_NUMBER,\r
-    LPC_IF,\r
-    GEN_STATUS),\r
+                                  EFI_PCI_ADDRESS (\r
+                                    LPC_BUS_NUMBER,\r
+                                    LPC_DEVICE_NUMBER,\r
+                                    LPC_IF,\r
+                                    GEN_STATUS\r
+                                    ),\r
                                   1,\r
                                   &GenStatus\r
                                   );\r
 \r
                                   1,\r
                                   &GenStatus\r
                                   );\r
 \r
-  DEBUG_CODE (\r
+  DEBUG_CODE_BEGIN ();\r
     if (TopSwap) {\r
       DEBUG ((EFI_D_ERROR, "SAR: Set top swap\n"));\r
     } else {\r
       DEBUG ((EFI_D_ERROR, "SAR: Clear top swap\n"));\r
     }\r
     if (TopSwap) {\r
       DEBUG ((EFI_D_ERROR, "SAR: Set top swap\n"));\r
     } else {\r
       DEBUG ((EFI_D_ERROR, "SAR: Clear top swap\n"));\r
     }\r
-  );\r
+  DEBUG_CODE_END ();\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
index 82d464aebe662e985c10697dc7b50fae750c0761..7678c4d365db58ba3e61b5edc6916a37e9c9df16 100644 (file)
@@ -24,38 +24,6 @@ Revision History
 \r
 #include "Runtime.h"\r
 \r
 \r
 #include "Runtime.h"\r
 \r
-EFI_STATUS\r
-PeHotRelocateImageEx (\r
-  IN UINT16      *Reloc,\r
-  IN OUT CHAR8   *Fixup,\r
-  IN OUT CHAR8   **FixupData,\r
-  IN UINT64      Adjust\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Performs an Itanium-based platform specific relocation fixup\r
-\r
-Arguments:\r
-\r
-  Reloc      - Pointer to the relocation record\r
-\r
-  Fixup      - Pointer to the address to fix up\r
-\r
-  FixupData  - Pointer to a buffer to log the fixups\r
-\r
-  Adjust     - The offset to adjust the fixup\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
-{\r
-  return EFI_SUCCESS;\r
-\r
-}\r
 \r
 //\r
 // Cache Flush Routine.\r
 \r
 //\r
 // Cache Flush Routine.\r
index ffc0aaf4a48562047be6e101d13a47b65d705bf1..97bdae0aa096315b9a7869bfe2a67532b4f4fa50 100644 (file)
@@ -23,192 +23,6 @@ Revision History
 --*/\r
 \r
 #include "Runtime.h"\r
 --*/\r
 \r
 #include "Runtime.h"\r
-#include "PeHotRelocateEx.h"\r
-\r
-EFI_STATUS\r
-PeHotRelocateImageEx (\r
-  IN UINT16      *Reloc,\r
-  IN OUT CHAR8   *Fixup,\r
-  IN OUT CHAR8   **FixupData,\r
-  IN UINT64      Adjust\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Performs an IPF specific relocation fixup\r
-\r
-Arguments:\r
-\r
-  Reloc      - Pointer to the relocation record\r
-\r
-  Fixup      - Pointer to the address to fix up\r
-\r
-  FixupData  - Pointer to a buffer to log the fixups\r
-\r
-  Adjust     - The offset to adjust the fixup\r
-\r
-Returns:\r
-\r
-  None\r
-\r
---*/\r
-{\r
-  UINT64  *F64;\r
-  UINT64  FixupVal;\r
-\r
-  switch ((*Reloc) >> 12) {\r
-  case EFI_IMAGE_REL_BASED_DIR64:\r
-    F64         = (UINT64 *) Fixup;\r
-    *FixupData  = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
-    if (*(UINT64 *) (*FixupData) == *F64) {\r
-      *F64 = *F64 + (UINT64) Adjust;\r
-    }\r
-\r
-    *FixupData = *FixupData + sizeof (UINT64);\r
-    break;\r
-\r
-  case EFI_IMAGE_REL_BASED_IA64_IMM64:\r
-    F64         = (UINT64 *) Fixup;\r
-    *FixupData  = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
-    if (*(UINT64 *) (*FixupData) == *F64) {\r
-      //\r
-      // Align it to bundle address before fixing up the\r
-      // 64-bit immediate value of the movl instruction.\r
-      //\r
-      //\r
-      Fixup     = (CHAR8 *) ((UINT64) Fixup & (UINT64)~(15));\r
-      FixupVal  = (UINT64) 0;\r
-\r
-      //\r
-      // Extract the lower 32 bits of IMM64 from bundle\r
-      //\r
-      EXT_IMM64 (\r
-        FixupVal,\r
-        (UINT32 *) Fixup + IMM64_IMM7B_INST_WORD_X,\r
-        IMM64_IMM7B_SIZE_X,\r
-        IMM64_IMM7B_INST_WORD_POS_X,\r
-        IMM64_IMM7B_VAL_POS_X\r
-        );\r
-\r
-      EXT_IMM64 (\r
-        FixupVal,\r
-        (UINT32 *) Fixup + IMM64_IMM9D_INST_WORD_X,\r
-        IMM64_IMM9D_SIZE_X,\r
-        IMM64_IMM9D_INST_WORD_POS_X,\r
-        IMM64_IMM9D_VAL_POS_X\r
-        );\r
-\r
-      EXT_IMM64 (\r
-        FixupVal,\r
-        (UINT32 *) Fixup + IMM64_IMM5C_INST_WORD_X,\r
-        IMM64_IMM5C_SIZE_X,\r
-        IMM64_IMM5C_INST_WORD_POS_X,\r
-        IMM64_IMM5C_VAL_POS_X\r
-        );\r
-\r
-      EXT_IMM64 (\r
-        FixupVal,\r
-        (UINT32 *) Fixup + IMM64_IC_INST_WORD_X,\r
-        IMM64_IC_SIZE_X,\r
-        IMM64_IC_INST_WORD_POS_X,\r
-        IMM64_IC_VAL_POS_X\r
-        );\r
-\r
-      EXT_IMM64 (\r
-        FixupVal,\r
-        (UINT32 *) Fixup + IMM64_IMM41a_INST_WORD_X,\r
-        IMM64_IMM41a_SIZE_X,\r
-        IMM64_IMM41a_INST_WORD_POS_X,\r
-        IMM64_IMM41a_VAL_POS_X\r
-        );\r
-\r
-      //\r
-      // Update 64-bit address\r
-      //\r
-      FixupVal += Adjust;\r
-\r
-      //\r
-      // Insert IMM64 into bundle\r
-      //\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IMM7B_INST_WORD_X),\r
-        IMM64_IMM7B_SIZE_X,\r
-        IMM64_IMM7B_INST_WORD_POS_X,\r
-        IMM64_IMM7B_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IMM9D_INST_WORD_X),\r
-        IMM64_IMM9D_SIZE_X,\r
-        IMM64_IMM9D_INST_WORD_POS_X,\r
-        IMM64_IMM9D_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IMM5C_INST_WORD_X),\r
-        IMM64_IMM5C_SIZE_X,\r
-        IMM64_IMM5C_INST_WORD_POS_X,\r
-        IMM64_IMM5C_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IC_INST_WORD_X),\r
-        IMM64_IC_SIZE_X,\r
-        IMM64_IC_INST_WORD_POS_X,\r
-        IMM64_IC_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IMM41a_INST_WORD_X),\r
-        IMM64_IMM41a_SIZE_X,\r
-        IMM64_IMM41a_INST_WORD_POS_X,\r
-        IMM64_IMM41a_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IMM41b_INST_WORD_X),\r
-        IMM64_IMM41b_SIZE_X,\r
-        IMM64_IMM41b_INST_WORD_POS_X,\r
-        IMM64_IMM41b_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_IMM41c_INST_WORD_X),\r
-        IMM64_IMM41c_SIZE_X,\r
-        IMM64_IMM41c_INST_WORD_POS_X,\r
-        IMM64_IMM41c_VAL_POS_X\r
-        );\r
-\r
-      INS_IMM64 (\r
-        FixupVal,\r
-        ((UINT32 *) Fixup + IMM64_SIGN_INST_WORD_X),\r
-        IMM64_SIGN_SIZE_X,\r
-        IMM64_SIGN_INST_WORD_POS_X,\r
-        IMM64_SIGN_VAL_POS_X\r
-        );\r
-\r
-      *(UINT64 *) (*FixupData) = *F64;\r
-    }\r
-\r
-    *FixupData = *FixupData + sizeof (UINT64);\r
-    break;\r
-\r
-  default:\r
-    DEBUG ((EFI_D_ERROR, "PeHotRelocateEx:unknown fixed type\n"));\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
 \r
 //\r
 // Cache Flush Routine.\r
 \r
 //\r
 // Cache Flush Routine.\r
index 4c2aeff78e45a454a7612cf5faff12e4b11d3649..fd980a7b6a48f385197036c7d41ccc84de180743 100644 (file)
@@ -51,166 +51,3 @@ Returns:
   return (CHAR8 *) ((UINTN) Image->ImageBase + Address);\r
 }\r
 \r
   return (CHAR8 *) ((UINTN) Image->ImageBase + Address);\r
 }\r
 \r
-VOID\r
-RelocatePeImageForRuntime (\r
-  RUNTIME_IMAGE_RELOCATION_DATA *Image\r
-  )\r
-{\r
-  CHAR8                     *OldBase;\r
-  CHAR8                     *NewBase;\r
-  EFI_IMAGE_DOS_HEADER      *DosHdr;\r
-  EFI_IMAGE_NT_HEADERS      *PeHdr;\r
-  UINT32                    NumberOfRvaAndSizes;\r
-  EFI_IMAGE_DATA_DIRECTORY  *DataDirectory;\r
-  EFI_IMAGE_DATA_DIRECTORY  *RelocDir;\r
-  EFI_IMAGE_BASE_RELOCATION *RelocBase;\r
-  EFI_IMAGE_BASE_RELOCATION *RelocBaseEnd;\r
-  UINT16                    *Reloc;\r
-  UINT16                    *RelocEnd;\r
-  CHAR8                     *Fixup;\r
-  CHAR8                     *FixupBase;\r
-  UINT16                    *F16;\r
-  UINT32                    *F32;\r
-  CHAR8                     *FixupData;\r
-  UINTN                     Adjust;\r
-  EFI_STATUS                Status;\r
-\r
-  OldBase = (CHAR8 *) ((UINTN) Image->ImageBase);\r
-  NewBase = (CHAR8 *) ((UINTN) Image->ImageBase);\r
-\r
-  Status  = RuntimeDriverConvertPointer (0, (VOID **) &NewBase);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  Adjust = (UINTN) NewBase - (UINTN) OldBase;\r
-\r
-  //\r
-  // Find the image's relocate dir info\r
-  //\r
-  DosHdr = (EFI_IMAGE_DOS_HEADER *) OldBase;\r
-  if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
-    //\r
-    // Valid DOS header so get address of PE header\r
-    //\r
-    PeHdr = (EFI_IMAGE_NT_HEADERS *) (((CHAR8 *) DosHdr) + DosHdr->e_lfanew);\r
-  } else {\r
-    //\r
-    // No Dos header so assume image starts with PE header.\r
-    //\r
-    PeHdr = (EFI_IMAGE_NT_HEADERS *) OldBase;\r
-  }\r
-\r
-  if (PeHdr->Signature != EFI_IMAGE_NT_SIGNATURE) {\r
-    //\r
-    // Not a valid PE image so Exit\r
-    //\r
-    return ;\r
-  }\r
-  //\r
-  // Get some data from the PE type dependent data\r
-  //\r
-  NumberOfRvaAndSizes = PeHdr->OptionalHeader.NumberOfRvaAndSizes;\r
-  DataDirectory       = &PeHdr->OptionalHeader.DataDirectory[0];\r
-\r
-  //\r
-  // Find the relocation block\r
-  //\r
-  // Per the PE/COFF spec, you can't assume that a given data directory\r
-  // is present in the image. You have to check the NumberOfRvaAndSizes in\r
-  // the optional header to verify a desired directory entry is there.\r
-  //\r
-  if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
-    RelocDir      = DataDirectory + EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC;\r
-    RelocBase     = RuntimePeImageAddress (Image, RelocDir->VirtualAddress);\r
-    RelocBaseEnd  = RuntimePeImageAddress (Image, RelocDir->VirtualAddress + RelocDir->Size);\r
-  } else {\r
-    //\r
-    // Cannot find relocations, cannot continue\r
-    //\r
-    ASSERT (FALSE);\r
-    return ;\r
-  }\r
-\r
-  ASSERT (RelocBase != NULL && RelocBaseEnd != NULL);\r
-\r
-  //\r
-  // Run the whole relocation block. And re-fixup data that has not been\r
-  // modified. The FixupData is used to see if the image has been modified\r
-  // since it was relocated. This is so data sections that have been updated\r
-  // by code will not be fixed up, since that would set them back to\r
-  // defaults.\r
-  //\r
-  FixupData = Image->RelocationData;\r
-  while (RelocBase < RelocBaseEnd) {\r
-\r
-    Reloc     = (UINT16 *) ((UINT8 *) RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION));\r
-    RelocEnd  = (UINT16 *) ((UINT8 *) RelocBase + RelocBase->SizeOfBlock);\r
-    FixupBase = (CHAR8 *) ((UINTN) Image->ImageBase) + RelocBase->VirtualAddress;\r
-\r
-    //\r
-    // Run this relocation record\r
-    //\r
-    while (Reloc < RelocEnd) {\r
-\r
-      Fixup = FixupBase + (*Reloc & 0xFFF);\r
-      switch ((*Reloc) >> 12) {\r
-\r
-      case EFI_IMAGE_REL_BASED_ABSOLUTE:\r
-        break;\r
-\r
-      case EFI_IMAGE_REL_BASED_HIGH:\r
-        F16 = (UINT16 *) Fixup;\r
-        if (*(UINT16 *) FixupData == *F16) {\r
-          *F16 = (UINT16) ((*F16 << 16) + ((UINT16) Adjust & 0xffff));\r
-        }\r
-\r
-        FixupData = FixupData + sizeof (UINT16);\r
-        break;\r
-\r
-      case EFI_IMAGE_REL_BASED_LOW:\r
-        F16 = (UINT16 *) Fixup;\r
-        if (*(UINT16 *) FixupData == *F16) {\r
-          *F16 = (UINT16) (*F16 + ((UINT16) Adjust & 0xffff));\r
-        }\r
-\r
-        FixupData = FixupData + sizeof (UINT16);\r
-        break;\r
-\r
-      case EFI_IMAGE_REL_BASED_HIGHLOW:\r
-        F32       = (UINT32 *) Fixup;\r
-        FixupData = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
-        if (*(UINT32 *) FixupData == *F32) {\r
-          *F32 = *F32 + (UINT32) Adjust;\r
-        }\r
-\r
-        FixupData = FixupData + sizeof (UINT32);\r
-        break;\r
-\r
-      case EFI_IMAGE_REL_BASED_HIGHADJ:\r
-        //\r
-        // Not implemented, but not used in EFI 1.0\r
-        //\r
-        ASSERT (FALSE);\r
-        break;\r
-\r
-      default:\r
-        //\r
-        // Only Itanium requires ConvertPeImage_Ex\r
-        //\r
-        Status = PeHotRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
-        if (EFI_ERROR (Status)) {\r
-          return ;\r
-        }\r
-      }\r
-      //\r
-      // Next relocation record\r
-      //\r
-      Reloc += 1;\r
-    }\r
-    //\r
-    // next reloc block\r
-    //\r
-    RelocBase = (EFI_IMAGE_BASE_RELOCATION *) RelocEnd;\r
-  }\r
-\r
-  FlushCpuCache (Image->ImageBase, (UINT64) Image->ImageSize);\r
-}\r
index d2428ea1b61060fb3c11407401c498c75bf4cc22..f3899bc8e19e03a767ad6cc286c8c103e5dfc4f3 100644 (file)
@@ -352,6 +352,7 @@ RuntimeDriverSetVirtualAddressMap (
   IN EFI_MEMORY_DESCRIPTOR  *VirtualMap\r
   )\r
 {\r
   IN EFI_MEMORY_DESCRIPTOR  *VirtualMap\r
   )\r
 {\r
+  EFI_STATUS                    Status;\r
   RUNTIME_NOTIFY_EVENT_DATA     *RuntimeEvent;\r
   RUNTIME_IMAGE_RELOCATION_DATA *RuntimeImage;\r
   LIST_ENTRY                    *Link;\r
   RUNTIME_NOTIFY_EVENT_DATA     *RuntimeEvent;\r
   RUNTIME_IMAGE_RELOCATION_DATA *RuntimeImage;\r
   LIST_ENTRY                    *Link;\r
@@ -359,6 +360,7 @@ RuntimeDriverSetVirtualAddressMap (
   UINTN                         Index1;\r
   EFI_DRIVER_OS_HANDOFF_HEADER  *DriverOsHandoffHeader;\r
   EFI_DRIVER_OS_HANDOFF         *DriverOsHandoff;\r
   UINTN                         Index1;\r
   EFI_DRIVER_OS_HANDOFF_HEADER  *DriverOsHandoffHeader;\r
   EFI_DRIVER_OS_HANDOFF         *DriverOsHandoff;\r
+  EFI_PHYSICAL_ADDRESS          VirtImageBase;\r
 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
   EFI_CAPSULE_TABLE             *CapsuleTable; \r
 #endif\r
 #if (EFI_SPECIFICATION_VERSION >= 0x00020000)\r
   EFI_CAPSULE_TABLE             *CapsuleTable; \r
 #endif\r
@@ -454,7 +456,19 @@ RuntimeDriverSetVirtualAddressMap (
   for (Link = mRelocationList.ForwardLink; Link != &mRelocationList; Link = Link->ForwardLink) {\r
     RuntimeImage = _CR (Link, RUNTIME_IMAGE_RELOCATION_DATA, Link);\r
     if (RuntimeImage->Valid) {\r
   for (Link = mRelocationList.ForwardLink; Link != &mRelocationList; Link = Link->ForwardLink) {\r
     RuntimeImage = _CR (Link, RUNTIME_IMAGE_RELOCATION_DATA, Link);\r
     if (RuntimeImage->Valid) {\r
-      RelocatePeImageForRuntime (RuntimeImage);\r
+\r
+      VirtImageBase = RuntimeImage->ImageBase;\r
+      Status  = RuntimeDriverConvertPointer (0, (VOID **) &VirtImageBase);\r
+      ASSERT_EFI_ERROR (Status);\r
+\r
+      PeCoffLoaderRelocateImageForRuntime (\r
+        RuntimeImage->ImageBase,\r
+        VirtImageBase,\r
+        RuntimeImage->ImageSize,\r
+        RuntimeImage->RelocationData\r
+        );\r
+      \r
+      FlushCpuCache (RuntimeImage->ImageBase, (UINT64)RuntimeImage->ImageSize);\r
     }\r
   }\r
   //\r
     }\r
   }\r
   //\r
index 3803a9daddc939a11d01614b01e1b6500c531100..5b582c76ba62f84eb23570fe9fde0126bd691349 100644 (file)
@@ -53,15 +53,6 @@ RelocatePeImageForRuntime (
   )\r
 ;\r
 \r
   )\r
 ;\r
 \r
-EFI_STATUS\r
-PeHotRelocateImageEx (\r
-  IN UINT16      *Reloc,\r
-  IN OUT CHAR8   *Fixup,\r
-  IN OUT CHAR8   **FixupData,\r
-  IN UINT64      Adjust\r
-  )\r
-;\r
-\r
 EFI_STATUS\r
 EFIAPI\r
 RuntimeDriverCalculateCrc32 (\r
 EFI_STATUS\r
 EFIAPI\r
 RuntimeDriverCalculateCrc32 (\r
index c1373e1ea48a7b3ffda6792cab81feed8210ce10..5773156f587c15526559c24e027383e48f218f02 100644 (file)
@@ -60,7 +60,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.-->
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>Runtime.dxs</Filename>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>Runtime.dxs</Filename>\r
-    <Filename>PeHotRelocate.c</Filename>\r
     <Filename>Runtime.c</Filename>\r
     <Filename>Runtime.h</Filename>\r
     <Filename>Crc32.c</Filename>\r
     <Filename>Runtime.c</Filename>\r
     <Filename>Runtime.h</Filename>\r
     <Filename>Crc32.c</Filename>\r
index 82d464aebe662e985c10697dc7b50fae750c0761..7678c4d365db58ba3e61b5edc6916a37e9c9df16 100644 (file)
@@ -24,38 +24,6 @@ Revision History
 \r
 #include "Runtime.h"\r
 \r
 \r
 #include "Runtime.h"\r
 \r
-EFI_STATUS\r
-PeHotRelocateImageEx (\r
-  IN UINT16      *Reloc,\r
-  IN OUT CHAR8   *Fixup,\r
-  IN OUT CHAR8   **FixupData,\r
-  IN UINT64      Adjust\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Performs an Itanium-based platform specific relocation fixup\r
-\r
-Arguments:\r
-\r
-  Reloc      - Pointer to the relocation record\r
-\r
-  Fixup      - Pointer to the address to fix up\r
-\r
-  FixupData  - Pointer to a buffer to log the fixups\r
-\r
-  Adjust     - The offset to adjust the fixup\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS\r
-\r
---*/\r
-{\r
-  return EFI_SUCCESS;\r
-\r
-}\r
 \r
 //\r
 // Cache Flush Routine.\r
 \r
 //\r
 // Cache Flush Routine.\r
index 3c21b12a1c7d5b2e48842ddb559513b46a1d8757..13e82759e12d5bee532b22b0cd73b709d42f45cc 100644 (file)
@@ -1165,6 +1165,30 @@ Returns:
   return FALSE;\r
 }\r
 \r
   return FALSE;\r
 }\r
 \r
+\r
+RETURN_STATUS\r
+EFIAPI\r
+IsEfiAppReadFromFile (\r
+  IN     VOID    *FileHandle,\r
+  IN     UINTN   FileOffset,\r
+  IN OUT UINTN   *ReadSize,\r
+  OUT    VOID    *Buffer\r
+  )\r
+{\r
+  EFI_STATUS        Status;\r
+  EFI_FILE_HANDLE   File;\r
+    \r
+  File = (EFI_FILE_HANDLE)FileHandle;\r
+  Status = File->SetPosition (File, FileOffset);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  return File->Read (File, ReadSize, Buffer);\r
+}\r
+\r
+\r
+\r
 BOOLEAN\r
 BOpt_IsEfiApp (\r
   IN EFI_FILE_HANDLE Dir,\r
 BOOLEAN\r
 BOpt_IsEfiApp (\r
   IN EFI_FILE_HANDLE Dir,\r
@@ -1185,60 +1209,32 @@ Returns:
   \r
 --*/\r
 {\r
   \r
 --*/\r
 {\r
-  UINTN                       BufferSize;\r
-  EFI_IMAGE_DOS_HEADER        DosHdr;\r
-  EFI_IMAGE_NT_HEADERS        PeHdr;\r
-  EFI_IMAGE_OPTIONAL_HEADER32 *PeOpt32;\r
-  EFI_IMAGE_OPTIONAL_HEADER64 *PeOpt64;\r
-  UINT16                      Subsystem;\r
-  EFI_FILE_HANDLE             File;\r
-  EFI_STATUS                  Status;\r
+  EFI_STATUS                            Status;\r
+  PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
+  EFI_FILE_HANDLE                       File;\r
 \r
   Status = Dir->Open (Dir, &File, FileName, EFI_FILE_MODE_READ, 0);\r
 \r
   Status = Dir->Open (Dir, &File, FileName, EFI_FILE_MODE_READ, 0);\r
-\r
   if (EFI_ERROR (Status)) {\r
     return FALSE;\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
     return FALSE;\r
   }\r
 \r
-  BufferSize = sizeof (EFI_IMAGE_DOS_HEADER);\r
-  File->Read (File, &BufferSize, &DosHdr);\r
-  if (DosHdr.e_magic != EFI_IMAGE_DOS_SIGNATURE) {\r
-    File->Close (File);\r
-    return FALSE;\r
-  }\r
+  ZeroMem (&ImageContext, sizeof (ImageContext));\r
+  ImageContext.Handle    = (VOID *)File;\r
+  ImageContext.ImageRead = IsEfiAppReadFromFile;\r
 \r
 \r
-  File->SetPosition (File, DosHdr.e_lfanew);\r
-  BufferSize = sizeof (EFI_IMAGE_NT_HEADERS);\r
-  File->Read (File, &BufferSize, &PeHdr);\r
-  if (PeHdr.Signature != EFI_IMAGE_NT_SIGNATURE) {\r
-    File->Close (File);\r
-    return FALSE;\r
-  }\r
-  //\r
-  // Determine PE type and read subsytem\r
-  // BugBug : We should be using EFI_IMAGE_MACHINE_TYPE_SUPPORTED (machine)\r
-  // macro to detect the machine type.\r
-  // We should not be using  EFI_IMAGE_OPTIONAL_HEADER32 and\r
-  // EFI_IMAGE_OPTIONAL_HEADER64\r
-  //\r
-  if (PeHdr.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
-    PeOpt32   = (EFI_IMAGE_OPTIONAL_HEADER32 *) &(PeHdr.OptionalHeader);\r
-    Subsystem = PeOpt32->Subsystem;\r
-  } else if (PeHdr.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
-    PeOpt64   = (EFI_IMAGE_OPTIONAL_HEADER64 *) &(PeHdr.OptionalHeader);\r
-    Subsystem = PeOpt64->Subsystem;\r
-  } else {\r
+  Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
+  File->Close (File);\r
+  if (EFI_ERROR (Status)) {\r
     return FALSE;\r
   }\r
 \r
     return FALSE;\r
   }\r
 \r
-  if (Subsystem == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {\r
-    File->Close (File);\r
+  if (ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) {\r
     return TRUE;\r
   } else {\r
     return TRUE;\r
   } else {\r
-    File->Close (File);\r
     return FALSE;\r
   }\r
     return FALSE;\r
   }\r
-}\r
+ }\r
+\r
 \r
 EFI_STATUS\r
 BOpt_FindDrivers (\r
 \r
 EFI_STATUS\r
 BOpt_FindDrivers (\r
index 320d6b7c44fe59540789205b72508ce17bbe49ac..c7b6bc9d5d609ba96d176732cdd4c132cfdd7a11 100644 (file)
@@ -28,6 +28,9 @@ ClearDebugRegisters (
   VOID\r
   )\r
 {\r
   VOID\r
   )\r
 {\r
+  //\r
+  // BugBug: We should not need to do this. We need to root cause this bug!!!!\r
+  //\r
   AsmWriteDr0 (0);\r
   AsmWriteDr1 (0);\r
 }\r
   AsmWriteDr0 (0);\r
   AsmWriteDr1 (0);\r
 }\r
@@ -85,6 +88,8 @@ Returns:
   return ;\r
 }\r
 \r
   return ;\r
 }\r
 \r
+\r
+\r
 STATIC\r
 CHAR8 *\r
 GetPdbPath (\r
 STATIC\r
 CHAR8 *\r
 GetPdbPath (\r
@@ -107,51 +112,18 @@ Returns:
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
-  CHAR8                           *PdbPath;\r
-  UINT32                          DirCount;\r
-  EFI_IMAGE_DOS_HEADER            *DosHdr;\r
-  EFI_IMAGE_NT_HEADERS            *NtHdr;\r
-  EFI_IMAGE_OPTIONAL_HEADER       *OptionalHdr;\r
-  EFI_IMAGE_DATA_DIRECTORY        *DirectoryEntry;\r
-  EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
-  VOID                            *CodeViewEntryPointer;\r
-\r
-  CodeViewEntryPointer  = NULL;\r
-  PdbPath               = NULL;\r
-  DosHdr                = ImageBase;\r
-\r
-  if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
-    NtHdr           = (EFI_IMAGE_NT_HEADERS *) ((UINT8 *) DosHdr + DosHdr->e_lfanew);\r
-    OptionalHdr     = (VOID *) &NtHdr->OptionalHeader;\r
-    DirectoryEntry  = (EFI_IMAGE_DATA_DIRECTORY *) &(OptionalHdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
-    if (DirectoryEntry->VirtualAddress != 0) {\r
-      for (DirCount = 0;\r
-           (DirCount < DirectoryEntry->Size / sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY)) && CodeViewEntryPointer == NULL;\r
-           DirCount++\r
-          ) {\r
-        DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (DirectoryEntry->VirtualAddress + (UINTN) ImageBase + DirCount * sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY));\r
-        if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
-          CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + (UINTN) ImageBase);\r
-          switch (*(UINT32 *) CodeViewEntryPointer) {\r
-          case CODEVIEW_SIGNATURE_NB10:\r
-            PdbPath = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
-            break;\r
-\r
-          case CODEVIEW_SIGNATURE_RSDS:\r
-            PdbPath = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
-            break;\r
-\r
-          default:\r
-            break;\r
-          }\r
-        }\r
-      }\r
-    }\r
-  }\r
+  PE_COFF_LOADER_IMAGE_CONTEXT          ImageContext;\r
+\r
+  ZeroMem (&ImageContext, sizeof (ImageContext));\r
+  ImageContext.Handle    = ImageBase;\r
+  ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;\r
 \r
 \r
-  return PdbPath;\r
+  PeCoffLoaderGetImageInfo (&ImageContext);\r
+\r
+  return ImageContext.PdbPointer;\r
 }\r
 \r
 }\r
 \r
+\r
 STATIC\r
 VOID\r
 GetNameFromHandle (\r
 STATIC\r
 VOID\r
 GetNameFromHandle (\r
index f0bd9bfbd487668896522bf1538e7f489a952b60..24b1a538693fa16af5af4ba22ea7aa752c19f1a8 100644 (file)
@@ -272,6 +272,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="8c690838-7a22-45c4-aa58-a33e3e515cd4" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="8c690838-7a22-45c4-aa58-a33e3e515cd4" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -2027,6 +2028,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="FC120ED3-40E1-46dc-8C9C-AAE3CA139ACF" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+     
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -2200,6 +2203,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="556f5d10-7309-4af4-b80a-8196bd60946f" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
@@ -4169,6 +4173,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
         <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+        <Instance ModuleGuid="be490364-73d2-420d-950e-f6450ca75dfb" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
       </Libraries>
       <PcdBuildDefinition>
         <PcdData ItemType="FIXED_AT_BUILD">
index ebe251e4790b9af4443d5cf34ec63dab76a35e4c..c20a7a6f64d0c07c006c3e8fdb2d23ed665a8d6b 100644 (file)
@@ -1,8 +1,10 @@
 /** @file\r
 /** @file\r
-  EFI image format for PE32+. Please note some data structures are different\r
-  for IA-32 and Itanium-based images, look for UINTN and the #ifdef EFI_IA64\r
+  EFI image format for PE32 and PE32+. Please note some data structures are \r
+  different for PE32 and PE32+. EFI_IMAGE_NT_HEADERS32 is for PE32 and \r
+  EFI_IMAGE_NT_HEADERS64 is for PE32+. \r
 \r
 \r
-  @bug Fix text - doc as defined in MSFT EFI specification.\r
+  This file is coded to the Visual Studio, Microsoft Portable Executable and \r
+  Common Object File Format Specification, Revision 8.0 - May 16, 2006. \r
 \r
   Copyright (c) 2006, Intel Corporation                                                         \r
   All rights reserved. This program and the accompanying materials                          \r
 \r
   Copyright (c) 2006, Intel Corporation                                                         \r
   All rights reserved. This program and the accompanying materials                          \r
 #define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION         10\r
 #define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11\r
 #define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER      12\r
 #define EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION         10\r
 #define EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11\r
 #define EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER      12\r
+#define EFI_IMAGE_SUBSYSTEM_EFI_EFI_ROM             13\r
+\r
 #define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER      13\r
 \r
 #define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER      13\r
 \r
-//\r
-// BugBug: Need to get a real answer for this problem. This is not in the\r
-//         PE specification.\r
-//\r
-//         A SAL runtime driver does not get fixed up when a transition to\r
-//         virtual mode is made. In all other cases it should be treated\r
-//         like a EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER image\r
-//\r
-#define EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER  13\r
 \r
 //\r
 // PE32+ Machine type for EFI images\r
 \r
 //\r
 // PE32+ Machine type for EFI images\r
@@ -58,7 +53,6 @@
 #define EFI_IMAGE_OS2_SIGNATURE     0x454E      // NE\r
 #define EFI_IMAGE_OS2_SIGNATURE_LE  0x454C      // LE\r
 #define EFI_IMAGE_NT_SIGNATURE      0x00004550  // PE00\r
 #define EFI_IMAGE_OS2_SIGNATURE     0x454E      // NE\r
 #define EFI_IMAGE_OS2_SIGNATURE_LE  0x454C      // LE\r
 #define EFI_IMAGE_NT_SIGNATURE      0x00004550  // PE00\r
-#define EFI_IMAGE_EDOS_SIGNATURE    0x44454550  // PEED\r
 \r
 ///\r
 /// PE images can start with an optional DOS header, so if an image is run\r
 \r
 ///\r
 /// PE images can start with an optional DOS header, so if an image is run\r
@@ -158,9 +152,9 @@ typedef struct {
 \r
 ///\r
 /// @attention\r
 \r
 ///\r
 /// @attention\r
-/// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64\r
-/// are for use ONLY by tools.  All proper EFI code MUST use\r
-/// EFI_IMAGE_OPTIONAL_HEADER ONLY!!!\r
+/// EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC means PE32 and \r
+/// EFI_IMAGE_OPTIONAL_HEADER32 must be used. The data structures only vary\r
+/// after NT additional fields.\r
 ///\r
 #define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b\r
 \r
 ///\r
 #define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b\r
 \r
@@ -206,9 +200,9 @@ typedef struct {
 \r
 ///\r
 /// @attention\r
 \r
 ///\r
 /// @attention\r
-/// EFI_IMAGE_OPTIONAL_HEADER32 and EFI_IMAGE_OPTIONAL_HEADER64\r
-/// are for use ONLY by tools.  All proper EFI code MUST use\r
-/// EFI_IMAGE_OPTIONAL_HEADER ONLY!!!\r
+/// EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC means PE32+ and \r
+/// EFI_IMAGE_OPTIONAL_HEADER64 must be used. The data structures only vary\r
+/// after NT additional fields.\r
 ///\r
 #define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b\r
 \r
 ///\r
 #define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b\r
 \r
@@ -251,6 +245,7 @@ typedef struct {
   EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];\r
 } EFI_IMAGE_OPTIONAL_HEADER64;\r
 \r
   EFI_IMAGE_DATA_DIRECTORY  DataDirectory[EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];\r
 } EFI_IMAGE_OPTIONAL_HEADER64;\r
 \r
+\r
 ///\r
 /// @attention\r
 /// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY\r
 ///\r
 /// @attention\r
 /// EFI_IMAGE_NT_HEADERS32 and EFI_IMAGE_HEADERS64 are for use ONLY\r
@@ -272,6 +267,7 @@ typedef struct {
 \r
 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)\r
 \r
 \r
 #define EFI_IMAGE_SIZEOF_NT_OPTIONAL64_HEADER sizeof (EFI_IMAGE_NT_HEADERS64)\r
 \r
+\r
 //\r
 // Processor specific definition of EFI_IMAGE_OPTIONAL_HEADER so the\r
 // type name EFI_IMAGE_OPTIONAL_HEADER is appropriate to the build.  Same for\r
 //\r
 // Processor specific definition of EFI_IMAGE_OPTIONAL_HEADER so the\r
 // type name EFI_IMAGE_OPTIONAL_HEADER is appropriate to the build.  Same for\r
@@ -279,31 +275,35 @@ typedef struct {
 //\r
 #if   defined (MDE_CPU_IA32)\r
 \r
 //\r
 #if   defined (MDE_CPU_IA32)\r
 \r
-typedef EFI_IMAGE_OPTIONAL_HEADER32     EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS32          EFI_IMAGE_NT_HEADERS;\r
-\r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC\r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
   (((Machine) == EFI_IMAGE_MACHINE_IA32) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
 \r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
   (((Machine) == EFI_IMAGE_MACHINE_IA32) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
 \r
-#elif defined (MDE_CPU_IPF)\r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_X64) \r
+\r
+//\r
+// @bug - Remove me when other package updated. \r
+//\r
+typedef EFI_IMAGE_NT_HEADERS32    EFI_IMAGE_NT_HEADERS;\r
 \r
 \r
-typedef EFI_IMAGE_OPTIONAL_HEADER64     EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS64          EFI_IMAGE_NT_HEADERS;\r
+#elif defined (MDE_CPU_IPF)\r
 \r
 \r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
   (((Machine) == EFI_IMAGE_MACHINE_IPF) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
 \r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
   (((Machine) == EFI_IMAGE_MACHINE_IPF) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
 \r
-#elif defined (MDE_CPU_X64)\r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE) \r
 \r
 \r
-typedef EFI_IMAGE_OPTIONAL_HEADER64     EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS64          EFI_IMAGE_NT_HEADERS;\r
+#elif defined (MDE_CPU_X64)\r
 \r
 \r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
   (((Machine) == EFI_IMAGE_MACHINE_X64) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
 \r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \\r
   (((Machine) == EFI_IMAGE_MACHINE_X64) || ((Machine) == EFI_IMAGE_MACHINE_EBC))\r
 \r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_IA32) \r
+\r
+//\r
+// @bug - Remove me when other package updated. \r
+//\r
+typedef EFI_IMAGE_NT_HEADERS32    EFI_IMAGE_NT_HEADERS;\r
+\r
 #elif defined (MDE_CPU_EBC)\r
 \r
 //\r
 #elif defined (MDE_CPU_EBC)\r
 \r
 //\r
@@ -311,12 +311,10 @@ typedef EFI_IMAGE_NT_HEADERS64          EFI_IMAGE_NT_HEADERS;
 // It does not make sense to have a PE loader coded in EBC. You need to \r
 // understand the basic \r
 //\r
 // It does not make sense to have a PE loader coded in EBC. You need to \r
 // understand the basic \r
 //\r
-typedef EFI_IMAGE_OPTIONAL_HEADER64     EFI_IMAGE_OPTIONAL_HEADER;\r
-typedef EFI_IMAGE_NT_HEADERS64          EFI_IMAGE_NT_HEADERS;\r
-\r
-#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC\r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_EBC)\r
 \r
 #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) ((Machine) == EFI_IMAGE_MACHINE_EBC)\r
 \r
+#define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine) (FALSE) \r
+\r
 #else\r
 #error Unknown Processor Type\r
 #endif\r
 #else\r
 #error Unknown Processor Type\r
 #endif\r
@@ -515,15 +513,36 @@ typedef struct {
 //\r
 // I386 relocation types.\r
 //\r
 //\r
 // I386 relocation types.\r
 //\r
-#define EFI_IMAGE_REL_I386_ABSOLUTE 0   // Reference is absolute, no relocation is necessary\r
-#define EFI_IMAGE_REL_I386_DIR16    01  // Direct 16-bit reference to the symbols virtual address\r
-#define EFI_IMAGE_REL_I386_REL16    02  // PC-relative 16-bit reference to the symbols virtual address\r
-#define EFI_IMAGE_REL_I386_DIR32    06  // Direct 32-bit reference to the symbols virtual address\r
-#define EFI_IMAGE_REL_I386_DIR32NB  07  // Direct 32-bit reference to the symbols virtual address, base not included\r
-#define EFI_IMAGE_REL_I386_SEG12    011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address\r
-#define EFI_IMAGE_REL_I386_SECTION  012\r
-#define EFI_IMAGE_REL_I386_SECREL   013\r
-#define EFI_IMAGE_REL_I386_REL32    024 // PC-relative 32-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_ABSOLUTE 0x0000   // Reference is absolute, no relocation is necessary\r
+#define EFI_IMAGE_REL_I386_DIR16    0x0001  // Direct 16-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_REL16    0x0002  // PC-relative 16-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_DIR32    0x0006  // Direct 32-bit reference to the symbols virtual address\r
+#define EFI_IMAGE_REL_I386_DIR32NB  0x0007  // Direct 32-bit reference to the symbols virtual address, base not included\r
+#define EFI_IMAGE_REL_I386_SEG12    0x0009 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address\r
+#define EFI_IMAGE_REL_I386_SECTION  0x001a\r
+#define EFI_IMAGE_REL_I386_SECREL   0x000b\r
+#define EFI_IMAGE_REL_I386_REL32    0x0014 // PC-relative 32-bit reference to the symbols virtual address\r
+\r
+//\r
+// x64 processor relocation types.\r
+//\r
+#define IMAGE_REL_AMD64_ABSOLUTE       0x0000\r
+#define IMAGE_REL_AMD64_ADDR64   0x0001\r
+#define IMAGE_REL_AMD64_ADDR32   0x0002\r
+#define IMAGE_REL_AMD64_ADDR32NB       0x0003\r
+#define IMAGE_REL_AMD64_REL32      0x0004\r
+#define IMAGE_REL_AMD64_REL32_1          0x0005\r
+#define IMAGE_REL_AMD64_REL32_2          0x0006\r
+#define IMAGE_REL_AMD64_REL32_3          0x0007\r
+#define IMAGE_REL_AMD64_REL32_4          0x0008\r
+#define IMAGE_REL_AMD64_REL32_5          0x0009\r
+#define IMAGE_REL_AMD64_SECTION          0x000A\r
+#define IMAGE_REL_AMD64_SECREL   0x000B\r
+#define IMAGE_REL_AMD64_SECREL7          0x000C\r
+#define IMAGE_REL_AMD64_TOKEN      0x000D\r
+#define IMAGE_REL_AMD64_SREL32   0x000E\r
+#define IMAGE_REL_AMD64_PAIR       0x000F\r
+#define IMAGE_REL_AMD64_SSPAN32          0x0010\r
 \r
 ///\r
 /// Based relocation format.\r
 \r
 ///\r
 /// Based relocation format.\r
@@ -695,4 +714,21 @@ typedef struct {
 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0\r
 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1\r
 \r
 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC  0\r
 #define EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG      1\r
 \r
+\r
+//\r
+// Union of PE32, PE32+, and TE headers\r
+//\r
+typedef union {\r
+  EFI_IMAGE_NT_HEADERS32   Pe32;\r
+  EFI_IMAGE_NT_HEADERS64   Pe32Plus;\r
+  EFI_TE_IMAGE_HEADER      Te;\r
+} EFI_IMAGE_OPTIONAL_HEADER_UNION;\r
+\r
+typedef union {\r
+  EFI_IMAGE_NT_HEADERS32            *Pe32;\r
+  EFI_IMAGE_NT_HEADERS64            *Pe32Plus;\r
+  EFI_TE_IMAGE_HEADER               *Te;\r
+  EFI_IMAGE_OPTIONAL_HEADER_UNION   *Union;\r
+} EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION;\r
+\r
 #endif\r
 #endif\r
index e2808418fabb34ee13f952c4914a9a9a0a94489c..13af84ed34c0042bde92c1eeed64369092edccb9 100644 (file)
@@ -17,7 +17,6 @@
 #ifndef __PCI_CF8_LIB_H__\r
 #define __PCI_CF8_LIB_H__\r
 \r
 #ifndef __PCI_CF8_LIB_H__\r
 #define __PCI_CF8_LIB_H__\r
 \r
-#include <Library/PciLib.h>\r
 \r
 /**\r
   Macro that converts PCI Bus, PCI Device, PCI Function and PCI Register to an\r
 \r
 /**\r
   Macro that converts PCI Bus, PCI Device, PCI Function and PCI Register to an\r
@@ -36,7 +35,7 @@
 \r
 **/\r
 #define PCI_CF8_LIB_ADDRESS(Bus,Device,Function,Offset) \\r
 \r
 **/\r
 #define PCI_CF8_LIB_ADDRESS(Bus,Device,Function,Offset) \\r
-  PCI_LIB_ADDRESS (Bus, Device, Function, Offset)\r
+  (((Offset) & 0xfff) | (((Function) & 0x07) << 12) | (((Device) & 0x1f) << 15) | (((Bus) & 0xff) << 20))\r
 \r
 /**\r
   Reads an 8-bit PCI configuration register.\r
 \r
 /**\r
   Reads an 8-bit PCI configuration register.\r
index 9bd1166a8706f7608979403e4ba2bcf5afbf4fec..29ff9dde8289a6337a5cd3012071d47b0549fb45 100644 (file)
@@ -36,7 +36,7 @@
 \r
 **/\r
 #define PCI_EXPRESS_LIB_ADDRESS(Bus,Device,Function,Offset) \\r
 \r
 **/\r
 #define PCI_EXPRESS_LIB_ADDRESS(Bus,Device,Function,Offset) \\r
-  PCI_LIB_ADDRESS (Bus, Device, Function, Offset)\r
+  (((Offset) & 0xfff) | (((Function) & 0x07) << 12) | (((Device) & 0x1f) << 15) | (((Bus) & 0xff) << 20))\r
 \r
 /**\r
   Reads an 8-bit PCI configuration register.\r
 \r
 /**\r
   Reads an 8-bit PCI configuration register.\r
index 85e3e25c1e8499d9112f3baee3d902ed1e7bf0d1..973a36865528e13efdeaa5bf3adf67d8a69b84ac 100644 (file)
@@ -41,4 +41,19 @@ PeCoffLoaderGetEntryPoint (
   OUT VOID  **EntryPoint\r
   );\r
 \r
   OUT VOID  **EntryPoint\r
   );\r
 \r
+/**\r
+  Returns the machine type of PE/COFF image. \r
+\r
+  @param  Image   Pointer to a PE/COFF header\r
+\r
+  @return         Machine type or zero if not a valid iamge\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+PeCoffLoaderGetMachineType (\r
+  IN  VOID    *Image\r
+  );\r
+\r
+\r
 #endif\r
 #endif\r
index df588b704da54399ecf6bd06f4c8ec2cd724b3cf..920004aebcdf7ee131b11775d0f233068a942902 100644 (file)
@@ -1,5 +1,5 @@
 /** @file\r
 /** @file\r
-  Memory Only PE COFF loader\r
+  Memory Only PE COFF loader\r
 \r
   Copyright (c) 2006, Intel Corporation                                                         \r
   All rights reserved. This program and the accompanying materials                          \r
 \r
   Copyright (c) 2006, Intel Corporation                                                         \r
   All rights reserved. This program and the accompanying materials                          \r
@@ -157,4 +157,53 @@ PeCoffLoaderLoadImage (
   )\r
 ;\r
 \r
   )\r
 ;\r
 \r
+\r
+/**\r
+  ImageRead function that operates on a memory buffer whos base is passed into\r
+  FileHandle. \r
+\r
+  @param  FileHandle        Ponter to baes of the input stream\r
+  @param  FileOffset        Offset to the start of the buffer\r
+  @param  ReadSize          Number of bytes to copy into the buffer\r
+  @param  Buffer            Location to place results of read\r
+\r
+  @retval RETURN_SUCCESS    Data is read from FileOffset from the Handle into \r
+                            the buffer.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderImageReadFromMemory (\r
+  IN     VOID    *FileHandle,\r
+  IN     UINTN   FileOffset,\r
+  IN OUT UINTN   *ReadSize,\r
+  OUT    VOID    *Buffer\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI\r
+  runtime. \r
+  \r
+  PE_COFF_LOADER_IMAGE_CONTEXT.FixupData stores information needed to reapply\r
+  the fixups with a virtual mapping.\r
+\r
+\r
+  @param  ImageBase          Base address of relocated image\r
+  @param  VirtImageBase      Virtual mapping for ImageBase\r
+  @param  ImageSize          Size of the image to relocate\r
+  @param  RelocationData     Location to place results of read\r
+  \r
+**/\r
+VOID\r
+EFIAPI\r
+PeCoffLoaderRelocateImageForRuntime (\r
+  IN  PHYSICAL_ADDRESS        ImageBase,\r
+  IN  PHYSICAL_ADDRESS        VirtImageBase,\r
+  IN  UINTN                   ImageSize,\r
+  IN  VOID                    *RelocationData\r
+  )\r
+;\r
+\r
+\r
 #endif\r
 #endif\r
index 126457a7e59be4dd013db32abf86b361b7837233..02c03b7aabc847418f1c5671027b2e7ad66eabdf 100644 (file)
@@ -64,192 +64,3 @@ IoWrite64 (
   return 0;\r
 }\r
 \r
   return 0;\r
 }\r
 \r
-/**\r
-  Reads an 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioRead8 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  return *(volatile UINT8*)Address;\r
-}\r
-\r
-/**\r
-  Writes an 8-bit MMIO register.\r
-\r
-  Writes the 8-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioWrite8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  return *(volatile UINT8*)Address = Value;\r
-}\r
-\r
-/**\r
-  Reads a 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioRead16 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  ASSERT ((Address & 1) == 0);\r
-  return *(volatile UINT16*)Address;\r
-}\r
-\r
-/**\r
-  Writes a 16-bit MMIO register.\r
-\r
-  Writes the 16-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioWrite16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    Value\r
-  )\r
-{\r
-  ASSERT ((Address & 1) == 0);\r
-  return *(volatile UINT16*)Address = Value;\r
-}\r
-\r
-/**\r
-  Reads a 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioRead32 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  ASSERT ((Address & 3) == 0);\r
-  return *(volatile UINT32*)Address;\r
-}\r
-\r
-/**\r
-  Writes a 32-bit MMIO register.\r
-\r
-  Writes the 32-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioWrite32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    Value\r
-  )\r
-{\r
-  ASSERT ((Address & 3) == 0);\r
-  return *(volatile UINT32*)Address = Value;\r
-}\r
-\r
-/**\r
-  Reads a 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioRead64 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  ASSERT ((Address & 7) == 0);\r
-  return *(volatile UINT64*)Address;\r
-}\r
-\r
-/**\r
-  Writes a 64-bit MMIO register.\r
-\r
-  Writes the 64-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioWrite64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    Value\r
-  )\r
-{\r
-  ASSERT ((Address & 7) == 0);\r
-  return *(volatile UINT64*)Address = Value;\r
-}\r
index a065c14299b7f4eb764821237d2448264392aab7..69fb878888fdd532ed48ae1193ce6b767a39a694 100644 (file)
 \r
 #ifdef __GNUC__\r
 \r
 \r
 #ifdef __GNUC__\r
 \r
+/**\r
+  Reads an 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioRead8 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  return *(volatile UINT8*)Address;\r
+}\r
+\r
+/**\r
+  Writes an 8-bit MMIO register.\r
+\r
+  Writes the 8-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioWrite8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT8                     Value\r
+  )\r
+{\r
+  return *(volatile UINT8*)Address = Value;\r
+}\r
+\r
+/**\r
+  Reads a 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 16-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioRead16 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  ASSERT ((Address & 1) == 0);\r
+  return *(volatile UINT16*)Address;\r
+}\r
+\r
+/**\r
+  Writes a 16-bit MMIO register.\r
+\r
+  Writes the 16-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 16-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioWrite16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT16                    Value\r
+  )\r
+{\r
+  ASSERT ((Address & 1) == 0);\r
+  return *(volatile UINT16*)Address = Value;\r
+}\r
+\r
+/**\r
+  Reads a 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 32-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioRead32 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  ASSERT ((Address & 3) == 0);\r
+  return *(volatile UINT32*)Address;\r
+}\r
+\r
+/**\r
+  Writes a 32-bit MMIO register.\r
+\r
+  Writes the 32-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 32-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioWrite32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT32                    Value\r
+  )\r
+{\r
+  ASSERT ((Address & 3) == 0);\r
+  return *(volatile UINT32*)Address = Value;\r
+}\r
+\r
+/**\r
+  Reads a 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 64-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioRead64 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  ASSERT ((Address & 7) == 0);\r
+  return *(volatile UINT64*)Address;\r
+}\r
+\r
+/**\r
+  Writes a 64-bit MMIO register.\r
+\r
+  Writes the 64-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 64-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioWrite64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT64                    Value\r
+  )\r
+{\r
+  ASSERT ((Address & 7) == 0);\r
+  return *(volatile UINT64*)Address = Value;\r
+}\r
+\r
+\r
+\r
 /**\r
   Reads an 8-bit I/O port.\r
 \r
 /**\r
   Reads an 8-bit I/O port.\r
 \r
index 8bce7a5eb926309ca7a570f8bbf9c4ce114ac51b..cfe5ddff4394b4a6305825f049b56bba0ae413d0 100644 (file)
 //\r
 // Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics\r
 //\r
 //\r
 // Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics\r
 //\r
-int            _inp  (unsigned short port);\r
+int            _inp (unsigned short port);\r
 unsigned short _inpw (unsigned short port);\r
 unsigned long  _inpd (unsigned short port);\r
 int            _outp (unsigned short port, int databyte );\r
 unsigned short _inpw (unsigned short port);\r
 unsigned long  _inpd (unsigned short port);\r
 int            _outp (unsigned short port, int databyte );\r
-unsigned short _outpw(unsigned short port, unsigned short dataword );\r
-unsigned long  _outpd(unsigned short port, unsigned long dataword );\r
+unsigned short _outpw (unsigned short port, unsigned short dataword );\r
+unsigned long  _outpd (unsigned short port, unsigned long dataword );\r
+void          _ReadWriteBarrier (void);\r
 \r
 #pragma intrinsic(_inp)\r
 #pragma intrinsic(_inpw)\r
 \r
 #pragma intrinsic(_inp)\r
 #pragma intrinsic(_inpw)\r
@@ -40,7 +41,15 @@ unsigned long  _outpd(unsigned short port, unsigned long dataword );
 #pragma intrinsic(_outp)\r
 #pragma intrinsic(_outpw)\r
 #pragma intrinsic(_outpd)\r
 #pragma intrinsic(_outp)\r
 #pragma intrinsic(_outpw)\r
 #pragma intrinsic(_outpd)\r
+#pragma intrinsic(_ReadWriteBarrier)\r
 \r
 \r
+//\r
+// _ReadWriteBarrier() forces memory reads and writes to complete at the point\r
+// in the call. This is only a hint to the compiler and does emit code.\r
+// In past versions of the compiler, _ReadWriteBarrier was enforced only \r
+// locally and did not affect functions up the call tree. In Visual C++ \r
+// 2005, _ReadWriteBarrier is enforced all the way up the call tree.\r
+//\r
 \r
 /**\r
   Reads an 8-bit I/O port.\r
 \r
 /**\r
   Reads an 8-bit I/O port.\r
@@ -62,6 +71,7 @@ IoRead8 (
   IN      UINTN                     Port\r
   )\r
 {\r
   IN      UINTN                     Port\r
   )\r
 {\r
+  _ReadWriteBarrier ();\r
   return (UINT8)_inp ((UINT16)Port);\r
 }\r
 \r
   return (UINT8)_inp ((UINT16)Port);\r
 }\r
 \r
@@ -87,6 +97,7 @@ IoWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
   IN      UINT8                     Value\r
   )\r
 {\r
+  _ReadWriteBarrier ();\r
   return (UINT8)_outp ((UINT16)Port, Value);\r
 }\r
 \r
   return (UINT8)_outp ((UINT16)Port, Value);\r
 }\r
 \r
@@ -111,6 +122,7 @@ IoRead16 (
   )\r
 {\r
   ASSERT ((Port & 1) == 0);\r
   )\r
 {\r
   ASSERT ((Port & 1) == 0);\r
+  _ReadWriteBarrier ();\r
   return _inpw((UINT16)Port);\r
 }\r
 \r
   return _inpw((UINT16)Port);\r
 }\r
 \r
@@ -137,6 +149,7 @@ IoWrite16 (
   )\r
 {\r
   ASSERT ((Port & 1) == 0);\r
   )\r
 {\r
   ASSERT ((Port & 1) == 0);\r
+  _ReadWriteBarrier ();\r
   return _outpw ((UINT16)Port, Value);\r
 }\r
 \r
   return _outpw ((UINT16)Port, Value);\r
 }\r
 \r
@@ -161,6 +174,7 @@ IoRead32 (
   )\r
 {\r
   ASSERT ((Port & 3) == 0);\r
   )\r
 {\r
   ASSERT ((Port & 3) == 0);\r
+  _ReadWriteBarrier ();\r
   return _inpd((UINT16)Port);\r
 }\r
 \r
   return _inpd((UINT16)Port);\r
 }\r
 \r
@@ -187,7 +201,207 @@ IoWrite32 (
   )\r
 {\r
   ASSERT ((Port & 3) == 0);\r
   )\r
 {\r
   ASSERT ((Port & 3) == 0);\r
+  _ReadWriteBarrier ();\r
   return _outpd ((UINT16)Port, Value);\r
 }\r
 \r
   return _outpd ((UINT16)Port, Value);\r
 }\r
 \r
+\r
+/**\r
+  Reads an 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioRead8 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT8 *)Address;\r
+}\r
+\r
+/**\r
+  Writes an 8-bit MMIO register.\r
+\r
+  Writes the 8-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioWrite8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT8                     Value\r
+  )\r
+{\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT8 *)Address = Value;\r
+}\r
+\r
+/**\r
+  Reads a 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 16-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioRead16 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  ASSERT ((Address & 1) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT16 *)Address;\r
+}\r
+\r
+/**\r
+  Writes a 16-bit MMIO register.\r
+\r
+  Writes the 16-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 16-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioWrite16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT16                    Value\r
+  )\r
+{\r
+  ASSERT ((Address & 1) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT16 *)Address = Value;\r
+}\r
+\r
+/**\r
+  Reads a 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 32-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioRead32 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  ASSERT ((Address & 3) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT32 *)Address;\r
+}\r
+\r
+/**\r
+  Writes a 32-bit MMIO register.\r
+\r
+  Writes the 32-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 32-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioWrite32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT32                    Value\r
+  )\r
+{\r
+  ASSERT ((Address & 3) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT32 *)Address = Value;\r
+}\r
+\r
+/**\r
+  Reads a 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 64-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioRead64 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  ASSERT ((Address & 7) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT64 *)Address;\r
+}\r
+\r
+/**\r
+  Writes a 64-bit MMIO register.\r
+\r
+  Writes the 64-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 64-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioWrite64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT64                    Value\r
+  )\r
+{\r
+  ASSERT ((Address & 7) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT64 *)Address = Value;\r
+}\r
+\r
 #endif\r
 #endif\r
index cbbd407eadd1d63957ff2ae99920564e2ad59431..272d641ff32af609ab574073f951a8a0ae23b643 100644 (file)
@@ -1315,7 +1315,7 @@ PciCf8ReadBuffer (
     //\r
     // Read a byte if StartAddress is byte aligned\r
     //\r
     //\r
     // Read a byte if StartAddress is byte aligned\r
     //\r
-    *(UINT8*)Buffer = PciCf8Read8 (StartAddress);\r
+    *(volatile UINT8 *)Buffer = PciCf8Read8 (StartAddress);\r
     StartAddress += sizeof (UINT8);\r
     Size -= sizeof (UINT8);\r
     Buffer = (UINT8*)Buffer + 1;\r
     StartAddress += sizeof (UINT8);\r
     Size -= sizeof (UINT8);\r
     Buffer = (UINT8*)Buffer + 1;\r
@@ -1325,7 +1325,7 @@ PciCf8ReadBuffer (
     //\r
     // Read a word if StartAddress is word aligned\r
     //\r
     //\r
     // Read a word if StartAddress is word aligned\r
     //\r
-    *(UINT16*)Buffer = PciCf8Read16 (StartAddress);\r
+    *(volatile UINT16 *)Buffer = PciCf8Read16 (StartAddress);\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
@@ -1335,7 +1335,7 @@ PciCf8ReadBuffer (
     //\r
     // Read as many double words as possible\r
     //\r
     //\r
     // Read as many double words as possible\r
     //\r
-    *(UINT32*)Buffer = PciCf8Read32 (StartAddress);\r
+    *(volatile UINT32 *)Buffer = PciCf8Read32 (StartAddress);\r
     StartAddress += sizeof (UINT32);\r
     Size -= sizeof (UINT32);\r
     Buffer = (UINT32*)Buffer + 1;\r
     StartAddress += sizeof (UINT32);\r
     Size -= sizeof (UINT32);\r
     Buffer = (UINT32*)Buffer + 1;\r
@@ -1345,7 +1345,7 @@ PciCf8ReadBuffer (
     //\r
     // Read the last remaining word if exist\r
     //\r
     //\r
     // Read the last remaining word if exist\r
     //\r
-    *(UINT16*)Buffer = PciCf8Read16 (StartAddress);\r
+    *(volatile UINT16 *)Buffer = PciCf8Read16 (StartAddress);\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
@@ -1355,7 +1355,7 @@ PciCf8ReadBuffer (
     //\r
     // Read the last remaining byte if exist\r
     //\r
     //\r
     // Read the last remaining byte if exist\r
     //\r
-    *(UINT8*)Buffer = PciCf8Read8 (StartAddress);\r
+    *(volatile UINT8 *)Buffer = PciCf8Read8 (StartAddress);\r
   }\r
 \r
   return ReturnValue;\r
   }\r
 \r
   return ReturnValue;\r
index 509a5e423fd528ce3a108b586693cad47324d8b2..6bb08938878b7209442b909d66ee35bddced0aaa 100644 (file)
@@ -40,7 +40,7 @@
   @return The base address of PCI Express.\r
 \r
 **/\r
   @return The base address of PCI Express.\r
 \r
 **/\r
-UINTN\r
+volatile UINTN\r
 GetPciExpressBaseAddress (\r
   VOID\r
   )\r
 GetPciExpressBaseAddress (\r
   VOID\r
   )\r
@@ -1220,7 +1220,7 @@ PciExpressReadBuffer (
     //\r
     // Read a byte if StartAddress is byte aligned\r
     //\r
     //\r
     // Read a byte if StartAddress is byte aligned\r
     //\r
-    *(UINT8*)Buffer = PciExpressRead8 (StartAddress);\r
+    *(volatile UINT8 *)Buffer = PciExpressRead8 (StartAddress);\r
     StartAddress += sizeof (UINT8);\r
     Size -= sizeof (UINT8);\r
     Buffer = (UINT8*)Buffer + 1;\r
     StartAddress += sizeof (UINT8);\r
     Size -= sizeof (UINT8);\r
     Buffer = (UINT8*)Buffer + 1;\r
@@ -1230,7 +1230,7 @@ PciExpressReadBuffer (
     //\r
     // Read a word if StartAddress is word aligned\r
     //\r
     //\r
     // Read a word if StartAddress is word aligned\r
     //\r
-    *(UINT16*)Buffer = PciExpressRead16 (StartAddress);\r
+    *(volatile UINT16 *)Buffer = PciExpressRead16 (StartAddress);\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
@@ -1240,7 +1240,7 @@ PciExpressReadBuffer (
     //\r
     // Read as many double words as possible\r
     //\r
     //\r
     // Read as many double words as possible\r
     //\r
-    *(UINT32*)Buffer = PciExpressRead32 (StartAddress);\r
+    *(volatile UINT32 *)Buffer = PciExpressRead32 (StartAddress);\r
     StartAddress += sizeof (UINT32);\r
     Size -= sizeof (UINT32);\r
     Buffer = (UINT32*)Buffer + 1;\r
     StartAddress += sizeof (UINT32);\r
     Size -= sizeof (UINT32);\r
     Buffer = (UINT32*)Buffer + 1;\r
@@ -1250,7 +1250,7 @@ PciExpressReadBuffer (
     //\r
     // Read the last remaining word if exist\r
     //\r
     //\r
     // Read the last remaining word if exist\r
     //\r
-    *(UINT16*)Buffer = PciExpressRead16 (StartAddress);\r
+    *(volatile UINT16 *)Buffer = PciExpressRead16 (StartAddress);\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
     StartAddress += sizeof (UINT16);\r
     Size -= sizeof (UINT16);\r
     Buffer = (UINT16*)Buffer + 1;\r
@@ -1260,7 +1260,7 @@ PciExpressReadBuffer (
     //\r
     // Read the last remaining byte if exist\r
     //\r
     //\r
     // Read the last remaining byte if exist\r
     //\r
-    *(UINT8*)Buffer = PciExpressRead8 (StartAddress);\r
+    *(volatile UINT8 *)Buffer = PciExpressRead8 (StartAddress);\r
   }\r
 \r
   return ReturnValue;\r
   }\r
 \r
   return ReturnValue;\r
index b740bd6e7c4a007448d65ec192e9ac01354953f4..001e043d3f22cc4829a1f8f98f05180402420a55 100644 (file)
@@ -40,26 +40,63 @@ PeCoffLoaderGetEntryPoint (
   OUT VOID  **EntryPoint\r
   )\r
 {\r
   OUT VOID  **EntryPoint\r
   )\r
 {\r
-  EFI_IMAGE_DOS_HEADER  *DosHeader;\r
-  EFI_IMAGE_NT_HEADERS  *PeHeader;\r
+  EFI_IMAGE_DOS_HEADER                  *DosHeader;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Header;\r
 \r
   ASSERT (Pe32Data   != NULL);\r
   ASSERT (EntryPoint != NULL);\r
 \r
   DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
 \r
   ASSERT (Pe32Data   != NULL);\r
   ASSERT (EntryPoint != NULL);\r
 \r
   DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
-\r
   if (DosHeader->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
   if (DosHeader->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
-    PeHeader = (EFI_IMAGE_NT_HEADERS *) ((UINTN) Pe32Data + (UINTN) ((DosHeader->e_lfanew) & 0x0ffff));\r
+    Header.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHeader->e_lfanew) & 0x0ffff));\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
     //\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
     //\r
-    PeHeader = (EFI_IMAGE_NT_HEADERS *) Pe32Data;\r
+    Header.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
   }\r
 \r
   }\r
 \r
-  *EntryPoint = (VOID *) ((UINTN) Pe32Data + (UINTN) (PeHeader->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));\r
+  //\r
+  // Calculate the entry point relative to the start of the image. \r
+  // AddressOfEntryPoint is common for PE32 & PE32+\r
+  //\r
+  *EntryPoint = (VOID *)((UINTN)Pe32Data + (UINTN)(Header.Pe32->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));\r
   return RETURN_SUCCESS;\r
 }\r
   return RETURN_SUCCESS;\r
 }\r
+\r
+\r
+/**\r
+  Returns the machine type of PE/COFF image. \r
+\r
+  @param  Image   Pointer to a PE/COFF header\r
+\r
+  @return         Machine type or zero if not a valid iamge\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+PeCoffLoaderGetMachineType (\r
+  IN  VOID  *Pe32Data\r
+  )\r
+{\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
+  EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
+\r
+  DosHdr = (EFI_IMAGE_DOS_HEADER  *)Pe32Data;\r
+  if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + DosHdr->e_lfanew);\r
+  } else {\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data);\r
+  }\r
+\r
+  if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE)  {\r
+    return Hdr.Pe32->FileHeader.Machine;\r
+  }\r
+\r
+  return 0x0000;\r
+}\r
+\r
+\r
index 6b8adc1fd63006ff021f862fa927a575a8c40c74..1e8f573009540d01686a302ec029c560e81ab357 100644 (file)
@@ -1,6 +1,9 @@
 /** @file\r
   Tiano PE/COFF loader.\r
 \r
 /** @file\r
   Tiano PE/COFF loader.\r
 \r
+  This PE/COFF loader supports loading any PE32 or PE32+ image type, but\r
+  only supports relocating IA32, X64, IPF, and EBC images.\r
+\r
   Copyright (c) 2006, Intel Corporation\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
   Copyright (c) 2006, Intel Corporation\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
 \r
 **/\r
 \r
 \r
 **/\r
 \r
+\r
 /**\r
 /**\r
-  Performs an Itanium-based specific relocation fixup.\r
+  Performs an Itanium-based specific relocation fixup and is a no-op on other\r
+  instruction sets.\r
 \r
   @param  Reloc       Pointer to the relocation record.\r
   @param  Fixup       Pointer to the address to fix up.\r
 \r
   @param  Reloc       Pointer to the relocation record.\r
   @param  Fixup       Pointer to the address to fix up.\r
@@ -34,33 +39,68 @@ PeCoffLoaderRelocateImageEx (
   );\r
 \r
 \r
   );\r
 \r
 \r
+/**\r
+  Performs an Itanium-based specific re-relocation fixup and is a no-op on other\r
+  instruction sets. This is used to re-relocated the image into the EFI virtual\r
+  space for runtime calls.\r
+\r
+  @param  Reloc       Pointer to the relocation record.\r
+  @param  Fixup       Pointer to the address to fix up.\r
+  @param  FixupData   Pointer to a buffer to log the fixups.\r
+  @param  Adjust      The offset to adjust the fixup.\r
+\r
+  @return Status code.\r
+\r
+**/\r
+RETURN_STATUS\r
+PeHotRelocateImageEx (\r
+  IN UINT16      *Reloc,\r
+  IN OUT CHAR8   *Fixup,\r
+  IN OUT CHAR8   **FixupData,\r
+  IN UINT64      Adjust\r
+  );\r
+\r
+\r
+/**\r
+  Returns TRUE if the machine type of PE/COFF image is supported. Supported \r
+  does not mean the image can be executed it means the PE/COFF loader supports\r
+  loading and relocating of the image type. It's up to the caller to support\r
+  the entry point. \r
+\r
+  @param  Machine   Machine type from the PE Header.\r
+\r
+  @return TRUE if this PE/COFF loader can load the image\r
+\r
+**/\r
+BOOLEAN\r
+PeCoffLoaderImageFormatSupported (\r
+  IN  UINT16  Machine\r
+  );\r
+\r
+\r
 \r
 /**\r
   Retrieves the PE or TE Header from a PE/COFF or TE image.\r
 \r
   @param  ImageContext    The context of the image being loaded.\r
 \r
 /**\r
   Retrieves the PE or TE Header from a PE/COFF or TE image.\r
 \r
   @param  ImageContext    The context of the image being loaded.\r
-  @param  PeHdr           The buffer in which to return the PE header.\r
-  @param  TeHdr           The buffer in which to return the TE header.\r
+  @param  Hdr             The buffer in which to return the PE32, PE32+, or TE header.\r
 \r
   @retval RETURN_SUCCESS  The PE or TE Header is read.\r
   @retval Other           The error status from reading the PE/COFF or TE image using the ImageRead function.\r
 \r
 **/\r
 \r
   @retval RETURN_SUCCESS  The PE or TE Header is read.\r
   @retval Other           The error status from reading the PE/COFF or TE image using the ImageRead function.\r
 \r
 **/\r
-STATIC\r
 RETURN_STATUS\r
 PeCoffLoaderGetPeHeader (\r
 RETURN_STATUS\r
 PeCoffLoaderGetPeHeader (\r
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext,\r
-  OUT    EFI_IMAGE_NT_HEADERS          *PeHdr,\r
-  OUT    EFI_TE_IMAGE_HEADER           *TeHdr\r
+  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT         *ImageContext,\r
+  OUT    EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr\r
   )\r
 {\r
   RETURN_STATUS         Status;\r
   EFI_IMAGE_DOS_HEADER  DosHdr;\r
   UINTN                 Size;\r
 \r
   )\r
 {\r
   RETURN_STATUS         Status;\r
   EFI_IMAGE_DOS_HEADER  DosHdr;\r
   UINTN                 Size;\r
 \r
-  ImageContext->IsTeImage = FALSE;\r
   //\r
   //\r
-  // Read the DOS image headers\r
+  // Read the DOS image header to check for it's existance\r
   //\r
   Size = sizeof (EFI_IMAGE_DOS_HEADER);\r
   Status = ImageContext->ImageRead (\r
   //\r
   Size = sizeof (EFI_IMAGE_DOS_HEADER);\r
   Status = ImageContext->ImageRead (\r
@@ -77,93 +117,85 @@ PeCoffLoaderGetPeHeader (
   ImageContext->PeCoffHeaderOffset = 0;\r
   if (DosHdr.e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
     //\r
   ImageContext->PeCoffHeaderOffset = 0;\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
+    // DOS image header is present, so read the PE header after the DOS image \r
+    // header\r
     //\r
     ImageContext->PeCoffHeaderOffset = DosHdr.e_lfanew;\r
   }\r
     //\r
     ImageContext->PeCoffHeaderOffset = DosHdr.e_lfanew;\r
   }\r
+\r
   //\r
   //\r
-  // Read the PE/COFF Header\r
+  // Read the PE/COFF Header. For PE32 (32-bit) this will read in too much \r
+  // data, but that should not hurt anythine. Hdr.Pe32->OptionalHeader.Magic\r
+  // determins if this is a PE32 or PE32+ image. The magic is in the same \r
+  // location in both images.\r
   //\r
   //\r
-  Size = sizeof (EFI_IMAGE_NT_HEADERS);\r
+  Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION);\r
   Status = ImageContext->ImageRead (\r
                            ImageContext->Handle,\r
                            ImageContext->PeCoffHeaderOffset,\r
                            &Size,\r
   Status = ImageContext->ImageRead (\r
                            ImageContext->Handle,\r
                            ImageContext->PeCoffHeaderOffset,\r
                            &Size,\r
-                           PeHdr\r
+                           Hdr.Pe32\r
                            );\r
   if (RETURN_ERROR (Status)) {\r
     ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
     return Status;\r
   }\r
                            );\r
   if (RETURN_ERROR (Status)) {\r
     ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
     return Status;\r
   }\r
+\r
   //\r
   //\r
-  // Check the PE/COFF Header Signature. If not, then try to read a TE header\r
+  // Use Signature to figure out if we understand the image format\r
   //\r
   //\r
-  if (PeHdr->Signature != EFI_IMAGE_NT_SIGNATURE) {\r
-    Size = sizeof (EFI_TE_IMAGE_HEADER);\r
-    Status = ImageContext->ImageRead (\r
-                             ImageContext->Handle,\r
-                             0,\r
-                             &Size,\r
-                             TeHdr\r
-                             );\r
-    if (TeHdr->Signature != EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
-      return RETURN_UNSUPPORTED;\r
-    }\r
-\r
-    ImageContext->IsTeImage = TRUE;\r
-  }\r
-\r
-  return RETURN_SUCCESS;\r
-}\r
-\r
-/**\r
-  Checks the PE or TE header of a PE/COFF or TE image to determine if it supported.\r
-\r
-  @param  ImageContext        The context of the image being loaded.\r
-  @param  PeHdr               The buffer in which to return the PE header.\r
-  @param  TeHdr               The buffer in which to return the TE header.\r
+  if (Hdr.Pe32->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
+    ImageContext->IsTeImage         = TRUE;\r
+    ImageContext->Machine           = Hdr.Te->Machine;\r
+    ImageContext->ImageType         = (UINT16)(Hdr.Te->Subsystem);\r
+    ImageContext->ImageSize         = 0;\r
+    ImageContext->SectionAlignment  = 4096;\r
+    ImageContext->SizeOfHeaders     = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;\r
 \r
 \r
-  @retval RETURN_SUCCESS      The PE/COFF or TE image is supported.\r
-  @retval RETURN_UNSUPPORTED  The PE/COFF or TE image is not supported.\r
+  } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE)  {\r
+    ImageContext->IsTeImage = FALSE;\r
+    ImageContext->Machine = Hdr.Pe32->FileHeader.Machine;\r
+    \r
+    if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+      //\r
+      // Use PE32 offset\r
+      //\r
+      ImageContext->ImageType         = Hdr.Pe32->OptionalHeader.Subsystem;\r
+      ImageContext->ImageSize         = (UINT64)Hdr.Pe32->OptionalHeader.SizeOfImage;\r
+      ImageContext->SectionAlignment  = Hdr.Pe32->OptionalHeader.SectionAlignment;\r
+      ImageContext->SizeOfHeaders     = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
 \r
 \r
-**/\r
-STATIC\r
-RETURN_STATUS\r
-PeCoffLoaderCheckImageType (\r
-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
-  IN     EFI_IMAGE_NT_HEADERS                  *PeHdr,\r
-  IN     EFI_TE_IMAGE_HEADER                   *TeHdr\r
-  )\r
-{\r
-  //\r
-  // See if the machine type is supported.  We support a native machine type (IA-32/Itanium-based)\r
-  // and the machine type for the Virtual Machine.\r
-  //\r
-  if (ImageContext->IsTeImage == FALSE) {\r
-    ImageContext->Machine = PeHdr->FileHeader.Machine;\r
+    } else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
+      //\r
+      // Use PE32+ offset\r
+      //\r
+      ImageContext->ImageType         = Hdr.Pe32Plus->OptionalHeader.Subsystem;\r
+      ImageContext->ImageSize         = (UINT64) Hdr.Pe32Plus->OptionalHeader.SizeOfImage;\r
+      ImageContext->SectionAlignment  = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;\r
+      ImageContext->SizeOfHeaders     = Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders;\r
+    } else {\r
+      ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;\r
+      return RETURN_UNSUPPORTED;    \r
+    }\r
   } else {\r
   } else {\r
-    ImageContext->Machine = TeHdr->Machine;\r
-  }\r
-\r
-  if (!(EFI_IMAGE_MACHINE_TYPE_SUPPORTED (ImageContext->Machine))) {\r
     ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;\r
     return RETURN_UNSUPPORTED;\r
   }\r
 \r
     ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;\r
     return RETURN_UNSUPPORTED;\r
   }\r
 \r
-  //\r
-  // See if the image type is supported.  We support EFI Applications,\r
-  // EFI Boot Service Drivers, and EFI Runtime Drivers.\r
-  //\r
-  if (ImageContext->IsTeImage == FALSE) {\r
-    ImageContext->ImageType = PeHdr->OptionalHeader.Subsystem;\r
-  } else {\r
-    ImageContext->ImageType = (UINT16) (TeHdr->Subsystem);\r
+  if (!PeCoffLoaderImageFormatSupported (ImageContext->Machine)) {\r
+    //\r
+    // If the PE/COFF loader does not support the image type return\r
+    // unsupported. This library can suport lots of types of images\r
+    // this does not mean the user of this library can call the entry\r
+    // point of the image. \r
+    //\r
+    return RETURN_UNSUPPORTED;\r
   }\r
 \r
   }\r
 \r
-\r
   return RETURN_SUCCESS;\r
 }\r
 \r
   return RETURN_SUCCESS;\r
 }\r
 \r
+\r
 /**\r
   Retrieves information about a PE/COFF image.\r
 \r
 /**\r
   Retrieves information about a PE/COFF image.\r
 \r
@@ -189,17 +221,18 @@ PeCoffLoaderGetImageInfo (
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT           *ImageContext\r
   )\r
 {\r
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT           *ImageContext\r
   )\r
 {\r
-  RETURN_STATUS                   Status;\r
-  EFI_IMAGE_NT_HEADERS            PeHdr;\r
-  EFI_TE_IMAGE_HEADER             TeHdr;\r
-  EFI_IMAGE_DATA_DIRECTORY        *DebugDirectoryEntry;\r
-  UINTN                           Size;\r
-  UINTN                           Index;\r
-  UINTN                           DebugDirectoryEntryRva;\r
-  UINTN                           DebugDirectoryEntryFileOffset;\r
-  UINTN                           SectionHeaderOffset;\r
-  EFI_IMAGE_SECTION_HEADER        SectionHeader;\r
-  EFI_IMAGE_DEBUG_DIRECTORY_ENTRY DebugEntry;\r
+  RETURN_STATUS                         Status;\r
+  EFI_IMAGE_OPTIONAL_HEADER_UNION       HdrData;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
+  EFI_IMAGE_DATA_DIRECTORY              *DebugDirectoryEntry;\r
+  UINTN                                 Size;\r
+  UINTN                                 Index;\r
+  UINTN                                 DebugDirectoryEntryRva;\r
+  UINTN                                 DebugDirectoryEntryFileOffset;\r
+  UINTN                                 SectionHeaderOffset;\r
+  EFI_IMAGE_SECTION_HEADER              SectionHeader;\r
+  EFI_IMAGE_DEBUG_DIRECTORY_ENTRY       DebugEntry;\r
+  UINT32                                NumberOfRvaAndSizes;\r
 \r
   if (NULL == ImageContext) {\r
     return RETURN_INVALID_PARAMETER;\r
 \r
   if (NULL == ImageContext) {\r
     return RETURN_INVALID_PARAMETER;\r
@@ -209,25 +242,31 @@ PeCoffLoaderGetImageInfo (
   //\r
   ImageContext->ImageError  = IMAGE_ERROR_SUCCESS;\r
 \r
   //\r
   ImageContext->ImageError  = IMAGE_ERROR_SUCCESS;\r
 \r
-  Status                    = PeCoffLoaderGetPeHeader (ImageContext, &PeHdr, &TeHdr);\r
-  if (RETURN_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Verify machine type\r
-  //\r
-  Status = PeCoffLoaderCheckImageType (ImageContext, &PeHdr, &TeHdr);\r
+  Hdr.Union = &HdrData;\r
+  Status = PeCoffLoaderGetPeHeader (ImageContext, Hdr);\r
   if (RETURN_ERROR (Status)) {\r
     return Status;\r
   }\r
   if (RETURN_ERROR (Status)) {\r
     return Status;\r
   }\r
+\r
   //\r
   // Retrieve the base address of the image\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
   //\r
   // Retrieve the base address of the image\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
-    ImageContext->ImageAddress = PeHdr.OptionalHeader.ImageBase;\r
+    if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+      //\r
+      // Use PE32 offset\r
+      //\r
+      ImageContext->ImageAddress = Hdr.Pe32->OptionalHeader.ImageBase;\r
+    } else {\r
+      //\r
+      // Use PE32+ offset\r
+      //\r
+      ImageContext->ImageAddress = Hdr.Pe32Plus->OptionalHeader.ImageBase;\r
+    }\r
   } else {\r
   } else {\r
-    ImageContext->ImageAddress = (PHYSICAL_ADDRESS) (TeHdr.ImageBase);\r
+    ImageContext->ImageAddress = (PHYSICAL_ADDRESS)(Hdr.Te->ImageBase);\r
   }\r
   }\r
+\r
   //\r
   // Initialize the alternate destination address to 0 indicating that it\r
   // should not be used.\r
   //\r
   // Initialize the alternate destination address to 0 indicating that it\r
   // should not be used.\r
@@ -251,23 +290,28 @@ PeCoffLoaderGetImageInfo (
   // Look at the file header to determine if relocations have been stripped, and\r
   // save this info in the image context for later use.\r
   //\r
   // Look at the file header to determine if relocations have been stripped, and\r
   // save this info in the image context for later use.\r
   //\r
-  if ((!(ImageContext->IsTeImage)) && ((PeHdr.FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0)) {\r
+  if ((!(ImageContext->IsTeImage)) && ((Hdr.Pe32->FileHeader.Characteristics & EFI_IMAGE_FILE_RELOCS_STRIPPED) != 0)) {\r
     ImageContext->RelocationsStripped = TRUE;\r
   } else {\r
     ImageContext->RelocationsStripped = FALSE;\r
   }\r
 \r
   if (!(ImageContext->IsTeImage)) {\r
     ImageContext->RelocationsStripped = TRUE;\r
   } else {\r
     ImageContext->RelocationsStripped = FALSE;\r
   }\r
 \r
   if (!(ImageContext->IsTeImage)) {\r
-    ImageContext->ImageSize         = (UINT64) PeHdr.OptionalHeader.SizeOfImage;\r
-    ImageContext->SectionAlignment  = PeHdr.OptionalHeader.SectionAlignment;\r
-    ImageContext->SizeOfHeaders     = PeHdr.OptionalHeader.SizeOfHeaders;\r
-\r
-    //\r
-    // Modify ImageSize to contain .PDB file name if required and initialize\r
-    // PdbRVA field...\r
-    //\r
-    if (PeHdr.OptionalHeader.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
-      DebugDirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *) &(PeHdr.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+    if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+      //     \r
+      // Use PE32 offset\r
+      //\r
+      NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
+      DebugDirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+    } else {\r
+      //     \r
+      // Use PE32+ offset\r
+      //\r
+      NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
+      DebugDirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+    }    \r
+    \r
+    if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
 \r
       DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;\r
 \r
 \r
       DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;\r
 \r
@@ -282,10 +326,10 @@ PeCoffLoaderGetImageInfo (
                                ImageContext->PeCoffHeaderOffset +\r
                                sizeof (UINT32) + \r
                                sizeof (EFI_IMAGE_FILE_HEADER) + \r
                                ImageContext->PeCoffHeaderOffset +\r
                                sizeof (UINT32) + \r
                                sizeof (EFI_IMAGE_FILE_HEADER) + \r
-                               PeHdr.FileHeader.SizeOfOptionalHeader\r
+                               Hdr.Pe32->FileHeader.SizeOfOptionalHeader\r
                                );\r
 \r
                                );\r
 \r
-      for (Index = 0; Index < PeHdr.FileHeader.NumberOfSections; Index++) {\r
+      for (Index = 0; Index < Hdr.Pe32->FileHeader.NumberOfSections; Index++) {\r
         //\r
         // Read section header from file\r
         //\r
         //\r
         // Read section header from file\r
         //\r
@@ -303,8 +347,8 @@ PeCoffLoaderGetImageInfo (
 \r
         if (DebugDirectoryEntryRva >= SectionHeader.VirtualAddress &&\r
             DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) {\r
 \r
         if (DebugDirectoryEntryRva >= SectionHeader.VirtualAddress &&\r
             DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) {\r
-            DebugDirectoryEntryFileOffset =\r
-            DebugDirectoryEntryRva - SectionHeader.VirtualAddress + SectionHeader.PointerToRawData;\r
+\r
+          DebugDirectoryEntryFileOffset = DebugDirectoryEntryRva - SectionHeader.VirtualAddress + SectionHeader.PointerToRawData;\r
           break;\r
         }\r
 \r
           break;\r
         }\r
 \r
@@ -340,17 +384,14 @@ PeCoffLoaderGetImageInfo (
       }\r
     }\r
   } else {\r
       }\r
     }\r
   } else {\r
-    ImageContext->ImageSize         = 0;\r
-    ImageContext->SectionAlignment  = 4096;\r
-    ImageContext->SizeOfHeaders     = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN) TeHdr.BaseOfCode - (UINTN) TeHdr.StrippedSize;\r
 \r
 \r
-    DebugDirectoryEntry             = &TeHdr.DataDirectory[1];\r
+    DebugDirectoryEntry             = &Hdr.Te->DataDirectory[1];\r
     DebugDirectoryEntryRva          = DebugDirectoryEntry->VirtualAddress;\r
     DebugDirectoryEntryRva          = DebugDirectoryEntry->VirtualAddress;\r
-    SectionHeaderOffset             = (UINTN) (sizeof (EFI_TE_IMAGE_HEADER));\r
+    SectionHeaderOffset             = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER));\r
 \r
     DebugDirectoryEntryFileOffset   = 0;\r
 \r
 \r
     DebugDirectoryEntryFileOffset   = 0;\r
 \r
-    for (Index = 0; Index < TeHdr.NumberOfSections;) {\r
+    for (Index = 0; Index < Hdr.Te->NumberOfSections;) {\r
       //\r
       // Read section header from file\r
       //\r
       //\r
       // Read section header from file\r
       //\r
@@ -372,15 +413,15 @@ PeCoffLoaderGetImageInfo (
                                         SectionHeader.VirtualAddress +\r
                                         SectionHeader.PointerToRawData +\r
                                         sizeof (EFI_TE_IMAGE_HEADER) -\r
                                         SectionHeader.VirtualAddress +\r
                                         SectionHeader.PointerToRawData +\r
                                         sizeof (EFI_TE_IMAGE_HEADER) -\r
-                                        TeHdr.StrippedSize;\r
+                                        Hdr.Te->StrippedSize;\r
 \r
         //\r
         // File offset of the debug directory was found, if this is not the last\r
         // section, then skip to the last section for calculating the image size.\r
         //\r
 \r
         //\r
         // File offset of the debug directory was found, if this is not the last\r
         // section, then skip to the last section for calculating the image size.\r
         //\r
-        if (Index < (UINTN) TeHdr.NumberOfSections - 1) {\r
-          SectionHeaderOffset += (TeHdr.NumberOfSections - 1 - Index) * sizeof (EFI_IMAGE_SECTION_HEADER);\r
-          Index = TeHdr.NumberOfSections - 1;\r
+        if (Index < (UINTN) Hdr.Te->NumberOfSections - 1) {\r
+          SectionHeaderOffset += (Hdr.Te->NumberOfSections - 1 - Index) * sizeof (EFI_IMAGE_SECTION_HEADER);\r
+          Index = Hdr.Te->NumberOfSections - 1;\r
           continue;\r
         }\r
       }\r
           continue;\r
         }\r
       }\r
@@ -395,7 +436,7 @@ PeCoffLoaderGetImageInfo (
       // by the RVA and the VirtualSize of the last section header in the\r
       // Section Table.\r
       //\r
       // by the RVA and the VirtualSize of the last section header in the\r
       // Section Table.\r
       //\r
-      if ((++Index) == (UINTN) TeHdr.NumberOfSections) {\r
+      if ((++Index) == (UINTN)Hdr.Te->NumberOfSections) {\r
         ImageContext->ImageSize = (SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize +\r
                                    ImageContext->SectionAlignment - 1) & ~(ImageContext->SectionAlignment - 1);\r
       }\r
         ImageContext->ImageSize = (SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize +\r
                                    ImageContext->SectionAlignment - 1) & ~(ImageContext->SectionAlignment - 1);\r
       }\r
@@ -431,6 +472,7 @@ PeCoffLoaderGetImageInfo (
   return RETURN_SUCCESS;\r
 }\r
 \r
   return RETURN_SUCCESS;\r
 }\r
 \r
+\r
 /**\r
   Converts an image address to the loaded address.\r
 \r
 /**\r
   Converts an image address to the loaded address.\r
 \r
@@ -440,19 +482,13 @@ PeCoffLoaderGetImageInfo (
   @return The converted address or NULL if the address can not be converted.\r
 \r
 **/\r
   @return The converted address or NULL if the address can not be converted.\r
 \r
 **/\r
-STATIC\r
 VOID *\r
 PeCoffLoaderImageAddress (\r
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
   IN     UINTN                                 Address\r
   )\r
 {\r
 VOID *\r
 PeCoffLoaderImageAddress (\r
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
   IN     UINTN                                 Address\r
   )\r
 {\r
-  if (Address >= ImageContext->ImageSize) {\r
-    ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_ADDRESS;\r
-    return NULL;\r
-  }\r
-\r
-  return (CHAR8 *) ((UINTN) ImageContext->ImageAddress + Address);\r
+  return (CHAR8 *)((UINTN) ImageContext->ImageAddress + Address);\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -481,26 +517,25 @@ PeCoffLoaderRelocateImage (
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
   )\r
 {\r
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
   )\r
 {\r
-  RETURN_STATUS             Status;\r
-  EFI_IMAGE_NT_HEADERS      *PeHdr;\r
-  EFI_TE_IMAGE_HEADER       *TeHdr;\r
-  EFI_IMAGE_DATA_DIRECTORY  *RelocDir;\r
-  UINT64                    Adjust;\r
-  EFI_IMAGE_BASE_RELOCATION *RelocBase;\r
-  EFI_IMAGE_BASE_RELOCATION *RelocBaseEnd;\r
-  UINT16                    *Reloc;\r
-  UINT16                    *RelocEnd;\r
-  CHAR8                     *Fixup;\r
-  CHAR8                     *FixupBase;\r
-  UINT16                    *F16;\r
-  UINT32                    *F32;\r
-  CHAR8                     *FixupData;\r
-  PHYSICAL_ADDRESS          BaseAddress;\r
+  RETURN_STATUS                         Status;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
+  EFI_IMAGE_DATA_DIRECTORY              *RelocDir;\r
+  UINT64                                Adjust;\r
+  EFI_IMAGE_BASE_RELOCATION             *RelocBase;\r
+  EFI_IMAGE_BASE_RELOCATION             *RelocBaseEnd;\r
+  UINT16                                *Reloc;\r
+  UINT16                                *RelocEnd;\r
+  CHAR8                                 *Fixup;\r
+  CHAR8                                 *FixupBase;\r
+  UINT16                                *F16;\r
+  UINT32                                *F32;  \r
+  UINT64                                *F64;\r
+  CHAR8                                 *FixupData;\r
+  PHYSICAL_ADDRESS                      BaseAddress;\r
+  UINT32                                NumberOfRvaAndSizes;\r
 \r
   ASSERT (ImageContext != NULL);\r
 \r
 \r
   ASSERT (ImageContext != NULL);\r
 \r
-  PeHdr = NULL;\r
-  TeHdr = NULL;\r
   //\r
   // Assume success\r
   //\r
   //\r
   // Assume success\r
   //\r
@@ -524,21 +559,35 @@ PeCoffLoaderRelocateImage (
   }\r
 \r
   if (!(ImageContext->IsTeImage)) {\r
   }\r
 \r
   if (!(ImageContext->IsTeImage)) {\r
-    PeHdr = (EFI_IMAGE_NT_HEADERS *)((UINTN)ImageContext->ImageAddress + \r
-                                            ImageContext->PeCoffHeaderOffset);\r
-   \r
-    Adjust = (UINT64) BaseAddress - PeHdr->OptionalHeader.ImageBase;\r
-    PeHdr->OptionalHeader.ImageBase = (UINTN)BaseAddress;\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
+    if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+      //\r
+      // Use PE32 offset\r
+      //\r
+      Adjust = (UINT64)BaseAddress - Hdr.Pe32->OptionalHeader.ImageBase;\r
+      Hdr.Pe32->OptionalHeader.ImageBase = (UINT32)BaseAddress;\r
+  \r
+      NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
+      RelocDir  = &Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+    } else {\r
+      //\r
+      // Use PE32+ offset\r
+      //\r
+      Adjust = (UINT64) BaseAddress - Hdr.Pe32Plus->OptionalHeader.ImageBase;\r
+      Hdr.Pe32Plus->OptionalHeader.ImageBase = (UINT64)BaseAddress;\r
+\r
+      NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
+      RelocDir  = &Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+    }\r
 \r
     //\r
     // Find the relocation block\r
 \r
     //\r
     // Find the relocation block\r
-    //\r
     // Per the PE/COFF spec, you can't assume that a given data directory\r
     // is present in the image. You have to check the NumberOfRvaAndSizes in\r
     // the optional header to verify a desired directory entry is there.\r
     //\r
     // Per the PE/COFF spec, you can't assume that a given data directory\r
     // is present in the image. You have to check the NumberOfRvaAndSizes in\r
     // the optional header to verify a desired directory entry is there.\r
     //\r
-    if (PeHdr->OptionalHeader.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
-      RelocDir  = &PeHdr->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+\r
+    if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
       RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);\r
       RelocBaseEnd = PeCoffLoaderImageAddress (\r
                       ImageContext,\r
       RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);\r
       RelocBaseEnd = PeCoffLoaderImageAddress (\r
                       ImageContext,\r
@@ -551,19 +600,19 @@ PeCoffLoaderRelocateImage (
       RelocBase = RelocBaseEnd = 0;\r
     }\r
   } else {\r
       RelocBase = RelocBaseEnd = 0;\r
     }\r
   } else {\r
-    TeHdr             = (EFI_TE_IMAGE_HEADER *) (UINTN) (ImageContext->ImageAddress);\r
-    Adjust            = (UINT64) (BaseAddress - TeHdr->ImageBase);\r
-    TeHdr->ImageBase  = (UINT64) (BaseAddress);\r
+    Hdr.Te             = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
+    Adjust            = (UINT64) (BaseAddress - Hdr.Te->ImageBase);\r
+    Hdr.Te->ImageBase  = (UINT64) (BaseAddress);\r
 \r
     //\r
     // Find the relocation block\r
     //\r
 \r
     //\r
     // Find the relocation block\r
     //\r
-    RelocDir = &TeHdr->DataDirectory[0];\r
+    RelocDir = &Hdr.Te->DataDirectory[0];\r
     RelocBase = (EFI_IMAGE_BASE_RELOCATION *)(UINTN)(\r
                                     ImageContext->ImageAddress + \r
                                     RelocDir->VirtualAddress +\r
                                     sizeof(EFI_TE_IMAGE_HEADER) - \r
     RelocBase = (EFI_IMAGE_BASE_RELOCATION *)(UINTN)(\r
                                     ImageContext->ImageAddress + \r
                                     RelocDir->VirtualAddress +\r
                                     sizeof(EFI_TE_IMAGE_HEADER) - \r
-                                    TeHdr->StrippedSize\r
+                                    Hdr.Te->StrippedSize\r
                                     );\r
     RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *) ((UINTN) RelocBase + (UINTN) RelocDir->Size - 1);\r
   }\r
                                     );\r
     RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *) ((UINTN) RelocBase + (UINTN) RelocDir->Size - 1);\r
   }\r
@@ -582,7 +631,7 @@ PeCoffLoaderRelocateImage (
       FixupBase = (CHAR8 *)(UINTN)(ImageContext->ImageAddress +\r
                     RelocBase->VirtualAddress +\r
                     sizeof(EFI_TE_IMAGE_HEADER) - \r
       FixupBase = (CHAR8 *)(UINTN)(ImageContext->ImageAddress +\r
                     RelocBase->VirtualAddress +\r
                     sizeof(EFI_TE_IMAGE_HEADER) - \r
-                    TeHdr->StrippedSize\r
+                    Hdr.Te->StrippedSize\r
                     );\r
     }\r
 \r
                     );\r
     }\r
 \r
@@ -626,21 +675,27 @@ PeCoffLoaderRelocateImage (
         *F32  = *F32 + (UINT32) Adjust;\r
         if (FixupData != NULL) {\r
           FixupData             = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
         *F32  = *F32 + (UINT32) Adjust;\r
         if (FixupData != NULL) {\r
           FixupData             = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
-          *(UINT32 *) FixupData = *F32;\r
+          *(UINT32 *)FixupData  = *F32;\r
           FixupData             = FixupData + sizeof (UINT32);\r
         }\r
         break;\r
 \r
           FixupData             = FixupData + sizeof (UINT32);\r
         }\r
         break;\r
 \r
-      case EFI_IMAGE_REL_BASED_HIGHADJ:\r
-        //\r
-        // Return the same EFI_UNSUPPORTED return code as\r
-        // PeCoffLoaderRelocateImageEx() returns if it does not recognize\r
-        // the relocation type.\r
-        //\r
-        ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
-        return RETURN_UNSUPPORTED;\r
+      case EFI_IMAGE_REL_BASED_DIR64:\r
+        F64 = (UINT64 *) Fixup;\r
+        *F64 = *F64 + (UINT64) Adjust;\r
+        if (FixupData != NULL) {\r
+          FixupData = ALIGN_POINTER (FixupData, sizeof(UINT64));\r
+          *(UINT64 *)(FixupData) = *F64;\r
+          FixupData = FixupData + sizeof(UINT64);\r
+        }\r
+        break;\r
 \r
       default:\r
 \r
       default:\r
+        //\r
+        // The common code does not handle some of the stranger IPF relocations\r
+        // PeCoffLoaderRelocateImageEx () addes support for these complex fixups\r
+        // on IPF and is a No-Op on other archtiectures.\r
+        //\r
         Status = PeCoffLoaderRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
         if (RETURN_ERROR (Status)) {\r
           ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
         Status = PeCoffLoaderRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
         if (RETURN_ERROR (Status)) {\r
           ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
@@ -693,8 +748,7 @@ PeCoffLoaderLoadImage (
   )\r
 {\r
   RETURN_STATUS                         Status;\r
   )\r
 {\r
   RETURN_STATUS                         Status;\r
-  EFI_IMAGE_NT_HEADERS                  *PeHdr;\r
-  EFI_TE_IMAGE_HEADER                   *TeHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
   PE_COFF_LOADER_IMAGE_CONTEXT          CheckContext;\r
   EFI_IMAGE_SECTION_HEADER              *FirstSection;\r
   EFI_IMAGE_SECTION_HEADER              *Section;\r
   PE_COFF_LOADER_IMAGE_CONTEXT          CheckContext;\r
   EFI_IMAGE_SECTION_HEADER              *FirstSection;\r
   EFI_IMAGE_SECTION_HEADER              *Section;\r
@@ -707,12 +761,10 @@ PeCoffLoaderLoadImage (
   EFI_IMAGE_DEBUG_DIRECTORY_ENTRY       *DebugEntry;\r
   UINTN                                 Size;\r
   UINT32                                TempDebugEntryRva;\r
   EFI_IMAGE_DEBUG_DIRECTORY_ENTRY       *DebugEntry;\r
   UINTN                                 Size;\r
   UINT32                                TempDebugEntryRva;\r
+  UINT32                                NumberOfRvaAndSizes;\r
 \r
   ASSERT (ImageContext != NULL);\r
 \r
 \r
   ASSERT (ImageContext != NULL);\r
 \r
-  PeHdr = NULL;\r
-  TeHdr = NULL;\r
-\r
   //\r
   // Assume success\r
   //\r
   //\r
   // Assume success\r
   //\r
@@ -786,32 +838,31 @@ PeCoffLoaderLoadImage (
                             (VOID *) (UINTN) ImageContext->ImageAddress\r
                             );\r
 \r
                             (VOID *) (UINTN) ImageContext->ImageAddress\r
                             );\r
 \r
-    PeHdr = (EFI_IMAGE_NT_HEADERS *)\r
-      ((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
 \r
     FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
                       (UINTN)ImageContext->ImageAddress +\r
                       ImageContext->PeCoffHeaderOffset +\r
                       sizeof(UINT32) + \r
                       sizeof(EFI_IMAGE_FILE_HEADER) + \r
 \r
     FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
                       (UINTN)ImageContext->ImageAddress +\r
                       ImageContext->PeCoffHeaderOffset +\r
                       sizeof(UINT32) + \r
                       sizeof(EFI_IMAGE_FILE_HEADER) + \r
-                      PeHdr->FileHeader.SizeOfOptionalHeader\r
+                      Hdr.Pe32->FileHeader.SizeOfOptionalHeader\r
       );\r
       );\r
-    NumberOfSections = (UINTN) (PeHdr->FileHeader.NumberOfSections);\r
+    NumberOfSections = (UINTN) (Hdr.Pe32->FileHeader.NumberOfSections);\r
   } else {\r
     Status = ImageContext->ImageRead (\r
                             ImageContext->Handle,\r
                             0,\r
                             &ImageContext->SizeOfHeaders,\r
   } else {\r
     Status = ImageContext->ImageRead (\r
                             ImageContext->Handle,\r
                             0,\r
                             &ImageContext->SizeOfHeaders,\r
-                            (void *) (UINTN) ImageContext->ImageAddress\r
+                            (void *)(UINTN)ImageContext->ImageAddress\r
                             );\r
 \r
                             );\r
 \r
-    TeHdr             = (EFI_TE_IMAGE_HEADER *) (UINTN) (ImageContext->ImageAddress);\r
+    Hdr.Te = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
 \r
     FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
 \r
     FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
-          (UINTN)ImageContext->ImageAddress +\r
-          sizeof(EFI_TE_IMAGE_HEADER)\r
-          );\r
-    NumberOfSections  = (UINTN) (TeHdr->NumberOfSections);\r
+                      (UINTN)ImageContext->ImageAddress +\r
+                      sizeof(EFI_TE_IMAGE_HEADER)\r
+                      );\r
+    NumberOfSections  = (UINTN) (Hdr.Te->NumberOfSections);\r
 \r
   }\r
 \r
 \r
   }\r
 \r
@@ -835,8 +886,8 @@ PeCoffLoaderLoadImage (
             Section->VirtualAddress + Section->Misc.VirtualSize - 1\r
             );\r
     if (ImageContext->IsTeImage) {\r
             Section->VirtualAddress + Section->Misc.VirtualSize - 1\r
             );\r
     if (ImageContext->IsTeImage) {\r
-      Base  = (CHAR8 *) ((UINTN) Base + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN) TeHdr->StrippedSize);\r
-      End   = (CHAR8 *) ((UINTN) End + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN) TeHdr->StrippedSize);\r
+      Base = (CHAR8 *)((UINTN) Base + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN)Hdr.Te->StrippedSize);\r
+      End  = (CHAR8 *)((UINTN) End +  sizeof (EFI_TE_IMAGE_HEADER) - (UINTN)Hdr.Te->StrippedSize);\r
     }\r
 \r
     if (End > MaxEnd) {\r
     }\r
 \r
     if (End > MaxEnd) {\r
@@ -869,7 +920,7 @@ PeCoffLoaderLoadImage (
       } else {\r
         Status = ImageContext->ImageRead (\r
                                 ImageContext->Handle,\r
       } else {\r
         Status = ImageContext->ImageRead (\r
                                 ImageContext->Handle,\r
-                                Section->PointerToRawData + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN) TeHdr->StrippedSize,\r
+                                Section->PointerToRawData + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN)Hdr.Te->StrippedSize,\r
                                 &Size,\r
                                 Base\r
                                 );\r
                                 &Size,\r
                                 Base\r
                                 );\r
@@ -899,17 +950,33 @@ PeCoffLoaderLoadImage (
   // Get image's entry point\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
   // Get image's entry point\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
-    ImageContext->EntryPoint = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (\r
-                                                                ImageContext,\r
-                                                                PeHdr->OptionalHeader.AddressOfEntryPoint\r
-                                                                );\r
+    //\r
+    // Sizes of AddressOfEntryPoint are different so we need to do this safely\r
+    //\r
+    if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+      //\r
+      // Use PE32 offset\r
+      //      \r
+      ImageContext->EntryPoint = (PHYSICAL_ADDRESS)(UINTN)PeCoffLoaderImageAddress (\r
+                                                            ImageContext,\r
+                                                            (UINTN)Hdr.Pe32->OptionalHeader.AddressOfEntryPoint\r
+                                                            );\r
+    } else {\r
+      //\r
+      // Use PE32+ offset\r
+      //\r
+      ImageContext->EntryPoint = (PHYSICAL_ADDRESS)(UINTN)PeCoffLoaderImageAddress (\r
+                                                            ImageContext,\r
+                                                            (UINTN)Hdr.Pe32Plus->OptionalHeader.AddressOfEntryPoint\r
+                                                            );\r
+    }\r
   } else {\r
     ImageContext->EntryPoint =  (PHYSICAL_ADDRESS) (\r
   } else {\r
     ImageContext->EntryPoint =  (PHYSICAL_ADDRESS) (\r
-                       (UINTN)ImageContext->ImageAddress +\r
-                       (UINTN)TeHdr->AddressOfEntryPoint +\r
-                       (UINTN)sizeof(EFI_TE_IMAGE_HEADER) -\r
-          (UINTN) TeHdr->StrippedSize\r
-      );\r
+                                (UINTN)ImageContext->ImageAddress  +\r
+                                (UINTN)Hdr.Te->AddressOfEntryPoint +\r
+                                (UINTN)sizeof(EFI_TE_IMAGE_HEADER) -\r
+                                (UINTN)Hdr.Te->StrippedSize\r
+                                );\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
@@ -920,15 +987,27 @@ PeCoffLoaderLoadImage (
   // the optional header to verify a desired directory entry is there.\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
   // the optional header to verify a desired directory entry is there.\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
-    if (PeHdr->OptionalHeader.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
-      DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)\r
-        &PeHdr->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+    if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+      //\r
+      // Use PE32 offset\r
+      //\r
+      NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
+      DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+    } else {\r
+      //\r
+      // Use PE32+ offset\r
+      //\r
+      NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
+      DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];\r
+    }\r
\r
+    if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
       ImageContext->FixupDataSize = DirectoryEntry->Size / sizeof (UINT16) * sizeof (UINTN);\r
     } else {\r
       ImageContext->FixupDataSize = 0;\r
     }\r
   } else {\r
       ImageContext->FixupDataSize = DirectoryEntry->Size / sizeof (UINT16) * sizeof (UINTN);\r
     } else {\r
       ImageContext->FixupDataSize = 0;\r
     }\r
   } else {\r
-    DirectoryEntry              = &TeHdr->DataDirectory[0];\r
+    DirectoryEntry              = &Hdr.Te->DataDirectory[0];\r
     ImageContext->FixupDataSize = DirectoryEntry->Size / sizeof (UINT16) * sizeof (UINTN);\r
   }\r
   //\r
     ImageContext->FixupDataSize = DirectoryEntry->Size / sizeof (UINT16) * sizeof (UINTN);\r
   }\r
   //\r
@@ -948,18 +1027,18 @@ PeCoffLoaderLoadImage (
                     );\r
     } else {\r
       DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)(UINTN)(\r
                     );\r
     } else {\r
       DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)(UINTN)(\r
-                                               ImageContext->ImageAddress +\r
-                                               ImageContext->DebugDirectoryEntryRva +\r
-                                               sizeof(EFI_TE_IMAGE_HEADER) -\r
-                                               TeHdr->StrippedSize\r
-                                               );\r
+                      ImageContext->ImageAddress +\r
+                      ImageContext->DebugDirectoryEntryRva +\r
+                      sizeof(EFI_TE_IMAGE_HEADER) -\r
+                      Hdr.Te->StrippedSize\r
+                      );\r
     }\r
 \r
     if (DebugEntry != NULL) {\r
       TempDebugEntryRva = DebugEntry->RVA;\r
       if (DebugEntry->RVA == 0 && DebugEntry->FileOffset != 0) {\r
         Section--;\r
     }\r
 \r
     if (DebugEntry != NULL) {\r
       TempDebugEntryRva = DebugEntry->RVA;\r
       if (DebugEntry->RVA == 0 && DebugEntry->FileOffset != 0) {\r
         Section--;\r
-        if ((UINTN) Section->SizeOfRawData < Section->Misc.VirtualSize) {\r
+        if ((UINTN)Section->SizeOfRawData < Section->Misc.VirtualSize) {\r
           TempDebugEntryRva = Section->VirtualAddress + Section->Misc.VirtualSize;\r
         } else {\r
           TempDebugEntryRva = Section->VirtualAddress + Section->SizeOfRawData;\r
           TempDebugEntryRva = Section->VirtualAddress + Section->Misc.VirtualSize;\r
         } else {\r
           TempDebugEntryRva = Section->VirtualAddress + Section->SizeOfRawData;\r
@@ -971,11 +1050,11 @@ PeCoffLoaderLoadImage (
           ImageContext->CodeView = PeCoffLoaderImageAddress (ImageContext, TempDebugEntryRva);\r
         } else {\r
           ImageContext->CodeView = (VOID *)(\r
           ImageContext->CodeView = PeCoffLoaderImageAddress (ImageContext, TempDebugEntryRva);\r
         } else {\r
           ImageContext->CodeView = (VOID *)(\r
-                      (UINTN)ImageContext->ImageAddress +\r
-                      (UINTN)TempDebugEntryRva +\r
-                      (UINTN)sizeof(EFI_TE_IMAGE_HEADER) -\r
-                (UINTN) TeHdr->StrippedSize\r
-            );\r
+                                    (UINTN)ImageContext->ImageAddress +\r
+                                    (UINTN)TempDebugEntryRva +\r
+                                    (UINTN)sizeof (EFI_TE_IMAGE_HEADER) -\r
+                                    (UINTN) Hdr.Te->StrippedSize\r
+                                    );\r
         }\r
 \r
         if (ImageContext->CodeView == NULL) {\r
         }\r
 \r
         if (ImageContext->CodeView == NULL) {\r
@@ -995,7 +1074,7 @@ PeCoffLoaderLoadImage (
           } else {\r
             Status = ImageContext->ImageRead (\r
                                     ImageContext->Handle,\r
           } else {\r
             Status = ImageContext->ImageRead (\r
                                     ImageContext->Handle,\r
-                                    DebugEntry->FileOffset + sizeof (EFI_TE_IMAGE_HEADER) - TeHdr->StrippedSize,\r
+                                    DebugEntry->FileOffset + sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize,\r
                                     &Size,\r
                                     ImageContext->CodeView\r
                                     );\r
                                     &Size,\r
                                     ImageContext->CodeView\r
                                     );\r
@@ -1016,11 +1095,11 @@ PeCoffLoaderLoadImage (
 \r
         switch (*(UINT32 *) ImageContext->CodeView) {\r
         case CODEVIEW_SIGNATURE_NB10:\r
 \r
         switch (*(UINT32 *) ImageContext->CodeView) {\r
         case CODEVIEW_SIGNATURE_NB10:\r
-          ImageContext->PdbPointer = (CHAR8 *) ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
+          ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
           break;\r
 \r
         case CODEVIEW_SIGNATURE_RSDS:\r
           break;\r
 \r
         case CODEVIEW_SIGNATURE_RSDS:\r
-          ImageContext->PdbPointer = (CHAR8 *) ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
+          ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
           break;\r
 \r
         default:\r
           break;\r
 \r
         default:\r
@@ -1032,3 +1111,228 @@ PeCoffLoaderLoadImage (
 \r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
+\r
+\r
+/**\r
+  Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI\r
+  runtime. \r
+  \r
+  PE_COFF_LOADER_IMAGE_CONTEXT.FixupData stores information needed to reapply\r
+  the fixups with a virtual mapping.\r
+\r
+\r
+  @param  ImageBase          Base address of relocated image\r
+  @param  VirtImageBase      Virtual mapping for ImageBase\r
+  @param  ImageSize          Size of the image to relocate\r
+  @param  RelocationData     Location to place results of read\r
+  \r
+**/\r
+VOID\r
+EFIAPI\r
+PeCoffLoaderRelocateImageForRuntime (\r
+  IN  PHYSICAL_ADDRESS        ImageBase,\r
+  IN  PHYSICAL_ADDRESS        VirtImageBase,\r
+  IN  UINTN                   ImageSize,\r
+  IN  VOID                    *RelocationData\r
+  )\r
+{\r
+  CHAR8                               *OldBase;\r
+  CHAR8                               *NewBase;\r
+  EFI_IMAGE_DOS_HEADER                *DosHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+  UINT32                              NumberOfRvaAndSizes;\r
+  EFI_IMAGE_DATA_DIRECTORY            *DataDirectory;\r
+  EFI_IMAGE_DATA_DIRECTORY            *RelocDir;\r
+  EFI_IMAGE_BASE_RELOCATION           *RelocBase;\r
+  EFI_IMAGE_BASE_RELOCATION           *RelocBaseEnd;\r
+  UINT16                              *Reloc;\r
+  UINT16                              *RelocEnd;\r
+  CHAR8                               *Fixup;\r
+  CHAR8                               *FixupBase;\r
+  UINT16                              *F16;\r
+  UINT32                              *F32;\r
+  UINT64                              *F64;\r
+  CHAR8                               *FixupData;\r
+  UINTN                               Adjust;\r
+  RETURN_STATUS                       Status;\r
+\r
+  OldBase = (CHAR8 *)((UINTN)ImageBase);\r
+  NewBase = (CHAR8 *)((UINTN)VirtImageBase);\r
+  Adjust = (UINTN) NewBase - (UINTN) OldBase;\r
+\r
+  //\r
+  // Find the image's relocate dir info\r
+  //\r
+  DosHdr = (EFI_IMAGE_DOS_HEADER *)OldBase;\r
+  if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
+    //\r
+    // Valid DOS header so get address of PE header\r
+    //\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)(((CHAR8 *)DosHdr) + DosHdr->e_lfanew);\r
+  } else {\r
+    //\r
+    // No Dos header so assume image starts with PE header.\r
+    //\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)OldBase;\r
+  }\r
+\r
+  if (Hdr.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) {\r
+    //\r
+    // Not a valid PE image so Exit\r
+    //\r
+    return ;\r
+  }\r
+\r
+  //\r
+  // Get some data from the PE type dependent data\r
+  //\r
+  if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+    //     \r
+    // Use PE32 offset\r
+    //\r
+    NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
+    DataDirectory = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+  } else {\r
+    //     \r
+    // Use PE32+ offset\r
+    //\r
+    NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
+    DataDirectory = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+  }    \r
+\r
+  //\r
+  // Find the relocation block\r
+  //\r
+  // Per the PE/COFF spec, you can't assume that a given data directory\r
+  // is present in the image. You have to check the NumberOfRvaAndSizes in\r
+  // the optional header to verify a desired directory entry is there.\r
+  //    \r
+  if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {\r
+    RelocDir      = DataDirectory + EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC;\r
+    RelocBase     = (EFI_IMAGE_BASE_RELOCATION *)(UINTN)(ImageBase + RelocDir->VirtualAddress);\r
+    RelocBaseEnd  = (EFI_IMAGE_BASE_RELOCATION *)(UINTN)(ImageBase + RelocDir->VirtualAddress + RelocDir->Size);\r
+  } else {\r
+    //\r
+    // Cannot find relocations, cannot continue\r
+    //\r
+    ASSERT (FALSE);\r
+    return ;\r
+  }\r
+\r
+  ASSERT (RelocBase != NULL && RelocBaseEnd != NULL);\r
+\r
+  //\r
+  // Run the whole relocation block. And re-fixup data that has not been\r
+  // modified. The FixupData is used to see if the image has been modified\r
+  // since it was relocated. This is so data sections that have been updated\r
+  // by code will not be fixed up, since that would set them back to\r
+  // defaults.\r
+  //\r
+  FixupData = RelocationData;\r
+  while (RelocBase < RelocBaseEnd) {\r
+\r
+    Reloc     = (UINT16 *) ((UINT8 *) RelocBase + sizeof (EFI_IMAGE_BASE_RELOCATION));\r
+    RelocEnd  = (UINT16 *) ((UINT8 *) RelocBase + RelocBase->SizeOfBlock);\r
+    FixupBase = (CHAR8 *) ((UINTN)ImageBase) + RelocBase->VirtualAddress;\r
+\r
+    //\r
+    // Run this relocation record\r
+    //\r
+    while (Reloc < RelocEnd) {\r
+\r
+      Fixup = FixupBase + (*Reloc & 0xFFF);\r
+      switch ((*Reloc) >> 12) {\r
+\r
+      case EFI_IMAGE_REL_BASED_ABSOLUTE:\r
+        break;\r
+\r
+      case EFI_IMAGE_REL_BASED_HIGH:\r
+        F16 = (UINT16 *) Fixup;\r
+        if (*(UINT16 *) FixupData == *F16) {\r
+          *F16 = (UINT16) ((*F16 << 16) + ((UINT16) Adjust & 0xffff));\r
+        }\r
+\r
+        FixupData = FixupData + sizeof (UINT16);\r
+        break;\r
+\r
+      case EFI_IMAGE_REL_BASED_LOW:\r
+        F16 = (UINT16 *) Fixup;\r
+        if (*(UINT16 *) FixupData == *F16) {\r
+          *F16 = (UINT16) (*F16 + ((UINT16) Adjust & 0xffff));\r
+        }\r
+\r
+        FixupData = FixupData + sizeof (UINT16);\r
+        break;\r
+\r
+      case EFI_IMAGE_REL_BASED_HIGHLOW:\r
+        F32       = (UINT32 *) Fixup;\r
+        FixupData = ALIGN_POINTER (FixupData, sizeof (UINT32));\r
+        if (*(UINT32 *) FixupData == *F32) {\r
+          *F32 = *F32 + (UINT32) Adjust;\r
+        }\r
+\r
+        FixupData = FixupData + sizeof (UINT32);\r
+        break;\r
+\r
+      case EFI_IMAGE_REL_BASED_DIR64:\r
+        F64       = (UINT64 *)Fixup;\r
+        FixupData = ALIGN_POINTER (FixupData, sizeof (UINT64));\r
+        if (*(UINT32 *) FixupData == *F64) {\r
+          *F64 = *F64 + (UINT64)Adjust;\r
+        }\r
+        break;\r
+\r
+      case EFI_IMAGE_REL_BASED_HIGHADJ:\r
+        //\r
+        // Not implemented, but not used in EFI 1.0\r
+        //\r
+        ASSERT (FALSE);\r
+        break;\r
+\r
+      default:\r
+        //\r
+        // Only Itanium requires ConvertPeImage_Ex\r
+        //\r
+        Status = PeHotRelocateImageEx (Reloc, Fixup, &FixupData, Adjust);\r
+        if (RETURN_ERROR (Status)) {\r
+          return ;\r
+        }\r
+      }\r
+      //\r
+      // Next relocation record\r
+      //\r
+      Reloc += 1;\r
+    }\r
+    //\r
+    // next reloc block\r
+    //\r
+    RelocBase = (EFI_IMAGE_BASE_RELOCATION *) RelocEnd;\r
+  }\r
+}\r
+\r
+\r
+/**\r
+  ImageRead function that operates on a memory buffer whos base is passed into\r
+  FileHandle. \r
+\r
+  @param  FileHandle        Ponter to baes of the input stream\r
+  @param  FileOffset        Offset to the start of the buffer\r
+  @param  ReadSize          Number of bytes to copy into the buffer\r
+  @param  Buffer            Location to place results of read\r
+\r
+  @retval RETURN_SUCCESS    Data is read from FileOffset from the Handle into \r
+                            the buffer.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+PeCoffLoaderImageReadFromMemory (\r
+  IN     VOID    *FileHandle,\r
+  IN     UINTN   FileOffset,\r
+  IN OUT UINTN   *ReadSize,\r
+  OUT    VOID    *Buffer\r
+  )\r
+{\r
+  CopyMem (Buffer, ((UINT8 *)FileHandle) + FileOffset, *ReadSize);\r
+  return RETURN_SUCCESS;\r
+}\r
+\r
index 69094ad1b837e2935a4e9316ba140b9a3b55bd03..6e4f9e0e36d13c005b02e96e7e142981f249e915 100644 (file)
@@ -1,15 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-Copyright (c) 2006, Intel Corporation\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
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
   <MsaHeader>\r
     <ModuleName>BasePeCoffLib</ModuleName>\r
     <ModuleType>BASE</ModuleType>\r
   <MsaHeader>\r
     <ModuleName>BasePeCoffLib</ModuleName>\r
     <ModuleType>BASE</ModuleType>\r
@@ -18,11 +8,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <Abstract>Component description file for Base PE/COFF Library</Abstract>\r
     <Description>PE/COFF Loader Library implementation.</Description>\r
     <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
     <Abstract>Component description file for Base PE/COFF Library</Abstract>\r
     <Description>PE/COFF Loader Library implementation.</Description>\r
     <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
-    <License>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
-      THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+    <License>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.</License>\r
     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
   </MsaHeader>\r
       WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>\r
     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
   </MsaHeader>\r
@@ -41,6 +31,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>DebugLib</Keyword>\r
     </LibraryClass>\r
     <LibraryClass Usage="ALWAYS_CONSUMED">\r
       <Keyword>DebugLib</Keyword>\r
     </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>PcdLib</Keyword>\r
+    </LibraryClass>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>BasePeCoff.c</Filename>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
     <Filename>BasePeCoff.c</Filename>\r
index fe41ac03bd5d25bc1c27264c4758e0fe0664c9a1..4289d0bb954c49d097fc4667420dede4b5261e74 100644 (file)
@@ -38,3 +38,56 @@ PeCoffLoaderRelocateImageEx (
 {\r
   return RETURN_UNSUPPORTED;\r
 }\r
 {\r
   return RETURN_UNSUPPORTED;\r
 }\r
+\r
+/**\r
+  Returns TRUE if the machine type of PE/COFF image is supported. Supported \r
+  does not mean the image can be executed it means the PE/COFF loader supports\r
+  loading and relocating of the image type. It's up to the caller to support\r
+  the entry point. \r
+\r
+  This function implies the basic PE/COFF loader/relocator supports IA32, EBC,\r
+  & X64 images. Calling the entry point in a correct mannor is up to the \r
+  consumer of this library.\r
+\r
+  @param  Machine   Machine type from the PE Header.\r
+\r
+  @return TRUE if this PE/COFF loader can load the image\r
+\r
+**/\r
+BOOLEAN\r
+PeCoffLoaderImageFormatSupported (\r
+  IN  UINT16  Machine\r
+  )\r
+{\r
+  if ((Machine == EFI_IMAGE_MACHINE_IA32) || (Machine == EFI_IMAGE_MACHINE_X64) || \r
+      (Machine ==  EFI_IMAGE_MACHINE_EBC)) {\r
+    return TRUE; \r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  Performs an Itanium-based specific re-relocation fixup and is a no-op on other\r
+  instruction sets. This is used to re-relocated the image into the EFI virtual\r
+  space for runtime calls.\r
+\r
+  @param  Reloc       Pointer to the relocation record.\r
+  @param  Fixup       Pointer to the address to fix up.\r
+  @param  FixupData   Pointer to a buffer to log the fixups.\r
+  @param  Adjust      The offset to adjust the fixup.\r
+\r
+  @return Status code.\r
+\r
+**/\r
+RETURN_STATUS\r
+PeHotRelocateImageEx (\r
+  IN UINT16      *Reloc,\r
+  IN OUT CHAR8   *Fixup,\r
+  IN OUT CHAR8   **FixupData,\r
+  IN UINT64      Adjust\r
+  )\r
+{\r
+  return RETURN_UNSUPPORTED;\r
+}\r
index 9a2b2a04dd9067c67841ab811f6441ddf9fbb9d7..9515a09f4d318605267b501f04234a77bfa31637 100644 (file)
@@ -39,3 +39,56 @@ PeCoffLoaderRelocateImageEx (
 {\r
   return RETURN_UNSUPPORTED;\r
 }\r
 {\r
   return RETURN_UNSUPPORTED;\r
 }\r
+\r
+/**\r
+  Returns TRUE if the machine type of PE/COFF image is supported. Supported \r
+  does not mean the image can be executed it means the PE/COFF loader supports\r
+  loading and relocating of the image type. It's up to the caller to support\r
+  the entry point. \r
+\r
+  This function implies the basic PE/COFF loader/relocator supports IA32, EBC,\r
+  & X64 images. Calling the entry point in a correct mannor is up to the \r
+  consumer of this library.\r
+\r
+  @param  Machine   Machine type from the PE Header.\r
+\r
+  @return TRUE if this PE/COFF loader can load the image\r
+\r
+**/\r
+BOOLEAN\r
+PeCoffLoaderImageFormatSupported (\r
+  IN  UINT16  Machine\r
+  )\r
+{\r
+  if ((Machine == EFI_IMAGE_MACHINE_IA32) || (Machine == EFI_IMAGE_MACHINE_X64) || \r
+      (Machine ==  EFI_IMAGE_MACHINE_EBC)) {\r
+    return TRUE; \r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+/**\r
+  Performs an Itanium-based specific re-relocation fixup and is a no-op on other\r
+  instruction sets. This is used to re-relocated the image into the EFI virtual\r
+  space for runtime calls.\r
+\r
+  @param  Reloc       Pointer to the relocation record.\r
+  @param  Fixup       Pointer to the address to fix up.\r
+  @param  FixupData   Pointer to a buffer to log the fixups.\r
+  @param  Adjust      The offset to adjust the fixup.\r
+\r
+  @return Status code.\r
+\r
+**/\r
+RETURN_STATUS\r
+PeHotRelocateImageEx (\r
+  IN UINT16      *Reloc,\r
+  IN OUT CHAR8   *Fixup,\r
+  IN OUT CHAR8   **FixupData,\r
+  IN UINT64      Adjust\r
+  )\r
+{\r
+  return RETURN_UNSUPPORTED;\r
+}\r
+\r
index 57c6555408d2d087ea411369707b0c3c948c0b57..adbd3fca81939da96c3440e696ebf3eac73fe594 100644 (file)
@@ -88,17 +88,6 @@ PeCoffLoaderRelocateImageEx (
   UINT64      FixupVal;\r
 \r
   switch ((*Reloc) >> 12) {\r
   UINT64      FixupVal;\r
 \r
   switch ((*Reloc) >> 12) {\r
-\r
-    case EFI_IMAGE_REL_BASED_DIR64:\r
-      F64 = (UINT64 *) Fixup;\r
-      *F64 = *F64 + (UINT64) Adjust;\r
-      if (*FixupData != NULL) {\r
-        *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64));\r
-        *(UINT64 *)(*FixupData) = *F64;\r
-        *FixupData = *FixupData + sizeof(UINT64);\r
-      }\r
-      break;\r
-\r
     case EFI_IMAGE_REL_BASED_IA64_IMM64:\r
 \r
       //\r
     case EFI_IMAGE_REL_BASED_IA64_IMM64:\r
 \r
       //\r
@@ -225,3 +214,232 @@ PeCoffLoaderRelocateImageEx (
 \r
   return RETURN_SUCCESS;\r
 }\r
 \r
   return RETURN_SUCCESS;\r
 }\r
+\r
+/**\r
+  Returns TRUE if the machine type of PE/COFF image is supported. Supported \r
+  does not mean the image can be executed it means the PE/COFF loader supports\r
+  loading and relocating of the image type. It's up to the caller to support\r
+  the entry point. \r
+\r
+  This function implies the basic PE/COFF loader/relocator supports IA32, EBC,\r
+  & X64 images. Calling the entry point in a correct mannor is up to the \r
+  consumer of this library. This version also supports the special relocations\r
+  for Itanium. \r
+\r
+  @param  Machine   Machine type from the PE Header.\r
+\r
+  @return TRUE if this PE/COFF loader can load the image\r
+\r
+**/\r
+BOOLEAN\r
+PeCoffLoaderImageFormatSupported (\r
+  IN  UINT16  Machine\r
+  )\r
+{\r
+  if ((Machine == EFI_IMAGE_MACHINE_IPF) || (Machine == EFI_IMAGE_MACHINE_IA32) ||\r
+      (Machine ==  EFI_IMAGE_MACHINE_EBC) || (Machine == EFI_IMAGE_MACHINE_X64)) {\r
+    return TRUE; \r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  ImageRead function that operates on a memory buffer whos base is passed into\r
+  FileHandle. \r
+\r
+  @param  Reloc             Ponter to baes of the input stream\r
+  @param  Fixup             Offset to the start of the buffer\r
+  @param  FixupData         Number of bytes to copy into the buffer\r
+  @param  Adjust            Location to place results of read\r
+\r
+  @retval RETURN_SUCCESS    Data is read from FileOffset from the Handle into \r
+                            the buffer.\r
+**/\r
+RETURN_STATUS\r
+PeHotRelocateImageEx (\r
+  IN UINT16      *Reloc,\r
+  IN OUT CHAR8   *Fixup,\r
+  IN OUT CHAR8   **FixupData,\r
+  IN UINT64      Adjust\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Performs an IPF specific relocation fixup\r
+\r
+Arguments:\r
+\r
+  Reloc      - Pointer to the relocation record\r
+\r
+  Fixup      - Pointer to the address to fix up\r
+\r
+  FixupData  - Pointer to a buffer to log the fixups\r
+\r
+  Adjust     - The offset to adjust the fixup\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  UINT64  *F64;\r
+  UINT64  FixupVal;\r
+\r
+  switch ((*Reloc) >> 12) {\r
+  case EFI_IMAGE_REL_BASED_DIR64:\r
+    F64         = (UINT64 *) Fixup;\r
+    *FixupData  = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
+    if (*(UINT64 *) (*FixupData) == *F64) {\r
+      *F64 = *F64 + (UINT64) Adjust;\r
+    }\r
+\r
+    *FixupData = *FixupData + sizeof (UINT64);\r
+    break;\r
+\r
+  case EFI_IMAGE_REL_BASED_IA64_IMM64:\r
+    F64         = (UINT64 *) Fixup;\r
+    *FixupData  = ALIGN_POINTER (*FixupData, sizeof (UINT64));\r
+    if (*(UINT64 *) (*FixupData) == *F64) {\r
+      //\r
+      // Align it to bundle address before fixing up the\r
+      // 64-bit immediate value of the movl instruction.\r
+      //\r
+      //\r
+      Fixup     = (CHAR8 *) ((UINT64) Fixup & (UINT64)~(15));\r
+      FixupVal  = (UINT64) 0;\r
+\r
+      //\r
+      // Extract the lower 32 bits of IMM64 from bundle\r
+      //\r
+      EXT_IMM64 (\r
+        FixupVal,\r
+        (UINT32 *) Fixup + IMM64_IMM7B_INST_WORD_X,\r
+        IMM64_IMM7B_SIZE_X,\r
+        IMM64_IMM7B_INST_WORD_POS_X,\r
+        IMM64_IMM7B_VAL_POS_X\r
+        );\r
+\r
+      EXT_IMM64 (\r
+        FixupVal,\r
+        (UINT32 *) Fixup + IMM64_IMM9D_INST_WORD_X,\r
+        IMM64_IMM9D_SIZE_X,\r
+        IMM64_IMM9D_INST_WORD_POS_X,\r
+        IMM64_IMM9D_VAL_POS_X\r
+        );\r
+\r
+      EXT_IMM64 (\r
+        FixupVal,\r
+        (UINT32 *) Fixup + IMM64_IMM5C_INST_WORD_X,\r
+        IMM64_IMM5C_SIZE_X,\r
+        IMM64_IMM5C_INST_WORD_POS_X,\r
+        IMM64_IMM5C_VAL_POS_X\r
+        );\r
+\r
+      EXT_IMM64 (\r
+        FixupVal,\r
+        (UINT32 *) Fixup + IMM64_IC_INST_WORD_X,\r
+        IMM64_IC_SIZE_X,\r
+        IMM64_IC_INST_WORD_POS_X,\r
+        IMM64_IC_VAL_POS_X\r
+        );\r
+\r
+      EXT_IMM64 (\r
+        FixupVal,\r
+        (UINT32 *) Fixup + IMM64_IMM41a_INST_WORD_X,\r
+        IMM64_IMM41a_SIZE_X,\r
+        IMM64_IMM41a_INST_WORD_POS_X,\r
+        IMM64_IMM41a_VAL_POS_X\r
+        );\r
+\r
+      //\r
+      // Update 64-bit address\r
+      //\r
+      FixupVal += Adjust;\r
+\r
+      //\r
+      // Insert IMM64 into bundle\r
+      //\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IMM7B_INST_WORD_X),\r
+        IMM64_IMM7B_SIZE_X,\r
+        IMM64_IMM7B_INST_WORD_POS_X,\r
+        IMM64_IMM7B_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IMM9D_INST_WORD_X),\r
+        IMM64_IMM9D_SIZE_X,\r
+        IMM64_IMM9D_INST_WORD_POS_X,\r
+        IMM64_IMM9D_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IMM5C_INST_WORD_X),\r
+        IMM64_IMM5C_SIZE_X,\r
+        IMM64_IMM5C_INST_WORD_POS_X,\r
+        IMM64_IMM5C_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IC_INST_WORD_X),\r
+        IMM64_IC_SIZE_X,\r
+        IMM64_IC_INST_WORD_POS_X,\r
+        IMM64_IC_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IMM41a_INST_WORD_X),\r
+        IMM64_IMM41a_SIZE_X,\r
+        IMM64_IMM41a_INST_WORD_POS_X,\r
+        IMM64_IMM41a_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IMM41b_INST_WORD_X),\r
+        IMM64_IMM41b_SIZE_X,\r
+        IMM64_IMM41b_INST_WORD_POS_X,\r
+        IMM64_IMM41b_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_IMM41c_INST_WORD_X),\r
+        IMM64_IMM41c_SIZE_X,\r
+        IMM64_IMM41c_INST_WORD_POS_X,\r
+        IMM64_IMM41c_VAL_POS_X\r
+        );\r
+\r
+      INS_IMM64 (\r
+        FixupVal,\r
+        ((UINT32 *) Fixup + IMM64_SIGN_INST_WORD_X),\r
+        IMM64_SIGN_SIZE_X,\r
+        IMM64_SIGN_INST_WORD_POS_X,\r
+        IMM64_SIGN_VAL_POS_X\r
+        );\r
+\r
+      *(UINT64 *) (*FixupData) = *F64;\r
+    }\r
+\r
+    *FixupData = *FixupData + sizeof (UINT64);\r
+    break;\r
+\r
+  default:\r
+    DEBUG ((EFI_D_ERROR, "PeHotRelocateEx:unknown fixed type\n"));\r
+    return RETURN_UNSUPPORTED;\r
+  }\r
+\r
+  return RETURN_SUCCESS;\r
+}\r
+\r
+\r
+\r
index db7eead97d0c47ebdfbe06038504c5fbc469dc01..7141adc2ad5ddc5d06ad50f1ca38864022c1f47f 100644 (file)
@@ -31,23 +31,58 @@ PeCoffLoaderRelocateImageEx (
   IN UINT64      Adjust\r
   )\r
 {\r
   IN UINT64      Adjust\r
   )\r
 {\r
-  UINT64      *F64;\r
-\r
-  switch ((*Reloc) >> 12) {\r
-\r
-    case EFI_IMAGE_REL_BASED_DIR64:\r
-      F64 = (UINT64 *) Fixup;\r
-      *F64 = *F64 + (UINT64) Adjust;\r
-      if (*FixupData != NULL) {\r
-        *FixupData = ALIGN_POINTER(*FixupData, sizeof(UINT64));\r
-        *(UINT64 *)(*FixupData) = *F64;\r
-        *FixupData = *FixupData + sizeof(UINT64);\r
-      }\r
-      break;\r
-\r
-    default:\r
-      return RETURN_UNSUPPORTED;\r
+  return RETURN_UNSUPPORTED;\r
+}\r
+\r
+/**\r
+  Returns TRUE if the machine type of PE/COFF image is supported. Supported \r
+  does not mean the image can be executed it means the PE/COFF loader supports\r
+  loading and relocating of the image type. It's up to the caller to support\r
+  the entry point. \r
+\r
+  This function implies the basic PE/COFF loader/relocator supports IA32, EBC,\r
+  & X64 images. Calling the entry point in a correct mannor is up to the \r
+  consumer of this library.\r
+\r
+  @param  Machine   Machine type from the PE Header.\r
+\r
+  @return TRUE if this PE/COFF loader can load the image\r
+\r
+**/\r
+BOOLEAN\r
+PeCoffLoaderImageFormatSupported (\r
+  IN  UINT16  Machine\r
+  )\r
+{\r
+  if ((Machine == EFI_IMAGE_MACHINE_IA32) || (Machine == EFI_IMAGE_MACHINE_X64) || \r
+      (Machine ==  EFI_IMAGE_MACHINE_EBC)) {\r
+    return TRUE; \r
   }\r
 \r
   }\r
 \r
-  return RETURN_SUCCESS;\r
+  return FALSE;\r
+}\r
+\r
+\r
+/**\r
+  Performs an Itanium-based specific re-relocation fixup and is a no-op on other\r
+  instruction sets. This is used to re-relocated the image into the EFI virtual\r
+  space for runtime calls.\r
+\r
+  @param  Reloc       Pointer to the relocation record.\r
+  @param  Fixup       Pointer to the address to fix up.\r
+  @param  FixupData   Pointer to a buffer to log the fixups.\r
+  @param  Adjust      The offset to adjust the fixup.\r
+\r
+  @return Status code.\r
+\r
+**/\r
+RETURN_STATUS\r
+PeHotRelocateImageEx (\r
+  IN UINT16      *Reloc,\r
+  IN OUT CHAR8   *Fixup,\r
+  IN OUT CHAR8   **FixupData,\r
+  IN UINT64      Adjust\r
+  )\r
+{\r
+  return RETURN_UNSUPPORTED;\r
 }\r
 }\r