By splitting the PEI and DXE phases into separate FVs,
we can only reserve the PEI FV for ACPI S3 support.
This should save about 7MB.

Unfortunately, this all has to happen in a single commit.

DEC:
* Remove PcdOvmfMemFv(Base|Size)
* Add PcdOvmfPeiMemFv(Base|Size)
* Add PcdOvmfDxeMemFv(Base|Size)

FDF:
* Add new PEIFV. Move PEI modules here.
* Remove MAINFV
* Add PEIFV and DXEFV into FVMAIN_COMPACT
   - They are added as 2 sections of a file, and compressed
     together so they should retain good compression
* PcdOvmf(Pei|Dxe)MemFv(Base|Size) are set

SEC:
* Find both the PEI and DXE FVs after decompression.
   - Copy them separately to their memory locations.

Platform PEI driver:
* Fv.c: Publish both FVs as appropriate
* MemDetect.c: PcdOvmfMemFv(Base|Size) =>
                PcdOvmfDxeMemFv(Base|Size)

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <[email protected]>
---
 OvmfPkg/OvmfPkg.dec                 |  6 ++--
 OvmfPkg/OvmfPkgIa32.fdf             | 23 ++++++------
 OvmfPkg/OvmfPkgIa32X64.fdf          | 23 ++++++------
 OvmfPkg/OvmfPkgX64.fdf              | 23 ++++++------
 OvmfPkg/PlatformPei/Fv.c            | 46 ++++++++++++++++--------
 OvmfPkg/PlatformPei/MemDetect.c     |  4 +--
 OvmfPkg/PlatformPei/PlatformPei.inf |  8 +++--
 OvmfPkg/Sec/SecMain.c               | 70 ++++++++++++++++++++++++++-----------
 OvmfPkg/Sec/SecMain.inf             |  8 +++--
 9 files changed, 130 insertions(+), 81 deletions(-)

diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index 0e33b3b..034ccd8 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -48,8 +48,10 @@
   gBlockMmioProtocolGuid          = {0x6b558ce3, 0x69e5, 0x4c67, {0xa6, 0x34, 
0xf7, 0xfe, 0x72, 0xad, 0xbe, 0x84}}
 
 [PcdsFixedAtBuild]
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|0x0|UINT32|0
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize|0x0|UINT32|1
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|0x0|UINT32|0
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize|0x0|UINT32|1
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|0x0|UINT32|0x15
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize|0x0|UINT32|0x16
 
   ## This flag is used to control the destination port for 
PlatformDebugLibIoPort
   gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort|0x402|UINT16|4
diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf
index 210abde..ac2c756 100644
--- a/OvmfPkg/OvmfPkgIa32.fdf
+++ b/OvmfPkg/OvmfPkgIa32.fdf
@@ -141,9 +141,13 @@ 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.P
 0x010000|0x008000
 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
 
-0x020000|0x7E0000
-gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
-FV = MAINFV
+0x020000|0x0E0000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
+FV = PEIFV
+
+0x100000|0x700000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
+FV = DXEFV
 
 
################################################################################
 
@@ -170,14 +174,14 @@ READ_LOCK_STATUS   = TRUE
 # SEC Phase modules
 #
 # The code in this FV handles the initial firmware startup, and
-# decompresses the MAINFV which handles the majority of the boot sequence.
+# decompresses the PEI and DXE FVs which handles the rest of the boot sequence.
 #
 INF  OvmfPkg/Sec/SecMain.inf
 
 INF  RuleOverride=RESET_VECTOR UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf
 
 
################################################################################
-[FV.MAINFV]
+[FV.PEIFV]
 BlockSize          = 0x10000
 FvAlignment        = 16
 ERASE_POLARITY     = 1
@@ -218,12 +222,6 @@ INF  
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
 INF  OvmfPkg/PlatformPei/PlatformPei.inf
 INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
-FILE FV_IMAGE = A4EF5A93-3F1B-4232-A1C4-F0910E6D1D9C {
-  SECTION COMPRESS PI_NONE {
-    SECTION FV_IMAGE = DXEFV
-  }
-}
-
 
################################################################################
 
 [FV.DXEFV]
@@ -400,7 +398,8 @@ READ_LOCK_STATUS   = TRUE
 
 FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = 
TRUE {
-     SECTION FV_IMAGE = MAINFV
+     SECTION FV_IMAGE = PEIFV
+     SECTION FV_IMAGE = DXEFV
    }
  }
 
diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf
index 90f44a6..527e2f3 100644
--- a/OvmfPkg/OvmfPkgIa32X64.fdf
+++ b/OvmfPkg/OvmfPkgIa32X64.fdf
@@ -141,9 +141,13 @@ 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.P
 0x010000|0x008000
 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
 
-0x020000|0x7E0000
-gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
-FV = MAINFV
+0x020000|0x0E0000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
+FV = PEIFV
+
+0x100000|0x700000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
+FV = DXEFV
 
 
################################################################################
 
@@ -170,14 +174,14 @@ READ_LOCK_STATUS   = TRUE
 # SEC Phase modules
 #
 # The code in this FV handles the initial firmware startup, and
-# decompresses the MAINFV which handles the majority of the boot sequence.
+# decompresses the PEI and DXE FVs which handles the rest of the boot sequence.
 #
 INF  OvmfPkg/Sec/SecMain.inf
 
 INF  RuleOverride=RESET_VECTOR USE = IA32 
UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf
 
 
################################################################################
-[FV.MAINFV]
+[FV.PEIFV]
 BlockSize          = 0x10000
 FvAlignment        = 16
 ERASE_POLARITY     = 1
@@ -218,12 +222,6 @@ INF  
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
 INF  OvmfPkg/PlatformPei/PlatformPei.inf
 INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
-FILE FV_IMAGE = A4EF5A93-3F1B-4232-A1C4-F0910E6D1D9C {
-  SECTION COMPRESS PI_NONE {
-    SECTION FV_IMAGE = DXEFV
-  }
-}
-
 
################################################################################
 
 [FV.DXEFV]
@@ -400,7 +398,8 @@ READ_LOCK_STATUS   = TRUE
 
 FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = 
TRUE {
-     SECTION FV_IMAGE = MAINFV
+     SECTION FV_IMAGE = PEIFV
+     SECTION FV_IMAGE = DXEFV
    }
  }
 
diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
index 67c7415..f4565ad 100644
--- a/OvmfPkg/OvmfPkgX64.fdf
+++ b/OvmfPkg/OvmfPkgX64.fdf
@@ -141,9 +141,13 @@ 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.P
 0x010000|0x008000
 
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
 
-0x020000|0x7E0000
-gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
-FV = MAINFV
+0x020000|0x0E0000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
+FV = PEIFV
+
+0x100000|0x700000
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
+FV = DXEFV
 
 
################################################################################
 
@@ -170,14 +174,14 @@ READ_LOCK_STATUS   = TRUE
 # SEC Phase modules
 #
 # The code in this FV handles the initial firmware startup, and
-# decompresses the MAINFV which handles the majority of the boot sequence.
+# decompresses the PEI and DXE FVs which handles the rest of the boot sequence.
 #
 INF  OvmfPkg/Sec/SecMain.inf
 
 INF  RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/Bin/ResetVector.inf
 
 
################################################################################
-[FV.MAINFV]
+[FV.PEIFV]
 BlockSize          = 0x10000
 FvAlignment        = 16
 ERASE_POLARITY     = 1
@@ -218,12 +222,6 @@ INF  
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
 INF  OvmfPkg/PlatformPei/PlatformPei.inf
 INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
-FILE FV_IMAGE = A4EF5A93-3F1B-4232-A1C4-F0910E6D1D9C {
-  SECTION COMPRESS PI_NONE {
-    SECTION FV_IMAGE = DXEFV
-  }
-}
-
 
################################################################################
 
 [FV.DXEFV]
@@ -400,7 +398,8 @@ READ_LOCK_STATUS   = TRUE
 
 FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = 
TRUE {
-     SECTION FV_IMAGE = MAINFV
+     SECTION FV_IMAGE = PEIFV
+     SECTION FV_IMAGE = DXEFV
    }
  }
 
diff --git a/OvmfPkg/PlatformPei/Fv.c b/OvmfPkg/PlatformPei/Fv.c
index f389e27..fbdb597 100644
--- a/OvmfPkg/PlatformPei/Fv.c
+++ b/OvmfPkg/PlatformPei/Fv.c
@@ -1,7 +1,7 @@
 /** @file
   Build FV related hobs for platform.
 
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
   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
@@ -20,10 +20,8 @@
 
 
 /**
-  Perform a call-back into the SEC simulator to get address of the Firmware Hub
-
-  @param  FfsHeader     Ffs Header availible to every PEIM
-  @param  PeiServices   General purpose services available to every PEIM.
+  Publish PEI & DXE (Decompressed) Memory based FVs to let PEI
+  and DXE know about them.
 
   @retval EFI_SUCCESS   Platform PEI FVs were initialized successfully.
 
@@ -33,26 +31,44 @@ PeiFvInitialization (
   VOID
   )
 {
-  DEBUG ((EFI_D_ERROR, "Platform PEI Firmware Volume Initialization\n"));
+  DEBUG ((EFI_D_INFO, "Platform PEI Firmware Volume Initialization\n"));
 
-  DEBUG (
-    (EFI_D_ERROR, "Firmware Volume HOB: 0x%x 0x%x\n",
-      PcdGet32 (PcdOvmfMemFvBase),
-      PcdGet32 (PcdOvmfMemFvSize)
-      )
+  //
+  // Create a memory allocation HOB for the PEI FV.
+  //
+  // This is marked as ACPI NVS so it will still be available on S3 resume.
+  //
+  BuildMemoryAllocationHob (
+    PcdGet32 (PcdOvmfPeiMemFvBase),
+    PcdGet32 (PcdOvmfPeiMemFvSize),
+    EfiACPIMemoryNVS
     );
 
-  BuildFvHob (PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize));
+  //
+  // Let DXE know about the DXE FV
+  //
+  BuildFvHob (PcdGet32 (PcdOvmfDxeMemFvBase), PcdGet32 (PcdOvmfDxeMemFvSize));
 
   //
-  // Create a memory allocation HOB.
+  // Create a memory allocation HOB for the DXE FV.
   //
   BuildMemoryAllocationHob (
-    PcdGet32 (PcdOvmfMemFvBase),
-    PcdGet32 (PcdOvmfMemFvSize),
+    PcdGet32 (PcdOvmfDxeMemFvBase),
+    PcdGet32 (PcdOvmfDxeMemFvSize),
     EfiBootServicesData
     );
 
+  //
+  // Let PEI know about the DXE FV so it can find the DXE Core
+  //
+  PeiServicesInstallFvInfoPpi (
+    NULL,
+    (VOID *)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase),
+    PcdGet32 (PcdOvmfDxeMemFvSize),
+    NULL,
+    NULL
+    );
+
   return EFI_SUCCESS;
 }
 
diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c
index a1de762..bd57b77 100644
--- a/OvmfPkg/PlatformPei/MemDetect.c
+++ b/OvmfPkg/PlatformPei/MemDetect.c
@@ -1,7 +1,7 @@
 /**@file
   Memory Detection for Virtual Machines.
 
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
   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
@@ -104,7 +104,7 @@ PublishPeiMemory (
   //
   // Determine the range of memory to use during PEI
   //
-  MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize);
+  MemoryBase = PcdGet32 (PcdOvmfDxeMemFvBase) + PcdGet32 (PcdOvmfDxeMemFvSize);
   MemorySize = LowerMemorySize - MemoryBase;
   if (MemorySize > SIZE_64MB) {
     MemoryBase = LowerMemorySize - SIZE_64MB;
diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf 
b/OvmfPkg/PlatformPei/PlatformPei.inf
index 7fe9d47..7c646ab 100644
--- a/OvmfPkg/PlatformPei/PlatformPei.inf
+++ b/OvmfPkg/PlatformPei/PlatformPei.inf
@@ -2,7 +2,7 @@
 #  Platform PEI driver
 #
 #  This module provides platform specific function to detect boot mode.
-#  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD 
License
@@ -58,8 +58,10 @@
   PcdLib
 
 [Pcd]
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
   gUefiOvmfPkgTokenSpaceGuid.PcdAcpiPmBaseAddress
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c
index 902ac85..21c2a36 100644
--- a/OvmfPkg/Sec/SecMain.c
+++ b/OvmfPkg/Sec/SecMain.c
@@ -319,8 +319,8 @@ FindFfsFileAndSection (
 
 **/
 EFI_STATUS
-DecompressGuidedFv (
-  IN OUT EFI_FIRMWARE_VOLUME_HEADER       **Fv
+DecompressMemFvs (
+  IN OUT EFI_FIRMWARE_VOLUME_HEADER       **PeiFv
   )
 {
   EFI_STATUS                        Status;
@@ -331,13 +331,14 @@ DecompressGuidedFv (
   UINT32                            AuthenticationStatus;
   VOID                              *OutputBuffer;
   VOID                              *ScratchBuffer;
-  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *NewFvSection;
-  EFI_FIRMWARE_VOLUME_HEADER        *NewFv;
+  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *FvSection;
+  EFI_FIRMWARE_VOLUME_HEADER        *PeiMemFv;
+  EFI_FIRMWARE_VOLUME_HEADER        *DxeMemFv;
 
-  NewFvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;
+  FvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;
 
   Status = FindFfsFileAndSection (
-             *Fv,
+             *PeiFv,
              EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
              EFI_SECTION_GUID_DEFINED,
              (EFI_COMMON_SECTION_HEADER**) &Section
@@ -358,8 +359,7 @@ DecompressGuidedFv (
     return Status;
   }
 
-  //PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize)
-  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfMemFvBase) + 
SIZE_1MB);
+  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase) + 
SIZE_1MB);
   ScratchBuffer = ALIGN_POINTER ((UINT8*) OutputBuffer + OutputBufferSize, 
SIZE_1MB);
   Status = ExtractGuidedSectionDecode (
              Section,
@@ -372,27 +372,57 @@ DecompressGuidedFv (
     return Status;
   }
 
-  Status = FindFfsSectionInSections (
+  Status = FindFfsSectionInstance (
              OutputBuffer,
              OutputBufferSize,
              EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
-             (EFI_COMMON_SECTION_HEADER**) &NewFvSection
+             0,
+             (EFI_COMMON_SECTION_HEADER**) &FvSection
              );
   if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "Unable to find FV image in extracted data\n"));
+    DEBUG ((EFI_D_ERROR, "Unable to find PEI FV section\n"));
     return Status;
   }
 
-  NewFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfMemFvBase);
-  CopyMem (NewFv, (VOID*) (NewFvSection + 1), PcdGet32 (PcdOvmfMemFvSize));
+  ASSERT (SECTION_SIZE (FvSection) ==
+          (PcdGet32 (PcdOvmfPeiMemFvSize) + sizeof (*FvSection)));
+  ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);
 
-  if (NewFv->Signature != EFI_FVH_SIGNATURE) {
-    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header 
signature\n", NewFv));
+  PeiMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 
(PcdOvmfPeiMemFvBase);
+  CopyMem (PeiMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfPeiMemFvSize));
+
+  if (PeiMemFv->Signature != EFI_FVH_SIGNATURE) {
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header 
signature\n", PeiMemFv));
+    CpuDeadLoop ();
+    return EFI_VOLUME_CORRUPTED;
+  }
+
+  Status = FindFfsSectionInstance (
+             OutputBuffer,
+             OutputBufferSize,
+             EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
+             1,
+             (EFI_COMMON_SECTION_HEADER**) &FvSection
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "Unable to find DXE FV section\n"));
+    return Status;
+  }
+
+  ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);
+  ASSERT (SECTION_SIZE (FvSection) ==
+          (PcdGet32 (PcdOvmfDxeMemFvSize) + sizeof (*FvSection)));
+
+  DxeMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 
(PcdOvmfDxeMemFvBase);
+  CopyMem (DxeMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfDxeMemFvSize));
+
+  if (DxeMemFv->Signature != EFI_FVH_SIGNATURE) {
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header 
signature\n", DxeMemFv));
     CpuDeadLoop ();
     return EFI_VOLUME_CORRUPTED;
   }
 
-  *Fv = NewFv;
+  *PeiFv = PeiMemFv;
   return EFI_SUCCESS;
 }
 
@@ -452,17 +482,17 @@ FindPeiCoreImageBaseInFv (
 **/
 VOID
 FindPeiCoreImageBase (
-  IN OUT  EFI_FIRMWARE_VOLUME_HEADER       **BootFv,
+  IN OUT  EFI_FIRMWARE_VOLUME_HEADER       **PeiFv,
      OUT  EFI_PHYSICAL_ADDRESS             *PeiCoreImageBase
   )
 {
   *PeiCoreImageBase = 0;
 
-  FindMainFv (BootFv);
+  FindMainFv (PeiFv);
 
-  DecompressGuidedFv (BootFv);
+  DecompressMemFvs (PeiFv);
 
-  FindPeiCoreImageBaseInFv (*BootFv, PeiCoreImageBase);
+  FindPeiCoreImageBaseInFv (*PeiFv, PeiCoreImageBase);
 }
 
 /**
diff --git a/OvmfPkg/Sec/SecMain.inf b/OvmfPkg/Sec/SecMain.inf
index 0b1cda8..107f60a 100644
--- a/OvmfPkg/Sec/SecMain.inf
+++ b/OvmfPkg/Sec/SecMain.inf
@@ -1,7 +1,7 @@
 ## @file
 #  SEC Driver
 #
-#  Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD 
License
@@ -64,8 +64,10 @@
   gEfiTemporaryRamSupportPpiGuid                # PPI ALWAYS_PRODUCED
 
 [Pcd]
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
-- 
1.8.5.2


------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to