[edk2-devel] [PATCH v2 13/14] OvmfPkg/QemuKernelLoaderFsDxe: add support for new Linux initrd device path
Laszlo Ersek
lersek at redhat.com
Thu Mar 5 13:19:09 UTC 2020
On 03/04/20 10:52, Ard Biesheuvel wrote:
> Linux v5.7 will introduce a new method to load the initial ramdisk
> (initrd) from the loader, using the LoadFile2 protocol installed on a
> special vendor GUIDed media device path.
>
> Add support for this to our QEMU command line kernel/initrd loader.
>
> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2566
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
> ---
> OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 79 ++++++++++++++++++++
> OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf | 2 +
> 2 files changed, 81 insertions(+)
>
> diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c
> index 8ccb1983170c..f43b4c0db0ec 100644
> --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c
> +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c
> @@ -13,15 +13,18 @@
> #include <Guid/FileInfo.h>
> #include <Guid/FileSystemInfo.h>
> #include <Guid/FileSystemVolumeLabelInfo.h>
> +#include <Guid/LinuxEfiInitrdMedia.h>
> #include <Guid/QemuKernelLoaderFsMedia.h>
> #include <Library/BaseLib.h>
> #include <Library/BaseMemoryLib.h>
> #include <Library/DebugLib.h>
> +#include <Library/DevicePathLib.h>
> #include <Library/MemoryAllocationLib.h>
> #include <Library/QemuFwCfgLib.h>
> #include <Library/UefiBootServicesTableLib.h>
> #include <Library/UefiRuntimeServicesTableLib.h>
> #include <Protocol/DevicePath.h>
> +#include <Protocol/LoadFile2.h>
> #include <Protocol/SimpleFileSystem.h>
>
> //
> @@ -84,6 +87,19 @@ STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mFileSystemDevicePath = {
> }
> };
>
> +STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mInitrdDevicePath = {
> + {
> + {
> + MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP,
> + { sizeof (VENDOR_DEVICE_PATH) }
> + },
> + LINUX_EFI_INITRD_MEDIA_GUID
> + }, {
> + END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
> + { sizeof (EFI_DEVICE_PATH_PROTOCOL) }
> + }
> +};
> +
> //
> // The "file in the EFI stub filesystem" abstraction.
> //
> @@ -839,6 +855,48 @@ STATIC CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL mFileSystem = {
> StubFileSystemOpenVolume
> };
>
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +InitrdLoadFile2 (
> + IN EFI_LOAD_FILE2_PROTOCOL *This,
> + IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
> + IN BOOLEAN BootPolicy,
> + IN OUT UINTN *BufferSize,
(1) You might want to beautify the columns here, similarly to commit
2632178bc683 ("OvmfPkg: add 'initrd' shell command to expose Linux
initrd via device path", 2020-03-04). Up to you.
Reviewed-by: Laszlo Ersek <lersek at redhat.com>
Thanks
Laszlo
> + IN VOID *Buffer OPTIONAL
> + )
> +{
> + CONST KERNEL_BLOB *InitrdBlob = &mKernelBlob[KernelBlobTypeInitrd];
> +
> + ASSERT (InitrdBlob->Size > 0);
> +
> + if (BootPolicy) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (BufferSize == NULL || !IsDevicePathValid (FilePath, 0)) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (FilePath->Type != END_DEVICE_PATH_TYPE ||
> + FilePath->SubType != END_ENTIRE_DEVICE_PATH_SUBTYPE) {
> + return EFI_NOT_FOUND;
> + }
> +
> + if (Buffer == NULL || *BufferSize < InitrdBlob->Size) {
> + *BufferSize = InitrdBlob->Size;
> + return EFI_BUFFER_TOO_SMALL;
> + }
> +
> + CopyMem (Buffer, InitrdBlob->Data, InitrdBlob->Size);
> +
> + *BufferSize = InitrdBlob->Size;
> + return EFI_SUCCESS;
> +}
> +
> +STATIC CONST EFI_LOAD_FILE2_PROTOCOL mInitrdLoadFile2 = {
> + InitrdLoadFile2,
> +};
>
> //
> // Utility functions.
> @@ -949,6 +1007,7 @@ QemuKernelLoaderFsDxeEntrypoint (
> KERNEL_BLOB *KernelBlob;
> EFI_STATUS Status;
> EFI_HANDLE FileSystemHandle;
> + EFI_HANDLE InitrdLoadFile2Handle;
>
> if (!QemuFwCfgIsAvailable ()) {
> return EFI_NOT_FOUND;
> @@ -993,8 +1052,28 @@ QemuKernelLoaderFsDxeEntrypoint (
> goto FreeBlobs;
> }
>
> + if (KernelBlob[KernelBlobTypeInitrd].Size > 0) {
> + InitrdLoadFile2Handle = NULL;
> + Status = gBS->InstallMultipleProtocolInterfaces (&InitrdLoadFile2Handle,
> + &gEfiDevicePathProtocolGuid, &mInitrdDevicePath,
> + &gEfiLoadFile2ProtocolGuid, &mInitrdLoadFile2,
> + NULL);
> + if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_ERROR, "%a: InstallMultipleProtocolInterfaces(): %r\n",
> + __FUNCTION__, Status));
> + goto UninstallFileSystemHandle;
> + }
> + }
> +
> return EFI_SUCCESS;
>
> +UninstallFileSystemHandle:
> + Status = gBS->UninstallMultipleProtocolInterfaces (FileSystemHandle,
> + &gEfiDevicePathProtocolGuid, &mFileSystemDevicePath,
> + &gEfiSimpleFileSystemProtocolGuid, &mFileSystem,
> + NULL);
> + ASSERT_EFI_ERROR (Status);
> +
> FreeBlobs:
> while (BlobType > 0) {
> CurrentBlob = &mKernelBlob[--BlobType];
> diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf
> index 5ba88063def0..7b35adb8e034 100644
> --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf
> +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf
> @@ -28,6 +28,7 @@ [LibraryClasses]
> BaseLib
> BaseMemoryLib
> DebugLib
> + DevicePathLib
> MemoryAllocationLib
> QemuFwCfgLib
> UefiBootServicesTableLib
> @@ -42,6 +43,7 @@ [Guids]
>
> [Protocols]
> gEfiDevicePathProtocolGuid ## PRODUCES
> + gEfiLoadFile2ProtocolGuid ## PRODUCES
> gEfiSimpleFileSystemProtocolGuid ## PRODUCES
>
> [Depex]
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#55522): https://edk2.groups.io/g/devel/message/55522
Mute This Topic: https://groups.io/mt/71722807/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list