On 03/03/20 15:01, Ard Biesheuvel wrote: > Before taking any actions, check if an instance of the LoadFile2 exists > already on the Linux initrd media GUID device path, and whether it was > provided by this command. If so, abort, since no duplicate instances of > the device path should exist. > > Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2564 > Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> > --- > OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c | > 31 ++++++++++++++++++++ > OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.uni | > 3 ++ > 2 files changed, 34 insertions(+) > > diff --git > a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c > b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c > index 47ed26b50d3a..ed8fbaa77069 100644 > --- a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c > +++ b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c > @@ -53,6 +53,33 @@ STATIC CONST SINGLE_NODE_VENDOR_MEDIA_DEVPATH > mInitrdDevicePath = { > } > }; > > +STATIC > +BOOLEAN > +IsOtherInitrdDevicePathAlreadyInstalled ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + EFI_DEVICE_PATH_PROTOCOL *DevicePath; > + EFI_HANDLE Handle; > + > + DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)&mInitrdDevicePath; > + Status = gBS->LocateDevicePath (&gEfiLoadFile2ProtocolGuid, &DevicePath, > + &Handle); > + if (EFI_ERROR (Status)) { > + return FALSE; > + } > + > + // > + // Check whether the existing instance is one that we installed during > + // a previous invocation. > + // > + if (Handle == mInitrdLoadFile2Handle) { > + return FALSE; > + } > + return TRUE; > +}
Looks good, the function will return TRUE when mInitrdLoadFile2Handle is NULL. Reviewed-by: Laszlo Ersek <ler...@redhat.com> Thanks Laszlo > + > STATIC > EFI_STATUS > EFIAPI > @@ -217,6 +244,10 @@ RunInitrd ( > } else { > ASSERT(FALSE); > } > + } else if (IsOtherInitrdDevicePathAlreadyInstalled ()) { > + ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ALREADY_INSTALLED), > + mLinuxInitrdShellCommandHiiHandle, L"initrd"); > + ShellStatus = SHELL_UNSUPPORTED; > } else { > if (ShellCommandLineGetCount (Package) > 2) { > ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), > diff --git > a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.uni > b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.uni > index a88fa6e3641b..4b6b1285fffd 100644 > --- > a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.uni > +++ > b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.uni > @@ -18,6 +18,7 @@ > #langdef en-US "english" > > #string STR_GEN_PROBLEM #language en-US "%H%s%N: Unknown flag - > '%H%s%N'\r\n" > +#string STR_GEN_ALREADY_INSTALLED #language en-US "%H%s%N: Linux initrd > already provided by platform\r\n" > #string STR_GEN_TOO_MANY #language en-US "%H%s%N: Too many > arguments.\r\n" > #string STR_GEN_TOO_FEW #language en-US "%H%s%N: Too few > arguments.\r\n" > #string STR_GEN_FIND_FAIL #language en-US "%H%s%N: File not found - > '%H%s%N'\r\n" > @@ -47,3 +48,5 @@ > " Consumers of the LoadFile2 protocol on the > LINUX_EFI_INITRD_MEDIA_GUID\r\n" > " device path that are started via means other than the shell will be > able\r\n" > " to locate the protocol and invoke it.\r\n" > +" 3. Exposing an initrd using this command is only supported if no initrd > is\r\n" > +" already being exposed by another driver on the platform.\r\n" > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55344): https://edk2.groups.io/g/devel/message/55344 Mute This Topic: https://groups.io/mt/71700589/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-