From ca3ad58bfa2284f0dc98ec904423e83874a90f52 Mon Sep 17 00:00:00 2001
From: andrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Date: Sun, 31 Jan 2010 01:39:20 +0000
Subject: [PATCH] Updated to support passing PE/COFF and LZMA decompress up via
 HOBS. Currently turned off.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9887 6f19259b-4bc3-4df7-8a09-765794883524
---
 BeagleBoardPkg/BeagleBoardPkg.dsc             |  9 +++--
 BeagleBoardPkg/BeagleBoardPkg.fdf             |  6 ++--
 BeagleBoardPkg/Sec/Sec.c                      | 14 +++++++-
 BeagleBoardPkg/Sec/Sec.inf                    |  1 +
 BeagleBoardPkg/build.sh                       |  2 +-
 EmbeddedPkg/Include/Guid/ExtractSection.h     |  7 ++--
 EmbeddedPkg/Include/Library/PrePiLib.h        |  1 +
 EmbeddedPkg/Include/Protocol/ExtractSection.h | 33 -----------------
 EmbeddedPkg/Include/Protocol/PeCoffLoader.h   |  3 ++
 .../Library/DxeHobPeCoffLib/DxeHobPeCoff.c    | 36 ++++++++++++++-----
 .../DxeHobPeCoffLib/DxeHobPeCoffLib.inf       |  6 +++-
 .../LzmaHobCustomDecompressLib.c              |  4 +--
 EmbeddedPkg/Library/PrePiLib/Hob.c            | 20 +++++------
 13 files changed, 75 insertions(+), 67 deletions(-)
 delete mode 100755 EmbeddedPkg/Include/Protocol/ExtractSection.h

diff --git a/BeagleBoardPkg/BeagleBoardPkg.dsc b/BeagleBoardPkg/BeagleBoardPkg.dsc
index 7679216a29..f9b1d2ef7b 100644
--- a/BeagleBoardPkg/BeagleBoardPkg.dsc
+++ b/BeagleBoardPkg/BeagleBoardPkg.dsc
@@ -57,7 +57,6 @@
   
   
   PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
-  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   
   #
   # Uncomment (and comment out the next line) For RealView Debugger. The Standard IO window 
@@ -120,6 +119,7 @@
   UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
   ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.inf
   LzmaDecompressLib|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
 
 [LibraryClasses.common.PEI_CORE]
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
@@ -133,6 +133,8 @@
   ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
   UefiDecompressLib|MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.inf
   DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+#  PeCoffLib|EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
 
 [LibraryClasses.common.DXE_DRIVER]
   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
@@ -154,6 +156,8 @@
   MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
   ReportStatusCodeLib|IntelFrameworkModulePkg/Library/DxeReportStatusCodeLibFramework/DxeReportStatusCodeLib.inf
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+  PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
+#  PeCoffLib|EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
 
 
 [LibraryClasses.ARM]
@@ -293,9 +297,7 @@
   gBeagleBoardTokenSpaceGuid.PcdBeagleConsoleUart|3
   
   # Timers
-#  gBeagleBoardTokenSpaceGuid.PcdBeagleArchTimer|OMAP3530_GPTIMER3
   gBeagleBoardTokenSpaceGuid.PcdBeagleArchTimer|3
-#  gBeagleBoardTokenSpaceGuid.PcdBeagleFreeTimer|OMAP3530_GPTIMER4
   gBeagleBoardTokenSpaceGuid.PcdBeagleFreeTimer|4
   gEmbeddedTokenSpaceGuid.PcdTimerPeriod|100000
   gEmbeddedTokenSpaceGuid.PcdEmbeddedFdPerformanceCounterPeriodInNanoseconds|77
@@ -326,6 +328,7 @@
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
       NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
       NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+#      NULL|EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.inf    
   }
 
   ArmPkg/Drivers/CpuDxe/CpuDxe.inf
diff --git a/BeagleBoardPkg/BeagleBoardPkg.fdf b/BeagleBoardPkg/BeagleBoardPkg.fdf
index d85a389629..5747ec1547 100644
--- a/BeagleBoardPkg/BeagleBoardPkg.fdf
+++ b/BeagleBoardPkg/BeagleBoardPkg.fdf
@@ -156,9 +156,9 @@ READ_LOCK_STATUS   = TRUE
 
   #NOTE: Open source EHCI stack doesn't work on Beagleboard.
   #NOTE: UsbBus and UsbMassStorage don't work using iPhond SDK tool chain.
-  INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
-  INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
-  INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
+  #INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
+  #INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
+  #INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
 
   #
   # UEFI application (Shell Embedded Boot Loader) 
diff --git a/BeagleBoardPkg/Sec/Sec.c b/BeagleBoardPkg/Sec/Sec.c
index a87ff6d65d..448a713f4d 100755
--- a/BeagleBoardPkg/Sec/Sec.c
+++ b/BeagleBoardPkg/Sec/Sec.c
@@ -24,9 +24,11 @@
 #include <Library/PeCoffGetEntryPointLib.h>
 
 #include <Ppi/GuidedSectionExtraction.h>
-
+#include <Guid/LzmaDecompress.h>
 #include <Omap3530/Omap3530.h>
 
+#include "LzmaDecompress.h"
+
 VOID
 EFIAPI 
 _ModuleEntryPoint(
@@ -260,6 +262,16 @@ CEntryPoint (
   ExtractGuidedSectionLibConstructor();
   LzmaDecompressLibConstructor();
 
+  // Build HOBs to pass up our version of stuff the DXE Core needs to save space
+#if 0
+  BuildPeCoffLoaderHob ();
+  BuildExtractSectionHob (
+    &gLzmaCustomDecompressGuid,
+    LzmaGuidedSectionGetInfo,
+    LzmaGuidedSectionExtraction
+    );
+#endif
+
   DecompressFirstFv ();
 
   // Load the DXE Core and transfer control to it
diff --git a/BeagleBoardPkg/Sec/Sec.inf b/BeagleBoardPkg/Sec/Sec.inf
index 58acf9ef4e..87394504ac 100755
--- a/BeagleBoardPkg/Sec/Sec.inf
+++ b/BeagleBoardPkg/Sec/Sec.inf
@@ -37,6 +37,7 @@
   EmbeddedPkg/EmbeddedPkg.dec
   ArmPkg/ArmPkg.dec
   Omap35xxPkg/Omap35xxPkg.dec
+  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
 
 [LibraryClasses]
   BaseLib
diff --git a/BeagleBoardPkg/build.sh b/BeagleBoardPkg/build.sh
index 85ce46eb14..928d3151ee 100755
--- a/BeagleBoardPkg/build.sh
+++ b/BeagleBoardPkg/build.sh
@@ -99,7 +99,7 @@ fi
 # Build the edk2 BeagleBoard code
 #
 if [[ $TARGET == RELEASE ]]; then
-  build -p $WORKSPACE/BeagleBoardPkg/BeagleBoardPkg.dsc -a ARM -t $TARGET_TOOLS -b -D DEBUG_TARGET=RELEASE $1 $2 $3 $4 $5 $6 $7 $8
+  build -p $WORKSPACE/BeagleBoardPkg/BeagleBoardPkg.dsc -a ARM -t $TARGET_TOOLS -b $TARGET -D DEBUG_TARGET=RELEASE $2 $3 $4 $5 $6 $7 $8
 else
   build -p $WORKSPACE/BeagleBoardPkg/BeagleBoardPkg.dsc -a ARM -t $TARGET_TOOLS -b $TARGET $1 $2 $3 $4 $5 $6 $7 $8
 fi
diff --git a/EmbeddedPkg/Include/Guid/ExtractSection.h b/EmbeddedPkg/Include/Guid/ExtractSection.h
index 4dedb60b10..5d337d470c 100755
--- a/EmbeddedPkg/Include/Guid/ExtractSection.h
+++ b/EmbeddedPkg/Include/Guid/ExtractSection.h
@@ -22,11 +22,14 @@
 // The GUID for this protocol mathes the Decompression scheme being used
 // So for example LZMA would be gLzmaCustomDecompressGuid
 //
-
 typedef struct {
-  EFI_HOB_GUID_TYPE                         Hob;                             
   EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER   SectionGetInfo;
   EXTRACT_GUIDED_SECTION_DECODE_HANDLER     SectionExtraction;
+} EXTRACT_SECTION_DATA;
+
+typedef struct {
+  EFI_HOB_GUID_TYPE     Hob;     
+  EXTRACT_SECTION_DATA  Data;
 } EXTRACT_SECTION_HOB;
 
 #endif
diff --git a/EmbeddedPkg/Include/Library/PrePiLib.h b/EmbeddedPkg/Include/Library/PrePiLib.h
index 3e4e6c023d..647cd0cb7e 100644
--- a/EmbeddedPkg/Include/Library/PrePiLib.h
+++ b/EmbeddedPkg/Include/Library/PrePiLib.h
@@ -678,6 +678,7 @@ BuildExtractSectionHob (
 VOID
 EFIAPI
 BuildPeCoffLoaderHob (
+  VOID
   );
 
 
diff --git a/EmbeddedPkg/Include/Protocol/ExtractSection.h b/EmbeddedPkg/Include/Protocol/ExtractSection.h
deleted file mode 100755
index 2860472be5..0000000000
--- a/EmbeddedPkg/Include/Protocol/ExtractSection.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/** @file
-
-  Copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>
-
-  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.
-
-**/
-
-#ifndef __EXTRACT_SECTION_PROTOCOL_H__
-#define __EXTRACT_SECTION_PROTOCOL_H__
-
-
-//
-// The GUID for this protocol mathes the Decompression scheme being used
-// So for example LZMA would be gLzmaCustomDecompressGuid
-//
-
-typedef struct {
-  EFI_HOB_GUID_TYPE                         Hob;
-  EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER   SectionGetInfo;
-  EXTRACT_GUIDED_SECTION_DECODE_HANDLER     SectionExtraction;
-} PROTOCOL_HOB;
-
-
-#endif
-
-
diff --git a/EmbeddedPkg/Include/Protocol/PeCoffLoader.h b/EmbeddedPkg/Include/Protocol/PeCoffLoader.h
index d6b4c03bd8..aa600122ed 100755
--- a/EmbeddedPkg/Include/Protocol/PeCoffLoader.h
+++ b/EmbeddedPkg/Include/Protocol/PeCoffLoader.h
@@ -15,6 +15,9 @@
 #ifndef __PE_COFF_LOADER_H__
 #define __PE_COFF_LOADER_H__
 
+// Needed for PE_COFF_LOADER_IMAGE_CONTEXT
+#include <Library/PeCoffLib.h>
+
 // B323179B-97FB-477E-B0FE-D88591FA11AB
 #define PE_COFF_LOADER_PROTOCOL_GUID \
   { 0xB323179B, 0x97FB, 0x477E, { 0xB0, 0xFE, 0xD8, 0x85, 0x91, 0xFA, 0x11, 0xAB } }
diff --git a/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c b/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
index 68bc2bf224..fdd2003264 100755
--- a/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
+++ b/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoff.c
@@ -21,6 +21,9 @@
 #include <Protocol/PeCoffLoader.h>
 
 
+PE_COFF_LOADER_PROTOCOL  *gPeCoffLoader = NULL;
+
+
 /**
   Retrieves information about a PE/COFF image.
 
@@ -167,11 +170,11 @@ PeCoffLoaderImageReadFromMemory (
   OUT    VOID    *Buffer
   )
 {
-  return gPeCoffLoader->RelocateImageForRuntime (
-                          *FileHandle,
+  return gPeCoffLoader->ReadFromMemory (
+                          FileHandle,
                           FileOffset,
-                          *ReadSize,
-                          *Buffer
+                          ReadSize,
+                          Buffer
                           );
                           
 }
@@ -214,7 +217,7 @@ PeCoffLoaderRelocateImageForRuntime (
                           ImageBase,
                           VirtImageBase,
                           ImageSize,
-                          *RelocationData
+                          RelocationData
                           );
 }
 
@@ -244,27 +247,42 @@ PeCoffLoaderUnloadImage (
   return gPeCoffLoader->UnloadImage (ImageContext);
 }
 
+typedef struct {
+  EFI_HOB_GUID_TYPE             Hob;
+  VOID                          *Interface;
+} PROTOCOL_HOB;
 
 
 /**
-  Register LzmaDecompress and LzmaDecompressGetInfo handlers with LzmaCustomerDecompressGuid.
+  The constructor function caches the pointer of DXE Services Table.
+
+  The constructor function caches the pointer of DXE Services Table.
+  It will ASSERT() if that operation fails.
+  It will ASSERT() if the pointer of DXE Services Table is NULL.
+  It will always return EFI_SUCCESS.
+
+  @param  ImageHandle   The firmware allocated handle for the EFI image.
+  @param  SystemTable   A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.
 
-  @retval  RETURN_SUCCESS            Register successfully.
-  @retval  RETURN_OUT_OF_RESOURCES   No enough memory to store this handler.
 **/
 EFI_STATUS
 EFIAPI
 DxeHobPeCoffLibConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
   )
 {
   PROTOCOL_HOB   *Hob;
-  
+
   Hob = GetFirstGuidHob (&gPeCoffLoaderProtocolGuid);
   if (Hob == NULL) {
     return EFI_NOT_FOUND;
   }
   
   gPeCoffLoader = Hob->Interface;
+  return EFI_SUCCESS;
 }
 
 
diff --git a/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf b/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
index 576af471bb..59f0f7fb90 100755
--- a/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
+++ b/EmbeddedPkg/Library/DxeHobPeCoffLib/DxeHobPeCoffLib.inf
@@ -16,7 +16,7 @@
 
 [Defines]
   INF_VERSION                    = 0x00010005
-  BASE_NAME                      = BasePeCoffLib
+  BASE_NAME                      = DxeHobPeCoffLib
   FILE_GUID                      = 671C6FD7-99FB-4EE3-B640-4B1D463BC3B5
   MODULE_TYPE                    = DXE_DRIVER
   VERSION_STRING                 = 1.0
@@ -34,7 +34,11 @@
 
 [Packages]
   MdePkg/MdePkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
 
 [LibraryClasses]
   DebugLib
+  HobLib
 
+[Protocols]
+  gPeCoffLoaderProtocolGuid
diff --git a/EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c b/EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c
index fe5fd83836..82e7654ff2 100755
--- a/EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c
+++ b/EmbeddedPkg/Library/LzmaHobCustomDecompressLib/LzmaHobCustomDecompressLib.c
@@ -44,7 +44,7 @@ LzmaDecompressLibConstructor (
 
   return ExtractGuidedSectionRegisterHandlers (
           &gLzmaCustomDecompressGuid,
-          Hob->SectionGetInfo,
-          Hob->SectionExtraction
+          Hob->Data.SectionGetInfo,
+          Hob->Data.SectionExtraction
           );      
 }
diff --git a/EmbeddedPkg/Library/PrePiLib/Hob.c b/EmbeddedPkg/Library/PrePiLib/Hob.c
index 04b49bb044..d055314915 100644
--- a/EmbeddedPkg/Library/PrePiLib/Hob.c
+++ b/EmbeddedPkg/Library/PrePiLib/Hob.c
@@ -818,11 +818,11 @@ BuildExtractSectionHob (
   IN  EXTRACT_GUIDED_SECTION_DECODE_HANDLER     SectionExtraction
   )
 {
-  EXTRACT_SECTION_HOB  Hob;
+  EXTRACT_SECTION_DATA Data;
   
-  Hob.SectionGetInfo    = SectionGetInfo;
-  Hob.SectionExtraction = SectionExtraction;
-  BuildGuidDataHob (Guid, &Hob, sizeof (EXTRACT_SECTION_HOB));
+  Data.SectionGetInfo    = SectionGetInfo;
+  Data.SectionExtraction = SectionExtraction;
+  BuildGuidDataHob (Guid, &Data, sizeof (Data));
 }
 
 PE_COFF_LOADER_PROTOCOL gPeCoffProtocol = {
@@ -834,22 +834,18 @@ PE_COFF_LOADER_PROTOCOL gPeCoffProtocol = {
   PeCoffLoaderUnloadImage
 };
 
-typedef struct {
-  EFI_HOB_GUID_TYPE             Hob;
-  VOID                          *Interface;
-} PROTOCOL_HOB;
-
 
 
 VOID
 EFIAPI
 BuildPeCoffLoaderHob (
+  VOID
   )
 {
-  PROTOCOL_HOB  Hob;      
+  VOID  *Ptr;      
   
-  Hob.Interface = &gPeCoffProtocol;
-  BuildGuidDataHob (&gPeCoffLoaderProtocolGuid, &Hob, sizeof (PROTOCOL_HOB));  
+  Ptr = &gPeCoffProtocol;
+  BuildGuidDataHob (&gPeCoffLoaderProtocolGuid, &Ptr, sizeof (VOID *));  
 }