summaryrefslogtreecommitdiffstats
path: root/OvmfPkg
diff options
context:
space:
mode:
authorArd Biesheuvel <ard.biesheuvel@linaro.org>2020-03-03 14:37:49 +0100
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2020-03-04 09:26:45 +0000
commitecb30848fdc96e146c997da2a4898a96d627b477 (patch)
tree5c5f533b474e40a7a329c349a3e41f8b85520eb4 /OvmfPkg
parentd55cfdc51f93b6622c3780d4cc2ba2769c154a15 (diff)
downloadedk2-ecb30848fdc96e146c997da2a4898a96d627b477.tar.gz
edk2-ecb30848fdc96e146c997da2a4898a96d627b477.tar.bz2
edk2-ecb30848fdc96e146c997da2a4898a96d627b477.zip
OvmfPkg/LinuxInitrdDynamicShellCommand: bail if initrd already exists
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.biesheuvel@linaro.org> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Diffstat (limited to 'OvmfPkg')
-rw-r--r--OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c31
-rw-r--r--OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.uni3
2 files changed, 34 insertions, 0 deletions
diff --git a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c
index 47ed26b50d..ed8fbaa770 100644
--- a/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c
+++ b/OvmfPkg/LinuxInitrdDynamicShellCommand/LinuxInitrdDynamicShellCommand.c
@@ -54,6 +54,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;
+}
+
+STATIC
EFI_STATUS
EFIAPI
InitrdLoadFile2 (
@@ -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 a88fa6e364..4b6b1285ff 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"