ArmVirtPkg: Fallback to variable emulation if no CFI is found

The kvmtool option '--flash <flash filename>' is used to launch
a guests VM with a CFI flash device that maps the flash file
specified at the command line.
However, kvmtool allows guest VMs to be launched without a CFI
flash device. In such scenarios the firmware can utilize the
emulated variable storage for UEFI variables. To support this
the PCD gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable
must be set to TRUE.

Therefore, update the NorFlashKvmtoolLib to fallback to variable
emulation if a CFI device is not detected. Also improve the error
logging.

Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
This commit is contained in:
Sami Mujawar 2023-05-11 14:52:17 +01:00 committed by mergify[bot]
parent 0e5aecfed1
commit 84d0b21d18
2 changed files with 36 additions and 5 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
An instance of the NorFlashPlatformLib for Kvmtool platform. An instance of the NorFlashPlatformLib for Kvmtool platform.
Copyright (c) 2020, ARM Ltd. All rights reserved.<BR> Copyright (c) 2020 - 2023, Arm Ltd. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@ -228,7 +228,7 @@ NorFlashPlatformLibConstructor (
CONST CHAR8 *Label; CONST CHAR8 *Label;
UINT32 LabelLen; UINT32 LabelLen;
if (mNorFlashDeviceCount != 0) { if ((mNorFlashDeviceCount != 0) || PcdGetBool (PcdEmuVariableNvModeEnable)) {
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -337,9 +337,39 @@ NorFlashPlatformLibConstructor (
} }
if (mNorFlashDevices[UefiVarStoreIndex].DeviceBaseAddress != 0) { if (mNorFlashDevices[UefiVarStoreIndex].DeviceBaseAddress != 0) {
return SetupVariableStore (&mNorFlashDevices[UefiVarStoreIndex]); Status = SetupVariableStore (&mNorFlashDevices[UefiVarStoreIndex]);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"ERROR: Failed to setup variable store, Status = %r\n",
Status
));
ASSERT (0);
}
} else {
DEBUG ((
DEBUG_ERROR,
"ERROR: Invalid Flash device Base address\n"
));
ASSERT (0);
Status = EFI_NOT_FOUND;
}
} else {
// No Flash device found fallback to Runtime Variable Emulation.
DEBUG ((
DEBUG_INFO,
"INFO: No Flash device found fallback to Runtime Variable Emulation.\n"
));
Status = PcdSetBoolS (PcdEmuVariableNvModeEnable, TRUE);
if (EFI_ERROR (Status)) {
DEBUG ((
DEBUG_ERROR,
"ERROR: Failed to set PcdEmuVariableNvModeEnable, Status = %r\n",
Status
));
ASSERT (0);
} }
} }
return EFI_NOT_FOUND; return Status;
} }

View File

@ -1,7 +1,7 @@
## @file ## @file
# Nor Flash library for Kvmtool. # Nor Flash library for Kvmtool.
# #
# Copyright (c) 2020, ARM Ltd. All rights reserved.<BR> # Copyright (c) 2020 - 2023, Arm Ltd. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
## ##
@ -39,6 +39,7 @@
gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress
gArmTokenSpaceGuid.PcdFvSize gArmTokenSpaceGuid.PcdFvSize
gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase