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