Add a new library that can be incorporated into any driver built from source, and which permits loading of the driver to be inhibited based on the value of a QEMU fw_cfg boolean variable. This will be used in a subsequent patch to allow dispatch of the IPv6 and IPv6 network protocol driver to be controlled from the QEMU command line.
Signed-off-by: Ard Biesheuvel <a...@kernel.org> --- OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.c | 30 ++++++++++++++++++++ OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.inf | 28 ++++++++++++++++++ OvmfPkg/OvmfPkg.dec | 4 +++ 3 files changed, 62 insertions(+) diff --git a/OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.c b/OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.c new file mode 100644 index 000000000000..dc8544bc38be --- /dev/null +++ b/OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.c @@ -0,0 +1,30 @@ +// @file +// Copyright (c) 2022, Google LLC. All rights reserved.<BR> +// SPDX-License-Identifier: BSD-2-Clause-Patent +// + +#include <PiDxe.h> + +#include <Library/QemuFwCfgSimpleParserLib.h> +#include <Library/UefiBootServicesTableLib.h> + +STATIC CHAR16 mExitData[] = L"Driver dispatch inhibited by QEMU fw_cfg variable."; + +EFI_STATUS +EFIAPI +DriverLoadInhibitorLibConstructor ( + IN EFI_HANDLE Handle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + RETURN_STATUS Status; + BOOLEAN Enabled; + + Status = QemuFwCfgParseBool (FixedPcdGetPtr (PcdDriverInhibitorFwCfgVarName), + &Enabled); + if (!RETURN_ERROR (Status) && !Enabled) { + return gBS->Exit (Handle, EFI_REQUEST_UNLOAD_IMAGE, sizeof mExitData, + mExitData); + } + return EFI_SUCCESS; +} diff --git a/OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.inf b/OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.inf new file mode 100644 index 000000000000..ed521d12d335 --- /dev/null +++ b/OvmfPkg/Library/DriverLoadInhibitorLib/DriverLoadInhibitorLib.inf @@ -0,0 +1,28 @@ +## @file +# Copyright (c) 2022, Google LLC. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = DriverLoadInhibitorLib + FILE_GUID = af4c2c0b-f7ed-4d61-ad97-5953982c3531 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = NULL + CONSTRUCTOR = DriverLoadInhibitorLibConstructor + +[Sources] + DriverLoadInhibitorLib.c + +[LibraryClasses] + QemuFwCfgSimpleParserLib + UefiBootServicesTableLib + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[FixedPcd] + gUefiOvmfPkgTokenSpaceGuid.PcdDriverInhibitorFwCfgVarName diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 5af76a540529..e9a22cab088c 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -399,6 +399,10 @@ [PcdsFixedAtBuild] ## The Tdx accept page size. 0x1000(4k),0x200000(2M) gUefiOvmfPkgTokenSpaceGuid.PcdTdxAcceptPageSize|0x200000|UINT32|0x65 + ## The QEMU fw_cfg variable that DriverLoadInhibitorLib will check to + # decide whether to abort dispatch of the driver it is linked into. + gUefiOvmfPkgTokenSpaceGuid.PcdDriverInhibitorFwCfgVarName|""|VOID*|0x68 + [PcdsDynamic, PcdsDynamicEx] gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2 gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10 -- 2.35.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#92421): https://edk2.groups.io/g/devel/message/92421 Mute This Topic: https://groups.io/mt/93032846/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-