]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: PlatformBootManagerLibGrub: Allow executing kernel via fw_cfg
authorJames Bottomley <jejb@linux.ibm.com>
Fri, 15 Jan 2021 23:33:02 +0000 (15:33 -0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 29 Jul 2021 09:49:50 +0000 (09:49 +0000)
Support QEMU's -kernel option.

Create a QemuKernel.c for PlatformBootManagerLibGrub
which is an exact copy of the file
PlatformBootManagerLib/QemuKernel.c .

Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ashish Kalra <ashish.kalra@amd.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Min Xu <min.m.xu@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3457
Signed-off-by: James Bottomley <jejb@linux.ibm.com>
Reviewed-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
OvmfPkg/AmdSev/AmdSevX64.dsc
OvmfPkg/Library/PlatformBootManagerLibGrub/BdsPlatform.c
OvmfPkg/Library/PlatformBootManagerLibGrub/BdsPlatform.h
OvmfPkg/Library/PlatformBootManagerLibGrub/PlatformBootManagerLibGrub.inf
OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c [new file with mode: 0644]

index a2f1324c40a6d3accf473cb70769351ef5182571..aefdcf881c991f6a3313543ac089b56f4b63a2ef 100644 (file)
   CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.inf\r
   MpInitLib|UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf\r
   QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/PeiQemuFwCfgS3LibFwCfg.inf\r
+  QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf\r
   PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf\r
   QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf\r
 \r
index 5c92d4fc2b097ce2a1f7fb66ca498916a27ce7ea..7cceeea4879c9f3d17a892f61ca673a5b60155af 100644 (file)
@@ -1315,6 +1315,11 @@ PlatformBootManagerAfterConsole (
   //\r
   Tcg2PhysicalPresenceLibProcessRequest (NULL);\r
 \r
+  //\r
+  // Process QEMU's -kernel command line option\r
+  //\r
+  TryRunningQemuKernel ();\r
+\r
   //\r
   // Perform some platform specific connect sequence\r
   //\r
index 748c630819204d88671db1c7ac5ad351a202edc7..f1d3a2906c00d6e6f2ae92cc5a622a4c94fb219c 100644 (file)
@@ -172,4 +172,15 @@ PlatformInitializeConsole (
   IN PLATFORM_CONSOLE_CONNECT_ENTRY   *PlatformConsole\r
   );\r
 \r
+/**\r
+  Loads and boots UEFI Linux via the FwCfg interface.\r
+\r
+  @retval    EFI_NOT_FOUND - The Linux kernel was not found\r
+\r
+**/\r
+EFI_STATUS\r
+TryRunningQemuKernel (\r
+  VOID\r
+  );\r
+\r
 #endif // _PLATFORM_SPECIFIC_BDS_PLATFORM_H_\r
index 9a806d17ec45ddae604190aa0c34bfcfef2ef412..5f6f73d184707972cb6da55e3a58d1b99797300a 100644 (file)
@@ -23,6 +23,7 @@
 \r
 [Sources]\r
   BdsPlatform.c\r
+  QemuKernel.c\r
   PlatformData.c\r
   BdsPlatform.h\r
 \r
@@ -46,6 +47,7 @@
   BootLogoLib\r
   DevicePathLib\r
   PciLib\r
+  QemuLoadImageLib\r
   UefiLib\r
   PlatformBmPrintScLib\r
   Tcg2PhysicalPresenceLib\r
diff --git a/OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c b/OvmfPkg/Library/PlatformBootManagerLibGrub/QemuKernel.c
new file mode 100644 (file)
index 0000000..c625592
--- /dev/null
@@ -0,0 +1,50 @@
+/** @file\r
+\r
+  Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/QemuLoadImageLib.h>\r
+#include <Library/ReportStatusCodeLib.h>\r
+#include <Library/UefiLib.h>\r
+\r
+\r
+EFI_STATUS\r
+TryRunningQemuKernel (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_HANDLE                KernelImageHandle;\r
+\r
+  Status = QemuLoadKernelImage (&KernelImageHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Signal the EVT_SIGNAL_READY_TO_BOOT event\r
+  //\r
+  EfiSignalEventReadyToBoot();\r
+\r
+  REPORT_STATUS_CODE (EFI_PROGRESS_CODE,\r
+    (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT));\r
+\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