OvmfPkg/RiscVVirt: Add PlatformBootManagerLib library
RISC-V Qemu Virt platfform needs the PlatformBootManagerLib similar to the one in ArmVirtPlatform. Add the library in OvmfPkg/RiscVVirt leveraging the one from Arm. Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Sunil V L <sunilvl@ventanamicro.com> Acked-by: Abner Chang <abner.chang@amd.com> Reviewed-by: Andrei Warkentin <andrei.warkentin@intel.com> Acked-by: Ard Biesheuvel <ardb@kernel.org> Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
This commit is contained in:
		
							
								
								
									
										1078
									
								
								OvmfPkg/RiscVVirt/Library/PlatformBootManagerLib/PlatformBm.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1078
									
								
								OvmfPkg/RiscVVirt/Library/PlatformBootManagerLib/PlatformBm.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,45 @@ | ||||
| /** @file | ||||
|   Head file for BDS Platform specific code | ||||
|  | ||||
|   Copyright (C) 2015-2016, Red Hat, Inc. | ||||
|   Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> | ||||
|  | ||||
|   SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
|  | ||||
| **/ | ||||
|  | ||||
| #ifndef _PLATFORM_BM_H_ | ||||
| #define _PLATFORM_BM_H_ | ||||
|  | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/DevicePathLib.h> | ||||
| #include <Library/MemoryAllocationLib.h> | ||||
| #include <Library/UefiBootServicesTableLib.h> | ||||
| #include <Library/UefiLib.h> | ||||
| #include <Library/UefiRuntimeServicesTableLib.h> | ||||
|  | ||||
| /** | ||||
|   Download the kernel, the initial ramdisk, and the kernel command line from | ||||
|   QEMU's fw_cfg. Construct a minimal SimpleFileSystem that contains the two | ||||
|   image files, and load and start the kernel from it. | ||||
|  | ||||
|   The kernel will be instructed via its command line to load the initrd from | ||||
|   the same Simple FileSystem. | ||||
|  | ||||
|   @retval EFI_NOT_FOUND         Kernel image was not found. | ||||
|   @retval EFI_OUT_OF_RESOURCES  Memory allocation failed. | ||||
|   @retval EFI_PROTOCOL_ERROR    Unterminated kernel command line. | ||||
|  | ||||
|   @return                       Error codes from any of the underlying | ||||
|                                 functions. On success, the function doesn't | ||||
|                                 return. | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| TryRunningQemuKernel ( | ||||
|   VOID | ||||
|   ); | ||||
|  | ||||
| #endif // _PLATFORM_BM_H_ | ||||
| @@ -0,0 +1,75 @@ | ||||
| ## @file | ||||
| #  Implementation for PlatformBootManagerLib library class interfaces for RISC-V. | ||||
| # | ||||
| #  Copyright (c) 2022, Ventana Micro Systems Inc. All rights reserved.<BR> | ||||
| # | ||||
| #  SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
| # | ||||
| ## | ||||
|  | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x0001001B | ||||
|   BASE_NAME                      = DxeRiscV64PlatformBootManagerLib | ||||
|   FILE_GUID                      = 4FC87DC9-2666-49BB-9023-B5FAA1E9E732 | ||||
|   MODULE_TYPE                    = DXE_DRIVER | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = PlatformBootManagerLib|DXE_DRIVER | ||||
|  | ||||
| # | ||||
| # The following information is for reference only and not required by the build tools. | ||||
| # | ||||
| #  VALID_ARCHITECTURES           = RISCV64 | ||||
| # | ||||
|  | ||||
| [Sources] | ||||
|   PlatformBm.c | ||||
|   PlatformBm.h | ||||
|   QemuKernel.c | ||||
|  | ||||
| [Packages] | ||||
|   MdeModulePkg/MdeModulePkg.dec | ||||
|   MdePkg/MdePkg.dec | ||||
|   OvmfPkg/OvmfPkg.dec | ||||
|   SecurityPkg/SecurityPkg.dec | ||||
|   ShellPkg/ShellPkg.dec | ||||
|  | ||||
| [LibraryClasses] | ||||
|   BaseLib | ||||
|   BaseMemoryLib | ||||
|   BootLogoLib | ||||
|   DebugLib | ||||
|   DevicePathLib | ||||
|   MemoryAllocationLib | ||||
|   PcdLib | ||||
|   PlatformBmPrintScLib | ||||
|   QemuBootOrderLib | ||||
|   QemuLoadImageLib | ||||
|   ReportStatusCodeLib | ||||
|   TpmPlatformHierarchyLib | ||||
|   UefiBootManagerLib | ||||
|   UefiBootServicesTableLib | ||||
|   UefiLib | ||||
|   UefiRuntimeServicesTableLib | ||||
|  | ||||
| [FixedPcd] | ||||
|   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate | ||||
|   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits | ||||
|   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity | ||||
|   gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits | ||||
|  | ||||
| [Pcd] | ||||
|   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut | ||||
|   gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString | ||||
|  | ||||
| [Guids] | ||||
|   gEfiEndOfDxeEventGroupGuid | ||||
|   gEfiGlobalVariableGuid | ||||
|   gRootBridgesConnectedEventGroupGuid | ||||
|   gUefiShellFileGuid | ||||
|   gEfiTtyTermGuid | ||||
|  | ||||
| [Protocols] | ||||
|   gEfiFirmwareVolume2ProtocolGuid | ||||
|   gEfiGraphicsOutputProtocolGuid | ||||
|   gEfiPciRootBridgeIoProtocolGuid | ||||
|   gVirtioDeviceProtocolGuid | ||||
| @@ -0,0 +1,77 @@ | ||||
| /** @file | ||||
|   Try to load an EFI-stubbed RISC-V Linux kernel from QEMU's fw_cfg. | ||||
|  | ||||
|   This implementation differs from OvmfPkg/Library/LoadLinuxLib. An EFI | ||||
|   stub in the subject kernel is a hard requirement here. | ||||
|  | ||||
|   Copyright (C) 2014-2016, Red Hat, Inc. | ||||
|  | ||||
|   SPDX-License-Identifier: BSD-2-Clause-Patent | ||||
| **/ | ||||
|  | ||||
| #include <Library/QemuLoadImageLib.h> | ||||
| #include <Library/ReportStatusCodeLib.h> | ||||
|  | ||||
| #include "PlatformBm.h" | ||||
|  | ||||
| // | ||||
| // The entry point of the feature. | ||||
| // | ||||
|  | ||||
| /** | ||||
|   Download the kernel, the initial ramdisk, and the kernel command line from | ||||
|   QEMU's fw_cfg. Construct a minimal SimpleFileSystem that contains the two | ||||
|   image files, and load and start the kernel from it. | ||||
|  | ||||
|   The kernel will be instructed via its command line to load the initrd from | ||||
|   the same Simple FileSystem. | ||||
|  | ||||
|   @retval EFI_NOT_FOUND         Kernel image was not found. | ||||
|   @retval EFI_OUT_OF_RESOURCES  Memory allocation failed. | ||||
|   @retval EFI_PROTOCOL_ERROR    Unterminated kernel command line. | ||||
|  | ||||
|   @return                       Error codes from any of the underlying | ||||
|                                 functions. On success, the function doesn't | ||||
|                                 return. | ||||
| **/ | ||||
| EFI_STATUS | ||||
| EFIAPI | ||||
| TryRunningQemuKernel ( | ||||
|   VOID | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS  Status; | ||||
|   EFI_HANDLE  KernelImageHandle; | ||||
|  | ||||
|   Status = QemuLoadKernelImage (&KernelImageHandle); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // Signal the EFI_EVENT_GROUP_READY_TO_BOOT event. | ||||
|   // | ||||
|   EfiSignalEventReadyToBoot (); | ||||
|  | ||||
|   REPORT_STATUS_CODE ( | ||||
|     EFI_PROGRESS_CODE, | ||||
|     (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT) | ||||
|     ); | ||||
|  | ||||
|   // | ||||
|   // Start the image. | ||||
|   // | ||||
|   Status = QemuStartKernelImage (&KernelImageHandle); | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     DEBUG (( | ||||
|       DEBUG_ERROR, | ||||
|       "%a: QemuStartKernelImage(): %r\n", | ||||
|       __FUNCTION__, | ||||
|       Status | ||||
|       )); | ||||
|   } | ||||
|  | ||||
|   QemuUnloadKernelImage (KernelImageHandle); | ||||
|  | ||||
|   return Status; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user