]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/PlatformBootManagerLib: switch to QemuLoadImageLib
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Sat, 29 Feb 2020 09:33:21 +0000 (10:33 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 5 Mar 2020 19:45:05 +0000 (19:45 +0000)
Replace the open coded sequence to load Linux on x86 with a short and
generic sequence invoking QemuLoadImageLib, which can be provided by
a generic version that only supports the LoadImage and StartImage boot
services, and one that incorporates the entire legacy loading sequence
as well.

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2566
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c

index c479f113b92b2b852e156d579a1eb6f3288ad76b..e470b9a6a3e501d6a8e88d64b2f9f7a1318d664e 100644 (file)
@@ -49,7 +49,7 @@
   NvVarsFileLib\r
   QemuFwCfgLib\r
   QemuFwCfgS3Lib\r
-  LoadLinuxLib\r
+  QemuLoadImageLib\r
   QemuBootOrderLib\r
   ReportStatusCodeLib\r
   UefiLib\r
index ddfef925edd321a4822b84f9fc51888c81e03310..c6255921779ea67caf592d23f134f95dd4a49d25 100644 (file)
@@ -9,11 +9,8 @@
 \r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <Library/LoadLinuxLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/QemuFwCfgLib.h>\r
+#include <Library/QemuLoadImageLib.h>\r
 #include <Library/ReportStatusCodeLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/UefiLib.h>\r
 \r
 \r
@@ -23,120 +20,11 @@ TryRunningQemuKernel (
   )\r
 {\r
   EFI_STATUS                Status;\r
-  UINTN                     KernelSize;\r
-  UINTN                     KernelInitialSize;\r
-  VOID                      *KernelBuf;\r
-  UINTN                     SetupSize;\r
-  VOID                      *SetupBuf;\r
-  UINTN                     CommandLineSize;\r
-  CHAR8                     *CommandLine;\r
-  UINTN                     InitrdSize;\r
-  VOID*                     InitrdData;\r
+  EFI_HANDLE                KernelImageHandle;\r
 \r
-  SetupBuf = NULL;\r
-  SetupSize = 0;\r
-  KernelBuf = NULL;\r
-  KernelInitialSize = 0;\r
-  CommandLine = NULL;\r
-  CommandLineSize = 0;\r
-  InitrdData = NULL;\r
-  InitrdSize = 0;\r
-\r
-  if (!QemuFwCfgIsAvailable ()) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  QemuFwCfgSelectItem (QemuFwCfgItemKernelSize);\r
-  KernelSize = (UINTN) QemuFwCfgRead64 ();\r
-\r
-  QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize);\r
-  SetupSize = (UINTN) QemuFwCfgRead64 ();\r
-\r
-  if (KernelSize == 0 || SetupSize == 0) {\r
-    DEBUG ((EFI_D_INFO, "qemu -kernel was not used.\n"));\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  SetupBuf = LoadLinuxAllocateKernelSetupPages (EFI_SIZE_TO_PAGES (SetupSize));\r
-  if (SetupBuf == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel setup!\n"));\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", (UINT32) SetupSize));\r
-  DEBUG ((EFI_D_INFO, "Reading kernel setup image ..."));\r
-  QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData);\r
-  QemuFwCfgReadBytes (SetupSize, SetupBuf);\r
-  DEBUG ((EFI_D_INFO, " [done]\n"));\r
-\r
-  Status = LoadLinuxCheckKernelSetup (SetupBuf, SetupSize);\r
+  Status = QemuLoadKernelImage (&KernelImageHandle);\r
   if (EFI_ERROR (Status)) {\r
-    goto FreeAndReturn;\r
-  }\r
-\r
-  Status = LoadLinuxInitializeKernelSetup (SetupBuf);\r
-  if (EFI_ERROR (Status)) {\r
-    goto FreeAndReturn;\r
-  }\r
-\r
-  KernelInitialSize = LoadLinuxGetKernelSize (SetupBuf, KernelSize);\r
-  if (KernelInitialSize == 0) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto FreeAndReturn;\r
-  }\r
-\r
-  KernelBuf = LoadLinuxAllocateKernelPages (\r
-                SetupBuf,\r
-                EFI_SIZE_TO_PAGES (KernelInitialSize));\r
-  if (KernelBuf == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel!\n"));\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto FreeAndReturn;\r
-  }\r
-\r
-  DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", (UINT32) KernelSize));\r
-  DEBUG ((EFI_D_INFO, "Reading kernel image ..."));\r
-  QemuFwCfgSelectItem (QemuFwCfgItemKernelData);\r
-  QemuFwCfgReadBytes (KernelSize, KernelBuf);\r
-  DEBUG ((EFI_D_INFO, " [done]\n"));\r
-\r
-  QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize);\r
-  CommandLineSize = (UINTN) QemuFwCfgRead64 ();\r
-\r
-  if (CommandLineSize > 0) {\r
-    CommandLine = LoadLinuxAllocateCommandLinePages (\r
-                    EFI_SIZE_TO_PAGES (CommandLineSize));\r
-    QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData);\r
-    QemuFwCfgReadBytes (CommandLineSize, CommandLine);\r
-  } else {\r
-    CommandLine = NULL;\r
-  }\r
-\r
-  Status = LoadLinuxSetCommandLine (SetupBuf, CommandLine);\r
-  if (EFI_ERROR (Status)) {\r
-    goto FreeAndReturn;\r
-  }\r
-\r
-  QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize);\r
-  InitrdSize = (UINTN) QemuFwCfgRead64 ();\r
-\r
-  if (InitrdSize > 0) {\r
-    InitrdData = LoadLinuxAllocateInitrdPages (\r
-                   SetupBuf,\r
-                   EFI_SIZE_TO_PAGES (InitrdSize)\r
-                   );\r
-    DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", (UINT32) InitrdSize));\r
-    DEBUG ((EFI_D_INFO, "Reading initrd image ..."));\r
-    QemuFwCfgSelectItem (QemuFwCfgItemInitrdData);\r
-    QemuFwCfgReadBytes (InitrdSize, InitrdData);\r
-    DEBUG ((EFI_D_INFO, " [done]\n"));\r
-  } else {\r
-    InitrdData = NULL;\r
-  }\r
-\r
-  Status = LoadLinuxSetInitrd (SetupBuf, InitrdData, InitrdSize);\r
-  if (EFI_ERROR (Status)) {\r
-    goto FreeAndReturn;\r
+    return Status;\r
   }\r
 \r
   //\r
@@ -147,22 +35,16 @@ TryRunningQemuKernel (
   REPORT_STATUS_CODE (EFI_PROGRESS_CODE,\r
     (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));\r
 \r
-  Status = LoadLinux (KernelBuf, SetupBuf);\r
-\r
-FreeAndReturn:\r
-  if (SetupBuf != NULL) {\r
-    FreePages (SetupBuf, EFI_SIZE_TO_PAGES (SetupSize));\r
-  }\r
-  if (KernelBuf != NULL) {\r
-    FreePages (KernelBuf, EFI_SIZE_TO_PAGES (KernelInitialSize));\r
-  }\r
-  if (CommandLine != NULL) {\r
-    FreePages (CommandLine, EFI_SIZE_TO_PAGES (CommandLineSize));\r
-  }\r
-  if (InitrdData != NULL) {\r
-    FreePages (InitrdData, EFI_SIZE_TO_PAGES (InitrdSize));\r
+  //\r
+  // Start the image.\r
+  //\r
+  Status = QemuStartKernelImage (&KernelImageHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((DEBUG_ERROR, "%a: QemuStartKernelImage(): %r\n", __FUNCTION__,\r
+      Status));\r
   }\r
 \r
+  QemuUnloadKernelImage (KernelImageHandle);\r
+\r
   return Status;\r
 }\r
-\r