From c1c2669c6bb3ed4e23c06a93e60450a4fc3eccf2 Mon Sep 17 00:00:00 2001 From: jljusten Date: Mon, 4 Jan 2010 16:17:59 +0000 Subject: [PATCH] OVMF: Update OVMF FD/FV build to minimize ROM size * 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 --- OvmfPkg/OvmfPkg.dec | 9 +- OvmfPkg/OvmfPkg.fdf | 164 ++++++------ OvmfPkg/OvmfPkgIa32.dsc | 22 +- OvmfPkg/OvmfPkgIa32X64.dsc | 23 +- OvmfPkg/OvmfPkgIa32X64.fdf | 167 ++++++------- OvmfPkg/OvmfPkgX64.dsc | 25 +- OvmfPkg/PlatformPei/Fv.c | 26 +- OvmfPkg/PlatformPei/MemDetect.c | 16 +- OvmfPkg/PlatformPei/PlatformPei.inf | 6 +- OvmfPkg/Sec/FindPeiCore.c | 375 ++++++++++++++++++++++++---- OvmfPkg/Sec/SecMain.c | 25 +- OvmfPkg/Sec/SecMain.h | 4 +- OvmfPkg/Sec/SecMain.inf | 6 +- 13 files changed, 564 insertions(+), 304 deletions(-) diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 02c039dcd0..862811c436 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -26,13 +26,8 @@ gUefiOvmfPkgTokenSpaceGuid = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}} [PcdsFixedAtBuild] - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0x0|UINT32|0 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x0|UINT32|0 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x0|UINT32|0 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0|UINT32|0 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase|0x0|UINT32|0 + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|0x0|UINT32|0 + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize|0x0|UINT32|0 [PcdsDynamic] gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|0 diff --git a/OvmfPkg/OvmfPkg.fdf b/OvmfPkg/OvmfPkg.fdf index d54753b0c4..d811b562f5 100644 --- a/OvmfPkg/OvmfPkg.fdf +++ b/OvmfPkg/OvmfPkg.fdf @@ -1,7 +1,7 @@ #/** @file # Open Virtual Machine Firmware: FDF # -# Copyright (c) 2006 - 2009, Intel Corporation +# Copyright (c) 2006 - 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 @@ -14,57 +14,33 @@ #**/ ################################################################################ -# -# FD Section -# The [FD] Section is made up of the definition statements and a -# description of what goes into the Flash Device Image. Each FD section -# defines one flash "device" image. A flash device image may be one of -# the following: Removable media bootable image (like a boot floppy -# image,) an Option ROM image (that would be "flashed" into an add-in -# card,) a System "Flash" image (that would be burned into a system's -# flash) or an Update ("Capsule") image that will be used to update and -# existing system flash. -# -################################################################################ -[FD.OVMF] -BaseAddress = 0xFFE00000 # The base address of the FLASH Device. -Size = 0x00200000 # The size in bytes of the FLASH Device +[FD.SEC] +BaseAddress = 0xFFFEE000 +Size = 0x00012000 ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0x20 +BlockSize = 0x1000 +NumBlocks = 0x12 + +0x0|0x12000 +FV = SECFV ################################################################################ -# -# Following are lists of FD Region layout which correspond to the locations of different -# images within the flash device. -# -# Regions must be defined in ascending order and may not overlap. -# -# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by -# the pipe "|" character, followed by the size of the region, also in hex with the leading -# "0x" characters. Like: -# Offset|Size -# PcdOffsetCName|PcdSizeCName -# RegionType -# -################################################################################ -0x0|0x200000 -gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoveryBase|gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoverySize + +[FD.MEMFD] +BaseAddress = 0x800000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase +Size = 0x400000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize +ErasePolarity = 1 +BlockSize = 0x10000 +NumBlocks = 0x40 + +0x0|0x400000 FV = MAINFV ################################################################################ -# -# FV Section -# -# [FV] section is used to define what components or modules are placed within a flash -# device file. This section also defines order the components and modules are positioned -# within the image. The [FV] section consists of define statements, set statements and -# module statements. -# -################################################################################ -[FV.DXEFV] + +[FV.SECFV] BlockSize = 0x1000 -FvAlignment = 16 #FV alignment and FV attributes setting. +FvAlignment = 16 ERASE_POLARITY = 1 MEMORY_MAPPED = TRUE STICKY_WRITE = TRUE @@ -82,7 +58,37 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE # -# Files to be placed in DXEFV +# 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. +# +INF OvmfPkg/Sec/SecMain.inf + +INF RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/Bin/ResetVector.inf + +################################################################################ +[FV.MAINFV] +BlockSize = 0x10000 +FvAlignment = 16 +ERASE_POLARITY = 1 +MEMORY_MAPPED = TRUE +STICKY_WRITE = TRUE +LOCK_CAP = TRUE +LOCK_STATUS = TRUE +WRITE_DISABLED_CAP = TRUE +WRITE_ENABLED_CAP = TRUE +WRITE_STATUS = TRUE +WRITE_LOCK_CAP = TRUE +WRITE_LOCK_STATUS = TRUE +READ_DISABLED_CAP = TRUE +READ_ENABLED_CAP = TRUE +READ_STATUS = TRUE +READ_LOCK_CAP = TRUE +READ_LOCK_STATUS = TRUE + +# +# Files to be placed in MAIN FV # # This firmware volume will have files placed in it uncompressed, # and then then entire firmware volume will be compressed in a @@ -90,11 +96,24 @@ READ_LOCK_STATUS = TRUE # overall compression. # +APRIORI PEI { + INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf +} + APRIORI DXE { INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf } +# +# PEI Phase modules +# +INF MdeModulePkg/Core/Pei/PeiMain.inf +INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf +INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf +INF OvmfPkg/PlatformPei/PlatformPei.inf +INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf + # # DXE Phase modules # @@ -106,7 +125,7 @@ INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf -INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf +INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf INF PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf @@ -163,7 +182,8 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { ################################################################################ -[FV.MAINFV] +[FV.OVMF] +BlockSize = 0x10000 FvAlignment = 16 ERASE_POLARITY = 1 MEMORY_MAPPED = TRUE @@ -182,51 +202,27 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE # -# Files to be placed in MAINFV -# -# This firmware volume will have all the files placed in it which -# must not be compressed at the initial boot phase. The only -# exception to this is the compressed 'DXEFV'. -# - -APRIORI PEI { - INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf -} - -# -# SEC Phase modules -# -INF OvmfPkg/Sec/SecMain.inf - -# -# PEI Phase modules -# -INF MdeModulePkg/Core/Pei/PeiMain.inf -INF RuleOverride=NORELOC MdeModulePkg/Universal/PCD/Pei/Pcd.inf -INF RuleOverride=NORELOC IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -INF RuleOverride=NORELOC OvmfPkg/PlatformPei/PlatformPei.inf -INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf - -# -# This file contains the compressed 'DXEFV', which is compressed +# This file contains the compressed MAINFV, which is compressed # in a single compression operation in order to achieve better # overall compression. # FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 { SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { # LzmaCompress - SECTION FV_IMAGE = DXEFV + SECTION FV_IMAGE = MAINFV } } -INF RuleOverride=RESET_VECTOR OvmfPkg/ResetVector/Bin/ResetVector.inf +# +# This file contains the uncompressed SECFV, which contains the initial +# boot code. The code in this FV decompresses the MAINFV. +# +# It uses the Volume Top File (VTF) GUID so it will be placed at the +# end of the FV. +# +FILE FREEFORM = 1BA0062E-C779-4582-8566-336AE8F78F09 { + SECTION Align=16 FV_IMAGE = SECFV +} -################################################################################ -# -# Rules are use with the [FV] section's module INF type to define -# how an FFS file is created for a given INF file. The following Rule are the default -# rules for the different module type. User can add the customized rules to define the -# content of the FFS file. -# ################################################################################ [Rule.Common.PEI_CORE] diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 4dc00d6e1a..11e1f98f1a 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -1,7 +1,7 @@ #/** @file # EFI/Framework Open Virtual Machine Firmware (OVMF) platform # -# Copyright (c) 2006 - 2009, Intel Corporation +# Copyright (c) 2006 - 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 @@ -81,6 +81,7 @@ [LibraryClasses.common.SEC] DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf + ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf [LibraryClasses.common.PEI_CORE] BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf @@ -128,7 +129,6 @@ ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf @@ -140,7 +140,6 @@ ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf [LibraryClasses.common.DXE_DRIVER] @@ -179,11 +178,6 @@ gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07 gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000 - gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32 @@ -233,7 +227,10 @@ # # SEC Phase modules # - OvmfPkg/Sec/SecMain.inf + OvmfPkg/Sec/SecMain.inf { + + NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf + } # # PEI Phase modules @@ -244,10 +241,7 @@ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf } IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf - MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { - - NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - } + MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf OvmfPkg/PlatformPei/PlatformPei.inf { @@ -290,7 +284,7 @@ TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf } - IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { + IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf } diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 5eb44d17a5..55fc6ce0b0 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -1,7 +1,7 @@ #/** @file # EFI/Framework Open Virtual Machine Firmware (OVMF) platform # -# Copyright (c) 2006 - 2009, Intel Corporation +# Copyright (c) 2006 - 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 @@ -82,6 +82,7 @@ BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf + ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf [LibraryClasses.common.PEI_CORE] BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf @@ -129,7 +130,6 @@ ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf @@ -141,7 +141,6 @@ ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf [LibraryClasses.common.DXE_DRIVER] @@ -180,11 +179,6 @@ gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07 gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000 - gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32 @@ -212,7 +206,6 @@ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F - ################################################################################ # # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform @@ -235,7 +228,10 @@ # # SEC Phase modules # - OvmfPkg/Sec/SecMain.inf + OvmfPkg/Sec/SecMain.inf { + + NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf + } # # PEI Phase modules @@ -246,10 +242,7 @@ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf } IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf - MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { - - NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - } + MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf OvmfPkg/PlatformPei/PlatformPei.inf { @@ -293,7 +286,7 @@ TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf } - IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { + IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf } diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index d734175e6e..dd238cfe04 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -1,7 +1,7 @@ #/** @file # Open Virtual Machine Firmware: FDF # -# Copyright (c) 2006 - 2009, Intel Corporation +# Copyright (c) 2006 - 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 @@ -14,57 +14,33 @@ #**/ ################################################################################ -# -# FD Section -# The [FD] Section is made up of the definition statements and a -# description of what goes into the Flash Device Image. Each FD section -# defines one flash "device" image. A flash device image may be one of -# the following: Removable media bootable image (like a boot floppy -# image,) an Option ROM image (that would be "flashed" into an add-in -# card,) a System "Flash" image (that would be burned into a system's -# flash) or an Update ("Capsule") image that will be used to update and -# existing system flash. -# -################################################################################ -[FD.OVMF] -BaseAddress = 0xFFE00000 # The base address of the FLASH Device. -Size = 0x00200000 # The size in bytes of the FLASH Device +[FD.SEC] +BaseAddress = 0xFFFEE000 +Size = 0x00012000 ErasePolarity = 1 -BlockSize = 0x10000 -NumBlocks = 0x20 +BlockSize = 0x1000 +NumBlocks = 0x12 + +0x0|0x12000 +FV = SECFV ################################################################################ -# -# Following are lists of FD Region layout which correspond to the locations of different -# images within the flash device. -# -# Regions must be defined in ascending order and may not overlap. -# -# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by -# the pipe "|" character, followed by the size of the region, also in hex with the leading -# "0x" characters. Like: -# Offset|Size -# PcdOffsetCName|PcdSizeCName -# RegionType -# -################################################################################ -0x0|0x200000 -gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoveryBase|gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoverySize + +[FD.MEMFD] +BaseAddress = 0x800000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase +Size = 0x400000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize +ErasePolarity = 1 +BlockSize = 0x10000 +NumBlocks = 0x40 + +0x0|0x400000 FV = MAINFV ################################################################################ -# -# FV Section -# -# [FV] section is used to define what components or modules are placed within a flash -# device file. This section also defines order the components and modules are positioned -# within the image. The [FV] section consists of define statements, set statements and -# module statements. -# -################################################################################ -[FV.DXEFV] + +[FV.SECFV] BlockSize = 0x1000 -FvAlignment = 16 #FV alignment and FV attributes setting. +FvAlignment = 16 ERASE_POLARITY = 1 MEMORY_MAPPED = TRUE STICKY_WRITE = TRUE @@ -82,7 +58,39 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE # -# Files to be placed in DXEFV +# 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. +# +INF OvmfPkg/Sec/SecMain.inf + +FILE RAW = 1BA0062E-C779-4582-8566-336AE8F78F09 { + SECTION RAW = OvmfPkg/ResetVector/Bin/ResetVector.ia32.raw + } + +################################################################################ +[FV.MAINFV] +BlockSize = 0x10000 +FvAlignment = 16 +ERASE_POLARITY = 1 +MEMORY_MAPPED = TRUE +STICKY_WRITE = TRUE +LOCK_CAP = TRUE +LOCK_STATUS = TRUE +WRITE_DISABLED_CAP = TRUE +WRITE_ENABLED_CAP = TRUE +WRITE_STATUS = TRUE +WRITE_LOCK_CAP = TRUE +WRITE_LOCK_STATUS = TRUE +READ_DISABLED_CAP = TRUE +READ_ENABLED_CAP = TRUE +READ_STATUS = TRUE +READ_LOCK_CAP = TRUE +READ_LOCK_STATUS = TRUE + +# +# Files to be placed in MAIN FV # # This firmware volume will have files placed in it uncompressed, # and then then entire firmware volume will be compressed in a @@ -90,11 +98,24 @@ READ_LOCK_STATUS = TRUE # overall compression. # +APRIORI PEI { + INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf +} + APRIORI DXE { INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf } +# +# PEI Phase modules +# +INF MdeModulePkg/Core/Pei/PeiMain.inf +INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf +INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf +INF OvmfPkg/PlatformPei/PlatformPei.inf +INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf + # # DXE Phase modules # @@ -106,7 +127,7 @@ INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf -INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf +INF MdeModulePkg/Universal/EbcDxe/EbcDxe.inf INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf INF PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf @@ -167,7 +188,8 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) { ################################################################################ -[FV.MAINFV] +[FV.OVMF] +BlockSize = 0x10000 FvAlignment = 16 ERASE_POLARITY = 1 MEMORY_MAPPED = TRUE @@ -186,54 +208,27 @@ READ_LOCK_CAP = TRUE READ_LOCK_STATUS = TRUE # -# Files to be placed in MAINFV -# -# This firmware volume will have all the files placed in it which -# must not be compressed at the initial boot phase. The only -# exception to this is the compressed 'DXEFV'. -# - -APRIORI PEI { - INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf -} - -# -# SEC Phase modules -# -INF OvmfPkg/Sec/SecMain.inf - -# -# PEI Phase modules -# -INF MdeModulePkg/Core/Pei/PeiMain.inf -INF RuleOverride=NORELOC MdeModulePkg/Universal/PCD/Pei/Pcd.inf -INF RuleOverride=NORELOC IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf -INF RuleOverride=NORELOC OvmfPkg/PlatformPei/PlatformPei.inf -INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf - -# -# This file contains the compressed 'DXEFV', which is compressed +# This file contains the compressed MAINFV, which is compressed # in a single compression operation in order to achieve better # overall compression. # FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 { SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { # LzmaCompress - SECTION FV_IMAGE = DXEFV + SECTION FV_IMAGE = MAINFV } } -FILE RAW = 1BA0062E-C779-4582-8566-336AE8F78F09 { - SECTION RAW = OvmfPkg/ResetVector/Bin/ResetVector.ia32.raw - } - - -################################################################################ # -# Rules are use with the [FV] section's module INF type to define -# how an FFS file is created for a given INF file. The following Rule are the default -# rules for the different module type. User can add the customized rules to define the -# content of the FFS file. +# This file contains the uncompressed SECFV, which contains the initial +# boot code. The code in this FV decompresses the MAINFV. # +# It uses the Volume Top File (VTF) GUID so it will be placed at the +# end of the FV. +# +FILE FREEFORM = 1BA0062E-C779-4582-8566-336AE8F78F09 { + SECTION Align=16 FV_IMAGE = SECFV +} + ################################################################################ [Rule.Common.PEI_CORE] diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index cc6cdd54ec..4d82980fe2 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -1,7 +1,7 @@ #/** @file # EFI/Framework Open Virtual Machine Firmware (OVMF) platform # -# Copyright (c) 2006 - 2009, Intel Corporation +# Copyright (c) 2006 - 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 @@ -82,6 +82,7 @@ BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf + ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf [LibraryClasses.common.PEI_CORE] BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf @@ -129,7 +130,6 @@ ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf @@ -141,7 +141,6 @@ ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf [LibraryClasses.common.DXE_DRIVER] @@ -180,11 +179,6 @@ gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07 gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000 - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000 - gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32 @@ -212,7 +206,6 @@ gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F - ################################################################################ # # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform @@ -235,7 +228,10 @@ # # SEC Phase modules # - OvmfPkg/Sec/SecMain.inf + OvmfPkg/Sec/SecMain.inf { + + NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf + } # # PEI Phase modules @@ -246,10 +242,7 @@ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf } IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf - MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { - - NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf - } + MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf OvmfPkg/PlatformPei/PlatformPei.inf { @@ -269,7 +262,7 @@ PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf } - + MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.inf @@ -292,7 +285,7 @@ TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf } - IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { + IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf { TimerLib|OvmfPkg/Library/AcpiTimerLib/AcpiTimerLib.inf } diff --git a/OvmfPkg/PlatformPei/Fv.c b/OvmfPkg/PlatformPei/Fv.c index 7ae35237b2..f9e2635208 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 - 2009, Intel Corporation + Copyright (c) 2006 - 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 which accompanies this distribution. The full text of the license may be found at @@ -14,10 +14,8 @@ #include "PiPei.h" #include -#include #include #include -#include #include @@ -35,25 +33,27 @@ PeiFvInitialization ( VOID ) { - EFI_PHYSICAL_ADDRESS FdBase; + EFI_PHYSICAL_ADDRESS FdBase; DEBUG ((EFI_D_ERROR, "Platform PEI Firmware Volume Initialization\n")); DEBUG ( (EFI_D_ERROR, "Firmware Volume HOB: 0x%x 0x%x\n", - PcdGet32 (PcdOvmfFlashFvRecoveryBase), - PcdGet32 (PcdOvmfFlashFvRecoverySize) + PcdGet32 (PcdOvmfMemFvBase), + PcdGet32 (PcdOvmfMemFvSize) ) ); - FdBase = PcdGet32 (PcdOvmfFlashFvRecoveryBase) - PcdGet32 (PcdVariableStoreSize) - PcdGet32 (PcdFlashNvStorageFtwSpareSize); - BuildFvHob (PcdGet32 (PcdOvmfFlashFvRecoveryBase), PcdGet32 (PcdOvmfFlashFvRecoverySize)); + FdBase = PcdGet32 (PcdOvmfMemFvBase) - PcdGet32 (PcdVariableStoreSize) - PcdGet32 (PcdFlashNvStorageFtwSpareSize); + BuildFvHob (PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize)); - BuildResourceDescriptorHob ( - EFI_RESOURCE_FIRMWARE_DEVICE, - (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE), - FdBase, - PcdGet32 (PcdOvmfFirmwareFdSize) + // + // Create a memory allocation HOB. + // + BuildMemoryAllocationHob ( + PcdGet32 (PcdOvmfMemFvBase), + PcdGet32 (PcdOvmfMemFvSize), + EfiBootServicesData ); return EFI_SUCCESS; diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c index daa83a0014..30ee2b1772 100644 --- a/OvmfPkg/PlatformPei/MemDetect.c +++ b/OvmfPkg/PlatformPei/MemDetect.c @@ -27,6 +27,7 @@ Module Name: #include #include #include +#include #include #include @@ -79,8 +80,15 @@ MemDetect ( // TotalMemorySize = (UINT64)GetSystemMemorySize (); - MemoryBase = 0x800000; - MemorySize = TotalMemorySize - MemoryBase - 0x100000; + // + // Determine the range of memory to use during PEI + // + MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize); + MemorySize = TotalMemorySize - MemoryBase; + if (MemorySize > SIZE_16MB) { + MemoryBase = TotalMemorySize - SIZE_16MB; + MemorySize = SIZE_16MB; + } // // Publish this memory to the PEI Core @@ -92,8 +100,8 @@ MemDetect ( // Create memory HOBs // AddMemoryBaseSizeHob (MemoryBase, MemorySize); - AddMemoryRangeHob (0x100000, 0x800000); - AddMemoryRangeHob (0x000000, 0x0A0000); + AddMemoryRangeHob (BASE_1MB, MemoryBase); + AddMemoryRangeHob (0, BASE_512KB + BASE_128KB); return EFI_SUCCESS; } diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf index df6545199b..1ef3a368cb 100644 --- a/OvmfPkg/PlatformPei/PlatformPei.inf +++ b/OvmfPkg/PlatformPei/PlatformPei.inf @@ -54,10 +54,8 @@ PeimEntryPoint [FixedPcd.common] - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize diff --git a/OvmfPkg/Sec/FindPeiCore.c b/OvmfPkg/Sec/FindPeiCore.c index 7d13ebb4bc..01cd70f5ba 100644 --- a/OvmfPkg/Sec/FindPeiCore.c +++ b/OvmfPkg/Sec/FindPeiCore.c @@ -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 @@ -15,16 +15,151 @@ #include #include +#include +#include +#include +#include #include #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); } diff --git a/OvmfPkg/Sec/SecMain.c b/OvmfPkg/Sec/SecMain.c index 99d21f3d95..58da92b086 100644 --- a/OvmfPkg/Sec/SecMain.c +++ b/OvmfPkg/Sec/SecMain.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -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, diff --git a/OvmfPkg/Sec/SecMain.h b/OvmfPkg/Sec/SecMain.h index 4f5eaa8137..1a4ed40bf7 100644 --- a/OvmfPkg/Sec/SecMain.h +++ b/OvmfPkg/Sec/SecMain.h @@ -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_ diff --git a/OvmfPkg/Sec/SecMain.inf b/OvmfPkg/Sec/SecMain.inf index 7cc1533fdc..08e26d2ac0 100644 --- a/OvmfPkg/Sec/SecMain.inf +++ b/OvmfPkg/Sec/SecMain.inf @@ -50,6 +50,8 @@ [LibraryClasses] BaseLib + BaseMemoryLib + ExtractGuidedSectionLib PcdLib PeCoffGetEntryPointLib UefiCpuLib @@ -58,6 +60,6 @@ gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED [FixedPcd.common] - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase - gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize