}\r
};\r
\r
+STATIC\r
+BOOLEAN\r
+IsOtherInitrdDevicePathAlreadyInstalled (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_HANDLE Handle;\r
+\r
+ DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)&mInitrdDevicePath;\r
+ Status = gBS->LocateDevicePath (&gEfiLoadFile2ProtocolGuid, &DevicePath,\r
+ &Handle);\r
+ if (EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+\r
+ //\r
+ // Check whether the existing instance is one that we installed during\r
+ // a previous invocation.\r
+ //\r
+ if (Handle == mInitrdLoadFile2Handle) {\r
+ return FALSE;\r
+ }\r
+ return TRUE;\r
+}\r
+\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
} else {\r
ASSERT(FALSE);\r
}\r
+ } else if (IsOtherInitrdDevicePathAlreadyInstalled ()) {\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ALREADY_INSTALLED),\r
+ mLinuxInitrdShellCommandHiiHandle, L"initrd");\r
+ ShellStatus = SHELL_UNSUPPORTED;\r
} else {\r
if (ShellCommandLineGetCount (Package) > 2) {\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY),\r
#langdef en-US "english"\r
\r
#string STR_GEN_PROBLEM #language en-US "%H%s%N: Unknown flag - '%H%s%N'\r\n"\r
+#string STR_GEN_ALREADY_INSTALLED #language en-US "%H%s%N: Linux initrd already provided by platform\r\n"\r
#string STR_GEN_TOO_MANY #language en-US "%H%s%N: Too many arguments.\r\n"\r
#string STR_GEN_TOO_FEW #language en-US "%H%s%N: Too few arguments.\r\n"\r
#string STR_GEN_FIND_FAIL #language en-US "%H%s%N: File not found - '%H%s%N'\r\n"\r
" Consumers of the LoadFile2 protocol on the LINUX_EFI_INITRD_MEDIA_GUID\r\n"\r
" device path that are started via means other than the shell will be able\r\n"\r
" to locate the protocol and invoke it.\r\n"\r
+" 3. Exposing an initrd using this command is only supported if no initrd is\r\n"\r
+" already being exposed by another driver on the platform.\r\n"\r