]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c
OvmfPkg/PlatformBootManagerLib: switch to QemuLoadImageLib
[mirror_edk2.git] / OvmfPkg / Library / PlatformBootManagerLib / QemuKernel.c
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