]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: Split MAINFV into a separate PEI and DXE FVs
authorJordan Justen <jordan.l.justen@intel.com>
Tue, 21 Jan 2014 19:39:13 +0000 (19:39 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 21 Jan 2014 19:39:13 +0000 (19:39 +0000)
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)

OVMF.fd before:

  Non-volatile data storage
  FVMAIN_COMPACT                    uncompressed
    FV FFS file                     LZMA compressed
      MAINFV                        uncompressed
        individual PEI modules      uncompressed
        FV FFS file                 compressed with PI_NONE
          DXEFV                     uncompressed
            individual DXE modules  uncompressed
  SECFV                             uncompressed

OVMF.fd after:

  Non-volatile data storage
  FVMAIN_COMPACT                    uncompressed
    FV FFS file                     LZMA compressed
      PEIFV                         uncompressed
        individual PEI modules      uncompressed
      DXEFV                         uncompressed
        individual DXE modules      uncompressed
  SECFV                             uncompressed

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15151 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/OvmfPkg.dec
OvmfPkg/OvmfPkgIa32.fdf
OvmfPkg/OvmfPkgIa32X64.fdf
OvmfPkg/OvmfPkgX64.fdf
OvmfPkg/PlatformPei/Fv.c
OvmfPkg/PlatformPei/MemDetect.c
OvmfPkg/PlatformPei/PlatformPei.inf
OvmfPkg/Sec/SecMain.c
OvmfPkg/Sec/SecMain.inf

index 0e33b3b69c1ca9cee1e117377589af49f648ac87..034ccd8ef7167327bb1428feb843a9fb3434f956 100644 (file)
   gBlockMmioProtocolGuid          = {0x6b558ce3, 0x69e5, 0x4c67, {0xa6, 0x34, 0xf7, 0xfe, 0x72, 0xad, 0xbe, 0x84}}\r
 \r
 [PcdsFixedAtBuild]\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|0x0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize|0x0|UINT32|1\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|0x0|UINT32|0\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize|0x0|UINT32|1\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|0x0|UINT32|0x15\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize|0x0|UINT32|0x16\r
 \r
   ## This flag is used to control the destination port for PlatformDebugLibIoPort\r
   gUefiOvmfPkgTokenSpaceGuid.PcdDebugIoPort|0x402|UINT16|4\r
index 210abdedeb6594a5f34782a535b37bc24a26e9b8..7c4e6cda62e090f5acc22c66b7b9370d9a1746a0 100644 (file)
@@ -141,9 +141,13 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.P
 0x010000|0x008000\r
 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize\r
 \r
-0x020000|0x7E0000\r
-gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
-FV = MAINFV\r
+0x020000|0x0E0000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize\r
+FV = PEIFV\r
+\r
+0x100000|0x700000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize\r
+FV = DXEFV\r
 \r
 ################################################################################\r
 \r
@@ -170,14 +174,14 @@ READ_LOCK_STATUS   = TRUE
 # SEC Phase modules\r
 #\r
 # The code in this FV handles the initial firmware startup, and\r
-# decompresses the MAINFV which handles the majority of the boot sequence.\r
+# decompresses the PEI and DXE FVs which handles the rest of the boot sequence.\r
 #\r
 INF  OvmfPkg/Sec/SecMain.inf\r
 \r
 INF  RuleOverride=RESET_VECTOR UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf\r
 \r
 ################################################################################\r
-[FV.MAINFV]\r
+[FV.PEIFV]\r
 BlockSize          = 0x10000\r
 FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
@@ -196,15 +200,6 @@ READ_STATUS        = TRUE
 READ_LOCK_CAP      = TRUE\r
 READ_LOCK_STATUS   = TRUE\r
 \r
-#\r
-# Files to be placed in MAIN FV\r
-#\r
-# This firmware volume will have files placed in it uncompressed,\r
-# and then then entire firmware volume will be compressed in a\r
-# single compression operation in order to achieve better\r
-# overall compression.\r
-#\r
-\r
 APRIORI PEI {\r
   INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
 }\r
@@ -218,12 +213,6 @@ INF  IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
 INF  OvmfPkg/PlatformPei/PlatformPei.inf\r
 INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
 \r
-FILE FV_IMAGE = A4EF5A93-3F1B-4232-A1C4-F0910E6D1D9C {\r
-  SECTION COMPRESS PI_NONE {\r
-    SECTION FV_IMAGE = DXEFV\r
-  }\r
-}\r
-\r
 ################################################################################\r
 \r
 [FV.DXEFV]\r
@@ -400,7 +389,13 @@ READ_LOCK_STATUS   = TRUE
 \r
 FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {\r
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {\r
-     SECTION FV_IMAGE = MAINFV\r
+     #\r
+     # These firmware volumes will have files placed in them uncompressed,\r
+     # and then both firmware volumes will be compressed in a single\r
+     # compression operation in order to achieve better overall compression.\r
+     #\r
+     SECTION FV_IMAGE = PEIFV\r
+     SECTION FV_IMAGE = DXEFV\r
    }\r
  }\r
 \r
index 90f44a623779382c1c5ee259caab0e31d63dca54..3cb49de30aa299321254b1f6e1643fd9065b7695 100644 (file)
@@ -141,9 +141,13 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.P
 0x010000|0x008000\r
 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize\r
 \r
-0x020000|0x7E0000\r
-gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
-FV = MAINFV\r
+0x020000|0x0E0000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize\r
+FV = PEIFV\r
+\r
+0x100000|0x700000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize\r
+FV = DXEFV\r
 \r
 ################################################################################\r
 \r
@@ -170,14 +174,14 @@ READ_LOCK_STATUS   = TRUE
 # SEC Phase modules\r
 #\r
 # The code in this FV handles the initial firmware startup, and\r
-# decompresses the MAINFV which handles the majority of the boot sequence.\r
+# decompresses the PEI and DXE FVs which handles the rest of the boot sequence.\r
 #\r
 INF  OvmfPkg/Sec/SecMain.inf\r
 \r
 INF  RuleOverride=RESET_VECTOR USE = IA32 UefiCpuPkg/ResetVector/Vtf0/Bin/ResetVector.inf\r
 \r
 ################################################################################\r
-[FV.MAINFV]\r
+[FV.PEIFV]\r
 BlockSize          = 0x10000\r
 FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
@@ -196,15 +200,6 @@ READ_STATUS        = TRUE
 READ_LOCK_CAP      = TRUE\r
 READ_LOCK_STATUS   = TRUE\r
 \r
-#\r
-# Files to be placed in MAIN FV\r
-#\r
-# This firmware volume will have files placed in it uncompressed,\r
-# and then then entire firmware volume will be compressed in a\r
-# single compression operation in order to achieve better\r
-# overall compression.\r
-#\r
-\r
 APRIORI PEI {\r
   INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
 }\r
@@ -218,12 +213,6 @@ INF  IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
 INF  OvmfPkg/PlatformPei/PlatformPei.inf\r
 INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
 \r
-FILE FV_IMAGE = A4EF5A93-3F1B-4232-A1C4-F0910E6D1D9C {\r
-  SECTION COMPRESS PI_NONE {\r
-    SECTION FV_IMAGE = DXEFV\r
-  }\r
-}\r
-\r
 ################################################################################\r
 \r
 [FV.DXEFV]\r
@@ -400,7 +389,13 @@ READ_LOCK_STATUS   = TRUE
 \r
 FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {\r
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {\r
-     SECTION FV_IMAGE = MAINFV\r
+     #\r
+     # These firmware volumes will have files placed in them uncompressed,\r
+     # and then both firmware volumes will be compressed in a single\r
+     # compression operation in order to achieve better overall compression.\r
+     #\r
+     SECTION FV_IMAGE = PEIFV\r
+     SECTION FV_IMAGE = DXEFV\r
    }\r
  }\r
 \r
index 67c7415fda0d2e4fd99eee7f5990306c76c036c1..bd1dc1bc5d2813744ec1d3e9b1db1a051bc250ea 100644 (file)
@@ -141,9 +141,13 @@ gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase|gUefiOvmfPkgTokenSpaceGuid.P
 0x010000|0x008000\r
 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize\r
 \r
-0x020000|0x7E0000\r
-gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
-FV = MAINFV\r
+0x020000|0x0E0000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize\r
+FV = PEIFV\r
+\r
+0x100000|0x700000\r
+gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize\r
+FV = DXEFV\r
 \r
 ################################################################################\r
 \r
@@ -170,14 +174,14 @@ READ_LOCK_STATUS   = TRUE
 # SEC Phase modules\r
 #\r
 # The code in this FV handles the initial firmware startup, and\r
-# decompresses the MAINFV which handles the majority of the boot sequence.\r
+# decompresses the PEI and DXE FVs which handles the rest of the boot sequence.\r
 #\r
 INF  OvmfPkg/Sec/SecMain.inf\r
 \r
 INF  RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/Bin/ResetVector.inf\r
 \r
 ################################################################################\r
-[FV.MAINFV]\r
+[FV.PEIFV]\r
 BlockSize          = 0x10000\r
 FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
@@ -196,15 +200,6 @@ READ_STATUS        = TRUE
 READ_LOCK_CAP      = TRUE\r
 READ_LOCK_STATUS   = TRUE\r
 \r
-#\r
-# Files to be placed in MAIN FV\r
-#\r
-# This firmware volume will have files placed in it uncompressed,\r
-# and then then entire firmware volume will be compressed in a\r
-# single compression operation in order to achieve better\r
-# overall compression.\r
-#\r
-\r
 APRIORI PEI {\r
   INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
 }\r
@@ -218,12 +213,6 @@ INF  IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
 INF  OvmfPkg/PlatformPei/PlatformPei.inf\r
 INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
 \r
-FILE FV_IMAGE = A4EF5A93-3F1B-4232-A1C4-F0910E6D1D9C {\r
-  SECTION COMPRESS PI_NONE {\r
-    SECTION FV_IMAGE = DXEFV\r
-  }\r
-}\r
-\r
 ################################################################################\r
 \r
 [FV.DXEFV]\r
@@ -400,7 +389,13 @@ READ_LOCK_STATUS   = TRUE
 \r
 FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {\r
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {\r
-     SECTION FV_IMAGE = MAINFV\r
+     #\r
+     # These firmware volumes will have files placed in them uncompressed,\r
+     # and then both firmware volumes will be compressed in a single\r
+     # compression operation in order to achieve better overall compression.\r
+     #\r
+     SECTION FV_IMAGE = PEIFV\r
+     SECTION FV_IMAGE = DXEFV\r
    }\r
  }\r
 \r
index f389e277c958a937f9218bf65100452e737635b2..fbdb597043ec5a124d5422c65b1484b3e339e796 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Build FV related hobs for platform.\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
   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
 \r
 \r
 /**\r
-  Perform a call-back into the SEC simulator to get address of the Firmware Hub\r
-\r
-  @param  FfsHeader     Ffs Header availible to every PEIM\r
-  @param  PeiServices   General purpose services available to every PEIM.\r
+  Publish PEI & DXE (Decompressed) Memory based FVs to let PEI\r
+  and DXE know about them.\r
 \r
   @retval EFI_SUCCESS   Platform PEI FVs were initialized successfully.\r
 \r
@@ -33,26 +31,44 @@ PeiFvInitialization (
   VOID\r
   )\r
 {\r
-  DEBUG ((EFI_D_ERROR, "Platform PEI Firmware Volume Initialization\n"));\r
+  DEBUG ((EFI_D_INFO, "Platform PEI Firmware Volume Initialization\n"));\r
 \r
-  DEBUG (\r
-    (EFI_D_ERROR, "Firmware Volume HOB: 0x%x 0x%x\n",\r
-      PcdGet32 (PcdOvmfMemFvBase),\r
-      PcdGet32 (PcdOvmfMemFvSize)\r
-      )\r
+  //\r
+  // Create a memory allocation HOB for the PEI FV.\r
+  //\r
+  // This is marked as ACPI NVS so it will still be available on S3 resume.\r
+  //\r
+  BuildMemoryAllocationHob (\r
+    PcdGet32 (PcdOvmfPeiMemFvBase),\r
+    PcdGet32 (PcdOvmfPeiMemFvSize),\r
+    EfiACPIMemoryNVS\r
     );\r
 \r
-  BuildFvHob (PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize));\r
+  //\r
+  // Let DXE know about the DXE FV\r
+  //\r
+  BuildFvHob (PcdGet32 (PcdOvmfDxeMemFvBase), PcdGet32 (PcdOvmfDxeMemFvSize));\r
 \r
   //\r
-  // Create a memory allocation HOB.\r
+  // Create a memory allocation HOB for the DXE FV.\r
   //\r
   BuildMemoryAllocationHob (\r
-    PcdGet32 (PcdOvmfMemFvBase),\r
-    PcdGet32 (PcdOvmfMemFvSize),\r
+    PcdGet32 (PcdOvmfDxeMemFvBase),\r
+    PcdGet32 (PcdOvmfDxeMemFvSize),\r
     EfiBootServicesData\r
     );\r
 \r
+  //\r
+  // Let PEI know about the DXE FV so it can find the DXE Core\r
+  //\r
+  PeiServicesInstallFvInfoPpi (\r
+    NULL,\r
+    (VOID *)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase),\r
+    PcdGet32 (PcdOvmfDxeMemFvSize),\r
+    NULL,\r
+    NULL\r
+    );\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
index a1de7626814c794eeedcb94225e41a4a93f48930..bd57b7792e212e37263b11fa878fe474d16d11f9 100644 (file)
@@ -1,7 +1,7 @@
 /**@file\r
   Memory Detection for Virtual Machines.\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
   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
@@ -104,7 +104,7 @@ PublishPeiMemory (
   //\r
   // Determine the range of memory to use during PEI\r
   //\r
-  MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize);\r
+  MemoryBase = PcdGet32 (PcdOvmfDxeMemFvBase) + PcdGet32 (PcdOvmfDxeMemFvSize);\r
   MemorySize = LowerMemorySize - MemoryBase;\r
   if (MemorySize > SIZE_64MB) {\r
     MemoryBase = LowerMemorySize - SIZE_64MB;\r
index 7fe9d471cb8f816be7cd03499ed213215cb4e954..7c646ab8a01279138c44952621173dfeeeae1990 100644 (file)
@@ -2,7 +2,7 @@
 #  Platform PEI driver\r
 #\r
 #  This module provides platform specific function to detect boot mode.\r
-#  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
   PcdLib\r
 \r
 [Pcd]\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize\r
   gUefiOvmfPkgTokenSpaceGuid.PcdAcpiPmBaseAddress\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
index 6e238fe3370160e95a6ce65405025905767fd348..0edc4f9af3cfbfee0f73c4d78f105a5ed0e7d939 100644 (file)
@@ -311,7 +311,7 @@ FindFfsFileAndSection (
   Locates the compressed main firmware volume and decompresses it.\r
 \r
   @param[in,out]  Fv            On input, the firmware volume to search\r
-                                On output, the decompressed main FV\r
+                                On output, the decompressed BOOT/PEI FV\r
 \r
   @retval EFI_SUCCESS           The file and section was found\r
   @retval EFI_NOT_FOUND         The file and section was not found\r
@@ -319,7 +319,7 @@ FindFfsFileAndSection (
 \r
 **/\r
 EFI_STATUS\r
-DecompressGuidedFv (\r
+DecompressMemFvs (\r
   IN OUT EFI_FIRMWARE_VOLUME_HEADER       **Fv\r
   )\r
 {\r
@@ -331,10 +331,11 @@ DecompressGuidedFv (
   UINT32                            AuthenticationStatus;\r
   VOID                              *OutputBuffer;\r
   VOID                              *ScratchBuffer;\r
-  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *NewFvSection;\r
-  EFI_FIRMWARE_VOLUME_HEADER        *NewFv;\r
+  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *FvSection;\r
+  EFI_FIRMWARE_VOLUME_HEADER        *PeiMemFv;\r
+  EFI_FIRMWARE_VOLUME_HEADER        *DxeMemFv;\r
 \r
-  NewFvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;\r
+  FvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;\r
 \r
   Status = FindFfsFileAndSection (\r
              *Fv,\r
@@ -358,8 +359,7 @@ DecompressGuidedFv (
     return Status;\r
   }\r
 \r
-  //PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize)\r
-  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfMemFvBase) + SIZE_1MB);\r
+  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase) + SIZE_1MB);\r
   ScratchBuffer = ALIGN_POINTER ((UINT8*) OutputBuffer + OutputBufferSize, SIZE_1MB);\r
   Status = ExtractGuidedSectionDecode (\r
              Section,\r
@@ -372,27 +372,57 @@ DecompressGuidedFv (
     return Status;\r
   }\r
 \r
-  Status = FindFfsSectionInSections (\r
+  Status = FindFfsSectionInstance (\r
              OutputBuffer,\r
              OutputBufferSize,\r
              EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
-             (EFI_COMMON_SECTION_HEADER**) &NewFvSection\r
+             0,\r
+             (EFI_COMMON_SECTION_HEADER**) &FvSection\r
              );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to find FV image in extracted data\n"));\r
+    DEBUG ((EFI_D_ERROR, "Unable to find PEI FV section\n"));\r
     return Status;\r
   }\r
 \r
-  NewFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfMemFvBase);\r
-  CopyMem (NewFv, (VOID*) (NewFvSection + 1), PcdGet32 (PcdOvmfMemFvSize));\r
+  ASSERT (SECTION_SIZE (FvSection) ==\r
+          (PcdGet32 (PcdOvmfPeiMemFvSize) + sizeof (*FvSection)));\r
+  ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);\r
 \r
-  if (NewFv->Signature != EFI_FVH_SIGNATURE) {\r
-    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", NewFv));\r
+  PeiMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfPeiMemFvBase);\r
+  CopyMem (PeiMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfPeiMemFvSize));\r
+\r
+  if (PeiMemFv->Signature != EFI_FVH_SIGNATURE) {\r
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", PeiMemFv));\r
+    CpuDeadLoop ();\r
+    return EFI_VOLUME_CORRUPTED;\r
+  }\r
+\r
+  Status = FindFfsSectionInstance (\r
+             OutputBuffer,\r
+             OutputBufferSize,\r
+             EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
+             1,\r
+             (EFI_COMMON_SECTION_HEADER**) &FvSection\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "Unable to find DXE FV section\n"));\r
+    return Status;\r
+  }\r
+\r
+  ASSERT (FvSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE);\r
+  ASSERT (SECTION_SIZE (FvSection) ==\r
+          (PcdGet32 (PcdOvmfDxeMemFvSize) + sizeof (*FvSection)));\r
+\r
+  DxeMemFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfDxeMemFvBase);\r
+  CopyMem (DxeMemFv, (VOID*) (FvSection + 1), PcdGet32 (PcdOvmfDxeMemFvSize));\r
+\r
+  if (DxeMemFv->Signature != EFI_FVH_SIGNATURE) {\r
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", DxeMemFv));\r
     CpuDeadLoop ();\r
     return EFI_VOLUME_CORRUPTED;\r
   }\r
 \r
-  *Fv = NewFv;\r
+  *Fv = PeiMemFv;\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -460,7 +490,7 @@ FindPeiCoreImageBase (
 \r
   FindMainFv (BootFv);\r
 \r
-  DecompressGuidedFv (BootFv);\r
+  DecompressMemFvs (BootFv);\r
 \r
   FindPeiCoreImageBaseInFv (*BootFv, PeiCoreImageBase);\r
 }\r
index 0b1cda83dff100279f1a4dd6c932027ce2edbe39..107f60afc29b944842fe5157165bf8a03b792421 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 #  SEC Driver\r
 #\r
-#  Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2008 - 2013, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
   gEfiTemporaryRamSupportPpiGuid                # PPI ALWAYS_PRODUCED\r
 \r
 [Pcd]\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvSize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDxeMemFvSize\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize\r