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
This commit is contained in:
jljusten 2010-01-04 16:17:59 +00:00
parent 8cf01cae78
commit c1c2669c6b
13 changed files with 564 additions and 304 deletions

View File

@ -26,13 +26,8 @@
gUefiOvmfPkgTokenSpaceGuid = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}} gUefiOvmfPkgTokenSpaceGuid = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}
[PcdsFixedAtBuild] [PcdsFixedAtBuild]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase|0x0|UINT32|0
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize|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
[PcdsDynamic] [PcdsDynamic]
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|0 gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|0

View File

@ -1,7 +1,7 @@
#/** @file #/** @file
# Open Virtual Machine Firmware: FDF # 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 # All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -14,57 +14,33 @@
#**/ #**/
################################################################################ ################################################################################
# [FD.SEC]
# FD Section BaseAddress = 0xFFFEE000
# The [FD] Section is made up of the definition statements and a Size = 0x00012000
# 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
ErasePolarity = 1 ErasePolarity = 1
BlockSize = 0x10000 BlockSize = 0x1000
NumBlocks = 0x20 NumBlocks = 0x12
0x0|0x12000
FV = SECFV
################################################################################ ################################################################################
#
# Following are lists of FD Region layout which correspond to the locations of different [FD.MEMFD]
# images within the flash device. BaseAddress = 0x800000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
# Size = 0x400000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
# Regions must be defined in ascending order and may not overlap. ErasePolarity = 1
# BlockSize = 0x10000
# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by NumBlocks = 0x40
# the pipe "|" character, followed by the size of the region, also in hex with the leading
# "0x" characters. Like: 0x0|0x400000
# Offset|Size
# PcdOffsetCName|PcdSizeCName
# RegionType <FV, DATA, or FILE>
#
################################################################################
0x0|0x200000
gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoveryBase|gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoverySize
FV = MAINFV FV = MAINFV
################################################################################ ################################################################################
#
# FV Section [FV.SECFV]
#
# [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]
BlockSize = 0x1000 BlockSize = 0x1000
FvAlignment = 16 #FV alignment and FV attributes setting. FvAlignment = 16
ERASE_POLARITY = 1 ERASE_POLARITY = 1
MEMORY_MAPPED = TRUE MEMORY_MAPPED = TRUE
STICKY_WRITE = TRUE STICKY_WRITE = TRUE
@ -82,7 +58,37 @@ READ_LOCK_CAP = TRUE
READ_LOCK_STATUS = 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, # This firmware volume will have files placed in it uncompressed,
# and then then entire firmware volume will be compressed in a # and then then entire firmware volume will be compressed in a
@ -90,11 +96,24 @@ READ_LOCK_STATUS = TRUE
# overall compression. # overall compression.
# #
APRIORI PEI {
INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
}
APRIORI DXE { APRIORI DXE {
INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.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 # DXE Phase modules
# #
@ -163,7 +182,8 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) {
################################################################################ ################################################################################
[FV.MAINFV] [FV.OVMF]
BlockSize = 0x10000
FvAlignment = 16 FvAlignment = 16
ERASE_POLARITY = 1 ERASE_POLARITY = 1
MEMORY_MAPPED = TRUE MEMORY_MAPPED = TRUE
@ -182,51 +202,27 @@ READ_LOCK_CAP = TRUE
READ_LOCK_STATUS = TRUE READ_LOCK_STATUS = TRUE
# #
# Files to be placed in MAINFV # This file contains the compressed MAINFV, which is compressed
#
# 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
# in a single compression operation in order to achieve better # in a single compression operation in order to achieve better
# overall compression. # overall compression.
# #
FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 { FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 {
SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { # LzmaCompress 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] [Rule.Common.PEI_CORE]

View File

@ -1,7 +1,7 @@
#/** @file #/** @file
# EFI/Framework Open Virtual Machine Firmware (OVMF) platform # 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 # All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -81,6 +81,7 @@
[LibraryClasses.common.SEC] [LibraryClasses.common.SEC]
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf
[LibraryClasses.common.PEI_CORE] [LibraryClasses.common.PEI_CORE]
BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf
@ -128,7 +129,6 @@
ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
@ -140,7 +140,6 @@
ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
[LibraryClasses.common.DXE_DRIVER] [LibraryClasses.common.DXE_DRIVER]
@ -179,11 +178,6 @@
gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07 gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07
gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200 gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000
gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32
@ -233,7 +227,10 @@
# #
# SEC Phase modules # SEC Phase modules
# #
OvmfPkg/Sec/SecMain.inf OvmfPkg/Sec/SecMain.inf {
<LibraryClasses>
NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
}
# #
# PEI Phase modules # PEI Phase modules
@ -244,10 +241,7 @@
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
} }
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
<LibraryClasses>
NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
}
OvmfPkg/PlatformPei/PlatformPei.inf { OvmfPkg/PlatformPei/PlatformPei.inf {
<LibraryClasses> <LibraryClasses>

View File

@ -1,7 +1,7 @@
#/** @file #/** @file
# EFI/Framework Open Virtual Machine Firmware (OVMF) platform # 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 # All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -82,6 +82,7 @@
BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf
[LibraryClasses.common.PEI_CORE] [LibraryClasses.common.PEI_CORE]
BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf
@ -129,7 +130,6 @@
ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
@ -141,7 +141,6 @@
ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
[LibraryClasses.common.DXE_DRIVER] [LibraryClasses.common.DXE_DRIVER]
@ -180,11 +179,6 @@
gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07 gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07
gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200 gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000
gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32
@ -212,7 +206,6 @@
gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F
################################################################################ ################################################################################
# #
# Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform
@ -235,7 +228,10 @@
# #
# SEC Phase modules # SEC Phase modules
# #
OvmfPkg/Sec/SecMain.inf OvmfPkg/Sec/SecMain.inf {
<LibraryClasses>
NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
}
# #
# PEI Phase modules # PEI Phase modules
@ -246,10 +242,7 @@
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
} }
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
<LibraryClasses>
NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
}
OvmfPkg/PlatformPei/PlatformPei.inf { OvmfPkg/PlatformPei/PlatformPei.inf {
<LibraryClasses> <LibraryClasses>

View File

@ -1,7 +1,7 @@
#/** @file #/** @file
# Open Virtual Machine Firmware: FDF # 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 # All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -14,57 +14,33 @@
#**/ #**/
################################################################################ ################################################################################
# [FD.SEC]
# FD Section BaseAddress = 0xFFFEE000
# The [FD] Section is made up of the definition statements and a Size = 0x00012000
# 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
ErasePolarity = 1 ErasePolarity = 1
BlockSize = 0x10000 BlockSize = 0x1000
NumBlocks = 0x20 NumBlocks = 0x12
0x0|0x12000
FV = SECFV
################################################################################ ################################################################################
#
# Following are lists of FD Region layout which correspond to the locations of different [FD.MEMFD]
# images within the flash device. BaseAddress = 0x800000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
# Size = 0x400000|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
# Regions must be defined in ascending order and may not overlap. ErasePolarity = 1
# BlockSize = 0x10000
# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by NumBlocks = 0x40
# the pipe "|" character, followed by the size of the region, also in hex with the leading
# "0x" characters. Like: 0x0|0x400000
# Offset|Size
# PcdOffsetCName|PcdSizeCName
# RegionType <FV, DATA, or FILE>
#
################################################################################
0x0|0x200000
gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoveryBase|gEfiUnixPkgTokenSpaceGuid.PcdUnixFlashFvRecoverySize
FV = MAINFV FV = MAINFV
################################################################################ ################################################################################
#
# FV Section [FV.SECFV]
#
# [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]
BlockSize = 0x1000 BlockSize = 0x1000
FvAlignment = 16 #FV alignment and FV attributes setting. FvAlignment = 16
ERASE_POLARITY = 1 ERASE_POLARITY = 1
MEMORY_MAPPED = TRUE MEMORY_MAPPED = TRUE
STICKY_WRITE = TRUE STICKY_WRITE = TRUE
@ -82,7 +58,39 @@ READ_LOCK_CAP = TRUE
READ_LOCK_STATUS = 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, # This firmware volume will have files placed in it uncompressed,
# and then then entire firmware volume will be compressed in a # and then then entire firmware volume will be compressed in a
@ -90,11 +98,24 @@ READ_LOCK_STATUS = TRUE
# overall compression. # overall compression.
# #
APRIORI PEI {
INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
}
APRIORI DXE { APRIORI DXE {
INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
INF IntelFrameworkModulePkg/Universal/DataHubDxe/DataHubDxe.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 # DXE Phase modules
# #
@ -167,7 +188,8 @@ FILE FREEFORM = PCD(gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdLogoFile) {
################################################################################ ################################################################################
[FV.MAINFV] [FV.OVMF]
BlockSize = 0x10000
FvAlignment = 16 FvAlignment = 16
ERASE_POLARITY = 1 ERASE_POLARITY = 1
MEMORY_MAPPED = TRUE MEMORY_MAPPED = TRUE
@ -186,54 +208,27 @@ READ_LOCK_CAP = TRUE
READ_LOCK_STATUS = TRUE READ_LOCK_STATUS = TRUE
# #
# Files to be placed in MAINFV # This file contains the compressed MAINFV, which is compressed
#
# 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
# in a single compression operation in order to achieve better # in a single compression operation in order to achieve better
# overall compression. # overall compression.
# #
FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 { FILE FV_IMAGE = 20bc8ac9-94d1-4208-ab28-5d673fd73486 {
SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE { # LzmaCompress 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 # This file contains the uncompressed SECFV, which contains the initial
# how an FFS file is created for a given INF file. The following Rule are the default # boot code. The code in this FV decompresses the MAINFV.
# rules for the different module type. User can add the customized rules to define the
# content of the FFS file.
# #
# 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] [Rule.Common.PEI_CORE]

View File

@ -1,7 +1,7 @@
#/** @file #/** @file
# EFI/Framework Open Virtual Machine Firmware (OVMF) platform # 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 # All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -82,6 +82,7 @@
BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf
ExtractGuidedSectionLib|OvmfPkg/Library/SecExtractGuidedSectionLib/SecExtractGuidedSectionLib.inf
[LibraryClasses.common.PEI_CORE] [LibraryClasses.common.PEI_CORE]
BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLibOptPei/BaseMemoryLibOptPei.inf
@ -129,7 +130,6 @@
ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
@ -141,7 +141,6 @@
ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf
UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf UefiScsiLib|MdePkg/Library/UefiScsiLib/UefiScsiLib.inf
[LibraryClasses.common.DXE_DRIVER] [LibraryClasses.common.DXE_DRIVER]
@ -180,11 +179,6 @@
gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07 gEfiSioTokenSpaceGuid.PcdSerialLineControl|0x07
gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200 gEfiSioTokenSpaceGuid.PcdSerialBoudRate|115200
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x200000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize|0x10000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase|0xFFE00000
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize|0x00200000
gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10 gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxFvSupported|6
gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32 gEfiMdeModulePkgTokenSpaceGuid.PcdPeiCoreMaxPeimPerFv|32
@ -212,7 +206,6 @@
gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000004F
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x2F
################################################################################ ################################################################################
# #
# Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform
@ -235,7 +228,10 @@
# #
# SEC Phase modules # SEC Phase modules
# #
OvmfPkg/Sec/SecMain.inf OvmfPkg/Sec/SecMain.inf {
<LibraryClasses>
NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
}
# #
# PEI Phase modules # PEI Phase modules
@ -246,10 +242,7 @@
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
} }
IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf { MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
<LibraryClasses>
NULL|IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
}
OvmfPkg/PlatformPei/PlatformPei.inf { OvmfPkg/PlatformPei/PlatformPei.inf {
<LibraryClasses> <LibraryClasses>

View File

@ -1,7 +1,7 @@
/** @file /** @file
Build FV related hobs for platform. 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 All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License 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 which accompanies this distribution. The full text of the license may be found at
@ -14,10 +14,8 @@
#include "PiPei.h" #include "PiPei.h"
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/PeimEntryPoint.h>
#include <Library/HobLib.h> #include <Library/HobLib.h>
#include <Library/PeiServicesLib.h> #include <Library/PeiServicesLib.h>
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
@ -41,19 +39,21 @@ PeiFvInitialization (
DEBUG ( DEBUG (
(EFI_D_ERROR, "Firmware Volume HOB: 0x%x 0x%x\n", (EFI_D_ERROR, "Firmware Volume HOB: 0x%x 0x%x\n",
PcdGet32 (PcdOvmfFlashFvRecoveryBase), PcdGet32 (PcdOvmfMemFvBase),
PcdGet32 (PcdOvmfFlashFvRecoverySize) PcdGet32 (PcdOvmfMemFvSize)
) )
); );
FdBase = PcdGet32 (PcdOvmfFlashFvRecoveryBase) - PcdGet32 (PcdVariableStoreSize) - PcdGet32 (PcdFlashNvStorageFtwSpareSize); FdBase = PcdGet32 (PcdOvmfMemFvBase) - PcdGet32 (PcdVariableStoreSize) - PcdGet32 (PcdFlashNvStorageFtwSpareSize);
BuildFvHob (PcdGet32 (PcdOvmfFlashFvRecoveryBase), PcdGet32 (PcdOvmfFlashFvRecoverySize)); BuildFvHob (PcdGet32 (PcdOvmfMemFvBase), PcdGet32 (PcdOvmfMemFvSize));
BuildResourceDescriptorHob ( //
EFI_RESOURCE_FIRMWARE_DEVICE, // Create a memory allocation HOB.
(EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE), //
FdBase, BuildMemoryAllocationHob (
PcdGet32 (PcdOvmfFirmwareFdSize) PcdGet32 (PcdOvmfMemFvBase),
PcdGet32 (PcdOvmfMemFvSize),
EfiBootServicesData
); );
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -27,6 +27,7 @@ Module Name:
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/HobLib.h> #include <Library/HobLib.h>
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/PcdLib.h>
#include <Library/PeimEntryPoint.h> #include <Library/PeimEntryPoint.h>
#include <Library/ResourcePublicationLib.h> #include <Library/ResourcePublicationLib.h>
@ -79,8 +80,15 @@ MemDetect (
// //
TotalMemorySize = (UINT64)GetSystemMemorySize (); 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 // Publish this memory to the PEI Core
@ -92,8 +100,8 @@ MemDetect (
// Create memory HOBs // Create memory HOBs
// //
AddMemoryBaseSizeHob (MemoryBase, MemorySize); AddMemoryBaseSizeHob (MemoryBase, MemorySize);
AddMemoryRangeHob (0x100000, 0x800000); AddMemoryRangeHob (BASE_1MB, MemoryBase);
AddMemoryRangeHob (0x000000, 0x0A0000); AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -54,10 +54,8 @@
PeimEntryPoint PeimEntryPoint
[FixedPcd.common] [FixedPcd.common]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize
gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize

View File

@ -1,7 +1,7 @@
/** @file /** @file
Locate the entry point for the PEI Core 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 All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -15,16 +15,151 @@
#include <PiPei.h> #include <PiPei.h>
#include <Library/BaseLib.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 <Library/PeCoffGetEntryPointLib.h>
#include "SecMain.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 EFIAPI
FindPeiCoreEntryPoint ( FindFfsFileAndSection (
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr, IN EFI_FIRMWARE_VOLUME_HEADER *Fv,
OUT VOID **PeiCoreEntryPoint IN EFI_FV_FILETYPE FileType,
IN EFI_SECTION_TYPE SectionType,
OUT EFI_COMMON_SECTION_HEADER **FoundSection
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -33,71 +168,219 @@ FindPeiCoreEntryPoint (
EFI_FFS_FILE_HEADER *File; EFI_FFS_FILE_HEADER *File;
UINT32 Size; UINT32 Size;
EFI_PHYSICAL_ADDRESS EndOfFile; 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; CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Fv;
EndOfFirmwareVolume = CurrentAddress + BootFirmwareVolumePtr->FvLength; EndOfFirmwareVolume = CurrentAddress + Fv->FvLength;
// //
// Loop through the FFS files in the Boot Firmware Volume // 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) { if (CurrentAddress > EndOfFirmwareVolume) {
return; return EFI_VOLUME_CORRUPTED;
} }
File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress; File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;
Size = *(UINT32*) File->Size & 0xffffff; Size = *(UINT32*) File->Size & 0xffffff;
if (Size < (sizeof (*File) + sizeof (*Section))) { if (Size < (sizeof (*File) + sizeof (EFI_COMMON_SECTION_HEADER))) {
return; return EFI_VOLUME_CORRUPTED;
} }
DEBUG ((EFI_D_INFO, "File->Type: 0x%x\n", File->Type));
EndOfFile = CurrentAddress + Size; EndOfFile = CurrentAddress + Size;
if (EndOfFile > EndOfFirmwareVolume) { 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; continue;
} }
// Status = FindFfsSectionInSections (
// Loop through the FFS file sections within the PEI Core FFS file (VOID*) (File + 1),
// (UINTN) EndOfFile - (UINTN) (File + 1),
EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN) (File + 1); SectionType,
for (;;) { FoundSection
CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL; );
Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress; if (!EFI_ERROR (Status) || (Status == EFI_VOLUME_CORRUPTED)) {
return Status;
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;
}
}
}
} }
} }
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);
}

View File

@ -17,6 +17,7 @@
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
#include <Library/DebugLib.h> #include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h> #include <Library/BaseMemoryLib.h>
#include <Library/PeimEntryPoint.h>
#include <Library/PeiServicesLib.h> #include <Library/PeiServicesLib.h>
#include <Ppi/TemporaryRamSupport.h> #include <Ppi/TemporaryRamSupport.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
@ -61,7 +62,7 @@ InitializeIdtPtr (
VOID VOID
EFIAPI EFIAPI
SecCoreStartupWithStack ( SecCoreStartupWithStack (
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr, IN EFI_FIRMWARE_VOLUME_HEADER *BootFv,
IN VOID *TopOfCurrentStack IN VOID *TopOfCurrentStack
) )
{ {
@ -72,18 +73,20 @@ SecCoreStartupWithStack (
VOID *IdtPtr; VOID *IdtPtr;
VOID *PeiCoreEntryPoint; 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 // Initialize floating point operating environment
// to be compliant with UEFI spec. // to be compliant with UEFI spec.
// //
InitializeFloatingPointUnits (); InitializeFloatingPointUnits ();
DEBUG ((EFI_D_INFO,
"SecCoreStartupWithStack(0x%x, 0x%x)\n",
(UINT32)(UINTN)BootFirmwareVolumePtr,
(UINT32)(UINTN)TopOfCurrentStack
));
BottomOfTempRam = (UINT8*)(UINTN) INITIAL_TOP_OF_STACK; BottomOfTempRam = (UINT8*)(UINTN) INITIAL_TOP_OF_STACK;
SizeOfTempRam = (UINTN) SIZE_64KB; SizeOfTempRam = (UINTN) SIZE_64KB;
TopOfTempRam = BottomOfTempRam + SizeOfTempRam; TopOfTempRam = BottomOfTempRam + SizeOfTempRam;
@ -104,9 +107,6 @@ SecCoreStartupWithStack (
SecCoreData = (EFI_SEC_PEI_HAND_OFF*)((UINTN) TopOfTempRam - SIZE_4KB); SecCoreData = (EFI_SEC_PEI_HAND_OFF*)((UINTN) TopOfTempRam - SIZE_4KB);
SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF); SecCoreData->DataSize = sizeof(EFI_SEC_PEI_HAND_OFF);
SecCoreData->BootFirmwareVolumeBase = (VOID*)(UINTN) PcdGet32 (PcdOvmfFlashFvRecoveryBase);
SecCoreData->BootFirmwareVolumeSize = PcdGet32 (PcdOvmfFlashFvRecoverySize);
SecCoreData->TemporaryRamBase = (VOID*) BottomOfTempRam; SecCoreData->TemporaryRamBase = (VOID*) BottomOfTempRam;
SecCoreData->TemporaryRamSize = SizeOfTempRam; SecCoreData->TemporaryRamSize = SizeOfTempRam;
@ -124,7 +124,10 @@ SecCoreStartupWithStack (
IdtPtr = ALIGN_POINTER(IdtPtr, 16); IdtPtr = ALIGN_POINTER(IdtPtr, 16);
InitializeIdtPtr (IdtPtr); InitializeIdtPtr (IdtPtr);
FindPeiCoreEntryPoint (BootFirmwareVolumePtr, &PeiCoreEntryPoint); FindPeiCoreEntryPoint (&BootFv, &PeiCoreEntryPoint);
SecCoreData->BootFirmwareVolumeBase = BootFv;
SecCoreData->BootFirmwareVolumeSize = BootFv->FvLength;
if (PeiCoreEntryPoint != NULL) { if (PeiCoreEntryPoint != NULL) {
DEBUG ((EFI_D_INFO, DEBUG ((EFI_D_INFO,

View File

@ -47,11 +47,11 @@ TemporaryRamMigration (
VOID VOID
EFIAPI EFIAPI
FindPeiCoreEntryPoint ( FindPeiCoreEntryPoint (
IN EFI_FIRMWARE_VOLUME_HEADER *BootFirmwareVolumePtr, IN EFI_FIRMWARE_VOLUME_HEADER **BootFirmwareVolumePtr,
OUT VOID **PeiCoreEntryPoint OUT VOID **PeiCoreEntryPoint
); );
#define INITIAL_TOP_OF_STACK BASE_128KB #define INITIAL_TOP_OF_STACK BASE_512KB
#endif // _PLATFORM_SECMAIN_H_ #endif // _PLATFORM_SECMAIN_H_

View File

@ -50,6 +50,8 @@
[LibraryClasses] [LibraryClasses]
BaseLib BaseLib
BaseMemoryLib
ExtractGuidedSectionLib
PcdLib PcdLib
PeCoffGetEntryPointLib PeCoffGetEntryPointLib
UefiCpuLib UefiCpuLib
@ -58,6 +60,6 @@
gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED gEfiTemporaryRamSupportPpiGuid # PPI ALWAYS_PRODUCED
[FixedPcd.common] [FixedPcd.common]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoveryBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvBase
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashFvRecoverySize gUefiOvmfPkgTokenSpaceGuid.PcdOvmfMemFvSize