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:
Sunil V L 2023-01-28 20:52:02 +05:30 committed by mergify[bot]
parent f13264b340
commit d78df93863
4 changed files with 1275 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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_

View File

@ -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

View File

@ -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;
}