]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OVMF: Update OVMF FD/FV build to minimize ROM size
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 4 Jan 2010 16:17:59 +0000 (16:17 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 4 Jan 2010 16:17:59 +0000 (16:17 +0000)
* Only SEC is uncompressed now
* The MAIN FV with PEI & DXE can easily shrink and grow as needed
* The final output will now be OVMF.Fv rather than OVMF.fd
* The final output size will be a multiple of 64kb

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

13 files changed:
OvmfPkg/OvmfPkg.dec
OvmfPkg/OvmfPkg.fdf
OvmfPkg/OvmfPkgIa32.dsc
OvmfPkg/OvmfPkgIa32X64.dsc
OvmfPkg/OvmfPkgIa32X64.fdf
OvmfPkg/OvmfPkgX64.dsc
OvmfPkg/PlatformPei/Fv.c
OvmfPkg/PlatformPei/MemDetect.c
OvmfPkg/PlatformPei/PlatformPei.inf
OvmfPkg/Sec/FindPeiCore.c
OvmfPkg/Sec/SecMain.c
OvmfPkg/Sec/SecMain.h
OvmfPkg/Sec/SecMain.inf

index 02c039dcd07dcaa650159271b223e848944bb314..862811c436a8514419961af8f2f12c978f6ea490 100644 (file)
   gUefiOvmfPkgTokenSpaceGuid      = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}\r
 \r
 [PcdsFixedAtBuild]\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0x0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0|UINT32|0\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase|0x0|UINT32|0\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|0x0|UINT32|0\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize|0x0|UINT32|0\r
 \r
 [PcdsDynamic]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|0\r
index d54753b0c49c76c44e069365da3d3dc7eea7c30c..d811b562f52a1fd895eadca2c7ec919a0a265889 100644 (file)
@@ -1,7 +1,7 @@
 #/** @file\r
 #  Open Virtual Machine Firmware: FDF\r
 #\r
-#  Copyright (c) 2006 - 2009, Intel Corporation\r
+#  Copyright (c) 2006 - 2010, Intel Corporation\r
 #\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
-# FD Section\r
-# The [FD] Section is made up of the definition statements and a\r
-# description of what goes into  the Flash Device Image.  Each FD section\r
-# defines one flash "device" image.  A flash device image may be one of\r
-# the following: Removable media bootable image (like a boot floppy\r
-# image,) an Option ROM image (that would be "flashed" into an add-in\r
-# card,) a System "Flash"  image (that would be burned into a system's\r
-# flash) or an Update ("Capsule") image that will be used to update and\r
-# existing system flash.\r
-#\r
+[FD.SEC]\r
+BaseAddress   = 0xFFFEE000\r
+Size          = 0x00012000\r
+ErasePolarity = 1\r
+BlockSize     = 0x1000\r
+NumBlocks     = 0x12\r
+\r
+0x0|0x12000\r
+FV = SECFV\r
+\r
 ################################################################################\r
-[FD.OVMF]\r
-BaseAddress   = 0xFFE00000     # The base address of the FLASH Device.\r
-Size          = 0x00200000     # The size in bytes of the FLASH Device\r
+\r
+[FD.MEMFD]\r
+BaseAddress   = 0x800000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
+Size          = 0x400000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
 ErasePolarity = 1\r
 BlockSize     = 0x10000\r
-NumBlocks     = 0x20\r
+NumBlocks     = 0x40\r
 \r
-################################################################################\r
-#\r
-# Following are lists of FD Region layout which correspond to the locations of different\r
-# images within the flash device.\r
-#\r
-# Regions must be defined in ascending order and may not overlap.\r
-#\r
-# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by\r
-# the pipe "|" character, followed by the size of the region, also in hex with the leading\r
-# "0x" characters. Like:\r
-# Offset|Size\r
-# PcdOffsetCName|PcdSizeCName\r
-# RegionType <FV, DATA, or FILE>\r
-#\r
-################################################################################\r
-0x0|0x200000\r
-gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoveryBase|gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoverySize\r
+0x0|0x400000\r
 FV = MAINFV\r
 \r
 ################################################################################\r
+\r
+[FV.SECFV]\r
+BlockSize          = 0x1000\r
+FvAlignment        = 16\r
+ERASE_POLARITY     = 1\r
+MEMORY_MAPPED      = TRUE\r
+STICKY_WRITE       = TRUE\r
+LOCK_CAP           = TRUE\r
+LOCK_STATUS        = TRUE\r
+WRITE_DISABLED_CAP = TRUE\r
+WRITE_ENABLED_CAP  = TRUE\r
+WRITE_STATUS       = TRUE\r
+WRITE_LOCK_CAP     = TRUE\r
+WRITE_LOCK_STATUS  = TRUE\r
+READ_DISABLED_CAP  = TRUE\r
+READ_ENABLED_CAP   = TRUE\r
+READ_STATUS        = TRUE\r
+READ_LOCK_CAP      = TRUE\r
+READ_LOCK_STATUS   = TRUE\r
+\r
 #\r
-# FV Section\r
+# SEC Phase modules\r
 #\r
-# [FV] section is used to define what components or modules are placed within a flash\r
-# device file.  This section also defines order the components and modules are positioned\r
-# within the image.  The [FV] section consists of define statements, set statements and\r
-# module statements.\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
 #\r
+INF  OvmfPkg/Sec/SecMain.inf\r
+\r
+INF  RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/Bin/ResetVector.inf\r
+\r
 ################################################################################\r
-[FV.DXEFV]\r
-BlockSize          = 0x1000\r
-FvAlignment        = 16         #FV alignment and FV attributes setting.\r
+[FV.MAINFV]\r
+BlockSize          = 0x10000\r
+FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
 MEMORY_MAPPED      = TRUE\r
 STICKY_WRITE       = TRUE\r
@@ -82,7 +88,7 @@ READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE\r
 \r
 #\r
-# Files to be placed in DXEFV\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
@@ -90,11 +96,24 @@ READ_LOCK_STATUS   = TRUE
 # overall compression.\r
 #\r
 \r
+APRIORI PEI {\r
+  INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
+}\r
+\r
 APRIORI DXE {\r
   INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf\r
   INF  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
 }\r
 \r
+#\r
+#  PEI Phase modules\r
+#\r
+INF  MdeModulePkg/Core/Pei/PeiMain.inf\r
+INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
+INF  IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
+INF  OvmfPkg/PlatformPei/PlatformPei.inf\r
+INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
+\r
 #\r
 # DXE Phase modules\r
 #\r
@@ -106,7 +125,7 @@ INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 INF  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 INF  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
 INF  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
-INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
+INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
 INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
 INF  PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
 INF  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
@@ -163,7 +182,8 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) {
 \r
 ################################################################################\r
 \r
-[FV.MAINFV]\r
+[FV.OVMF]\r
+BlockSize          = 0x10000\r
 FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
 MEMORY_MAPPED      = TRUE\r
@@ -182,51 +202,27 @@ READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE\r
 \r
 #\r
-# Files to be placed in MAINFV\r
-#\r
-# This firmware volume will have all the files placed in it which\r
-# must not be compressed at the initial boot phase.  The only\r
-# exception to this is the compressed 'DXEFV'.\r
-#\r
-\r
-APRIORI PEI {\r
-  INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
-}\r
-\r
-#\r
-#  SEC Phase modules\r
-#\r
-INF  OvmfPkg/Sec/SecMain.inf\r
-\r
-#\r
-#  PEI Phase modules\r
-#\r
-INF  MdeModulePkg/Core/Pei/PeiMain.inf\r
-INF  RuleOverride=NORELOC MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
-INF  RuleOverride=NORELOC IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
-INF  RuleOverride=NORELOC OvmfPkg/PlatformPei/PlatformPei.inf\r
-INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
-\r
-#\r
-# This file contains the compressed 'DXEFV', which is compressed\r
+# This file contains the compressed MAINFV, which is compressed\r
 # in a single compression operation in order to achieve better\r
 # overall compression.\r
 #\r
 FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 {\r
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { # LzmaCompress\r
-      SECTION FV_IMAGE = DXEFV\r
+      SECTION FV_IMAGE = MAINFV\r
    }\r
  }\r
 \r
-INF  RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/Bin/ResetVector.inf\r
-\r
-################################################################################\r
 #\r
-# Rules are use with the [FV] section's module INF type to define\r
-# how an FFS file is created for a given INF file. The following Rule are the default\r
-# rules for the different module type. User can add the customized rules to define the\r
-# content of the FFS file.\r
+# This file contains the uncompressed SECFV, which contains the initial\r
+# boot code.  The code in this FV decompresses the MAINFV.\r
+#\r
+# It uses the Volume Top File (VTF) GUID so it will be placed at the\r
+# end of the FV.\r
 #\r
+FILE FREEFORM = 1BA0062E-C779-4582-8566-336AE8F78F09 {\r
+  SECTION Align=16 FV_IMAGE = SECFV\r
+}\r
+\r
 ################################################################################\r
 \r
 [Rule.Common.PEI_CORE]\r
index 4dc00d6e1a73e31e9b8f97241fa2f3ca522a7032..11e1f98f1af440998175e6eb9577980a19395d07 100644 (file)
@@ -1,7 +1,7 @@
 #/** @file\r
 #  EFI/Framework Open Virtual Machine Firmware (OVMF) platform\r
 #\r
-#  Copyright (c) 2006 - 2009, Intel Corporation\r
+#  Copyright (c) 2006 - 2010, Intel Corporation\r
 #\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
@@ -81,6 +81,7 @@
 [LibraryClasses.common.SEC]\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf\r
+  ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf\r
 \r
 [LibraryClasses.common.PEI_CORE]\r
   BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf\r
   ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf\r
-  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
   UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf\r
 \r
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
-  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf\r
 \r
 [LibraryClasses.common.DXE_DRIVER]\r
   gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07\r
   gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200\r
 \r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000\r
-\r
   gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32\r
   #\r
   # SEC Phase modules\r
   #\r
-  OvmfPkg/Sec/SecMain.inf\r
+  OvmfPkg/Sec/SecMain.inf {\r
+    <LibraryClasses>\r
+      NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
+  }\r
 \r
   #\r
   # PEI Phase modules\r
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
   }\r
   IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
-  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {\r
-    <LibraryClasses>\r
-      NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
-  }\r
+  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
 \r
   OvmfPkg/PlatformPei/PlatformPei.inf {\r
     <LibraryClasses>\r
       TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf\r
   }\r
 \r
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf  {\r
+  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf {\r
     <LibraryClasses>\r
       TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf\r
   }\r
index 5eb44d17a566f3c64674f5d0f6fdce0a3ce9c70d..55fc6ce0b04b084059a245bea4b193c52cfd51aa 100644 (file)
@@ -1,7 +1,7 @@
 #/** @file\r
 #  EFI/Framework Open Virtual Machine Firmware (OVMF) platform\r
 #\r
-#  Copyright (c) 2006 - 2009, Intel Corporation\r
+#  Copyright (c) 2006 - 2010, Intel Corporation\r
 #\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
@@ -82,6 +82,7 @@
   BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf\r
+  ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf\r
 \r
 [LibraryClasses.common.PEI_CORE]\r
   BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf\r
   ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf\r
-  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
   UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf\r
 \r
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
-  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf\r
 \r
 [LibraryClasses.common.DXE_DRIVER]\r
   gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07\r
   gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200\r
 \r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000\r
-\r
   gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32\r
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F\r
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F\r
 \r
-\r
 ################################################################################\r
 #\r
 # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform\r
   #\r
   # SEC Phase modules\r
   #\r
-  OvmfPkg/Sec/SecMain.inf\r
+  OvmfPkg/Sec/SecMain.inf {\r
+    <LibraryClasses>\r
+      NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
+  }\r
 \r
   #\r
   # PEI Phase modules\r
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
   }\r
   IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
-  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {\r
-    <LibraryClasses>\r
-      NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
-  }\r
+  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
 \r
   OvmfPkg/PlatformPei/PlatformPei.inf {\r
     <LibraryClasses>\r
       TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf\r
   }\r
 \r
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf  {\r
+  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf {\r
     <LibraryClasses>\r
       TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf\r
   }\r
index d734175e6e35ce70c676b284ea6b4147a68015d4..dd238cfe04e7d4eb77a024088705987dcfff80bc 100644 (file)
@@ -1,7 +1,7 @@
 #/** @file\r
 #  Open Virtual Machine Firmware: FDF\r
 #\r
-#  Copyright (c) 2006 - 2009, Intel Corporation\r
+#  Copyright (c) 2006 - 2010, Intel Corporation\r
 #\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
-# FD Section\r
-# The [FD] Section is made up of the definition statements and a\r
-# description of what goes into  the Flash Device Image.  Each FD section\r
-# defines one flash "device" image.  A flash device image may be one of\r
-# the following: Removable media bootable image (like a boot floppy\r
-# image,) an Option ROM image (that would be "flashed" into an add-in\r
-# card,) a System "Flash"  image (that would be burned into a system's\r
-# flash) or an Update ("Capsule") image that will be used to update and\r
-# existing system flash.\r
-#\r
+[FD.SEC]\r
+BaseAddress   = 0xFFFEE000\r
+Size          = 0x00012000\r
+ErasePolarity = 1\r
+BlockSize     = 0x1000\r
+NumBlocks     = 0x12\r
+\r
+0x0|0x12000\r
+FV = SECFV\r
+\r
 ################################################################################\r
-[FD.OVMF]\r
-BaseAddress   = 0xFFE00000     # The base address of the FLASH Device.\r
-Size          = 0x00200000     # The size in bytes of the FLASH Device\r
+\r
+[FD.MEMFD]\r
+BaseAddress   = 0x800000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
+Size          = 0x400000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
 ErasePolarity = 1\r
 BlockSize     = 0x10000\r
-NumBlocks     = 0x20\r
+NumBlocks     = 0x40\r
 \r
-################################################################################\r
-#\r
-# Following are lists of FD Region layout which correspond to the locations of different\r
-# images within the flash device.\r
-#\r
-# Regions must be defined in ascending order and may not overlap.\r
-#\r
-# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by\r
-# the pipe "|" character, followed by the size of the region, also in hex with the leading\r
-# "0x" characters. Like:\r
-# Offset|Size\r
-# PcdOffsetCName|PcdSizeCName\r
-# RegionType <FV, DATA, or FILE>\r
-#\r
-################################################################################\r
-0x0|0x200000\r
-gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoveryBase|gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoverySize\r
+0x0|0x400000\r
 FV = MAINFV\r
 \r
 ################################################################################\r
+\r
+[FV.SECFV]\r
+BlockSize          = 0x1000\r
+FvAlignment        = 16\r
+ERASE_POLARITY     = 1\r
+MEMORY_MAPPED      = TRUE\r
+STICKY_WRITE       = TRUE\r
+LOCK_CAP           = TRUE\r
+LOCK_STATUS        = TRUE\r
+WRITE_DISABLED_CAP = TRUE\r
+WRITE_ENABLED_CAP  = TRUE\r
+WRITE_STATUS       = TRUE\r
+WRITE_LOCK_CAP     = TRUE\r
+WRITE_LOCK_STATUS  = TRUE\r
+READ_DISABLED_CAP  = TRUE\r
+READ_ENABLED_CAP   = TRUE\r
+READ_STATUS        = TRUE\r
+READ_LOCK_CAP      = TRUE\r
+READ_LOCK_STATUS   = TRUE\r
+\r
 #\r
-# FV Section\r
+# SEC Phase modules\r
 #\r
-# [FV] section is used to define what components or modules are placed within a flash\r
-# device file.  This section also defines order the components and modules are positioned\r
-# within the image.  The [FV] section consists of define statements, set statements and\r
-# module statements.\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
 #\r
+INF  OvmfPkg/Sec/SecMain.inf\r
+\r
+FILE RAW = 1BA0062E-C779-4582-8566-336AE8F78F09 {\r
+    SECTION RAW = OvmfPkg/ResetVector/Bin/ResetVector.ia32.raw\r
+  }\r
+\r
 ################################################################################\r
-[FV.DXEFV]\r
-BlockSize          = 0x1000\r
-FvAlignment        = 16         #FV alignment and FV attributes setting.\r
+[FV.MAINFV]\r
+BlockSize          = 0x10000\r
+FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
 MEMORY_MAPPED      = TRUE\r
 STICKY_WRITE       = TRUE\r
@@ -82,7 +90,7 @@ READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE\r
 \r
 #\r
-# Files to be placed in DXEFV\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
@@ -90,11 +98,24 @@ READ_LOCK_STATUS   = TRUE
 # overall compression.\r
 #\r
 \r
+APRIORI PEI {\r
+  INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
+}\r
+\r
 APRIORI DXE {\r
   INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf\r
   INF  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
 }\r
 \r
+#\r
+#  PEI Phase modules\r
+#\r
+INF  MdeModulePkg/Core/Pei/PeiMain.inf\r
+INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
+INF  IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
+INF  OvmfPkg/PlatformPei/PlatformPei.inf\r
+INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
+\r
 #\r
 # DXE Phase modules\r
 #\r
@@ -106,7 +127,7 @@ INF  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 INF  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
 INF  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
 INF  IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
-INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
+INF  MdeModulePkg/Universal/EbcDxe/EbcDxe.inf\r
 INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf\r
 INF  PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf\r
 INF  UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf\r
@@ -167,7 +188,8 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) {
 \r
 ################################################################################\r
 \r
-[FV.MAINFV]\r
+[FV.OVMF]\r
+BlockSize          = 0x10000\r
 FvAlignment        = 16\r
 ERASE_POLARITY     = 1\r
 MEMORY_MAPPED      = TRUE\r
@@ -186,54 +208,27 @@ READ_LOCK_CAP      = TRUE
 READ_LOCK_STATUS   = TRUE\r
 \r
 #\r
-# Files to be placed in MAINFV\r
-#\r
-# This firmware volume will have all the files placed in it which\r
-# must not be compressed at the initial boot phase.  The only\r
-# exception to this is the compressed 'DXEFV'.\r
-#\r
-\r
-APRIORI PEI {\r
-  INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
-}\r
-\r
-#\r
-#  SEC Phase modules\r
-#\r
-INF  OvmfPkg/Sec/SecMain.inf\r
-\r
-#\r
-#  PEI Phase modules\r
-#\r
-INF  MdeModulePkg/Core/Pei/PeiMain.inf\r
-INF  RuleOverride=NORELOC MdeModulePkg/Universal/PCD/Pei/Pcd.inf\r
-INF  RuleOverride=NORELOC IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
-INF  RuleOverride=NORELOC OvmfPkg/PlatformPei/PlatformPei.inf\r
-INF  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
-\r
-#\r
-# This file contains the compressed 'DXEFV', which is compressed\r
+# This file contains the compressed MAINFV, which is compressed\r
 # in a single compression operation in order to achieve better\r
 # overall compression.\r
 #\r
 FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 {\r
    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { # LzmaCompress\r
-      SECTION FV_IMAGE = DXEFV\r
+      SECTION FV_IMAGE = MAINFV\r
    }\r
  }\r
 \r
-FILE RAW = 1BA0062E-C779-4582-8566-336AE8F78F09 {\r
-    SECTION RAW = OvmfPkg/ResetVector/Bin/ResetVector.ia32.raw\r
-  }\r
-\r
-\r
-################################################################################\r
 #\r
-# Rules are use with the [FV] section's module INF type to define\r
-# how an FFS file is created for a given INF file. The following Rule are the default\r
-# rules for the different module type. User can add the customized rules to define the\r
-# content of the FFS file.\r
+# This file contains the uncompressed SECFV, which contains the initial\r
+# boot code.  The code in this FV decompresses the MAINFV.\r
+#\r
+# It uses the Volume Top File (VTF) GUID so it will be placed at the\r
+# end of the FV.\r
 #\r
+FILE FREEFORM = 1BA0062E-C779-4582-8566-336AE8F78F09 {\r
+  SECTION Align=16 FV_IMAGE = SECFV\r
+}\r
+\r
 ################################################################################\r
 \r
 [Rule.Common.PEI_CORE]\r
index cc6cdd54ecdd22074d04a162e732749d13efa4d0..4d82980fe2f02b44c812a839c823dc19c4e89f54 100644 (file)
@@ -1,7 +1,7 @@
 #/** @file\r
 #  EFI/Framework Open Virtual Machine Firmware (OVMF) platform\r
 #\r
-#  Copyright (c) 2006 - 2009, Intel Corporation\r
+#  Copyright (c) 2006 - 2010, Intel Corporation\r
 #\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
@@ -82,6 +82,7 @@
   BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf\r
+  ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf\r
 \r
 [LibraryClasses.common.PEI_CORE]\r
   BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf\r
   ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf\r
-  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
   UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf\r
 \r
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf\r
   DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf\r
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
-  ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
   UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf\r
 \r
 [LibraryClasses.common.DXE_DRIVER]\r
   gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07\r
   gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200\r
 \r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000\r
-\r
   gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32\r
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F\r
   gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F\r
 \r
-\r
 ################################################################################\r
 #\r
 # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform\r
   #\r
   # SEC Phase modules\r
   #\r
-  OvmfPkg/Sec/SecMain.inf\r
+  OvmfPkg/Sec/SecMain.inf {\r
+    <LibraryClasses>\r
+      NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
+  }\r
 \r
   #\r
   # PEI Phase modules\r
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
   }\r
   IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf\r
-  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {\r
-    <LibraryClasses>\r
-      NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf\r
-  }\r
+  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf\r
 \r
   OvmfPkg/PlatformPei/PlatformPei.inf {\r
     <LibraryClasses>\r
    <LibraryClasses>\r
       PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
   }\r
-  \r
+\r
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf\r
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf\r
   IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf\r
       TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf\r
   }\r
 \r
-  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf  {\r
+  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf {\r
     <LibraryClasses>\r
       TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf\r
   }\r
index 7ae35237b272ed0fe2c5409b0c41c83e0ec4d269..f9e263520858b3cc67ecf535174982d80b0cf0e3 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Build FV related hobs for platform.\r
 \r
-  Copyright (c) 2006 - 2009, Intel Corporation\r
+  Copyright (c) 2006 - 2010, 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
 \r
 #include "PiPei.h"\r
 #include <Library/DebugLib.h>\r
-#include <Library/PeimEntryPoint.h>\r
 #include <Library/HobLib.h>\r
 #include <Library/PeiServicesLib.h>\r
-#include <Library/PeiServicesTablePointerLib.h>\r
 #include <Library/PcdLib.h>\r
 \r
 \r
@@ -35,25 +33,27 @@ PeiFvInitialization (
   VOID\r
   )\r
 {\r
-  EFI_PHYSICAL_ADDRESS FdBase;\r
+  EFI_PHYSICAL_ADDRESS        FdBase;\r
 \r
   DEBUG ((EFI_D_ERROR, "Platform PEI Firmware Volume Initialization\n"));\r
 \r
   DEBUG (\r
     (EFI_D_ERROR, "Firmware Volume HOB: 0x%x 0x%x\n",\r
-      PcdGet32 (PcdOvmfFlashFvRecoveryBase),\r
-      PcdGet32 (PcdOvmfFlashFvRecoverySize)\r
+      PcdGet32 (PcdOvmfMemFvBase),\r
+      PcdGet32 (PcdOvmfMemFvSize)\r
       )\r
     );\r
 \r
-  FdBase = PcdGet32 (PcdOvmfFlashFvRecoveryBase) - PcdGet32 (PcdVariableStoreSize) - PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
-  BuildFvHob (PcdGet32 (PcdOvmfFlashFvRecoveryBase), PcdGet32 (PcdOvmfFlashFvRecoverySize));\r
+  FdBase = PcdGet32 (PcdOvmfMemFvBase) - PcdGet32 (PcdVariableStoreSize) - PcdGet32 (PcdFlashNvStorageFtwSpareSize);\r
+  BuildFvHob (PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize));\r
 \r
-  BuildResourceDescriptorHob (\r
-    EFI_RESOURCE_FIRMWARE_DEVICE,\r
-    (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE),\r
-    FdBase,\r
-    PcdGet32 (PcdOvmfFirmwareFdSize)\r
+  //\r
+  // Create a memory allocation HOB.\r
+  //\r
+  BuildMemoryAllocationHob (\r
+    PcdGet32 (PcdOvmfMemFvBase),\r
+    PcdGet32 (PcdOvmfMemFvSize),\r
+    EfiBootServicesData\r
     );\r
 \r
   return EFI_SUCCESS;\r
index daa83a00141795b65a38dec68b00b86735563d8b..30ee2b1772afa79c2d1261588bf7a000eb95ccc6 100644 (file)
@@ -27,6 +27,7 @@ Module Name:
 #include <Library/DebugLib.h>\r
 #include <Library/HobLib.h>\r
 #include <Library/IoLib.h>\r
+#include <Library/PcdLib.h>\r
 #include <Library/PeimEntryPoint.h>\r
 #include <Library/ResourcePublicationLib.h>\r
 \r
@@ -79,8 +80,15 @@ MemDetect (
   //\r
   TotalMemorySize = (UINT64)GetSystemMemorySize ();\r
 \r
-  MemoryBase = 0x800000;\r
-  MemorySize = TotalMemorySize - MemoryBase - 0x100000;\r
+  //\r
+  // Determine the range of memory to use during PEI\r
+  //\r
+  MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize);\r
+  MemorySize = TotalMemorySize - MemoryBase;\r
+  if (MemorySize > SIZE_16MB) {\r
+    MemoryBase = TotalMemorySize - SIZE_16MB;\r
+    MemorySize = SIZE_16MB;\r
+  }\r
 \r
   //\r
   // Publish this memory to the PEI Core\r
@@ -92,8 +100,8 @@ MemDetect (
   // Create memory HOBs\r
   //\r
   AddMemoryBaseSizeHob (MemoryBase, MemorySize);\r
-  AddMemoryRangeHob (0x100000, 0x800000);\r
-  AddMemoryRangeHob (0x000000, 0x0A0000);\r
+  AddMemoryRangeHob (BASE_1MB, MemoryBase);\r
+  AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
 \r
   return EFI_SUCCESS;\r
 }\r
index df6545199b8deb6ee99bc3cb9082ff4d3a9a8ba5..1ef3a368cbe17b5d1bbbf81eb289146089742955 100644 (file)
   PeimEntryPoint\r
 \r
 [FixedPcd.common]\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize\r
index 7d13ebb4bcb41645796d0851fdafcc9149e0d467..01cd70f5baf0dab6d3aa2b0c6ba5f616b36e8e62 100644 (file)
@@ -1,7 +1,7 @@
 /** @file
   Locate the entry point for the PEI Core
 
-  Copyright (c) 2008 - 2009, Intel Corporation
+  Copyright (c) 2008 - 2010, 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
 
 #include <PiPei.h>
 #include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ExtractGuidedSectionLib.h>
+#include <Library/PcdLib.h>
 #include <Library/PeCoffGetEntryPointLib.h>
 
 #include "SecMain.h"
 
 
-VOID
+/**
+  Locates the main boot firmware volume.
+
+  @param[in,out]  BootFv  On input, the base of the BootFv
+                          On output, the decompressed main firmware volume
+
+  @retval EFI_SUCCESS    The main firmware volume was located and decompressed
+  @retval EFI_NOT_FOUND  The main firmware volume was not found
+
+**/
+EFI_STATUS
+FindMainFv (
+  IN OUT  EFI_FIRMWARE_VOLUME_HEADER   **BootFv
+  )
+{
+  EFI_FIRMWARE_VOLUME_HEADER  *Fv;
+  UINTN                       Distance;
+  BOOLEAN                     Found;
+
+  ASSERT (((UINTN) *BootFv & EFI_PAGE_MASK) == 0);
+
+  Found = FALSE;
+  Fv = *BootFv;
+  Distance = (UINTN) (*BootFv)->FvLength;
+  do {
+    Fv = (EFI_FIRMWARE_VOLUME_HEADER*) ((UINT8*) Fv - EFI_PAGE_SIZE);
+    Distance += EFI_PAGE_SIZE;
+    if (Distance > SIZE_32MB) {
+      return EFI_NOT_FOUND;
+    }
+
+    if (Fv->Signature != EFI_FVH_SIGNATURE) {
+      continue;
+    }
+
+    if ((UINTN) Fv->FvLength > Distance) {
+      continue;
+    }
+
+    *BootFv = Fv;
+    return EFI_SUCCESS;
+
+  } while (TRUE);
+}
+
+
+/**
+  Locates a section within a series of sections
+  with the specified section type.
+
+  @param[in]   Sections        The sections to search
+  @param[in]   SizeOfSections  Total size of all sections
+  @param[in]   SectionType     The section type to locate
+  @param[out]  FoundSection    The FFS section if found
+
+  @retval EFI_SUCCESS           The file and section was found
+  @retval EFI_NOT_FOUND         The file and section was not found
+  @retval EFI_VOLUME_CORRUPTED  The firmware volume was corrupted
+
+**/
+EFI_STATUS
+FindFfsSectionInSections (
+  IN  VOID                             *Sections,
+  IN  UINTN                            SizeOfSections,
+  IN  EFI_SECTION_TYPE                 SectionType,
+  OUT EFI_COMMON_SECTION_HEADER        **FoundSection
+  )
+{
+  EFI_PHYSICAL_ADDRESS        CurrentAddress;
+  UINT32                      Size;
+  EFI_PHYSICAL_ADDRESS        EndOfSections;
+  EFI_COMMON_SECTION_HEADER   *Section;
+  EFI_PHYSICAL_ADDRESS        EndOfSection;
+
+  //
+  // Loop through the FFS file sections within the PEI Core FFS file
+  //
+  EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) Sections;
+  EndOfSections = EndOfSection + SizeOfSections;
+  for (;;) {
+    if (EndOfSection == EndOfSections) {
+      break;
+    }
+    CurrentAddress = (EndOfSection + 3) & ~(3ULL);
+    if (CurrentAddress >= EndOfSections) {
+      return EFI_VOLUME_CORRUPTED;
+    }
+
+    Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;
+    DEBUG ((EFI_D_INFO, "Section->Type: 0x%x\n", Section->Type));
+
+    Size = SECTION_SIZE (Section);
+    if (Size < sizeof (*Section)) {
+      return EFI_VOLUME_CORRUPTED;
+    }
+
+    EndOfSection = CurrentAddress + Size;
+    if (EndOfSection > EndOfSections) {
+      return EFI_VOLUME_CORRUPTED;
+    }
+
+    //
+    // Look for the requested section type
+    //
+    if (Section->Type == SectionType) {
+      *FoundSection = Section;
+      return EFI_SUCCESS;
+    }
+    DEBUG ((EFI_D_INFO, "Section->Type (0x%x) != SectionType (0x%x)\n", Section->Type, SectionType));
+  }
+
+  return EFI_NOT_FOUND;
+}
+
+
+/**
+  Locates a FFS file with the specified file type and a section
+  within that file with the specified section type.
+
+  @param[in]   Fv            The firmware volume to search
+  @param[in]   FileType      The file type to locate
+  @param[in]   SectionType   The section type to locate
+  @param[out]  FoundSection  The FFS section if found
+
+  @retval EFI_SUCCESS           The file and section was found
+  @retval EFI_NOT_FOUND         The file and section was not found
+  @retval EFI_VOLUME_CORRUPTED  The firmware volume was corrupted
+
+**/
+EFI_STATUS
 EFIAPI
-FindPeiCoreEntryPoint (
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *BootFirmwareVolumePtr,
-  OUT VOID                             **PeiCoreEntryPoint
+FindFfsFileAndSection (
+  IN  EFI_FIRMWARE_VOLUME_HEADER       *Fv,
+  IN  EFI_FV_FILETYPE                  FileType,
+  IN  EFI_SECTION_TYPE                 SectionType,
+  OUT EFI_COMMON_SECTION_HEADER        **FoundSection
   )
 {
   EFI_STATUS                  Status;
@@ -33,71 +168,219 @@ FindPeiCoreEntryPoint (
   EFI_FFS_FILE_HEADER         *File;
   UINT32                      Size;
   EFI_PHYSICAL_ADDRESS        EndOfFile;
-  EFI_COMMON_SECTION_HEADER   *Section;
-  EFI_PHYSICAL_ADDRESS        EndOfSection;
 
-  *PeiCoreEntryPoint = NULL;
+  if (Fv->Signature != EFI_FVH_SIGNATURE) {
+    DEBUG ((EFI_D_INFO, "FV at %p does not have FV header signature\n", Fv));
+    return EFI_VOLUME_CORRUPTED;
+  }
 
-  CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) BootFirmwareVolumePtr;
-  EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength;
+  CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Fv;
+  EndOfFirmwareVolume = CurrentAddress + Fv->FvLength;
 
   //
   // Loop through the FFS files in the Boot Firmware Volume
   //
-  for (EndOfFile = CurrentAddress + BootFirmwareVolumePtr->HeaderLength; ; ) {
+  for (EndOfFile = CurrentAddress + Fv->HeaderLength; ; ) {
 
-    CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;
+    CurrentAddress = (EndOfFile + 7) & ~(7ULL);
     if (CurrentAddress > EndOfFirmwareVolume) {
-      return;
+      return EFI_VOLUME_CORRUPTED;
     }
 
     File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;
     Size = *(UINT32*) File->Size & 0xffffff;
-    if (Size < (sizeof (*File) + sizeof (*Section))) {
-      return;
+    if (Size < (sizeof (*File) + sizeof (EFI_COMMON_SECTION_HEADER))) {
+      return EFI_VOLUME_CORRUPTED;
     }
+    DEBUG ((EFI_D_INFO, "File->Type: 0x%x\n", File->Type));
 
     EndOfFile = CurrentAddress + Size;
     if (EndOfFile > EndOfFirmwareVolume) {
-      return;
+      return EFI_VOLUME_CORRUPTED;
     }
 
     //
-    // Look for PEI Core files
+    // Look for the request file type
     //
-    if (File->Type != EFI_FV_FILETYPE_PEI_CORE) {
+    if (File->Type != FileType) {
+      DEBUG ((EFI_D_INFO, "File->Type (0x%x) != FileType (0x%x)\n", File->Type, FileType));
       continue;
     }
 
-    //
-    // Loop through the FFS file sections within the PEI Core FFS file
-    //
-    EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) (File + 1);
-    for (;;) {
-      CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;
-      Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;
-
-      Size = *(UINT32*) Section->Size & 0xffffff;
-      if (Size < sizeof (*Section)) {
-        return;
-      }
-
-      EndOfSection = CurrentAddress + Size;
-      if (EndOfSection > EndOfFile) {
-        return;
-      }
-
-      //
-      // Look for executable sections
-      //
-      if (Section->Type == EFI_SECTION_PE32) {
-        Status = PeCoffLoaderGetEntryPoint ((VOID*) (Section + 1), PeiCoreEntryPoint);
-        if (!EFI_ERROR (Status)) {
-          return;
-        }
-      }
+    Status = FindFfsSectionInSections (
+               (VOID*) (File + 1),
+               (UINTN) EndOfFile - (UINTN) (File + 1),
+               SectionType,
+               FoundSection
+               );
+    if (!EFI_ERROR (Status) || (Status == EFI_VOLUME_CORRUPTED)) {
+      return Status;
     }
+  }
+
+  return EFI_NOT_FOUND;
+}
+
+
+/**
+  Locates the compressed main firmware volume and decompresses it.
+
+  @param[in,out]  Fv            On input, the firmware volume to search
+                                On output, the decompressed main FV
+
+  @retval EFI_SUCCESS           The file and section was found
+  @retval EFI_NOT_FOUND         The file and section was not found
+  @retval EFI_VOLUME_CORRUPTED  The firmware volume was corrupted
+
+**/
+EFI_STATUS
+EFIAPI
+DecompressGuidedFv (
+  IN OUT EFI_FIRMWARE_VOLUME_HEADER       **Fv
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_GUID_DEFINED_SECTION          *Section;
+  UINT32                            OutputBufferSize;
+  UINT32                            ScratchBufferSize;
+  UINT16                            SectionAttribute;
+  UINT32                            AuthenticationStatus;
+  VOID                              *OutputBuffer;
+  VOID                              *ScratchBuffer;
+  EFI_FIRMWARE_VOLUME_IMAGE_SECTION *NewFvSection;
+  EFI_FIRMWARE_VOLUME_HEADER        *NewFv;
 
+  NewFvSection = (EFI_FIRMWARE_VOLUME_IMAGE_SECTION*) NULL;
+
+  Status = FindFfsFileAndSection (
+             *Fv,
+             EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
+             EFI_SECTION_GUID_DEFINED,
+             (EFI_COMMON_SECTION_HEADER**) &Section
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "Unable to find GUID defined section\n"));
+    return Status;
+  }
+
+  Status = ExtractGuidedSectionGetInfo (
+             Section,
+             &OutputBufferSize,
+             &ScratchBufferSize,
+             &SectionAttribute
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "Unable to GetInfo for GUIDed section\n"));
+    return Status;
+  }
+
+  //PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize)
+  OutputBuffer = (VOID*) ((UINT8*)(UINTN) PcdGet32 (PcdOvmfMemFvBase) + SIZE_1MB);
+  ScratchBuffer = ALIGN_POINTER ((UINT8*) OutputBuffer + OutputBufferSize, SIZE_1MB);
+  Status = ExtractGuidedSectionDecode (
+             Section,
+             &OutputBuffer,
+             ScratchBuffer,
+             &AuthenticationStatus
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "Error during GUID section decode\n"));
+    return Status;
+  }
+
+  Status = FindFfsSectionInSections (
+             OutputBuffer,
+             OutputBufferSize,
+             EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
+             (EFI_COMMON_SECTION_HEADER**) &NewFvSection
+             );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "Unable to find FV image in extracted data\n"));
+    return Status;
   }
+
+  NewFv = (EFI_FIRMWARE_VOLUME_HEADER*)(UINTN) PcdGet32 (PcdOvmfMemFvBase);
+  CopyMem (NewFv, (VOID*) (NewFvSection + 1), PcdGet32 (PcdOvmfMemFvSize));
+
+  if (NewFv->Signature != EFI_FVH_SIGNATURE) {
+    DEBUG ((EFI_D_ERROR, "Extracted FV at %p does not have FV header signature\n", NewFv));
+    CpuDeadLoop ();
+    return EFI_VOLUME_CORRUPTED;
+  }
+
+  *Fv = NewFv;
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Locates the PEI Core entry point address
+
+  @param[in]  Fv                 The firmware volume to search
+  @param[out] PeiCoreEntryPoint  The entry point of the PEI Core image
+
+  @retval EFI_SUCCESS           The file and section was found
+  @retval EFI_NOT_FOUND         The file and section was not found
+  @retval EFI_VOLUME_CORRUPTED  The firmware volume was corrupted
+
+**/
+EFI_STATUS
+EFIAPI
+FindPeiCoreEntryPointInFv (
+  IN  EFI_FIRMWARE_VOLUME_HEADER       *Fv,
+  OUT VOID                             **PeiCoreEntryPoint
+  )
+{
+  EFI_STATUS                  Status;
+  EFI_COMMON_SECTION_HEADER   *Section;
+
+  Status = FindFfsFileAndSection (
+             Fv,
+             EFI_FV_FILETYPE_PEI_CORE,
+             EFI_SECTION_PE32,
+             &Section
+             );
+  if (EFI_ERROR (Status)) {
+    Status = FindFfsFileAndSection (
+               Fv,
+               EFI_FV_FILETYPE_PEI_CORE,
+               EFI_SECTION_TE,
+               &Section
+               );
+    if (EFI_ERROR (Status)) {
+      DEBUG ((EFI_D_ERROR, "Unable to find PEI Core image\n"));
+      return Status;
+    }
+  }
+
+  return PeCoffLoaderGetEntryPoint ((VOID*) (Section + 1), PeiCoreEntryPoint);
+}
+
+
+/**
+  Locates the PEI Core entry point address
+
+  @param[in,out]  Fv                 The firmware volume to search
+  @param[out]     PeiCoreEntryPoint  The entry point of the PEI Core image
+
+  @retval EFI_SUCCESS           The file and section was found
+  @retval EFI_NOT_FOUND         The file and section was not found
+  @retval EFI_VOLUME_CORRUPTED  The firmware volume was corrupted
+
+**/
+VOID
+EFIAPI
+FindPeiCoreEntryPoint (
+  IN OUT  EFI_FIRMWARE_VOLUME_HEADER       **BootFv,
+     OUT  VOID                             **PeiCoreEntryPoint
+  )
+{
+  *PeiCoreEntryPoint = NULL;
+
+  FindMainFv (BootFv);
+
+  DecompressGuidedFv (BootFv);
+
+  FindPeiCoreEntryPointInFv (*BootFv, PeiCoreEntryPoint);
 }
 
index 99d21f3d95120469ecd2ce8f6e270879f84d49c2..58da92b0866acadcf5c6e7c8c6d481838c07334c 100644 (file)
@@ -17,6 +17,7 @@
 #include <Library/BaseLib.h>
 #include <Library/DebugLib.h>
 #include <Library/BaseMemoryLib.h>
+#include <Library/PeimEntryPoint.h>
 #include <Library/PeiServicesLib.h>
 #include <Ppi/TemporaryRamSupport.h>
 #include <Library/PcdLib.h>
@@ -61,7 +62,7 @@ InitializeIdtPtr (
 VOID
 EFIAPI
 SecCoreStartupWithStack (
-  IN EFI_FIRMWARE_VOLUME_HEADER       *BootFirmwareVolumePtr,
+  IN EFI_FIRMWARE_VOLUME_HEADER       *BootFv,
   IN VOID                             *TopOfCurrentStack
   )
 {
@@ -72,18 +73,20 @@ SecCoreStartupWithStack (
   VOID                        *IdtPtr;
   VOID                        *PeiCoreEntryPoint;
 
+  DEBUG ((EFI_D_INFO,
+    "SecCoreStartupWithStack(0x%x, 0x%x)\n",
+    (UINT32)(UINTN)BootFv,
+    (UINT32)(UINTN)TopOfCurrentStack
+    ));
+
+  ProcessLibraryConstructorList (NULL, NULL);
+
   //
   // Initialize floating point operating environment
   // to be compliant with UEFI spec.
   //
   InitializeFloatingPointUnits ();
 
-  DEBUG ((EFI_D_INFO,
-    "SecCoreStartupWithStack(0x%x, 0x%x)\n",
-    (UINT32)(UINTN)BootFirmwareVolumePtr,
-    (UINT32)(UINTN)TopOfCurrentStack
-    ));
-
   BottomOfTempRam = (UINT8*)(UINTN) INITIAL_TOP_OF_STACK;
   SizeOfTempRam = (UINTN) SIZE_64KB;
   TopOfTempRam = BottomOfTempRam + SizeOfTempRam;
@@ -104,9 +107,6 @@ SecCoreStartupWithStack (
   SecCoreData = (EFI_SEC_PEI_HAND_OFF*)((UINTN) TopOfTempRam - SIZE_4KB);
   SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
 
-  SecCoreData->BootFirmwareVolumeBase = (VOID*)(UINTN) PcdGet32 (PcdOvmfFlashFvRecoveryBase);
-  SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdOvmfFlashFvRecoverySize);
-
   SecCoreData->TemporaryRamBase       = (VOID*) BottomOfTempRam;
   SecCoreData->TemporaryRamSize       = SizeOfTempRam;
 
@@ -124,7 +124,10 @@ SecCoreStartupWithStack (
   IdtPtr = ALIGN_POINTER(IdtPtr, 16);
   InitializeIdtPtr (IdtPtr);
 
-  FindPeiCoreEntryPoint (BootFirmwareVolumePtr, &PeiCoreEntryPoint);
+  FindPeiCoreEntryPoint (&BootFv, &PeiCoreEntryPoint);
+
+  SecCoreData->BootFirmwareVolumeBase = BootFv;
+  SecCoreData->BootFirmwareVolumeSize = BootFv->FvLength;
 
   if (PeiCoreEntryPoint != NULL) {
     DEBUG ((EFI_D_INFO,
index 4f5eaa8137f8c5528caddf2295d588d36106869e..1a4ed40bf70547634605c3912ea92e277b0d480b 100644 (file)
@@ -47,11 +47,11 @@ TemporaryRamMigration (
 VOID
 EFIAPI
 FindPeiCoreEntryPoint (
-  IN  EFI_FIRMWARE_VOLUME_HEADER       *BootFirmwareVolumePtr,
+  IN  EFI_FIRMWARE_VOLUME_HEADER       **BootFirmwareVolumePtr,
   OUT VOID                             **PeiCoreEntryPoint
   );
 
-#define INITIAL_TOP_OF_STACK      BASE_128KB
+#define INITIAL_TOP_OF_STACK      BASE_512KB
 
 #endif // _PLATFORM_SECMAIN_H_
 
index 7cc1533fdc2797ced70f801ab320898ae58abc1a..08e26d2ac0fe9ecf6df5cdcaf86d0a02b75ecd4d 100644 (file)
@@ -50,6 +50,8 @@
 \r
 [LibraryClasses]\r
   BaseLib\r
+  BaseMemoryLib\r
+  ExtractGuidedSectionLib\r
   PcdLib\r
   PeCoffGetEntryPointLib\r
   UefiCpuLib\r
@@ -58,6 +60,6 @@
   gEfiTemporaryRamSupportPpiGuid                # PPI ALWAYS_PRODUCED\r
 \r
 [FixedPcd.common]\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase\r
-  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize\r
 \r