BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2198 The flash detection routine will attempt to determine how the flash device behaves (e.g. ROM, RAM, Flash). But when SEV-ES is enabled and the flash device behaves as a ROM device (meaning it is marked read-only by the hypervisor), this check may result in an infinite nested page fault because of the attempted write. Since the instruction cannot be emulated when SEV-ES is enabled, the RIP is never advanced, resulting in repeated nested page faults. When SEV-ES is enabled, exit the flash detection early and assume that the FD behaves as Flash. This will result in QemuFlashWrite() being called to store EFI variables, which will also result in an infinite nested page fault when the write is performed. In this case, update QemuFlashWrite() to use the VMGEXIT MMIO write support to have the hypervisor perform the write without having to emulate the instruction. Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
89 lines
2.6 KiB
INI
89 lines
2.6 KiB
INI
## @file
|
|
# Component description file for QEMU Flash Firmware Volume Block DXE driver
|
|
# module.
|
|
#
|
|
# This DXE runtime driver implements and produces the Firmware Volue Block
|
|
# Protocol for a QEMU flash device.
|
|
#
|
|
# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
|
#
|
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
#
|
|
##
|
|
|
|
[Defines]
|
|
INF_VERSION = 0x00010005
|
|
BASE_NAME = FvbServicesRuntimeDxe
|
|
FILE_GUID = 733cbac2-b23f-4b92-bc8e-fb01ce5907b7
|
|
MODULE_TYPE = DXE_RUNTIME_DRIVER
|
|
VERSION_STRING = 1.0
|
|
ENTRY_POINT = FvbInitialize
|
|
|
|
#
|
|
# The following information is for reference only and not required by the build
|
|
# tools.
|
|
#
|
|
# VALID_ARCHITECTURES = IA32 X64
|
|
#
|
|
|
|
[Sources]
|
|
FvbInfo.c
|
|
FwBlockService.c
|
|
FwBlockService.h
|
|
FwBlockServiceDxe.c
|
|
QemuFlash.c
|
|
QemuFlash.h
|
|
QemuFlashDxe.c
|
|
|
|
[Packages]
|
|
MdePkg/MdePkg.dec
|
|
MdeModulePkg/MdeModulePkg.dec
|
|
UefiCpuPkg/UefiCpuPkg.dec
|
|
OvmfPkg/OvmfPkg.dec
|
|
|
|
[LibraryClasses]
|
|
BaseLib
|
|
BaseMemoryLib
|
|
DebugLib
|
|
DevicePathLib
|
|
DxeServicesTableLib
|
|
MemEncryptSevLib
|
|
MemoryAllocationLib
|
|
PcdLib
|
|
UefiBootServicesTableLib
|
|
UefiDriverEntryPoint
|
|
UefiRuntimeLib
|
|
VmgExitLib
|
|
|
|
[Guids]
|
|
gEfiEventVirtualAddressChangeGuid # ALWAYS_CONSUMED
|
|
# gEfiEventVirtualAddressChangeGuid # Create Event: EVENT_GROUP_GUID
|
|
|
|
[Protocols]
|
|
gEfiFirmwareVolumeBlockProtocolGuid # PROTOCOL SOMETIMES_PRODUCED
|
|
gEfiDevicePathProtocolGuid # PROTOCOL SOMETIMES_PRODUCED
|
|
|
|
[FixedPcd]
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageVariableBase
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwWorkingBase
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageFtwSpareBase
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareBlockSize
|
|
|
|
[Pcd]
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase
|
|
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable
|
|
|
|
[FeaturePcd]
|
|
gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire
|
|
|
|
[Depex]
|
|
TRUE
|