On 08/22/22 18:59, Ard Biesheuvel wrote: > On Thu, 18 Aug 2022 at 07:58, Laszlo Ersek <ler...@redhat.com> wrote: >> >> On 08/17/22 17:11, Ard Biesheuvel wrote: >>> 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 >> >> (1) Still a typo? Did you mean "IPv4 and IPv6"? >> >>> driver to be controlled from the QEMU command line. >>> >>> This approach is based on the notion that all UEFI and DXE drivers share >>> a single UefiDriverEntryPoint implementation, which we can easily swap >>> out at build time with one that will abort execution based on the value >>> of some QEMU fw_cfg variable. >>> >>> Signed-off-by: Ard Biesheuvel <a...@kernel.org> >>> --- >>> >>> OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.c >>> | 147 ++++++++++++++++++++ >>> >>> OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.inf >>> | 57 ++++++++ >>> OvmfPkg/OvmfPkg.dec >>> | 4 + >>> 3 files changed, 208 insertions(+) >>> >>> diff --git >>> a/OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.c >>> >>> b/OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.c >>> new file mode 100644 >>> index 000000000000..6eaf0cfd16ad >>> --- /dev/null >>> +++ >>> b/OvmfPkg/Library/UefiDriverEntryPointFwCfgOverrideLib/UefiDriverEntryPointFwCfgOverrideLib.c >>> @@ -0,0 +1,147 @@ >>> +/** @file >>> + Entry point to a EFI/DXE driver. This version is specific to QEMU, and >>> ties >>> + dispatch of the driver in question on the value of a QEMU fw_cfg boolean >>> + variable which is referenced by name via a fixed pointer PCD. >>> + >>> +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >>> +Copyright (c) 2022, Google LLC. All rights reserved.<BR> >>> +SPDX-License-Identifier: BSD-2-Clause-Patent >>> + >>> +**/ >>> + >>> +#include <Uefi.h> >>> + >>> +#include <Protocol/LoadedImage.h> >>> + >>> +#include <Library/BaseLib.h> >>> +#include <Library/DebugLib.h> >>> +#include <Library/QemuFwCfgSimpleParserLib.h> >>> +#include <Library/UefiBootServicesTableLib.h> >>> +#include <Library/UefiDriverEntryPoint.h> >>> + >>> +/** >>> + Unloads an image from memory. >>> + >>> + This function is a callback that a driver registers to do cleanup >>> + when the UnloadImage boot service function is called. >>> + >>> + @param ImageHandle The handle to the image to unload. >>> + >>> + @return Status returned by all unload(). >>> + >>> +**/ >>> +STATIC >>> +EFI_STATUS >>> +EFIAPI >>> +_DriverUnloadHandler ( >>> + EFI_HANDLE ImageHandle >>> + ) >>> +{ >>> + EFI_STATUS Status; >>> + >>> + // >>> + // If an UnloadImage() handler is specified, then call it >>> + // >>> + Status = ProcessModuleUnloadList (ImageHandle); >>> + >>> + // >>> + // If the driver specific unload handler does not return an error, then >>> call >>> + // all of the library destructors. If the unload handler returned an >>> error, >>> + // then the driver can not be unloaded, and the library destructors >>> should >>> + // not be called >>> + // >>> + if (!EFI_ERROR (Status)) { >>> + ProcessLibraryDestructorList (ImageHandle, gST); >>> + } >>> + >>> + // >>> + // Return the status from the driver specific unload handler >>> + // >>> + return Status; >>> +} >>> + >>> +/** >>> + The entry point of PE/COFF Image for a DXE Driver, DXE Runtime Driver, or >>> + UEFI Driver. >>> + >>> + @param ImageHandle The image handle of the DXE Driver, >>> DXE >>> + Runtime Driver, or UEFI Driver. >>> + @param SystemTable A pointer to the EFI System Table. >>> + >>> + @retval EFI_SUCCESS The DXE Driver, DXE Runtime Driver, or >>> + UEFI Driver exited normally. >>> + @retval EFI_INCOMPATIBLE_VERSION _gUefiDriverRevision is greater than >>> + SystemTable->Hdr.Revision. >>> + @retval Other Return value from >>> + ProcessModuleEntryPointList(). >>> + >>> +**/ >>> +EFI_STATUS >>> +EFIAPI >>> +_ModuleEntryPoint ( >>> + IN EFI_HANDLE ImageHandle, >>> + IN EFI_SYSTEM_TABLE *SystemTable >>> + ) >>> +{ >>> + EFI_STATUS Status; >>> + EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; >>> + RETURN_STATUS RetStatus; >>> + BOOLEAN Enabled; >>> + >>> + if (_gUefiDriverRevision != 0) { >>> + // >>> + // Make sure that the EFI/UEFI spec revision of the platform is >= >>> EFI/UEFI >>> + // spec revision of the driver >>> + // >>> + if (SystemTable->Hdr.Revision < _gUefiDriverRevision) { >>> + return EFI_INCOMPATIBLE_VERSION; >>> + } >>> + } >>> + >>> + // >>> + // Call constructor for all libraries >>> + // >>> + ProcessLibraryConstructorList (ImageHandle, SystemTable); >>> + >>> + // >>> + // Install unload handler... >>> + // >>> + if (_gDriverUnloadImageCount != 0) { >>> + Status = gBS->HandleProtocol ( >>> + ImageHandle, >>> + &gEfiLoadedImageProtocolGuid, >>> + (VOID **)&LoadedImage >>> + ); >>> + ASSERT_EFI_ERROR (Status); >>> + LoadedImage->Unload = _DriverUnloadHandler; >>> + } >>> + >>> + RetStatus = QemuFwCfgParseBool ( >>> + FixedPcdGetPtr (PcdEntryPointOverrideFwCfgVarName), >>> + &Enabled); >>> + if (!RETURN_ERROR (RetStatus) && !Enabled) { >>> + // >>> + // The QEMU fw_cfg variable tells us not to load this image. So abort. >>> + // >>> + Status = EFI_ABORTED; >>> + } else { >>> + // >>> + // Call the driver entry point >>> + // >>> + Status = ProcessModuleEntryPointList (ImageHandle, SystemTable); >>> + } >> >> Right, I think this is the way to do it -- we've constructed all the lib >> instances, so now we can rely on PCDs and QemuFwCfg. >> >> I'm OK with this version, just one idea: in order to avoid the code >> duplication (and to benefit from future improvements to the original >> entry point lib in MdePkg), we could introduce a new hook API to the >> original -- forwarding the ImageHandle and SystemTable parameters to it >> --, provide a Null instance implementation for the API, for the general >> case, in MdePkg, and provide an fw_cfg-based implementation for OVMF / >> ArmVirt. >> >> I think it's worth a try; if Michael, Liming and Zhiguang don't like the >> bit of additional complexity in MdePkg, you can still merge this >> version. If you don't want to patch MdePkg though, I won't insist, of >> course. >> > > This means every single DSC that describes a driver, including > out-of-tree option ROMs for graphics and network cards will need to be > updated to include a resolution. I don't think this is worth the > hassle, to be honest,
good point > at least not until we get support for defining > default resolutions as part of the library class declaration (which I > asked for a number of times) this one too > >> Reviewed-by: Laszlo Ersek <ler...@redhat.com> >> > > Thanks. I highly appreciate that you have taken the time to join the > discussion. > > Will you be in Dublin next month by any chance? > unfortunately not -- the location is good for me, but the time is not, it conflicts again with my kids' school schedule. Cheers! Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#92746): https://edk2.groups.io/g/devel/message/92746 Mute This Topic: https://groups.io/mt/93083118/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-