On Tue, 19 Jul 2022 at 17:12, Gerd Hoffmann <kra...@redhat.com> wrote: > > The function reads the boot order from qemu fw_cfg, translates it into > device paths and stores them in 'QemuBootOrderNNNN' variables. In case > there is no boot ordering configured the function will do nothing. > > Use case: Allow applications loaded via 'qemu -kernel bootloader.efi' > obey the boot order. > > Signed-off-by: Gerd Hoffmann <kra...@redhat.com>
Reviewed-by: Ard Biesheuvel <a...@kernel.org Merged as #3298 > --- > OvmfPkg/OvmfPkg.dec | 1 + > .../QemuBootOrderLib/QemuBootOrderLib.inf | 1 + > OvmfPkg/Include/Library/QemuBootOrderLib.h | 14 ++ > .../PlatformBootManagerLib/BdsPlatform.c | 5 + > .../QemuBootOrderLib/QemuBootOrderLib.c | 122 ++++++++++++++++++ > 5 files changed, 143 insertions(+) > > diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec > index 5af76a540529..6b1296b15afa 100644 > --- a/OvmfPkg/OvmfPkg.dec > +++ b/OvmfPkg/OvmfPkg.dec > @@ -146,6 +146,7 @@ [Guids] > gConfidentialComputingSecretGuid = {0xadf956ad, 0xe98c, 0x484c, > {0xae, 0x11, 0xb5, 0x1c, 0x7d, 0x33, 0x64, 0x47}} > gConfidentialComputingSevSnpBlobGuid = {0x067b1f5f, 0xcf26, 0x44c5, > {0x85, 0x54, 0x93, 0xd7, 0x77, 0x91, 0x2d, 0x42}} > gUefiOvmfPkgPlatformInfoGuid = {0xdec9b486, 0x1f16, 0x47c7, > {0x8f, 0x68, 0xdf, 0x1a, 0x41, 0x88, 0x8b, 0xa5}} > + gQemuBootOrderGuid = {0x668f4529, 0x63d0, 0x4bb5, > {0xb6, 0x5d, 0x6f, 0xbb, 0x9d, 0x36, 0xa4, 0x4a}} > > [Ppis] > # PPI whose presence in the PPI database signals that the TPM base address > diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf > b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf > index 7c02f04e7009..211344fb0b89 100644 > --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf > +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.inf > @@ -49,6 +49,7 @@ [LibraryClasses] > [Guids] > gEfiGlobalVariableGuid > gVirtioMmioTransportGuid > + gQemuBootOrderGuid > > [FeaturePcd] > gUefiOvmfPkgTokenSpaceGuid.PcdQemuBootOrderPciTranslation > diff --git a/OvmfPkg/Include/Library/QemuBootOrderLib.h > b/OvmfPkg/Include/Library/QemuBootOrderLib.h > index 9f06439aed1e..f0369298a134 100644 > --- a/OvmfPkg/Include/Library/QemuBootOrderLib.h > +++ b/OvmfPkg/Include/Library/QemuBootOrderLib.h > @@ -47,6 +47,20 @@ ConnectDevicesFromQemu ( > VOID > ); > > +/** > + Write qemu boot order to uefi variables. > + > + Attempt to retrieve the "bootorder" fw_cfg file from QEMU. Translate > + the OpenFirmware device paths therein to UEFI device path fragments. > + > + On Success store the device path in QemuBootOrderNNNN variables. > +**/ > +VOID > +EFIAPI > +StoreQemuBootOrder ( > + VOID > + ); > + > /** > > Set the boot order based on configuration retrieved from QEMU. > diff --git a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c > b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c > index 51016a5548cb..98f6f07341ec 100644 > --- a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c > +++ b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c > @@ -1694,6 +1694,11 @@ PlatformBootManagerAfterConsole ( > // > PciAcpiInitialization (); > > + // > + // Write qemu bootorder to efi variables > + // > + StoreQemuBootOrder (); > + > // > // Process QEMU's -kernel command line option > // > diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c > b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c > index 67d29ac6429f..398de7fab4ba 100644 > --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c > +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c > @@ -1686,6 +1686,128 @@ ConnectDevicesFromQemu ( > return Status; > } > > +/** > + Write qemu boot order to uefi variables. > + > + Attempt to retrieve the "bootorder" fw_cfg file from QEMU. Translate > + the OpenFirmware device paths therein to UEFI device path fragments. > + > + On Success store the device path in QemuBootOrderNNNN variables. > +**/ > +VOID > +EFIAPI > +StoreQemuBootOrder ( > + VOID > + ) > +{ > + RETURN_STATUS Status; > + FIRMWARE_CONFIG_ITEM FwCfgItem; > + UINTN FwCfgSize; > + CHAR8 *FwCfg; > + EFI_STATUS EfiStatus; > + EXTRA_ROOT_BUS_MAP *ExtraPciRoots; > + CONST CHAR8 *FwCfgPtr; > + UINTN TranslatedSize; > + CHAR16 Translated[TRANSLATION_OUTPUT_SIZE]; > + UINTN VariableIndex = 0; > + CHAR16 VariableName[20]; > + > + Status = QemuFwCfgFindFile ("bootorder", &FwCfgItem, &FwCfgSize); > + if (RETURN_ERROR (Status)) { > + return; > + } > + > + if (FwCfgSize == 0) { > + return; > + } > + > + FwCfg = AllocatePool (FwCfgSize); > + if (FwCfg == NULL) { > + return; > + } > + > + QemuFwCfgSelectItem (FwCfgItem); > + QemuFwCfgReadBytes (FwCfgSize, FwCfg); > + if (FwCfg[FwCfgSize - 1] != '\0') { > + Status = RETURN_INVALID_PARAMETER; > + goto FreeFwCfg; > + } > + > + DEBUG ((DEBUG_VERBOSE, "%a: FwCfg:\n", __FUNCTION__)); > + DEBUG ((DEBUG_VERBOSE, "%a\n", FwCfg)); > + DEBUG ((DEBUG_VERBOSE, "%a: FwCfg: <end>\n", __FUNCTION__)); > + > + if (FeaturePcdGet (PcdQemuBootOrderPciTranslation)) { > + EfiStatus = CreateExtraRootBusMap (&ExtraPciRoots); > + if (EFI_ERROR (EfiStatus)) { > + Status = (RETURN_STATUS)EfiStatus; > + goto FreeFwCfg; > + } > + } else { > + ExtraPciRoots = NULL; > + } > + > + // > + // Translate each OpenFirmware path to a UEFI devpath prefix. > + // > + FwCfgPtr = FwCfg; > + TranslatedSize = ARRAY_SIZE (Translated); > + Status = TranslateOfwPath ( > + &FwCfgPtr, > + ExtraPciRoots, > + Translated, > + &TranslatedSize > + ); > + while (!RETURN_ERROR (Status)) { > + EFI_DEVICE_PATH_PROTOCOL *DevicePath; > + > + // > + // Convert the UEFI devpath prefix to binary representation. > + // > + ASSERT (Translated[TranslatedSize] == L'\0'); > + DevicePath = ConvertTextToDevicePath (Translated); > + if (DevicePath == NULL) { > + Status = RETURN_OUT_OF_RESOURCES; > + goto FreeExtraPciRoots; > + } > + > + UnicodeSPrint ( > + VariableName, > + sizeof (VariableName), > + L"QemuBootOrder%04d", > + VariableIndex++ > + ); > + DEBUG ((DEBUG_INFO, "%a: %s = %s\n", __FUNCTION__, VariableName, > Translated)); > + gRT->SetVariable ( > + VariableName, > + &gQemuBootOrderGuid, > + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, > + GetDevicePathSize (DevicePath), > + DevicePath > + ); > + FreePool (DevicePath); > + > + // > + // Move to the next OFW devpath. > + // > + TranslatedSize = ARRAY_SIZE (Translated); > + Status = TranslateOfwPath ( > + &FwCfgPtr, > + ExtraPciRoots, > + Translated, > + &TranslatedSize > + ); > + } > + > +FreeExtraPciRoots: > + if (ExtraPciRoots != NULL) { > + DestroyExtraRootBusMap (ExtraPciRoots); > + } > + > +FreeFwCfg: > + FreePool (FwCfg); > +} > + > /** > > Convert the UEFI DevicePath to full text representation with DevPathToText, > -- > 2.36.1 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#93252): https://edk2.groups.io/g/devel/message/93252 Mute This Topic: https://groups.io/mt/92484547/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-