From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55140+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55140+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134186; cv=none; d=zohomail.com; s=zohoarc; b=SjePJuWK0nxJKeIzjX4Mv56Qew/nYfLpvb0qJ59oXx9CGRNS6sEiYw9OCFH3EZwDwDWg99gckTPNFYPnn1IRrIa05IPXLygEdd3ZTjL4BZJ6A+lh/dca+RdbLN2ehZXR2yq4KnV6pf73bLKMtA0xhhHhUCcmObSU+PEyx/c/mgM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134186; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=0UGmTB/yZy28PsFwUmzGA9nDOC0XOuc6LoV6kCK1HmI=; b=kyKMZhuec4bnsWebJ2neAcVjweojvqW60fbbMHLzkDDkqovAxPSrDRlr6iBG7ry+4Dtxu4Jo+695+zRkudcgEs3Q2hYpZXT/8SqDYKUmLVl5vE7S6qte48OeImYp4tNcTGMkTYsRir0L7p5K+ZFCVcd9c+/hAhFZbLki1cP0EEw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55140+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134186420408.91726511948127; Sun, 1 Mar 2020 23:29:46 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 5DfsYY1788612xe4slipoH1I; Sun, 01 Mar 2020 23:29:45 -0800 X-Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by mx.groups.io with SMTP id smtpd.web12.10942.1583134184447895274 for ; Sun, 01 Mar 2020 23:29:44 -0800 X-Received: by mail-wr1-f67.google.com with SMTP id l5so11140108wrx.4 for ; Sun, 01 Mar 2020 23:29:44 -0800 (PST) X-Gm-Message-State: IVnnDBv1NdsWHJv7eijDkbRvx1787277AA= X-Google-Smtp-Source: APXvYqz5yaGVUHZ7EsSriQABaXAK3bokKZanGQxi00idjF2frfL/H7/nyKRk2vFthKF3aRmayLy/Cg== X-Received: by 2002:a5d:6604:: with SMTP id n4mr19757337wru.136.1583134182710; Sun, 01 Mar 2020 23:29:42 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:42 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 01/13] OvmfPkg: add GUID for the QEMU kernel loader fs media device path Date: Mon, 2 Mar 2020 08:29:24 +0100 Message-Id: <20200302072936.29221-2-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134185; bh=f8NCTJ0y8Pk23o1aIJfKXyq9Q3IhcIVOSSdmcP6W/so=; h=Cc:Date:From:Reply-To:Subject:To; b=kWhBlGS7WVt/ef3R1QLmXajYIzb0svSY6XAnHpyo1lOXGiOQWed9QlbNT0W8Fl1tHRm S4ZM9B4ZNjpbjWt0UmStPC8ugvW57RgpHPlxp9tuitW59NIcENtyywincibxhFR1ZP35N 3wGHDnk3cgtFFCIbMN4Osnit7kERqN8YjL0= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In an upcoming patch, we will introduce a separate DXE driver that exposes the virtual SimpleFileSystem implementation that carries the kernel and initrd passed via the QEMU command line, and a separate library that consumes it, to be incorporated into the boot manager. Since the GUID used for the SimpleFileSystem implementation's device path will no longer be for internal use only, create a well defined GUID to identify the media device path. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- OvmfPkg/Include/Guid/QemuKernelLoaderFsMedia.h | 18 ++++++++++++++++++ OvmfPkg/OvmfPkg.dec | 1 + 2 files changed, 19 insertions(+) diff --git a/OvmfPkg/Include/Guid/QemuKernelLoaderFsMedia.h b/OvmfPkg/Inclu= de/Guid/QemuKernelLoaderFsMedia.h new file mode 100644 index 000000000000..225c3c494613 --- /dev/null +++ b/OvmfPkg/Include/Guid/QemuKernelLoaderFsMedia.h @@ -0,0 +1,18 @@ +/** @file + GUID definition for the QEMU LoaderFs media device path, containing the + kernel, initrd and command line as file objects + + Copyright (c) 2020, Arm, Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef QEMU_KERNEL_LOADER_FS_MEDIA_GUID_H__ +#define QEMU_KERNEL_LOADER_FS_MEDIA_GUID_H__ + +#define QEMU_KERNEL_LOADER_FS_MEDIA_GUID \ + {0x1428f772, 0xb64a, 0x441e, {0xb8, 0xc3, 0x9e, 0xbd, 0xd7, 0xf8, 0x93, = 0xc7}} + +extern EFI_GUID gQemuKernelLoaderFsMediaGuid; + +#endif diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 6849a79cd8b0..d88778600517 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -87,6 +87,7 @@ [Guids] gEfiLegacyBiosGuid =3D {0x2E3044AC, 0x879F, 0x490F, {0x= 97, 0x60, 0xBB, 0xDF, 0xAF, 0x69, 0x5F, 0x50}} gEfiLegacyDevOrderVariableGuid =3D {0xa56074db, 0x65fe, 0x45f7, {0x= bd, 0x21, 0x2d, 0x2b, 0xdd, 0x8e, 0x96, 0x52}} gLinuxEfiInitrdMediaGuid =3D {0x5568e427, 0x68fc, 0x4f3d, {0x= ac, 0x74, 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68}} + gQemuKernelLoaderFsMediaGuid =3D {0x1428f772, 0xb64a, 0x441e, {0x= b8, 0xc3, 0x9e, 0xbd, 0xd7, 0xf8, 0x93, 0xc7}} =20 [Protocols] gVirtioDeviceProtocolGuid =3D {0xfa920010, 0x6785, 0x4941, {0x= b6, 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a}} --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55140): https://edk2.groups.io/g/devel/message/55140 Mute This Topic: https://groups.io/mt/71669012/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55141+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55141+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134188; cv=none; d=zohomail.com; s=zohoarc; b=VW91r/WaooRkrm5R0Y8inXamoor5YHmkTO6aOCjRs5pdJPsLvICmptkRhd0iNYIH2YZw3+GHcea/3JlK8mEv+zbD6+HvTUd8B+H0KopUynzg41OrCtS1xmH0vi24vUHfvZrTfC/fBF4atoeOq+6sgGvduHpl2JLycocjroU1XZ4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134188; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=BsI9EUq33c8fOhytrGyzHvDNlCxBjPemsmXU6+l/R5o=; b=RMTmiTtjUL3K32goTEIXJDwpzuFWFH9m8b/ZT81cjlS/K+6OvBMgcGT1SSqPdku2g5wgR9PFnsExYwQUNc9SAe3B+UJiuvIWtxrZge9UzhP2CRLCNLrRrrGAAGhltsQdUlt273wttFjploSCgEeTIg124rSrP7My3LsRbOS1QQ0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55141+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134188679891.7561540144918; Sun, 1 Mar 2020 23:29:48 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id MWLzYY1788612xrBBuaT8Rm3; Sun, 01 Mar 2020 23:29:47 -0800 X-Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) by mx.groups.io with SMTP id smtpd.web12.10943.1583134186678759665 for ; Sun, 01 Mar 2020 23:29:47 -0800 X-Received: by mail-wr1-f41.google.com with SMTP id x7so11167384wrr.0 for ; Sun, 01 Mar 2020 23:29:46 -0800 (PST) X-Gm-Message-State: grRJdHXo9I6IsehMaUsE8fwcx1787277AA= X-Google-Smtp-Source: APXvYqyJdmdKObLpX+auhESIDjw98WQJz5gpOmu3mWBPOBrG3+pgLMyqzOGOyQ9GZ0Eg+wAqJon3fQ== X-Received: by 2002:adf:90cb:: with SMTP id i69mr21216595wri.205.1583134183851; Sun, 01 Mar 2020 23:29:43 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:42 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 02/13] OvmfPkg: export abstract QEMU blob filesystem in standalone driver Date: Mon, 2 Mar 2020 08:29:25 +0100 Message-Id: <20200302072936.29221-3-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134187; bh=or6AxyETJ+wbqsTxO+B7ujOWVEprppNxw6JEhgQY/4g=; h=Cc:Date:From:Reply-To:Subject:To; b=QwhEMQYQ5mgVUL5IUanBzl8UCJzUOnta+TV+nQ+9UhgiTcBkbFcyBNHfaZ95k9sG3Ba LIYdRF5f9wzi48n7tf5l0HhAfsXCxnD5cEcIsOYFQqdw3WivOtCsoDfw3I/SEcNbZ4HqF 1f6WT6q0yMKFHG20SaX3lrpxeqjE9qn5R6E= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Expose the existing implementation of an abstract filesystem exposing the blobs passed to QEMU via the command line via a standalone DXE driver. Notable difference with the original code is the switch to a new vendor GUIDed media device path, as opposed to a vendor GUID hardware device path, which is not entirely appropriate for pure software constructs. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 979 ++++++++++++= ++++++++ OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf | 48 + 2 files changed, 1027 insertions(+) diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPk= g/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c new file mode 100644 index 000000000000..efecbd817da1 --- /dev/null +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c @@ -0,0 +1,979 @@ +/** @file + DXE driver to expose the 'kernel', 'initrd' and 'cmdline' blobs + provided by QEMU as file in an abstract file system + + Copyright (C) 2014-2016, Red Hat, Inc. + Copyright (C) 2020, Arm, Limited. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// Static data that hosts the fw_cfg blobs and serves file requests. +// +typedef enum { + KernelBlobTypeKernel, + KernelBlobTypeInitrd, + KernelBlobTypeCommandLine, + KernelBlobTypeMax +} KERNEL_BLOB_TYPE; + +typedef struct { + FIRMWARE_CONFIG_ITEM CONST SizeKey; + FIRMWARE_CONFIG_ITEM CONST DataKey; + CONST CHAR16 * CONST Name; + UINT32 Size; + UINT8 *Data; +} KERNEL_BLOB; + +STATIC KERNEL_BLOB mKernelBlob[KernelBlobTypeMax] =3D { + { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, L"kernel" = }, + { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, L"initrd" = }, + { QemuFwCfgItemCommandLineSize, QemuFwCfgItemCommandLineData, L"cmdline"= } +}; + +STATIC UINT64 mTotalBlobBytes; + +// +// Device path for the handle that incorporates our "EFI stub filesystem". +// +#pragma pack (1) +typedef struct { + VENDOR_DEVICE_PATH VenMediaNode; + EFI_DEVICE_PATH_PROTOCOL EndNode; +} SINGLE_VENMEDIA_NODE_DEVPATH; +#pragma pack () + +STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mFileSystemDevicePath =3D { + { + { + MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, + { sizeof (VENDOR_DEVICE_PATH) } + }, + QEMU_KERNEL_LOADER_FS_MEDIA_GUID + }, { + END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, + { sizeof (EFI_DEVICE_PATH_PROTOCOL) } + } +}; + +// +// The "file in the EFI stub filesystem" abstraction. +// +STATIC EFI_TIME mInitTime; + +#define STUB_FILE_SIG SIGNATURE_64 ('S', 'T', 'U', 'B', 'F', 'I', 'L', 'E') + +typedef struct { + UINT64 Signature; // Carries STUB_FILE_SIG. + + KERNEL_BLOB_TYPE BlobType; // Index into mKernelBlob. KernelBlobTypeMax + // denotes the root directory of the filesy= stem. + + UINT64 Position; // Byte position for regular files; + // next directory entry to return for the r= oot + // directory. + + EFI_FILE_PROTOCOL File; // Standard protocol interface. +} STUB_FILE; + +#define STUB_FILE_FROM_FILE(FilePointer) \ + CR (FilePointer, STUB_FILE, File, STUB_FILE_SIG) + +// +// Tentative definition of the file protocol template. The initializer +// (external definition) will be provided later. +// +STATIC CONST EFI_FILE_PROTOCOL mEfiFileProtocolTemplate; + + +// +// Protocol member functions for File. +// + +/** + Opens a new file relative to the source file's location. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that= is + the file handle to the source location. This wou= ld + typically be an open handle to a directory. + + @param[out] NewHandle A pointer to the location to return the opened h= andle + for the new file. + + @param[in] FileName The Null-terminated string of the name of the fi= le to + be opened. The file name may contain the followi= ng + path modifiers: "\", ".", and "..". + + @param[in] OpenMode The mode to open the file. The only valid + combinations that the file may be opened with ar= e: + Read, Read/Write, or Create/Read/Write. + + @param[in] Attributes Only valid for EFI_FILE_MODE_CREATE, in which ca= se + these are the attribute bits for the newly creat= ed + file. + + @retval EFI_SUCCESS The file was opened. + @retval EFI_NOT_FOUND The specified file could not be found on t= he + device. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_MEDIA_CHANGED The device has a different medium in it or= the + medium is no longer supported. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_WRITE_PROTECTED An attempt was made to create a file, or o= pen a + file for write when the media is + write-protected. + @retval EFI_ACCESS_DENIED The service denied access to the file. + @retval EFI_OUT_OF_RESOURCES Not enough resources were available to ope= n the + file. + @retval EFI_VOLUME_FULL The volume is full. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileOpen ( + IN EFI_FILE_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **NewHandle, + IN CHAR16 *FileName, + IN UINT64 OpenMode, + IN UINT64 Attributes + ) +{ + CONST STUB_FILE *StubFile; + UINTN BlobType; + STUB_FILE *NewStubFile; + + // + // We're read-only. + // + switch (OpenMode) { + case EFI_FILE_MODE_READ: + break; + + case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE: + case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE: + return EFI_WRITE_PROTECTED; + + default: + return EFI_INVALID_PARAMETER; + } + + // + // Only the root directory supports opening files in it. + // + StubFile =3D STUB_FILE_FROM_FILE (This); + if (StubFile->BlobType !=3D KernelBlobTypeMax) { + return EFI_UNSUPPORTED; + } + + // + // Locate the file. + // + for (BlobType =3D 0; BlobType < KernelBlobTypeMax; ++BlobType) { + if (StrCmp (FileName, mKernelBlob[BlobType].Name) =3D=3D 0) { + break; + } + } + if (BlobType =3D=3D KernelBlobTypeMax) { + return EFI_NOT_FOUND; + } + + // + // Found it. + // + NewStubFile =3D AllocatePool (sizeof *NewStubFile); + if (NewStubFile =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + NewStubFile->Signature =3D STUB_FILE_SIG; + NewStubFile->BlobType =3D (KERNEL_BLOB_TYPE)BlobType; + NewStubFile->Position =3D 0; + CopyMem (&NewStubFile->File, &mEfiFileProtocolTemplate, + sizeof mEfiFileProtocolTemplate); + *NewHandle =3D &NewStubFile->File; + + return EFI_SUCCESS; +} + + +/** + Closes a specified file handle. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the= file + handle to close. + + @retval EFI_SUCCESS The file was closed. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileClose ( + IN EFI_FILE_PROTOCOL *This + ) +{ + FreePool (STUB_FILE_FROM_FILE (This)); + return EFI_SUCCESS; +} + + +/** + Close and delete the file handle. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the + handle to the file to delete. + + @retval EFI_SUCCESS The file was closed and deleted, and the + handle was closed. + @retval EFI_WARN_DELETE_FAILURE The handle was closed, but the file was= not + deleted. + +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileDelete ( + IN EFI_FILE_PROTOCOL *This + ) +{ + FreePool (STUB_FILE_FROM_FILE (This)); + return EFI_WARN_DELETE_FAILURE; +} + + +/** + Helper function that formats an EFI_FILE_INFO structure into the + user-allocated buffer, for any valid KERNEL_BLOB_TYPE value (including + KernelBlobTypeMax, which stands for the root directory). + + The interface follows the EFI_FILE_GET_INFO -- and for directories, the + EFI_FILE_READ -- interfaces. + + @param[in] BlobType The KERNEL_BLOB_TYPE value identifying the f= w_cfg + blob backing the STUB_FILE that information = is + being requested about. If BlobType equals + KernelBlobTypeMax, then information will be + provided about the root directory of the + filesystem. + + @param[in,out] BufferSize On input, the size of Buffer. On output, the + amount of data returned in Buffer. In both ca= ses, + the size is measured in bytes. + + @param[out] Buffer A pointer to the data buffer to return. The + buffer's type is EFI_FILE_INFO. + + @retval EFI_SUCCESS The information was returned. + @retval EFI_BUFFER_TOO_SMALL BufferSize is too small to store the + EFI_FILE_INFO structure. BufferSize has be= en + updated with the size needed to complete t= he + request. +**/ +STATIC +EFI_STATUS +ConvertKernelBlobTypeToFileInfo ( + IN KERNEL_BLOB_TYPE BlobType, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ) +{ + CONST CHAR16 *Name; + UINT64 FileSize; + UINT64 Attribute; + + UINTN NameSize; + UINTN FileInfoSize; + EFI_FILE_INFO *FileInfo; + UINTN OriginalBufferSize; + + if (BlobType =3D=3D KernelBlobTypeMax) { + // + // getting file info about the root directory + // + Name =3D L"\\"; + FileSize =3D KernelBlobTypeMax; + Attribute =3D EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY; + } else { + CONST KERNEL_BLOB *Blob; + + Blob =3D &mKernelBlob[BlobType]; + Name =3D Blob->Name; + FileSize =3D Blob->Size; + Attribute =3D EFI_FILE_READ_ONLY; + } + + NameSize =3D (StrLen(Name) + 1) * 2; + FileInfoSize =3D OFFSET_OF (EFI_FILE_INFO, FileName) + NameSize; + ASSERT (FileInfoSize >=3D sizeof *FileInfo); + + OriginalBufferSize =3D *BufferSize; + *BufferSize =3D FileInfoSize; + if (OriginalBufferSize < *BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + FileInfo =3D (EFI_FILE_INFO *)Buffer; + FileInfo->Size =3D FileInfoSize; + FileInfo->FileSize =3D FileSize; + FileInfo->PhysicalSize =3D FileSize; + FileInfo->Attribute =3D Attribute; + + CopyMem (&FileInfo->CreateTime, &mInitTime, sizeof mInitTime); + CopyMem (&FileInfo->LastAccessTime, &mInitTime, sizeof mInitTime); + CopyMem (&FileInfo->ModificationTime, &mInitTime, sizeof mInitTime); + CopyMem (FileInfo->FileName, Name, NameSize); + + return EFI_SUCCESS; +} + + +/** + Reads data from a file, or continues scanning a directory. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance t= hat + is the file handle to read data from. + + @param[in,out] BufferSize On input, the size of the Buffer. On output, = the + amount of data returned in Buffer. In both ca= ses, + the size is measured in bytes. If the read go= es + beyond the end of the file, the read length is + truncated to the end of the file. + + If This is a directory, the function reads the + directory entry at the current position and + returns the entry (as EFI_FILE_INFO) in Buffe= r. If + there are no more directory entries, the + BufferSize is set to zero on output. + + @param[out] Buffer The buffer into which the data is read. + + @retval EFI_SUCCESS Data was read. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_DEVICE_ERROR An attempt was made to read from a deleted + file. + @retval EFI_DEVICE_ERROR On entry, the current file position is bey= ond + the end of the file. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to store the + current directory entry as a EFI_FILE_INFO + structure. BufferSize has been updated wit= h the + size needed to complete the request, and t= he + directory position has not been advanced. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileRead ( + IN EFI_FILE_PROTOCOL *This, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ) +{ + STUB_FILE *StubFile; + CONST KERNEL_BLOB *Blob; + UINT64 Left; + + StubFile =3D STUB_FILE_FROM_FILE (This); + + // + // Scanning the root directory? + // + if (StubFile->BlobType =3D=3D KernelBlobTypeMax) { + EFI_STATUS Status; + + if (StubFile->Position =3D=3D KernelBlobTypeMax) { + // + // Scanning complete. + // + *BufferSize =3D 0; + return EFI_SUCCESS; + } + + Status =3D ConvertKernelBlobTypeToFileInfo ( + (KERNEL_BLOB_TYPE)StubFile->Position, + BufferSize, + Buffer); + if (EFI_ERROR (Status)) { + return Status; + } + + ++StubFile->Position; + return EFI_SUCCESS; + } + + // + // Reading a file. + // + Blob =3D &mKernelBlob[StubFile->BlobType]; + if (StubFile->Position > Blob->Size) { + return EFI_DEVICE_ERROR; + } + + Left =3D Blob->Size - StubFile->Position; + if (*BufferSize > Left) { + *BufferSize =3D (UINTN)Left; + } + if (Blob->Data !=3D NULL) { + CopyMem (Buffer, Blob->Data + StubFile->Position, *BufferSize); + } + StubFile->Position +=3D *BufferSize; + return EFI_SUCCESS; +} + + +/** + Writes data to a file. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance t= hat + is the file handle to write data to. + + @param[in,out] BufferSize On input, the size of the Buffer. On output, = the + amount of data actually written. In both case= s, + the size is measured in bytes. + + @param[in] Buffer The buffer of data to write. + + @retval EFI_SUCCESS Data was written. + @retval EFI_UNSUPPORTED Writes to open directory files are not + supported. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted = file. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_WRITE_PROTECTED The file or medium is write-protected. + @retval EFI_ACCESS_DENIED The file was opened read only. + @retval EFI_VOLUME_FULL The volume is full. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileWrite ( + IN EFI_FILE_PROTOCOL *This, + IN OUT UINTN *BufferSize, + IN VOID *Buffer + ) +{ + STUB_FILE *StubFile; + + StubFile =3D STUB_FILE_FROM_FILE (This); + return (StubFile->BlobType =3D=3D KernelBlobTypeMax) ? + EFI_UNSUPPORTED : + EFI_WRITE_PROTECTED; +} + + +/** + Returns a file's current position. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that i= s the + file handle to get the current position on. + + @param[out] Position The address to return the file's current position + value. + + @retval EFI_SUCCESS The position was returned. + @retval EFI_UNSUPPORTED The request is not valid on open directories. + @retval EFI_DEVICE_ERROR An attempt was made to get the position from a + deleted file. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileGetPosition ( + IN EFI_FILE_PROTOCOL *This, + OUT UINT64 *Position + ) +{ + STUB_FILE *StubFile; + + StubFile =3D STUB_FILE_FROM_FILE (This); + if (StubFile->BlobType =3D=3D KernelBlobTypeMax) { + return EFI_UNSUPPORTED; + } + + *Position =3D StubFile->Position; + return EFI_SUCCESS; +} + + +/** + Sets a file's current position. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is= the + file handle to set the requested position on. + + @param[in] Position The byte position from the start of the file to set= . For + regular files, MAX_UINT64 means "seek to end". For + directories, zero means "rewind directory scan". + + @retval EFI_SUCCESS The position was set. + @retval EFI_UNSUPPORTED The seek request for nonzero is not valid on o= pen + directories. + @retval EFI_DEVICE_ERROR An attempt was made to set the position of a + deleted file. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileSetPosition ( + IN EFI_FILE_PROTOCOL *This, + IN UINT64 Position + ) +{ + STUB_FILE *StubFile; + KERNEL_BLOB *Blob; + + StubFile =3D STUB_FILE_FROM_FILE (This); + + if (StubFile->BlobType =3D=3D KernelBlobTypeMax) { + if (Position =3D=3D 0) { + // + // rewinding a directory scan is allowed + // + StubFile->Position =3D 0; + return EFI_SUCCESS; + } + return EFI_UNSUPPORTED; + } + + // + // regular file seek + // + Blob =3D &mKernelBlob[StubFile->BlobType]; + if (Position =3D=3D MAX_UINT64) { + // + // seek to end + // + StubFile->Position =3D Blob->Size; + } else { + // + // absolute seek from beginning -- seeking past the end is allowed + // + StubFile->Position =3D Position; + } + return EFI_SUCCESS; +} + + +/** + Returns information about a file. + + @param[in] This A pointer to the EFI_FILE_PROTOCOL insta= nce + that is the file handle the requested + information is for. + + @param[in] InformationType The type identifier GUID for the informa= tion + being requested. The following informati= on + types are supported, storing the + corresponding structures in Buffer: + + - gEfiFileInfoGuid: EFI_FILE_INFO + + - gEfiFileSystemInfoGuid: + EFI_FILE_SYSTEM_INFO + + - gEfiFileSystemVolumeLabelInfoIdGuid: + EFI_FILE_SYSTEM_VOLUME_LABEL + + @param[in,out] BufferSize On input, the size of Buffer. On output,= the + amount of data returned in Buffer. In bo= th + cases, the size is measured in bytes. + + @param[out] Buffer A pointer to the data buffer to return. = The + buffer's type is indicated by + InformationType. + + @retval EFI_SUCCESS The information was returned. + @retval EFI_UNSUPPORTED The InformationType is not known. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to store the + information structure requested by + InformationType. BufferSize has been updat= ed + with the size needed to complete the reque= st. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileGetInfo ( + IN EFI_FILE_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN OUT UINTN *BufferSize, + OUT VOID *Buffer + ) +{ + CONST STUB_FILE *StubFile; + UINTN OriginalBufferSize; + + StubFile =3D STUB_FILE_FROM_FILE (This); + + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { + return ConvertKernelBlobTypeToFileInfo (StubFile->BlobType, BufferSize, + Buffer); + } + + OriginalBufferSize =3D *BufferSize; + + if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { + EFI_FILE_SYSTEM_INFO *FileSystemInfo; + + *BufferSize =3D sizeof *FileSystemInfo; + if (OriginalBufferSize < *BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + FileSystemInfo =3D (EFI_FILE_SYSTEM_INFO *)Buffer; + FileSystemInfo->Size =3D sizeof *FileSystemInfo; + FileSystemInfo->ReadOnly =3D TRUE; + FileSystemInfo->VolumeSize =3D mTotalBlobBytes; + FileSystemInfo->FreeSpace =3D 0; + FileSystemInfo->BlockSize =3D 1; + FileSystemInfo->VolumeLabel[0] =3D L'\0'; + + return EFI_SUCCESS; + } + + if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))= { + EFI_FILE_SYSTEM_VOLUME_LABEL *FileSystemVolumeLabel; + + *BufferSize =3D sizeof *FileSystemVolumeLabel; + if (OriginalBufferSize < *BufferSize) { + return EFI_BUFFER_TOO_SMALL; + } + + FileSystemVolumeLabel =3D (EFI_FILE_SYSTEM_VOLUME_LABEL *)Buffer; + FileSystemVolumeLabel->VolumeLabel[0] =3D L'\0'; + + return EFI_SUCCESS; + } + + return EFI_UNSUPPORTED; +} + + +/** + Sets information about a file. + + @param[in] File A pointer to the EFI_FILE_PROTOCOL instance = that + is the file handle the information is for. + + @param[in] InformationType The type identifier for the information being + set. + + @param[in] BufferSize The size, in bytes, of Buffer. + + @param[in] Buffer A pointer to the data buffer to write. The + buffer's type is indicated by InformationTyp= e. + + @retval EFI_SUCCESS The information was set. + @retval EFI_UNSUPPORTED The InformationType is not known. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_WRITE_PROTECTED InformationType is EFI_FILE_INFO_ID and the + media is read-only. + @retval EFI_WRITE_PROTECTED InformationType is + EFI_FILE_PROTOCOL_SYSTEM_INFO_ID and the m= edia + is read only. + @retval EFI_WRITE_PROTECTED InformationType is + EFI_FILE_SYSTEM_VOLUME_LABEL_ID and the me= dia + is read-only. + @retval EFI_ACCESS_DENIED An attempt is made to change the name of a= file + to a file that is already present. + @retval EFI_ACCESS_DENIED An attempt is being made to change the + EFI_FILE_DIRECTORY Attribute. + @retval EFI_ACCESS_DENIED An attempt is being made to change the siz= e of + a directory. + @retval EFI_ACCESS_DENIED InformationType is EFI_FILE_INFO_ID and the + file was opened read-only and an attempt is + being made to modify a field other than + Attribute. + @retval EFI_VOLUME_FULL The volume is full. + @retval EFI_BAD_BUFFER_SIZE BufferSize is smaller than the size of the= type + indicated by InformationType. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileSetInfo ( + IN EFI_FILE_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN UINTN BufferSize, + IN VOID *Buffer + ) +{ + return EFI_WRITE_PROTECTED; +} + + +/** + Flushes all modified data associated with a file to a device. + + @param [in] This A pointer to the EFI_FILE_PROTOCOL instance that is the + file handle to flush. + + @retval EFI_SUCCESS The data was flushed. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_WRITE_PROTECTED The file or medium is write-protected. + @retval EFI_ACCESS_DENIED The file was opened read-only. + @retval EFI_VOLUME_FULL The volume is full. +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileFlush ( + IN EFI_FILE_PROTOCOL *This + ) +{ + return EFI_WRITE_PROTECTED; +} + +// +// External definition of the file protocol template. +// +STATIC CONST EFI_FILE_PROTOCOL mEfiFileProtocolTemplate =3D { + EFI_FILE_PROTOCOL_REVISION, // revision 1 + StubFileOpen, + StubFileClose, + StubFileDelete, + StubFileRead, + StubFileWrite, + StubFileGetPosition, + StubFileSetPosition, + StubFileGetInfo, + StubFileSetInfo, + StubFileFlush, + NULL, // OpenEx, revision 2 + NULL, // ReadEx, revision 2 + NULL, // WriteEx, revision 2 + NULL // FlushEx, revision 2 +}; + + +// +// Protocol member functions for SimpleFileSystem. +// + +/** + Open the root directory on a volume. + + @param[in] This A pointer to the volume to open the root directory on. + + @param[out] Root A pointer to the location to return the opened file ha= ndle + for the root directory in. + + @retval EFI_SUCCESS The device was opened. + @retval EFI_UNSUPPORTED This volume does not support the requested= file + system type. + @retval EFI_NO_MEDIA The device has no medium. + @retval EFI_DEVICE_ERROR The device reported an error. + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. + @retval EFI_ACCESS_DENIED The service denied access to the file. + @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of + resources. + @retval EFI_MEDIA_CHANGED The device has a different medium in it or= the + medium is no longer supported. Any existing + file handles for this volume are no longer + valid. To access the files on the new medi= um, + the volume must be reopened with OpenVolum= e(). +**/ +STATIC +EFI_STATUS +EFIAPI +StubFileSystemOpenVolume ( + IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, + OUT EFI_FILE_PROTOCOL **Root + ) +{ + STUB_FILE *StubFile; + + StubFile =3D AllocatePool (sizeof *StubFile); + if (StubFile =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + StubFile->Signature =3D STUB_FILE_SIG; + StubFile->BlobType =3D KernelBlobTypeMax; + StubFile->Position =3D 0; + CopyMem (&StubFile->File, &mEfiFileProtocolTemplate, + sizeof mEfiFileProtocolTemplate); + *Root =3D &StubFile->File; + + return EFI_SUCCESS; +} + +STATIC CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL mFileSystem =3D { + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION, + StubFileSystemOpenVolume +}; + + +// +// Utility functions. +// + +/** + Populate a blob in mKernelBlob. + + param[in,out] Blob Pointer to the KERNEL_BLOB element in mKernelBlob th= at is + to be filled from fw_cfg. + + @retval EFI_SUCCESS Blob has been populated. If fw_cfg reporte= d a + size of zero for the blob, then Blob->Data= has + been left unchanged. + + @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for Blob->Data. +**/ +STATIC +EFI_STATUS +FetchBlob ( + IN OUT KERNEL_BLOB *Blob + ) +{ + UINT32 Left; + + // + // Read blob size. + // + QemuFwCfgSelectItem (Blob->SizeKey); + Blob->Size =3D QemuFwCfgRead32 (); + if (Blob->Size =3D=3D 0) { + return EFI_SUCCESS; + } + + // + // Read blob. + // + Blob->Data =3D AllocatePool (Blob->Size); + if (Blob->Data =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "%a: failed to allocate %Ld bytes for \"%s\"\n", + __FUNCTION__, (INT64)Blob->Size, Blob->Name)); + return EFI_OUT_OF_RESOURCES; + } + + DEBUG ((DEBUG_INFO, "%a: loading %Ld bytes for \"%s\"\n", __FUNCTION__, + (INT64)Blob->Size, Blob->Name)); + QemuFwCfgSelectItem (Blob->DataKey); + + Left =3D Blob->Size; + do { + UINT32 Chunk; + + Chunk =3D (Left < SIZE_1MB) ? Left : SIZE_1MB; + QemuFwCfgReadBytes (Chunk, Blob->Data + (Blob->Size - Left)); + Left -=3D Chunk; + DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\"\n", + __FUNCTION__, (INT64)Left, Blob->Name)); + } while (Left > 0); + return EFI_SUCCESS; +} + + +// +// The entry point of the feature. +// + +/** + Download the kernel, the initial ramdisk, and the kernel command line fr= om + QEMU's fw_cfg. Construct a minimal SimpleFileSystem that contains the two + image files. + + @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 +QemuKernelLoaderFsDxeEntrypoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + UINTN BlobType; + KERNEL_BLOB *CurrentBlob; + KERNEL_BLOB *KernelBlob; + EFI_STATUS Status; + EFI_HANDLE FileSystemHandle; + + if (!QemuFwCfgIsAvailable ()) { + return EFI_NOT_FOUND; + } + + Status =3D gRT->GetTime (&mInitTime, NULL /* Capabilities */); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: GetTime(): %r\n", __FUNCTION__, Status)); + return Status; + } + + // + // Fetch all blobs. + // + for (BlobType =3D 0; BlobType < KernelBlobTypeMax; ++BlobType) { + CurrentBlob =3D &mKernelBlob[BlobType]; + Status =3D FetchBlob (CurrentBlob); + if (EFI_ERROR (Status)) { + goto FreeBlobs; + } + mTotalBlobBytes +=3D CurrentBlob->Size; + } + KernelBlob =3D &mKernelBlob[KernelBlobTypeKernel]; + + if (KernelBlob->Data =3D=3D NULL) { + Status =3D EFI_NOT_FOUND; + goto FreeBlobs; + } + + // + // Create a new handle with a single VenMedia() node device path protoco= l on + // it, plus a custom SimpleFileSystem protocol on it. + // + FileSystemHandle =3D NULL; + Status =3D gBS->InstallMultipleProtocolInterfaces (&FileSystemHandle, + &gEfiDevicePathProtocolGuid, &mFileSystemDevicePat= h, + &gEfiSimpleFileSystemProtocolGuid, &mFileSystem, + NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: InstallMultipleProtocolInterfaces(): %r\n", + __FUNCTION__, Status)); + goto FreeBlobs; + } + + return EFI_SUCCESS; + +FreeBlobs: + while (BlobType > 0) { + CurrentBlob =3D &mKernelBlob[--BlobType]; + if (CurrentBlob->Data !=3D NULL) { + FreePool (CurrentBlob->Data); + CurrentBlob->Size =3D 0; + CurrentBlob->Data =3D NULL; + } + } + + return Status; +} diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf b/Ovmf= Pkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf new file mode 100644 index 000000000000..f4b50c265027 --- /dev/null +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf @@ -0,0 +1,48 @@ +## @file +# DXE driver to expose the 'kernel', 'initrd' and 'cmdline' blobs +# provided by QEMU as file in an abstract file system +# +# Copyright (C) 2014-2016, Red Hat, Inc. +# Copyright (C) 2020, Arm, Limited. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION =3D 1.27 + BASE_NAME =3D QemuKernelLoaderFsDxe + FILE_GUID =3D 806040ca-dad9-4978-a3b4-2d2ab0c8a48f + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D QemuKernelLoaderFsDxeEntrypoint + +[Sources] + QemuKernelLoaderFsDxe.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + UefiBootServicesTableLib + QemuFwCfgLib + UefiDriverEntryPoint + UefiRuntimeServicesTableLib + +[Guids] + gEfiFileInfoGuid + gEfiFileSystemInfoGuid + gEfiFileSystemVolumeLabelInfoIdGuid + gQemuKernelLoaderFsMediaGuid + +[Protocols] + gEfiDevicePathProtocolGuid ## PRODUCES + gEfiSimpleFileSystemProtocolGuid ## PRODUCES + +[Depex] + gEfiRealTimeClockArchProtocolGuid --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55141): https://edk2.groups.io/g/devel/message/55141 Mute This Topic: https://groups.io/mt/71669014/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55142+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55142+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134188; cv=none; d=zohomail.com; s=zohoarc; b=ddMxGtCENQC48Ei2IhnMtPaz+ikJDp0WYhcdcKuRXaxRtWrS8VtI0JQl0uvBVp8NLK5CFHkYD2Rel6zeAYYEauFPG/1ul9r9VMoy8KiQh2t7ySSPutDH1h6zAtQZOqTLriTimN6h7ku/mNo5mrihAHy+o+5ff8dvwlXRYi0dL9s= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134188; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=LNTRHPE7ly3Lt1rXmHt+NryrzpHrVkADJIKvtU+TEhA=; b=M9Te7xJI0ezswHRzLRR4fEV9ekFL2TpWXsFzVAzzuDZDJA7bTYezVln1piEx43/gicdtywBc4JdpxkCt8ZYqOhTl6eQ00IhqVDbB9tS3feZTyKG2pgFqAu3Oi+ivS8Le+xP6RSik61p8QmQOcOA7DFMJc8t9tZGpp2FW3DD7/NQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55142+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134188763232.57320966234988; Sun, 1 Mar 2020 23:29:48 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id fmj2YY1788612xsBpyPEPmVs; Sun, 01 Mar 2020 23:29:47 -0800 X-Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by mx.groups.io with SMTP id smtpd.web11.11031.1583134186868986570 for ; Sun, 01 Mar 2020 23:29:47 -0800 X-Received: by mail-wr1-f67.google.com with SMTP id v2so11048135wrp.12 for ; Sun, 01 Mar 2020 23:29:46 -0800 (PST) X-Gm-Message-State: 4Q8vSIyk9Z0lQnhL9O8uN3DHx1787277AA= X-Google-Smtp-Source: APXvYqz+qJ7SJNr/6UNGOvPdHODq6f/gZkL9jMlz/aCMxdy+s0P9d1ciGHKJwklt1bitMO2mMmcTuQ== X-Received: by 2002:adf:de0d:: with SMTP id b13mr20794268wrm.297.1583134184813; Sun, 01 Mar 2020 23:29:44 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:44 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 03/13] OvmfPkg: introduce QemuLoadImageLib library class Date: Mon, 2 Mar 2020 08:29:26 +0100 Message-Id: <20200302072936.29221-4-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134187; bh=9sZ4DPcxJhrMT2KBcKCdjfBjmSjsE/EY/7uvMZTJqqA=; h=Cc:Date:From:Reply-To:Subject:To; b=vGT0FwmHB9gR8AU1PZqRvCyeC+zTkWHr04V7Cm46xhGskf4wzSZ7kMyXlekij8/a7xI 9nRfiPUf4wEw4qqF5yUSAF79cgcjAkFiBUaq2PxdXlrwu/egV4VL7+PEDKJxi9CvmJZ7P 5Y2SMbx++1aM03d2LXa36V/Nkzq1I2v9TU0= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Introduce the QemuLoadImageLib library class that we will instantiate to load the kernel image passed via the QEMU command line using the standard LoadImage boot service. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- OvmfPkg/Include/Library/QemuLoadImageLib.h | 78 ++++++++++++++++++++ OvmfPkg/OvmfPkg.dec | 5 ++ 2 files changed, 83 insertions(+) diff --git a/OvmfPkg/Include/Library/QemuLoadImageLib.h b/OvmfPkg/Include/L= ibrary/QemuLoadImageLib.h new file mode 100644 index 000000000000..304853096593 --- /dev/null +++ b/OvmfPkg/Include/Library/QemuLoadImageLib.h @@ -0,0 +1,78 @@ +/** @file + Load a kernel image and command line passed to QEMU via + the command line + + Copyright (C) 2020, Arm, Limited. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef QEMU_LOAD_IMAGE_LIB_H__ +#define QEMU_LOAD_IMAGE_LIB_H__ + +#include +#include + +#include + +/** + Download the kernel, the initial ramdisk, and the kernel command line fr= om + QEMU's fw_cfg. The kernel will be instructed via its command line to load + the initrd from the same Simple FileSystem. + + @param[out] ImageHandle The image handle that was allocated for + loading the image + + @retval EFI_SUCCESS The image was loaded successfully. + @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. +**/ +EFI_STATUS +EFIAPI +QemuLoadKernelImage ( + OUT EFI_HANDLE *ImageHandle + ); + +/** + Transfer control to a kernel image loaded with QemuLoadKernelImage () + + @param[in] ImageHandle Handle of image to be started. + + @retval EFI_INVALID_PARAMETER ImageHandle is either an invalid image h= andle + or the image has already been initialize= d with + StartImage + @retval EFI_SECURITY_VIOLATION The current platform policy specifies th= at the + image should not be started. + + @return Error codes returned by the started imag= e. + On success, the function doesn't return. +**/ +EFI_STATUS +EFIAPI +QemuStartKernelImage ( + IN EFI_HANDLE ImageHandle + ); + +/** + Unloads an image loaded with QemuLoadKernelImage (). + + @param ImageHandle Handle that identifies the image to be + unloaded. + + @retval EFI_SUCCESS The image has been unloaded. + @retval EFI_UNSUPPORTED The image has been started, and does not + support unload. + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. + +**/ +EFI_STATUS +EFIAPI +QemuUnloadKernelImage ( + IN EFI_HANDLE ImageHandle + ); + +#endif diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index d88778600517..26f977bad795 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -58,6 +58,11 @@ [LibraryClasses] # QemuBootOrderLib|Include/Library/QemuBootOrderLib.h =20 + ## @libraryclass Load a kernel image and command line passed to QEMU v= ia + # the command line + # + QemuLoadImageLib|Include/Library/QemuLoadImageLib.h + ## @libraryclass Serialize (and deserialize) variables # SerializeVariablesLib|Include/Library/SerializeVariablesLib.h --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55142): https://edk2.groups.io/g/devel/message/55142 Mute This Topic: https://groups.io/mt/71669015/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55143+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55143+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134189; cv=none; d=zohomail.com; s=zohoarc; b=bh7AoDbTp7vXvZqim9/qy3gWaOBKGAct4NqhCt7XdupxhEOtiKExX2EIJPdPmUFDEzSnsBlLWvfcpUyZepC8Zos2RhI5OhYUiKJq1Wf27TLGlENjVwRQpF+TUya/w65UI29f5AefAYZLtBTELmQWakC213txdmwj4TGNbGKLnAA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134189; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=bh4WZGrOyscEgglJyO774sRCaaOlSXR1iPeGusZWg8k=; b=ibqY2i/Q5vIN5yIDe209zsckQ04r/YGGKZD6WBO5ua1LOiqK3eiFgvyhtGgjv7wUOU4bts6RqZ8ocHMF/t8arsEQTWHyrPHtyDMZheQBoBbs/bfWl/cxlOHPwMrGK/NVRkpgNFZWpHMGt2P1p8j+xqxLzp/4a+0gefJ1zncTBSE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55143+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134189777921.540942642297; Sun, 1 Mar 2020 23:29:49 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id W3VUYY1788612xmGT4StVxZZ; Sun, 01 Mar 2020 23:29:48 -0800 X-Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by mx.groups.io with SMTP id smtpd.web10.11203.1583134187837182821 for ; Sun, 01 Mar 2020 23:29:48 -0800 X-Received: by mail-wr1-f66.google.com with SMTP id v2so11048192wrp.12 for ; Sun, 01 Mar 2020 23:29:47 -0800 (PST) X-Gm-Message-State: C7eisg5vhvj6sIm9iE7ty6AGx1787277AA= X-Google-Smtp-Source: APXvYqzm9Px15ULMrQnktAk3GTJ0c8kIB3EkR6OhORp+/Tr7COjvpStqbi76anFablXWpQHUX2oP4w== X-Received: by 2002:a5d:494c:: with SMTP id r12mr19401410wrs.50.1583134185854; Sun, 01 Mar 2020 23:29:45 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:45 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 04/13] OvmfPkg: provide a generic implementation of QemuLoadImageLib Date: Mon, 2 Mar 2020 08:29:27 +0100 Message-Id: <20200302072936.29221-5-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134188; bh=xMaXg76enkYUhl+yDeh6ByDtONoFNbBDaudsG6uhvrI=; h=Cc:Date:From:Reply-To:Subject:To; b=VcLFUpJBX4fw88N/y0BPGugyclJkEPM/Dz4WK+zOXVqHxXtwGn7+nMkyuXt62U+adPq gR0p7kKwo70f4lhsDtl4pEiZklu+D8bmoSpwfAntIY+jQYeEJx3BQjT0WL3lIP0jFPYhK jIqTVRKOGCGmbgAje6MN79DnI5RQIEoPjXU= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Implement QemuLoadImageLib, and make it load the image provided by the QEMU_EFI_LOADER_FS_MEDIA_GUID/kernel device path that we implemented in a preceding patch in a separate DXE driver, using only the standard LoadImage and StartImage boot services. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel --- OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c | 253 = ++++++++++++++++++++ OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf | 39 = +++ 2 files changed, 292 insertions(+) diff --git a/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLi= b.c b/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c new file mode 100644 index 000000000000..c48c7a88dd91 --- /dev/null +++ b/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c @@ -0,0 +1,253 @@ +/** @file + Generic implementation of QemuLoadImageLib library class interface. + + Copyright (c) 2020, ARM Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma pack (1) +typedef struct { + EFI_DEVICE_PATH_PROTOCOL FilePathHeader; + CHAR16 FilePath[sizeof (L"kernel")]; +} KERNEL_FILE_DEVPATH; + +typedef struct { + VENDOR_DEVICE_PATH VenMediaNode; + KERNEL_FILE_DEVPATH FileNode; + EFI_DEVICE_PATH_PROTOCOL EndNode; +} KERNEL_VENMEDIA_FILE_DEVPATH; +#pragma pack () + +STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath =3D { + { + { + MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, + { sizeof (VENDOR_DEVICE_PATH) } + }, + QEMU_KERNEL_LOADER_FS_MEDIA_GUID + }, { + { + MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, + { sizeof (KERNEL_FILE_DEVPATH) } + }, + L"kernel", + }, { + END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, + { sizeof (EFI_DEVICE_PATH_PROTOCOL) } + } +}; + +/** + Download the kernel, the initial ramdisk, and the kernel command line fr= om + QEMU's fw_cfg. The kernel will be instructed via its command line to load + the initrd from the same Simple FileSystem. + + @param[out] ImageHandle The image handle that was allocated for + loading the image + @param[out] LoadedImage The loaded image protocol that was install= ed + on ImageHandle by the LoadImage boot servi= ce. + + @retval EFI_SUCCESS The image was loaded successfully. + @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. +**/ +EFI_STATUS +EFIAPI +QemuLoadKernelImage ( + OUT EFI_HANDLE *ImageHandle + ) +{ + EFI_STATUS Status; + EFI_HANDLE KernelImageHandle; + EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage; + UINTN CommandLineSize; + CHAR8 *CommandLine; + UINTN InitrdSize; + + // + // Load the image. This should call back into the QEMU EFI loader file s= ystem. + // + Status =3D gBS->LoadImage ( + FALSE, // BootPolicy: exact match req= uired + gImageHandle, // ParentImageHandle + (EFI_DEVICE_PATH_PROTOCOL *)&mKernelDevicePath, + NULL, // SourceBuffer + 0, // SourceSize + &KernelImageHandle + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: LoadImage(): %r\n", __FUNCTION__, Status)); + return Status; + } + + // + // Construct the kernel command line. + // + Status =3D gBS->OpenProtocol ( + KernelImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **)&KernelLoadedImage, + gImageHandle, // AgentHandle + NULL, // ControllerHandle + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + ASSERT_EFI_ERROR (Status); + + QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize); + CommandLineSize =3D (UINTN) QemuFwCfgRead64 (); + + if (CommandLineSize =3D=3D 0) { + KernelLoadedImage->LoadOptionsSize =3D 0; + } else { + CommandLine =3D AllocatePool (CommandLineSize); + ASSERT (CommandLine !=3D NULL); + + QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData); + QemuFwCfgReadBytes (CommandLineSize, CommandLine); + + // + // Verify NUL-termination of the command line. + // + if (CommandLine[CommandLineSize - 1] !=3D '\0') { + DEBUG ((DEBUG_ERROR, "%a: kernel command line is not NUL-terminated\= n", + __FUNCTION__)); + Status =3D EFI_PROTOCOL_ERROR; + goto FreeCommandLine; + } + + // + // Drop the terminating NUL, convert to UTF-16. + // + KernelLoadedImage->LoadOptionsSize =3D (CommandLineSize - 1) * 2; + } + + QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize); + InitrdSize =3D (UINTN) QemuFwCfgRead64 (); + + if (InitrdSize > 0) { + // + // Append ' initrd=3Dinitrd' in UTF-16. + // + KernelLoadedImage->LoadOptionsSize +=3D sizeof (L" initrd=3Dinitrd") -= 2; + } + + if (KernelLoadedImage->LoadOptionsSize =3D=3D 0) { + KernelLoadedImage->LoadOptions =3D NULL; + } else { + // + // NUL-terminate in UTF-16. + // + KernelLoadedImage->LoadOptionsSize +=3D 2; + + KernelLoadedImage->LoadOptions =3D AllocatePool ( + KernelLoadedImage->LoadOptionsSize); + if (KernelLoadedImage->LoadOptions =3D=3D NULL) { + KernelLoadedImage->LoadOptionsSize =3D 0; + Status =3D EFI_OUT_OF_RESOURCES; + goto FreeCommandLine; + } + + UnicodeSPrintAsciiFormat ( + KernelLoadedImage->LoadOptions, + KernelLoadedImage->LoadOptionsSize, + "%a%a", + (CommandLineSize =3D=3D 0) ? "" : CommandLine, + (InitrdSize =3D=3D 0) ? "" : " initrd=3Dinitrd" + ); + DEBUG ((DEBUG_INFO, "%a: command line: \"%s\"\n", __FUNCTION__, + (CHAR16 *)KernelLoadedImage->LoadOptions)); + } + + *ImageHandle =3D KernelImageHandle; + return EFI_SUCCESS; + +FreeCommandLine: + FreePool (CommandLine); + gBS->UnloadImage (KernelImageHandle); + + return Status; +} + +/** + Transfer control to a kernel image loaded with QemuLoadKernelImage () + + @param[in] ImageHandle Handle of image to be started. + + @retval EFI_INVALID_PARAMETER ImageHandle is either an invalid image h= andle + or the image has already been initialize= d with + StartImage + @retval EFI_SECURITY_VIOLATION The current platform policy specifies th= at the + image should not be started. + + @return Error codes returned by the started image +**/ +EFI_STATUS +EFIAPI +QemuStartKernelImage ( + IN EFI_HANDLE ImageHandle + ) +{ + return gBS->StartImage ( + ImageHandle, + NULL, // ExitDataSize + NULL // ExitData + ); +} + +/** + Unloads an image loaded with QemuLoadKernelImage (). + + @param ImageHandle Handle that identifies the image to be + unloaded. + + @retval EFI_SUCCESS The image has been unloaded. + @retval EFI_UNSUPPORTED The image has been started, and does not + support unload. + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. + +**/ +EFI_STATUS +EFIAPI +QemuUnloadKernelImage ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage; + EFI_STATUS Status; + + Status =3D gBS->OpenProtocol ( + ImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **)&KernelLoadedImage, + gImageHandle, // AgentHandle + NULL, // ControllerHandle + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return EFI_INVALID_PARAMETER; + } + + if (KernelLoadedImage->LoadOptions !=3D NULL) { + FreePool (KernelLoadedImage->LoadOptions); + KernelLoadedImage->LoadOptions =3D NULL; + } + KernelLoadedImage->LoadOptionsSize =3D 0; + + return gBS->UnloadImage (ImageHandle); +} diff --git a/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLi= b.inf b/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf new file mode 100644 index 000000000000..cbd40e6290e0 --- /dev/null +++ b/OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf @@ -0,0 +1,39 @@ +## @file +# Generic implementation of QemuLoadImageLib library class interface. +# +# Copyright (c) 2020, ARM Ltd. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 1.27 + BASE_NAME =3D GenericQemuLoadImageLib + FILE_GUID =3D 9e3e28da-c7b5-4f85-841a-84e6a9a1f1a0 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D QemuLoadImageLib|DXE_DRIVER + +[Sources] + GenericQemuLoadImageLib.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + DebugLib + MemoryAllocationLib + PrintLib + QemuFwCfgLib + ReportStatusCodeLib + UefiBootServicesTableLib + +[Protocols] + gEfiDevicePathProtocolGuid + gEfiLoadedImageProtocolGuid + +[Guids] + gQemuKernelLoaderFsMediaGuid --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55143): https://edk2.groups.io/g/devel/message/55143 Mute This Topic: https://groups.io/mt/71669017/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55144+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55144+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134190; cv=none; d=zohomail.com; s=zohoarc; b=OT0bcyzw31V/0417WqkjGci0Qqc1RRFe8kHiENcqqaRfRlpZ1ITv4fZE2CE90JIUIY8N2XoD96SZVQCfkwT0+AC3EFL4zhGY++pWjRZF37vM2Gf9Fr19O1MAAjwlGjxWBEuYZA7B8quY4+rDhoekX1lnqj7q7Q134mr7451JKJM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134190; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=njgw9M05Znj4gucm+bcCJlWJCg6Db0esebjopXqPzZs=; b=VGJIFLyhv4YCEm7R83U3mYA0vGCefYW27P1WBF6SHMb9HCu4hxT5r7EjOb4Z9aec5e/ErE8uUR7xhtHriqQTGGcWpidkez7KaIOyJT9KfjXcizSBcSBB7MXjCzzzIdvjrsn+ZK5UPhwjPy9XMXBhWNDWkrVM0C2QHU2C6JrR1/8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55144+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134190249913.321747136001; Sun, 1 Mar 2020 23:29:50 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id vy8dYY1788612xa9OvluJagU; Sun, 01 Mar 2020 23:29:49 -0800 X-Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by mx.groups.io with SMTP id smtpd.web09.11009.1583134188546041663 for ; Sun, 01 Mar 2020 23:29:48 -0800 X-Received: by mail-wr1-f67.google.com with SMTP id x7so11167470wrr.0 for ; Sun, 01 Mar 2020 23:29:48 -0800 (PST) X-Gm-Message-State: 66IZASDboaHat9mysUrOxmyCx1787277AA= X-Google-Smtp-Source: ADFU+vvJfthJUf5vsQyXB/E4eeGLyFyfnjx3GmqpUOrJ+v62TxqaatvFxSvV0iK/1I/rucdBR1cnZg== X-Received: by 2002:adf:fc07:: with SMTP id i7mr5219345wrr.158.1583134186881; Sun, 01 Mar 2020 23:29:46 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:46 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 05/13] ArmVirtPkg: incorporate the new QEMU kernel loader driver and library Date: Mon, 2 Mar 2020 08:29:28 +0100 Message-Id: <20200302072936.29221-6-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134189; bh=FzpaNKuzNHePSBbtSHD27am7NpdVn9scSEM24QwRxpU=; h=Cc:Date:From:Reply-To:Subject:To; b=iAWWvhK7Ktv9n/zS+0QBz5UQPHZ+1sfR1wO89q1wTs/9P1vqpaoO8pGk3/86BAesuHE S2poCfQpIPgScUcCOIrYozLHqof5C2hIakiJERUB9QEKwN9SAYvgyaZ25UUrNL87D/w9d QanQJLvxP/WJhtFfQViWObFotnXX1ywoIrM= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add the QEMU loader DXE driver and client library to the build for our QEMU targeted implementations in ArmVirtPkg. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- ArmVirtPkg/ArmVirtQemu.dsc | 2 ++ ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 1 + ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 ++ 3 files changed, 5 insertions(+) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index 7ae6702ac1f0..d037d68f90c7 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -56,6 +56,7 @@ [LibraryClasses.common] VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice= Lib.inf QemuFwCfgLib|ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf + QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf =20 ArmPlatformLib|ArmPlatformPkg/Library/ArmPlatformLibNull/ArmPlatformLibN= ull.inf =20 @@ -371,6 +372,7 @@ [Components.common] NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanc= eManagerUiLib.inf } + OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf =20 # # Networking stack diff --git a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc b/ArmVirtPkg/ArmVirtQemuF= vMain.fdf.inc index bfa380815f1a..9cb8621ffece 100644 --- a/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc +++ b/ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc @@ -114,6 +114,7 @@ [FV.FvMain] INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe= .inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf + INF OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf =20 # # Networking stack diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKerne= l.dsc index 3b0f04967a4b..dfd06587c735 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -56,6 +56,7 @@ [LibraryClasses.common] VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice= Lib.inf QemuFwCfgLib|ArmVirtPkg/Library/QemuFwCfgLib/QemuFwCfgLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf + QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf =20 ArmVirtMemInfoLib|ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoL= ib.inf =20 @@ -355,6 +356,7 @@ [Components.common] NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanc= eManagerUiLib.inf } + OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf =20 # # Networking stack --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55144): https://edk2.groups.io/g/devel/message/55144 Mute This Topic: https://groups.io/mt/71669018/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55145+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55145+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134192; cv=none; d=zohomail.com; s=zohoarc; b=h56bHzP0ceT0ZPvqIz2JnnnFU16otWi4zkQIWumAQs5b/CFMzDzp1yclYW31zRp4dmCd78q40wrWhLz+KydReiWtj6AIrRxd3/sfZ3heUJJNUXltVkKy0a4LBdTDWUxglxBkJPcslQ5FZSTLxnwasLwubDz0oFfA0ZRHTyw4uaM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134192; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=8JxlT1aghsdaZP0MXWdwKTO6zoHt4jkkdNzkWRRTXc8=; b=bMkciIJ0pVqPsSYZFOAbATyKXw968IRRGph+aoYgZtEATRIhfaIGysim1B2SLOVpifVl2eHEXZTWiINhyB+XlEiMqWwuCJ0yY+V6FFzIGK/zO3nqx45S9B+zTtxrUGnDag4aTuq3SUbkujAQ1bSOslF1C746sIxGjYqZIH1elUk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55145+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134192804517.2958348794419; Sun, 1 Mar 2020 23:29:52 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id wAb2YY1788612x43FPHnF2cu; Sun, 01 Mar 2020 23:29:51 -0800 X-Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by mx.groups.io with SMTP id smtpd.web09.11011.1583134190736598597 for ; Sun, 01 Mar 2020 23:29:51 -0800 X-Received: by mail-wr1-f54.google.com with SMTP id z15so11190417wrl.1 for ; Sun, 01 Mar 2020 23:29:50 -0800 (PST) X-Gm-Message-State: gHqREtbKdup2wWmsQUeevXTfx1787277AA= X-Google-Smtp-Source: APXvYqydlY4mOEq4uyuu3yP2kW2zsudErxEbqqE4Ic6VhzyVxZ8SGHGf8bX+xyWyVbjELT44JWKZUg== X-Received: by 2002:adf:e90d:: with SMTP id f13mr22141302wrm.0.1583134188091; Sun, 01 Mar 2020 23:29:48 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:47 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 06/13] ArmVirtPkg/PlatformBootManagerLib: switch to separate QEMU loader Date: Mon, 2 Mar 2020 08:29:29 +0100 Message-Id: <20200302072936.29221-7-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134191; bh=jv+C3j9YmUYa+M7P54jn+PMPmK5cDCy5BIK03xe/UFg=; h=Cc:Date:From:Reply-To:Subject:To; b=hhkalpytTQ7Tf0rvqQ67toJrGvT3BO25dwBlBtlGkRhlTm78Ydizzc4FkBYAyyJfNiz AS1UNac7mKjiHvUN5DMHrQCChA2juxfkXBLoeJ5UrU7E34S/N1NRQTI/3YT1ziAmrpX+R 7ymFc6M8hMmFsqefDOyufA1Mx92n10PdGHI= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Drop the QEMU loader file system implementation inside this library, and switch to the separate QemuLoadImageLib library and the associated driver to expose the kernel and initrd passed via the QEMU command line. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel --- ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf | = 8 +- ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c | 105= 2 +------------------- 2 files changed, 6 insertions(+), 1054 deletions(-) diff --git a/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerL= ib.inf b/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.i= nf index a9d4888d4377..e80f444aec64 100644 --- a/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/ArmVirtPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -46,7 +46,7 @@ [LibraryClasses] PlatformBmPrintScLib PrintLib QemuBootOrderLib - QemuFwCfgLib + QemuLoadImageLib ReportStatusCodeLib UefiBootManagerLib UefiBootServicesTableLib @@ -64,18 +64,12 @@ [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut =20 [Guids] - gEfiFileInfoGuid - gEfiFileSystemInfoGuid - gEfiFileSystemVolumeLabelInfoIdGuid gEfiEndOfDxeEventGroupGuid gRootBridgesConnectedEventGroupGuid gUefiShellFileGuid =20 [Protocols] - gEfiDevicePathProtocolGuid gEfiFirmwareVolume2ProtocolGuid gEfiGraphicsOutputProtocolGuid - gEfiLoadedImageProtocolGuid gEfiPciRootBridgeIoProtocolGuid - gEfiSimpleFileSystemProtocolGuid gVirtioDeviceProtocolGuid diff --git a/ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c b/ArmVi= rtPkg/Library/PlatformBootManagerLib/QemuKernel.c index d3851fd75fa5..c305927e249b 100644 --- a/ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c +++ b/ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c @@ -9,887 +9,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ =20 -#include -#include -#include -#include -#include +#include #include -#include -#include -#include =20 #include "PlatformBm.h" =20 -// -// Static data that hosts the fw_cfg blobs and serves file requests. -// -typedef enum { - KernelBlobTypeKernel, - KernelBlobTypeInitrd, - KernelBlobTypeCommandLine, - KernelBlobTypeMax -} KERNEL_BLOB_TYPE; - -typedef struct { - FIRMWARE_CONFIG_ITEM CONST SizeKey; - FIRMWARE_CONFIG_ITEM CONST DataKey; - CONST CHAR16 * CONST Name; - UINT32 Size; - UINT8 *Data; -} KERNEL_BLOB; - -STATIC KERNEL_BLOB mKernelBlob[KernelBlobTypeMax] =3D { - { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, L"kernel" = }, - { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, L"initrd" = }, - { QemuFwCfgItemCommandLineSize, QemuFwCfgItemCommandLineData, L"cmdline"= } -}; - -STATIC UINT64 mTotalBlobBytes; - -// -// Device path for the handle that incorporates our "EFI stub filesystem".= The -// GUID is arbitrary and need not be standardized or advertized. -// -#pragma pack(1) -typedef struct { - VENDOR_DEVICE_PATH VenHwNode; - EFI_DEVICE_PATH_PROTOCOL EndNode; -} SINGLE_VENHW_NODE_DEVPATH; -#pragma pack() - -STATIC CONST SINGLE_VENHW_NODE_DEVPATH mFileSystemDevicePath =3D { - { - { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { sizeof (VENDOR_DEVICE_PATH) } = }, - { - 0xb0fae7e7, 0x6b07, 0x49d0, - { 0x9e, 0x5b, 0x3b, 0xde, 0xc8, 0x3b, 0x03, 0x9d } - } - }, - - { - END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, - { sizeof (EFI_DEVICE_PATH_PROTOCOL) } - } -}; - -// -// The "file in the EFI stub filesystem" abstraction. -// -STATIC EFI_TIME mInitTime; - -#define STUB_FILE_SIG SIGNATURE_64 ('S', 'T', 'U', 'B', 'F', 'I', 'L', 'E') - -typedef struct { - UINT64 Signature; // Carries STUB_FILE_SIG. - - KERNEL_BLOB_TYPE BlobType; // Index into mKernelBlob. KernelBlobTypeMax - // denotes the root directory of the filesy= stem. - - UINT64 Position; // Byte position for regular files; - // next directory entry to return for the r= oot - // directory. - - EFI_FILE_PROTOCOL File; // Standard protocol interface. -} STUB_FILE; - -#define STUB_FILE_FROM_FILE(FilePointer) \ - CR (FilePointer, STUB_FILE, File, STUB_FILE_SIG) - -// -// Tentative definition of the file protocol template. The initializer -// (external definition) will be provided later. -// -STATIC CONST EFI_FILE_PROTOCOL mEfiFileProtocolTemplate; - - -// -// Protocol member functions for File. -// - -/** - Opens a new file relative to the source file's location. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that= is - the file handle to the source location. This wou= ld - typically be an open handle to a directory. - - @param[out] NewHandle A pointer to the location to return the opened h= andle - for the new file. - - @param[in] FileName The Null-terminated string of the name of the fi= le to - be opened. The file name may contain the followi= ng - path modifiers: "\", ".", and "..". - - @param[in] OpenMode The mode to open the file. The only valid - combinations that the file may be opened with ar= e: - Read, Read/Write, or Create/Read/Write. - - @param[in] Attributes Only valid for EFI_FILE_MODE_CREATE, in which ca= se - these are the attribute bits for the newly creat= ed - file. - - @retval EFI_SUCCESS The file was opened. - @retval EFI_NOT_FOUND The specified file could not be found on t= he - device. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_MEDIA_CHANGED The device has a different medium in it or= the - medium is no longer supported. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_WRITE_PROTECTED An attempt was made to create a file, or o= pen a - file for write when the media is - write-protected. - @retval EFI_ACCESS_DENIED The service denied access to the file. - @retval EFI_OUT_OF_RESOURCES Not enough resources were available to ope= n the - file. - @retval EFI_VOLUME_FULL The volume is full. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileOpen ( - IN EFI_FILE_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **NewHandle, - IN CHAR16 *FileName, - IN UINT64 OpenMode, - IN UINT64 Attributes - ) -{ - CONST STUB_FILE *StubFile; - UINTN BlobType; - STUB_FILE *NewStubFile; - - // - // We're read-only. - // - switch (OpenMode) { - case EFI_FILE_MODE_READ: - break; - - case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE: - case EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE: - return EFI_WRITE_PROTECTED; - - default: - return EFI_INVALID_PARAMETER; - } - - // - // Only the root directory supports opening files in it. - // - StubFile =3D STUB_FILE_FROM_FILE (This); - if (StubFile->BlobType !=3D KernelBlobTypeMax) { - return EFI_UNSUPPORTED; - } - - // - // Locate the file. - // - for (BlobType =3D 0; BlobType < KernelBlobTypeMax; ++BlobType) { - if (StrCmp (FileName, mKernelBlob[BlobType].Name) =3D=3D 0) { - break; - } - } - if (BlobType =3D=3D KernelBlobTypeMax) { - return EFI_NOT_FOUND; - } - - // - // Found it. - // - NewStubFile =3D AllocatePool (sizeof *NewStubFile); - if (NewStubFile =3D=3D NULL) { - return EFI_OUT_OF_RESOURCES; - } - - NewStubFile->Signature =3D STUB_FILE_SIG; - NewStubFile->BlobType =3D (KERNEL_BLOB_TYPE)BlobType; - NewStubFile->Position =3D 0; - CopyMem (&NewStubFile->File, &mEfiFileProtocolTemplate, - sizeof mEfiFileProtocolTemplate); - *NewHandle =3D &NewStubFile->File; - - return EFI_SUCCESS; -} - - -/** - Closes a specified file handle. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the= file - handle to close. - - @retval EFI_SUCCESS The file was closed. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileClose ( - IN EFI_FILE_PROTOCOL *This - ) -{ - FreePool (STUB_FILE_FROM_FILE (This)); - return EFI_SUCCESS; -} - - -/** - Close and delete the file handle. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the - handle to the file to delete. - - @retval EFI_SUCCESS The file was closed and deleted, and the - handle was closed. - @retval EFI_WARN_DELETE_FAILURE The handle was closed, but the file was= not - deleted. - -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileDelete ( - IN EFI_FILE_PROTOCOL *This - ) -{ - FreePool (STUB_FILE_FROM_FILE (This)); - return EFI_WARN_DELETE_FAILURE; -} - - -/** - Helper function that formats an EFI_FILE_INFO structure into the - user-allocated buffer, for any valid KERNEL_BLOB_TYPE value (including - KernelBlobTypeMax, which stands for the root directory). - - The interface follows the EFI_FILE_GET_INFO -- and for directories, the - EFI_FILE_READ -- interfaces. - - @param[in] BlobType The KERNEL_BLOB_TYPE value identifying the f= w_cfg - blob backing the STUB_FILE that information = is - being requested about. If BlobType equals - KernelBlobTypeMax, then information will be - provided about the root directory of the - filesystem. - - @param[in,out] BufferSize On input, the size of Buffer. On output, the - amount of data returned in Buffer. In both ca= ses, - the size is measured in bytes. - - @param[out] Buffer A pointer to the data buffer to return. The - buffer's type is EFI_FILE_INFO. - - @retval EFI_SUCCESS The information was returned. - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small to store the - EFI_FILE_INFO structure. BufferSize has be= en - updated with the size needed to complete t= he - request. -**/ -STATIC -EFI_STATUS -ConvertKernelBlobTypeToFileInfo ( - IN KERNEL_BLOB_TYPE BlobType, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - CONST CHAR16 *Name; - UINT64 FileSize; - UINT64 Attribute; - - UINTN NameSize; - UINTN FileInfoSize; - EFI_FILE_INFO *FileInfo; - UINTN OriginalBufferSize; - - if (BlobType =3D=3D KernelBlobTypeMax) { - // - // getting file info about the root directory - // - Name =3D L"\\"; - FileSize =3D KernelBlobTypeMax; - Attribute =3D EFI_FILE_READ_ONLY | EFI_FILE_DIRECTORY; - } else { - CONST KERNEL_BLOB *Blob; - - Blob =3D &mKernelBlob[BlobType]; - Name =3D Blob->Name; - FileSize =3D Blob->Size; - Attribute =3D EFI_FILE_READ_ONLY; - } - - NameSize =3D (StrLen(Name) + 1) * 2; - FileInfoSize =3D OFFSET_OF (EFI_FILE_INFO, FileName) + NameSize; - ASSERT (FileInfoSize >=3D sizeof *FileInfo); - - OriginalBufferSize =3D *BufferSize; - *BufferSize =3D FileInfoSize; - if (OriginalBufferSize < *BufferSize) { - return EFI_BUFFER_TOO_SMALL; - } - - FileInfo =3D (EFI_FILE_INFO *)Buffer; - FileInfo->Size =3D FileInfoSize; - FileInfo->FileSize =3D FileSize; - FileInfo->PhysicalSize =3D FileSize; - FileInfo->Attribute =3D Attribute; - - CopyMem (&FileInfo->CreateTime, &mInitTime, sizeof mInitTime); - CopyMem (&FileInfo->LastAccessTime, &mInitTime, sizeof mInitTime); - CopyMem (&FileInfo->ModificationTime, &mInitTime, sizeof mInitTime); - CopyMem (FileInfo->FileName, Name, NameSize); - - return EFI_SUCCESS; -} - - -/** - Reads data from a file, or continues scanning a directory. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance t= hat - is the file handle to read data from. - - @param[in,out] BufferSize On input, the size of the Buffer. On output, = the - amount of data returned in Buffer. In both ca= ses, - the size is measured in bytes. If the read go= es - beyond the end of the file, the read length is - truncated to the end of the file. - - If This is a directory, the function reads the - directory entry at the current position and - returns the entry (as EFI_FILE_INFO) in Buffe= r. If - there are no more directory entries, the - BufferSize is set to zero on output. - - @param[out] Buffer The buffer into which the data is read. - - @retval EFI_SUCCESS Data was read. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_DEVICE_ERROR An attempt was made to read from a deleted - file. - @retval EFI_DEVICE_ERROR On entry, the current file position is bey= ond - the end of the file. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to store the - current directory entry as a EFI_FILE_INFO - structure. BufferSize has been updated wit= h the - size needed to complete the request, and t= he - directory position has not been advanced. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileRead ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - STUB_FILE *StubFile; - CONST KERNEL_BLOB *Blob; - UINT64 Left; - - StubFile =3D STUB_FILE_FROM_FILE (This); - - // - // Scanning the root directory? - // - if (StubFile->BlobType =3D=3D KernelBlobTypeMax) { - EFI_STATUS Status; - - if (StubFile->Position =3D=3D KernelBlobTypeMax) { - // - // Scanning complete. - // - *BufferSize =3D 0; - return EFI_SUCCESS; - } - - Status =3D ConvertKernelBlobTypeToFileInfo ( - (KERNEL_BLOB_TYPE)StubFile->Position, - BufferSize, - Buffer); - if (EFI_ERROR (Status)) { - return Status; - } - - ++StubFile->Position; - return EFI_SUCCESS; - } - - // - // Reading a file. - // - Blob =3D &mKernelBlob[StubFile->BlobType]; - if (StubFile->Position > Blob->Size) { - return EFI_DEVICE_ERROR; - } - - Left =3D Blob->Size - StubFile->Position; - if (*BufferSize > Left) { - *BufferSize =3D (UINTN)Left; - } - if (Blob->Data !=3D NULL) { - CopyMem (Buffer, Blob->Data + StubFile->Position, *BufferSize); - } - StubFile->Position +=3D *BufferSize; - return EFI_SUCCESS; -} - - -/** - Writes data to a file. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance t= hat - is the file handle to write data to. - - @param[in,out] BufferSize On input, the size of the Buffer. On output, = the - amount of data actually written. In both case= s, - the size is measured in bytes. - - @param[in] Buffer The buffer of data to write. - - @retval EFI_SUCCESS Data was written. - @retval EFI_UNSUPPORTED Writes to open directory files are not - supported. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted = file. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_WRITE_PROTECTED The file or medium is write-protected. - @retval EFI_ACCESS_DENIED The file was opened read only. - @retval EFI_VOLUME_FULL The volume is full. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileWrite ( - IN EFI_FILE_PROTOCOL *This, - IN OUT UINTN *BufferSize, - IN VOID *Buffer - ) -{ - STUB_FILE *StubFile; - - StubFile =3D STUB_FILE_FROM_FILE (This); - return (StubFile->BlobType =3D=3D KernelBlobTypeMax) ? - EFI_UNSUPPORTED : - EFI_WRITE_PROTECTED; -} - - -/** - Returns a file's current position. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that i= s the - file handle to get the current position on. - - @param[out] Position The address to return the file's current position - value. - - @retval EFI_SUCCESS The position was returned. - @retval EFI_UNSUPPORTED The request is not valid on open directories. - @retval EFI_DEVICE_ERROR An attempt was made to get the position from a - deleted file. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileGetPosition ( - IN EFI_FILE_PROTOCOL *This, - OUT UINT64 *Position - ) -{ - STUB_FILE *StubFile; - - StubFile =3D STUB_FILE_FROM_FILE (This); - if (StubFile->BlobType =3D=3D KernelBlobTypeMax) { - return EFI_UNSUPPORTED; - } - - *Position =3D StubFile->Position; - return EFI_SUCCESS; -} - - -/** - Sets a file's current position. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is= the - file handle to set the requested position on. - - @param[in] Position The byte position from the start of the file to set= . For - regular files, MAX_UINT64 means "seek to end". For - directories, zero means "rewind directory scan". - - @retval EFI_SUCCESS The position was set. - @retval EFI_UNSUPPORTED The seek request for nonzero is not valid on o= pen - directories. - @retval EFI_DEVICE_ERROR An attempt was made to set the position of a - deleted file. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileSetPosition ( - IN EFI_FILE_PROTOCOL *This, - IN UINT64 Position - ) -{ - STUB_FILE *StubFile; - KERNEL_BLOB *Blob; - - StubFile =3D STUB_FILE_FROM_FILE (This); - - if (StubFile->BlobType =3D=3D KernelBlobTypeMax) { - if (Position =3D=3D 0) { - // - // rewinding a directory scan is allowed - // - StubFile->Position =3D 0; - return EFI_SUCCESS; - } - return EFI_UNSUPPORTED; - } - - // - // regular file seek - // - Blob =3D &mKernelBlob[StubFile->BlobType]; - if (Position =3D=3D MAX_UINT64) { - // - // seek to end - // - StubFile->Position =3D Blob->Size; - } else { - // - // absolute seek from beginning -- seeking past the end is allowed - // - StubFile->Position =3D Position; - } - return EFI_SUCCESS; -} - - -/** - Returns information about a file. - - @param[in] This A pointer to the EFI_FILE_PROTOCOL insta= nce - that is the file handle the requested - information is for. - - @param[in] InformationType The type identifier GUID for the informa= tion - being requested. The following informati= on - types are supported, storing the - corresponding structures in Buffer: - - - gEfiFileInfoGuid: EFI_FILE_INFO - - - gEfiFileSystemInfoGuid: - EFI_FILE_SYSTEM_INFO - - - gEfiFileSystemVolumeLabelInfoIdGuid: - EFI_FILE_SYSTEM_VOLUME_LABEL - - @param[in,out] BufferSize On input, the size of Buffer. On output,= the - amount of data returned in Buffer. In bo= th - cases, the size is measured in bytes. - - @param[out] Buffer A pointer to the data buffer to return. = The - buffer's type is indicated by - InformationType. - - @retval EFI_SUCCESS The information was returned. - @retval EFI_UNSUPPORTED The InformationType is not known. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to store the - information structure requested by - InformationType. BufferSize has been updat= ed - with the size needed to complete the reque= st. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileGetInfo ( - IN EFI_FILE_PROTOCOL *This, - IN EFI_GUID *InformationType, - IN OUT UINTN *BufferSize, - OUT VOID *Buffer - ) -{ - CONST STUB_FILE *StubFile; - UINTN OriginalBufferSize; - - StubFile =3D STUB_FILE_FROM_FILE (This); - - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { - return ConvertKernelBlobTypeToFileInfo (StubFile->BlobType, BufferSize, - Buffer); - } - - OriginalBufferSize =3D *BufferSize; - - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { - EFI_FILE_SYSTEM_INFO *FileSystemInfo; - - *BufferSize =3D sizeof *FileSystemInfo; - if (OriginalBufferSize < *BufferSize) { - return EFI_BUFFER_TOO_SMALL; - } - - FileSystemInfo =3D (EFI_FILE_SYSTEM_INFO *)Buffer; - FileSystemInfo->Size =3D sizeof *FileSystemInfo; - FileSystemInfo->ReadOnly =3D TRUE; - FileSystemInfo->VolumeSize =3D mTotalBlobBytes; - FileSystemInfo->FreeSpace =3D 0; - FileSystemInfo->BlockSize =3D 1; - FileSystemInfo->VolumeLabel[0] =3D L'\0'; - - return EFI_SUCCESS; - } - - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))= { - EFI_FILE_SYSTEM_VOLUME_LABEL *FileSystemVolumeLabel; - - *BufferSize =3D sizeof *FileSystemVolumeLabel; - if (OriginalBufferSize < *BufferSize) { - return EFI_BUFFER_TOO_SMALL; - } - - FileSystemVolumeLabel =3D (EFI_FILE_SYSTEM_VOLUME_LABEL *)Buffer; - FileSystemVolumeLabel->VolumeLabel[0] =3D L'\0'; - - return EFI_SUCCESS; - } - - return EFI_UNSUPPORTED; -} - - -/** - Sets information about a file. - - @param[in] File A pointer to the EFI_FILE_PROTOCOL instance = that - is the file handle the information is for. - - @param[in] InformationType The type identifier for the information being - set. - - @param[in] BufferSize The size, in bytes, of Buffer. - - @param[in] Buffer A pointer to the data buffer to write. The - buffer's type is indicated by InformationTyp= e. - - @retval EFI_SUCCESS The information was set. - @retval EFI_UNSUPPORTED The InformationType is not known. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_WRITE_PROTECTED InformationType is EFI_FILE_INFO_ID and the - media is read-only. - @retval EFI_WRITE_PROTECTED InformationType is - EFI_FILE_PROTOCOL_SYSTEM_INFO_ID and the m= edia - is read only. - @retval EFI_WRITE_PROTECTED InformationType is - EFI_FILE_SYSTEM_VOLUME_LABEL_ID and the me= dia - is read-only. - @retval EFI_ACCESS_DENIED An attempt is made to change the name of a= file - to a file that is already present. - @retval EFI_ACCESS_DENIED An attempt is being made to change the - EFI_FILE_DIRECTORY Attribute. - @retval EFI_ACCESS_DENIED An attempt is being made to change the siz= e of - a directory. - @retval EFI_ACCESS_DENIED InformationType is EFI_FILE_INFO_ID and the - file was opened read-only and an attempt is - being made to modify a field other than - Attribute. - @retval EFI_VOLUME_FULL The volume is full. - @retval EFI_BAD_BUFFER_SIZE BufferSize is smaller than the size of the= type - indicated by InformationType. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileSetInfo ( - IN EFI_FILE_PROTOCOL *This, - IN EFI_GUID *InformationType, - IN UINTN BufferSize, - IN VOID *Buffer - ) -{ - return EFI_WRITE_PROTECTED; -} - - -/** - Flushes all modified data associated with a file to a device. - - @param [in] This A pointer to the EFI_FILE_PROTOCOL instance that is the - file handle to flush. - - @retval EFI_SUCCESS The data was flushed. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_WRITE_PROTECTED The file or medium is write-protected. - @retval EFI_ACCESS_DENIED The file was opened read-only. - @retval EFI_VOLUME_FULL The volume is full. -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileFlush ( - IN EFI_FILE_PROTOCOL *This - ) -{ - return EFI_WRITE_PROTECTED; -} - -// -// External definition of the file protocol template. -// -STATIC CONST EFI_FILE_PROTOCOL mEfiFileProtocolTemplate =3D { - EFI_FILE_PROTOCOL_REVISION, // revision 1 - StubFileOpen, - StubFileClose, - StubFileDelete, - StubFileRead, - StubFileWrite, - StubFileGetPosition, - StubFileSetPosition, - StubFileGetInfo, - StubFileSetInfo, - StubFileFlush, - NULL, // OpenEx, revision 2 - NULL, // ReadEx, revision 2 - NULL, // WriteEx, revision 2 - NULL // FlushEx, revision 2 -}; - - -// -// Protocol member functions for SimpleFileSystem. -// - -/** - Open the root directory on a volume. - - @param[in] This A pointer to the volume to open the root directory on. - - @param[out] Root A pointer to the location to return the opened file ha= ndle - for the root directory in. - - @retval EFI_SUCCESS The device was opened. - @retval EFI_UNSUPPORTED This volume does not support the requested= file - system type. - @retval EFI_NO_MEDIA The device has no medium. - @retval EFI_DEVICE_ERROR The device reported an error. - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted. - @retval EFI_ACCESS_DENIED The service denied access to the file. - @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of - resources. - @retval EFI_MEDIA_CHANGED The device has a different medium in it or= the - medium is no longer supported. Any existing - file handles for this volume are no longer - valid. To access the files on the new medi= um, - the volume must be reopened with OpenVolum= e(). -**/ -STATIC -EFI_STATUS -EFIAPI -StubFileSystemOpenVolume ( - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This, - OUT EFI_FILE_PROTOCOL **Root - ) -{ - STUB_FILE *StubFile; - - StubFile =3D AllocatePool (sizeof *StubFile); - if (StubFile =3D=3D NULL) { - return EFI_OUT_OF_RESOURCES; - } - - StubFile->Signature =3D STUB_FILE_SIG; - StubFile->BlobType =3D KernelBlobTypeMax; - StubFile->Position =3D 0; - CopyMem (&StubFile->File, &mEfiFileProtocolTemplate, - sizeof mEfiFileProtocolTemplate); - *Root =3D &StubFile->File; - - return EFI_SUCCESS; -} - -STATIC CONST EFI_SIMPLE_FILE_SYSTEM_PROTOCOL mFileSystem =3D { - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION, - StubFileSystemOpenVolume -}; - - -// -// Utility functions. -// - -/** - Populate a blob in mKernelBlob. - - param[in,out] Blob Pointer to the KERNEL_BLOB element in mKernelBlob th= at is - to be filled from fw_cfg. - - @retval EFI_SUCCESS Blob has been populated. If fw_cfg reporte= d a - size of zero for the blob, then Blob->Data= has - been left unchanged. - - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for Blob->Data. -**/ -STATIC -EFI_STATUS -FetchBlob ( - IN OUT KERNEL_BLOB *Blob - ) -{ - UINT32 Left; - - // - // Read blob size. - // - QemuFwCfgSelectItem (Blob->SizeKey); - Blob->Size =3D QemuFwCfgRead32 (); - if (Blob->Size =3D=3D 0) { - return EFI_SUCCESS; - } - - // - // Read blob. - // - Blob->Data =3D AllocatePool (Blob->Size); - if (Blob->Data =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "%a: failed to allocate %Ld bytes for \"%s\"\n", - __FUNCTION__, (INT64)Blob->Size, Blob->Name)); - return EFI_OUT_OF_RESOURCES; - } - - DEBUG ((EFI_D_INFO, "%a: loading %Ld bytes for \"%s\"\n", __FUNCTION__, - (INT64)Blob->Size, Blob->Name)); - QemuFwCfgSelectItem (Blob->DataKey); - - Left =3D Blob->Size; - do { - UINT32 Chunk; - - Chunk =3D (Left < SIZE_1MB) ? Left : SIZE_1MB; - QemuFwCfgReadBytes (Chunk, Blob->Data + (Blob->Size - Left)); - Left -=3D Chunk; - DEBUG ((EFI_D_VERBOSE, "%a: %Ld bytes remaining for \"%s\"\n", - __FUNCTION__, (INT64)Left, Blob->Name)); - } while (Left > 0); - return EFI_SUCCESS; -} - - // // The entry point of the feature. // @@ -916,83 +40,13 @@ TryRunningQemuKernel ( VOID ) { - UINTN BlobType; - KERNEL_BLOB *CurrentBlob; - KERNEL_BLOB *KernelBlob, *InitrdBlob, *CommandLineBlob; EFI_STATUS Status; - EFI_HANDLE FileSystemHandle; - EFI_DEVICE_PATH_PROTOCOL *KernelDevicePath; EFI_HANDLE KernelImageHandle; - EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage; =20 - Status =3D gRT->GetTime (&mInitTime, NULL /* Capabilities */); + Status =3D QemuLoadKernelImage (&KernelImageHandle); if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: GetTime(): %r\n", __FUNCTION__, Status)); - return Status; - } - - // - // Fetch all blobs. - // - for (BlobType =3D 0; BlobType < KernelBlobTypeMax; ++BlobType) { - CurrentBlob =3D &mKernelBlob[BlobType]; - Status =3D FetchBlob (CurrentBlob); - if (EFI_ERROR (Status)) { - goto FreeBlobs; - } - mTotalBlobBytes +=3D CurrentBlob->Size; - } - KernelBlob =3D &mKernelBlob[KernelBlobTypeKernel]; - InitrdBlob =3D &mKernelBlob[KernelBlobTypeInitrd]; - CommandLineBlob =3D &mKernelBlob[KernelBlobTypeCommandLine]; - - if (KernelBlob->Data =3D=3D NULL) { - Status =3D EFI_NOT_FOUND; - goto FreeBlobs; - } - - // - // Create a new handle with a single VenHw() node device path protocol o= n it, - // plus a custom SimpleFileSystem protocol on it. - // - FileSystemHandle =3D NULL; - Status =3D gBS->InstallMultipleProtocolInterfaces (&FileSystemHandle, - &gEfiDevicePathProtocolGuid, &mFileSystemDevicePat= h, - &gEfiSimpleFileSystemProtocolGuid, &mFileSystem, - NULL); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: InstallMultipleProtocolInterfaces(): %r\n", - __FUNCTION__, Status)); - goto FreeBlobs; - } - - // - // Create a device path for the kernel image to be loaded from that will= call - // back into our file system. - // - KernelDevicePath =3D FileDevicePath (FileSystemHandle, KernelBlob->Name); - if (KernelDevicePath =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "%a: failed to allocate kernel device path\n", - __FUNCTION__)); - Status =3D EFI_OUT_OF_RESOURCES; - goto UninstallProtocols; - } - - // - // Load the image. This should call back into our file system. - // - Status =3D gBS->LoadImage ( - FALSE, // BootPolicy: exact match required - gImageHandle, // ParentImageHandle - KernelDevicePath, - NULL, // SourceBuffer - 0, // SourceSize - &KernelImageHandle - ); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "%a: LoadImage(): %r\n", __FUNCTION__, Status)); if (Status !=3D EFI_SECURITY_VIOLATION) { - goto FreeKernelDevicePath; + return Status; } // // From the resource allocation perspective, EFI_SECURITY_VIOLATION me= ans @@ -1001,74 +55,6 @@ TryRunningQemuKernel ( goto UnloadKernelImage; } =20 - // - // Construct the kernel command line. - // - Status =3D gBS->OpenProtocol ( - KernelImageHandle, - &gEfiLoadedImageProtocolGuid, - (VOID **)&KernelLoadedImage, - gImageHandle, // AgentHandle - NULL, // ControllerHandle - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - ASSERT_EFI_ERROR (Status); - - if (CommandLineBlob->Data =3D=3D NULL) { - KernelLoadedImage->LoadOptionsSize =3D 0; - } else { - // - // Verify NUL-termination of the command line. - // - if (CommandLineBlob->Data[CommandLineBlob->Size - 1] !=3D '\0') { - DEBUG ((EFI_D_ERROR, "%a: kernel command line is not NUL-terminated\= n", - __FUNCTION__)); - Status =3D EFI_PROTOCOL_ERROR; - goto UnloadKernelImage; - } - - // - // Drop the terminating NUL, convert to UTF-16. - // - KernelLoadedImage->LoadOptionsSize =3D (CommandLineBlob->Size - 1) * 2; - } - - if (InitrdBlob->Data !=3D NULL) { - // - // Append ' initrd=3D' in UTF-16. - // - KernelLoadedImage->LoadOptionsSize +=3D - (8 + StrLen(InitrdBlob->Name)) * 2; - } - - if (KernelLoadedImage->LoadOptionsSize =3D=3D 0) { - KernelLoadedImage->LoadOptions =3D NULL; - } else { - // - // NUL-terminate in UTF-16. - // - KernelLoadedImage->LoadOptionsSize +=3D 2; - - KernelLoadedImage->LoadOptions =3D AllocatePool ( - KernelLoadedImage->LoadOptionsSize); - if (KernelLoadedImage->LoadOptions =3D=3D NULL) { - KernelLoadedImage->LoadOptionsSize =3D 0; - Status =3D EFI_OUT_OF_RESOURCES; - goto UnloadKernelImage; - } - - UnicodeSPrintAsciiFormat ( - KernelLoadedImage->LoadOptions, - KernelLoadedImage->LoadOptionsSize, - "%a%a%s", - (CommandLineBlob->Data =3D=3D NULL) ? "" : (CHAR8 *)CommandLineBlob= ->Data, - (InitrdBlob->Data =3D=3D NULL) ? "" : " initrd=3D", - (InitrdBlob->Data =3D=3D NULL) ? L"" : InitrdBlob->Name - ); - DEBUG ((EFI_D_INFO, "%a: command line: \"%s\"\n", __FUNCTION__, - (CHAR16 *)KernelLoadedImage->LoadOptions)); - } - // // Signal the EFI_EVENT_GROUP_READY_TO_BOOT event. // @@ -1080,41 +66,13 @@ TryRunningQemuKernel ( // // Start the image. // - Status =3D gBS->StartImage ( - KernelImageHandle, - NULL, // ExitDataSize - NULL // ExitData - ); + Status =3D QemuStartKernelImage (KernelImageHandle); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "%a: StartImage(): %r\n", __FUNCTION__, Status)); } =20 - if (KernelLoadedImage->LoadOptions !=3D NULL) { - FreePool (KernelLoadedImage->LoadOptions); - } - KernelLoadedImage->LoadOptionsSize =3D 0; - UnloadKernelImage: - gBS->UnloadImage (KernelImageHandle); - -FreeKernelDevicePath: - FreePool (KernelDevicePath); - -UninstallProtocols: - gBS->UninstallMultipleProtocolInterfaces (FileSystemHandle, - &gEfiSimpleFileSystemProtocolGuid, &mFileSystem, - &gEfiDevicePathProtocolGuid, &mFileSystemDevicePath, - NULL); - -FreeBlobs: - while (BlobType > 0) { - CurrentBlob =3D &mKernelBlob[--BlobType]; - if (CurrentBlob->Data !=3D NULL) { - FreePool (CurrentBlob->Data); - CurrentBlob->Size =3D 0; - CurrentBlob->Data =3D NULL; - } - } + QemuUnloadKernelImage (KernelImageHandle); =20 return Status; } --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55145): https://edk2.groups.io/g/devel/message/55145 Mute This Topic: https://groups.io/mt/71669019/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55146+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55146+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134192; cv=none; d=zohomail.com; s=zohoarc; b=AgBP6qZZ36KoU3ywzoMnUNwFA8Q0HPBiBbITF3WajzpJUrzOLQqQ3pb6ZfE5uZ4GCUFxsPkDMUuDn75PU8JyOlZLka2kBviqloMpElARH4phQ73ZfNh1mtimJoOmJqO8Sb49/QHgZbFJpBWuqEtNG8zMZng7lGLf9dBjU4gIg/A= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134192; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=d5Cv0Sy7QH2+TrOvRCgooCMIXqhv+d7u1RvmxTP/ec0=; b=lR+1ISEACxzz5lddGb27PD0DkSs+5U/ckNQL53iifQ/h5QZvXP87FvKBH2ZM0NLUluKpD/cV/0QvddjAVlEr9byI57Zl1jhCsEKP98vy1y+aziulsVGJh6L7MwEDeQzoeD7ScW7T4FHxwZjvlvmT7AeqwklffFAqFuS6jgwwJzw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55146+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134192752473.7671265487086; Sun, 1 Mar 2020 23:29:52 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id V5SzYY1788612xTBBxij5WeS; Sun, 01 Mar 2020 23:29:51 -0800 X-Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by mx.groups.io with SMTP id smtpd.web10.11204.1583134190931675799 for ; Sun, 01 Mar 2020 23:29:51 -0800 X-Received: by mail-wr1-f65.google.com with SMTP id z15so11190427wrl.1 for ; Sun, 01 Mar 2020 23:29:50 -0800 (PST) X-Gm-Message-State: Junqj0jXdAVo46zJRHWSYC8Sx1787277AA= X-Google-Smtp-Source: APXvYqz9ZOedV2ZvJZllqgQQiDtvK1k2pnMcwI8vXMGtpXbVRbuOCDNdFSObllYTchFqEqWCnYuYtA== X-Received: by 2002:a05:6000:ca:: with SMTP id q10mr20382123wrx.78.1583134189100; Sun, 01 Mar 2020 23:29:49 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:48 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 07/13] OvmfPkg/QemuKernelLoaderFsDxe: don't expose kernel command line Date: Mon, 2 Mar 2020 08:29:30 +0100 Message-Id: <20200302072936.29221-8-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134191; bh=S3A8qCKuAE+SfyR88FFm6Zt946yUM2lvmyp3V4qKLE8=; h=Cc:Date:From:Reply-To:Subject:To; b=mB91NwPNubnS1aAQWEGeNKuv9hODRCBIDqDbeCihGrYACAvW7kR6+4D+3Y3IqJ5NStJ ixFZeCPkKCuAKt0pprhXHpRh2Rj3K/iBDi5VZ2RUjMtOCqc6oD5YMJf3OP9jZHY+D6gcn mQmUZXhanBv75WqRoK8P6CjqZnDkyE630pU= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We have no need for exposing the kernel command line as a file, so remove support for that. Since the remaining blobs (kernel and initrd) are typically much larger than a page, switch to the page based allocator for blobs at the same time. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPk= g/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c index efecbd817da1..b8d64e2781fc 100644 --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c @@ -30,7 +30,6 @@ typedef enum { KernelBlobTypeKernel, KernelBlobTypeInitrd, - KernelBlobTypeCommandLine, KernelBlobTypeMax } KERNEL_BLOB_TYPE; =20 @@ -45,7 +44,6 @@ typedef struct { STATIC KERNEL_BLOB mKernelBlob[KernelBlobTypeMax] =3D { { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, L"kernel" = }, { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, L"initrd" = }, - { QemuFwCfgItemCommandLineSize, QemuFwCfgItemCommandLineData, L"cmdline"= } }; =20 STATIC UINT64 mTotalBlobBytes; @@ -865,7 +863,7 @@ FetchBlob ( // // Read blob. // - Blob->Data =3D AllocatePool (Blob->Size); + Blob->Data =3D AllocatePages (EFI_SIZE_TO_PAGES (Blob->Size)); if (Blob->Data =3D=3D NULL) { DEBUG ((DEBUG_ERROR, "%a: failed to allocate %Ld bytes for \"%s\"\n", __FUNCTION__, (INT64)Blob->Size, Blob->Name)); @@ -969,7 +967,7 @@ QemuKernelLoaderFsDxeEntrypoint ( while (BlobType > 0) { CurrentBlob =3D &mKernelBlob[--BlobType]; if (CurrentBlob->Data !=3D NULL) { - FreePool (CurrentBlob->Data); + FreePages (CurrentBlob->Data, EFI_SIZE_TO_PAGES (CurrentBlob->Size)); CurrentBlob->Size =3D 0; CurrentBlob->Data =3D NULL; } --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55146): https://edk2.groups.io/g/devel/message/55146 Mute This Topic: https://groups.io/mt/71669020/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55147+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55147+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134193; cv=none; d=zohomail.com; s=zohoarc; b=mDyGLvz2gwpdmejxsxnRNgXlF5XT/yytzpZnW+V39QsQn9QypoF+ME5oJT01eVFOj6Gl4zgP2kanEbmF6KZb0hFa4TheRMqb4hzpge2XfQh63czdAcPdT4xu8+o6gSd2FX/GJCkTScWIREAsOJ3DS+Loa5eB62swoywXrPxWuMM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134193; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=x2RwwZPoO4K4sDaTFCmNXtNJPVI79ISmc2WkmtwKVmg=; b=dulR59/TjjJ2nFGCpz1Vpy6BPjmANsA2Edo4EluKVjPDnOBrNt6cx3Zg1pZIZ1Kclyk6oqX7q4psSAj/CUtCKNFniu3XHaf/etQNIlyn7eqLAQKRqzhHfOj8r0vijGgm4yhqKV5W7C69QwS9T/mwXe2UnFbjn5JMAtJbmysUzd8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55147+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134193909472.74263589425914; Sun, 1 Mar 2020 23:29:53 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 42rBYY1788612x72qqdfPWx4; Sun, 01 Mar 2020 23:29:52 -0800 X-Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by mx.groups.io with SMTP id smtpd.web11.11032.1583134192078627684 for ; Sun, 01 Mar 2020 23:29:52 -0800 X-Received: by mail-wr1-f68.google.com with SMTP id l5so11140549wrx.4 for ; Sun, 01 Mar 2020 23:29:51 -0800 (PST) X-Gm-Message-State: 8Zy3teVXcX0xKZmdK6k8FA12x1787277AA= X-Google-Smtp-Source: APXvYqwTeebCxvIQ0vGkWOovemNbaiqRmvQhQ1+vPIVJzmlwHSZQLvZUIiDlYpASeTiUX//u6xmzhQ== X-Received: by 2002:a5d:4443:: with SMTP id x3mr20091336wrr.379.1583134190364; Sun, 01 Mar 2020 23:29:50 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:49 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 08/13] OvmfPkg/QemuKernelLoaderFsDxe: add support for the kernel setup block Date: Mon, 2 Mar 2020 08:29:31 +0100 Message-Id: <20200302072936.29221-9-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134192; bh=XqOUfKz+cul+Vh0EYEHIGhSbNXOrwrp4FgekUzJEMkk=; h=Cc:Date:From:Reply-To:Subject:To; b=HSgQJrNlBg78RKBSuhqcVRUy4a1+kvJvWvB9cPzN2WYxOU6zB/Tgm/KjQH/8ZCatgcN 7GbUj9Z00ec8Aeuc5WunDiePMUmHupjozlwj4dMy647DTZyE2KvgdeXfeJ2C5ciACTbo7 v16uCV05Gzplgz0ibr8O9IkZ4j6LHSibBHo= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" On x86, the kernel image consists of a setup block and the actual kernel, and QEMU presents these as separate blobs, whereas on disk (and in terms of PE/COFF image signing), they consist of a single image. So add support to our FS loader driver to expose files via the abstract file system that consist of up to two concatenated blobs, and redefine the kernel file so it consists of the setup and kernel blobs, on every architecture (on non-x86, the setup block is simply 0 bytes and is therefore ignored implicitly) Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel --- OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 70 ++++++++++++++-= ----- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPk= g/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c index b8d64e2781fc..77d8fedb738a 100644 --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c @@ -34,16 +34,29 @@ typedef enum { } KERNEL_BLOB_TYPE; =20 typedef struct { - FIRMWARE_CONFIG_ITEM CONST SizeKey; - FIRMWARE_CONFIG_ITEM CONST DataKey; - CONST CHAR16 * CONST Name; - UINT32 Size; - UINT8 *Data; + CONST CHAR16 Name[8]; + struct { + FIRMWARE_CONFIG_ITEM CONST SizeKey; + FIRMWARE_CONFIG_ITEM CONST DataKey; + UINT32 Size; + } FwCfgItem[2]; + UINT32 Size; + UINT8 *Data; } KERNEL_BLOB; =20 STATIC KERNEL_BLOB mKernelBlob[KernelBlobTypeMax] =3D { - { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, L"kernel" = }, - { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, L"initrd" = }, + { + L"kernel", + { + { QemuFwCfgItemKernelSetupSize, QemuFwCfgItemKernelSetupData, }, + { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, }, + } + }, { + L"initrd", + { + { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, }, + } + } }; =20 STATIC UINT64 mTotalBlobBytes; @@ -850,12 +863,20 @@ FetchBlob ( ) { UINT32 Left; + UINTN Idx; + UINT8 *ChunkData; =20 // // Read blob size. // - QemuFwCfgSelectItem (Blob->SizeKey); - Blob->Size =3D QemuFwCfgRead32 (); + Blob->Size =3D 0; + for (Idx =3D 0; Idx < ARRAY_SIZE (Blob->FwCfgItem); Idx++) { + if (Blob->FwCfgItem[Idx].SizeKey =3D=3D 0) { + break; + } + QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].SizeKey); + Blob->Size +=3D Blob->FwCfgItem[Idx].Size =3D QemuFwCfgRead32 (); + } if (Blob->Size =3D=3D 0) { return EFI_SUCCESS; } @@ -872,18 +893,25 @@ FetchBlob ( =20 DEBUG ((DEBUG_INFO, "%a: loading %Ld bytes for \"%s\"\n", __FUNCTION__, (INT64)Blob->Size, Blob->Name)); - QemuFwCfgSelectItem (Blob->DataKey); - - Left =3D Blob->Size; - do { - UINT32 Chunk; - - Chunk =3D (Left < SIZE_1MB) ? Left : SIZE_1MB; - QemuFwCfgReadBytes (Chunk, Blob->Data + (Blob->Size - Left)); - Left -=3D Chunk; - DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\"\n", - __FUNCTION__, (INT64)Left, Blob->Name)); - } while (Left > 0); + + ChunkData =3D Blob->Data; + for (Idx =3D 0; Idx < ARRAY_SIZE (Blob->FwCfgItem); Idx++) { + QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].DataKey); + + Left =3D Blob->FwCfgItem[Idx].Size; + do { + UINT32 Chunk; + + Chunk =3D (Left < SIZE_1MB) ? Left : SIZE_1MB; + QemuFwCfgReadBytes (Chunk, ChunkData + Blob->FwCfgItem[Idx].Size - L= eft); + Left -=3D Chunk; + DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\" (%d)\n", + __FUNCTION__, (INT64)Left, Blob->Name, Idx)); + } while (Left > 0); + + ChunkData +=3D Blob->FwCfgItem[Idx].Size; + } + return EFI_SUCCESS; } =20 --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55147): https://edk2.groups.io/g/devel/message/55147 Mute This Topic: https://groups.io/mt/71669021/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55148+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55148+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134195; cv=none; d=zohomail.com; s=zohoarc; b=daww3xyzd4ghcT2BXPVjK8pRwRhBElTRQJ4GLEJW3R3C6ng8nre4RMLxdlmhrME1fCFFHa/0RdpdsLkDais3zzSum9tA1Ju4KCXFGUF/9OQdXGYgKi0OHokaciZKKk7hj8hqnirTOAPPckwMMUKN89TwvajzifqQmlyaUjt3IF0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134195; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=7P1gqrJdEZ0rjgbTx4JoEg5Yh4RKt6fE2e/N8VKq3Qc=; b=ipsnjq09iXFJ2s4GyER+H0KKo4bkB9WlDjHd2QPvsiWKNdNzx3yBPPVt+fn4++5Ub8oeU+qBaqvX35tvI8VIt/HCMrRYzW4FKNlhpCutGJ5BgsvmFPF1fHa5Aq7NXPNQ6y9emDilWu2DHfKgK060fltuF7rR6KFCVnRCZ/i7QC4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55148+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134195618715.6043148586789; Sun, 1 Mar 2020 23:29:55 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id baiwYY1788612xGN2Rq1vjxs; Sun, 01 Mar 2020 23:29:54 -0800 X-Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by mx.groups.io with SMTP id smtpd.web10.11205.1583134193672357580 for ; Sun, 01 Mar 2020 23:29:54 -0800 X-Received: by mail-wr1-f66.google.com with SMTP id v2so11048443wrp.12 for ; Sun, 01 Mar 2020 23:29:53 -0800 (PST) X-Gm-Message-State: JPM7Vz7x4sLIOpH4KojSNAynx1787277AA= X-Google-Smtp-Source: APXvYqz4pYYLATh4pz9pROdCw5CSrvwQpTSj8jmufcu14q1CQSuEc0iM88oMJND+uHlbooBJ0GFL+g== X-Received: by 2002:adf:e3cd:: with SMTP id k13mr21761789wrm.302.1583134191616; Sun, 01 Mar 2020 23:29:51 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:50 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 09/13] OvmfPkg: implement QEMU loader library for X86 with legacy fallback Date: Mon, 2 Mar 2020 08:29:32 +0100 Message-Id: <20200302072936.29221-10-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134194; bh=O8Mh6BD3evYoEtC61GcGsASKrPaelyDYpuBOXSoB68M=; h=Cc:Date:From:Reply-To:Subject:To; b=O7+eOip3JdsBtV3y2QActibgi7hF7o7MbfQVE+xKwCcdJMvCt9YQzBSMiLLQhMfLXR/ BGPF8MGyXqQiKZ1vEiWXD/zjj5ndP+rxijksAnzvc98lGR+7TZJP4qhMczlfnSs3dnH3/ 7fckwV0jt1/T+HzscCaaMUarK4zQFLoh60w= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Implement another version of QemuLoadImageLib that uses LoadImage and StartImage, but falls back to the legacy Linux loader code if that fails. The logic in the legacy fallback routines is identical to the current QEMU linux loader for X64 and IA32. Note the use of a LoadedImage pseudo-protocol for the legacy loaded image: this makes it possible to expose the LoadImage/StartImage abstraction for the legacy loader, using the EFI paradigm of identifying loaded image solely by a handle. The pseudo-protocol record type and the use of CR() is to get DEBUG coverage for the code that deals with these handles. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel --- OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c | 562 ++++++++= ++++++++++++ OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf | 42 ++ OvmfPkg/OvmfPkg.dec | 1 + 3 files changed, 605 insertions(+) diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c b/Ov= mfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c new file mode 100644 index 000000000000..a1ced417d1cc --- /dev/null +++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c @@ -0,0 +1,562 @@ +/** @file + X86 specific implementation of QemuLoadImageLib library class interface + with support for loading mixed mode images and non-EFI stub images + + Copyright (c) 2020, ARM Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#pragma pack (1) +typedef struct { + EFI_DEVICE_PATH_PROTOCOL FilePathHeader; + CHAR16 FilePath[sizeof (L"kernel")]; +} KERNEL_FILE_DEVPATH; + +typedef struct { + VENDOR_DEVICE_PATH VenMediaNode; + KERNEL_FILE_DEVPATH FileNode; + EFI_DEVICE_PATH_PROTOCOL EndNode; +} KERNEL_VENMEDIA_FILE_DEVPATH; +#pragma pack () + +STATIC CONST KERNEL_VENMEDIA_FILE_DEVPATH mKernelDevicePath =3D { + { + { + MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, + { sizeof (VENDOR_DEVICE_PATH) } + }, + QEMU_KERNEL_LOADER_FS_MEDIA_GUID + }, { + { + MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, + { sizeof (KERNEL_FILE_DEVPATH) } + }, + L"kernel", + }, { + END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, + { sizeof (EFI_DEVICE_PATH_PROTOCOL) } + } +}; + +typedef struct { + VOID *SetupBuf; + VOID *KernelBuf; + CHAR8 *CommandLine; + VOID *InitrdData; + UINTN SetupSize; + UINTN KernelInitialSize; + UINTN InitrdSize; + UINTN CommandLineSize; +} QEMU_LEGACY_LOADED_IMAGE; + +#define QEMU_LEGACY_LOADED_IMAGE_SIG \ + SIGNATURE_64 ('Q', 'L', 'O', 'A', 'D', 'I', 'M', 'G') + +typedef struct { + UINT64 Signature; + QEMU_LEGACY_LOADED_IMAGE LoadedImage; +} QEMU_LEGACY_LOADED_IMAGE_REC; + +#define QEMU_LEGACY_LOADED_IMAGE_REC_FROM_LOADED_IMAGE(ImagePointer) \ + CR (ImagePointer, QEMU_LEGACY_LOADED_IMAGE_REC, LoadedImage, \ + QEMU_LEGACY_LOADED_IMAGE_SIG) + +STATIC +VOID +FreeLegacyImage ( + IN QEMU_LEGACY_LOADED_IMAGE *LoadedImage + ) +{ + if (LoadedImage->SetupBuf !=3D NULL) { + FreePages (LoadedImage->SetupBuf, + EFI_SIZE_TO_PAGES (LoadedImage->SetupSize)); + } + if (LoadedImage->KernelBuf !=3D NULL) { + FreePages (LoadedImage->KernelBuf, + EFI_SIZE_TO_PAGES (LoadedImage->KernelInitialSize)); + } + if (LoadedImage->CommandLine !=3D NULL) { + FreePages (LoadedImage->CommandLine, + EFI_SIZE_TO_PAGES (LoadedImage->CommandLineSize)); + } + if (LoadedImage->InitrdData !=3D NULL) { + FreePages (LoadedImage->InitrdData, + EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize)); + } +} + +STATIC +EFI_STATUS +QemuLoadLegacyImage ( + OUT EFI_HANDLE *ImageHandle + ) +{ + EFI_STATUS Status; + UINTN KernelSize; + UINTN SetupSize; + QEMU_LEGACY_LOADED_IMAGE_REC *LoadedImageRec; + QEMU_LEGACY_LOADED_IMAGE *LoadedImage; + + QemuFwCfgSelectItem (QemuFwCfgItemKernelSize); + KernelSize =3D (UINTN)QemuFwCfgRead64 (); + + QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize); + SetupSize =3D (UINTN)QemuFwCfgRead64 (); + + if (KernelSize =3D=3D 0 || SetupSize =3D=3D 0) { + DEBUG ((DEBUG_INFO, "qemu -kernel was not used.\n")); + return EFI_NOT_FOUND; + } + + LoadedImageRec =3D AllocateZeroPool (sizeof (*LoadedImageRec)); + if (LoadedImageRec =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + LoadedImageRec->Signature =3D QEMU_LEGACY_LOADED_IMAGE_SIG; + LoadedImage =3D &LoadedImageRec->LoadedImage; + + LoadedImage->SetupSize =3D SetupSize; + LoadedImage->SetupBuf =3D LoadLinuxAllocateKernelSetupPages ( + EFI_SIZE_TO_PAGES (LoadedImage->SetupSize)); + if (LoadedImage->SetupBuf =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "Unable to allocate memory for kernel setup!\n")); + return EFI_OUT_OF_RESOURCES; + } + + DEBUG ((DEBUG_INFO, "Setup size: 0x%x\n", (UINT32)LoadedImage->SetupSize= )); + DEBUG ((DEBUG_INFO, "Reading kernel setup image ...")); + QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData); + QemuFwCfgReadBytes (LoadedImage->SetupSize, LoadedImage->SetupBuf); + DEBUG ((DEBUG_INFO, " [done]\n")); + + Status =3D LoadLinuxCheckKernelSetup (LoadedImage->SetupBuf, + LoadedImage->SetupSize); + if (EFI_ERROR (Status)) { + goto FreeAndReturn; + } + + Status =3D LoadLinuxInitializeKernelSetup (LoadedImage->SetupBuf); + if (EFI_ERROR (Status)) { + goto FreeAndReturn; + } + + LoadedImage->KernelInitialSize =3D LoadLinuxGetKernelSize ( + LoadedImage->SetupBuf, KernelSize); + if (LoadedImage->KernelInitialSize =3D=3D 0) { + Status =3D EFI_UNSUPPORTED; + goto FreeAndReturn; + } + + LoadedImage->KernelBuf =3D LoadLinuxAllocateKernelPages ( + LoadedImage->SetupBuf, + EFI_SIZE_TO_PAGES (LoadedImage->KernelInitial= Size) + ); + if (LoadedImage->KernelBuf =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "Unable to allocate memory for kernel!\n")); + Status =3D EFI_OUT_OF_RESOURCES; + goto FreeAndReturn; + } + + DEBUG ((DEBUG_INFO, "Kernel size: 0x%x\n", (UINT32)KernelSize)); + DEBUG ((DEBUG_INFO, "Reading kernel image ...")); + QemuFwCfgSelectItem (QemuFwCfgItemKernelData); + QemuFwCfgReadBytes (KernelSize, LoadedImage->KernelBuf); + DEBUG ((DEBUG_INFO, " [done]\n")); + + QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize); + LoadedImage->CommandLineSize =3D (UINTN)QemuFwCfgRead64 (); + + if (LoadedImage->CommandLineSize > 0) { + LoadedImage->CommandLine =3D LoadLinuxAllocateCommandLinePages ( + EFI_SIZE_TO_PAGES ( + LoadedImage->CommandLineSize)); + QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData); + QemuFwCfgReadBytes (LoadedImage->CommandLineSize, LoadedImage->Command= Line); + } else { + LoadedImage->CommandLine =3D NULL; + } + + Status =3D LoadLinuxSetCommandLine (LoadedImage->SetupBuf, + LoadedImage->CommandLine); + if (EFI_ERROR (Status)) { + goto FreeAndReturn; + } + + QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize); + LoadedImage->InitrdSize =3D (UINTN)QemuFwCfgRead64 (); + + if (LoadedImage->InitrdSize > 0) { + LoadedImage->InitrdData =3D LoadLinuxAllocateInitrdPages ( + LoadedImage->SetupBuf, + EFI_SIZE_TO_PAGES (LoadedImage->InitrdSize= )); + DEBUG ((DEBUG_INFO, "Initrd size: 0x%x\n", + (UINT32)LoadedImage->InitrdSize)); + DEBUG ((DEBUG_INFO, "Reading initrd image ...")); + QemuFwCfgSelectItem (QemuFwCfgItemInitrdData); + QemuFwCfgReadBytes (LoadedImage->InitrdSize, LoadedImage->InitrdData); + DEBUG ((DEBUG_INFO, " [done]\n")); + } else { + LoadedImage->InitrdData =3D NULL; + } + + Status =3D LoadLinuxSetInitrd (LoadedImage->SetupBuf, LoadedImage->Initr= dData, + LoadedImage->InitrdSize); + if (EFI_ERROR (Status)) { + goto FreeAndReturn; + } + + Status =3D gBS->InstallProtocolInterface (ImageHandle, + &gX86QemuKernelLoadedImageGuid, EFI_NATIVE_INTERFACE, + LoadedImage); + if (EFI_ERROR (Status)) { + goto FreeAndReturn; + } + return EFI_SUCCESS; + +FreeAndReturn: + FreeLegacyImage (LoadedImage); + FreePool (LoadedImageRec); + return Status; +} + +STATIC +EFI_STATUS +QemuStartLegacyImage ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + QEMU_LEGACY_LOADED_IMAGE *LoadedImage; + QEMU_LEGACY_LOADED_IMAGE_REC *LoadedImageRec; + + Status =3D gBS->OpenProtocol (ImageHandle, + &gX86QemuKernelLoadedImageGuid, + (VOID **)&LoadedImage, + gImageHandle, // AgentHandle + NULL, // ControllerHandle + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return EFI_INVALID_PARAMETER; + } + + LoadedImageRec =3D QEMU_LEGACY_LOADED_IMAGE_REC_FROM_LOADED_IMAGE (Loade= dImage); + + return LoadLinux (LoadedImageRec->LoadedImage.KernelBuf, + LoadedImageRec->LoadedImage.SetupBuf); +} + +STATIC +EFI_STATUS +QemuUnloadLegacyImage ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + QEMU_LEGACY_LOADED_IMAGE *LoadedImage; + QEMU_LEGACY_LOADED_IMAGE_REC *LoadedImageRec; + + Status =3D gBS->OpenProtocol (ImageHandle, + &gX86QemuKernelLoadedImageGuid, + (VOID **)&LoadedImage, + gImageHandle, // AgentHandle + NULL, // ControllerHandle + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return EFI_INVALID_PARAMETER; + } + + LoadedImageRec =3D QEMU_LEGACY_LOADED_IMAGE_REC_FROM_LOADED_IMAGE (Loade= dImage); + + FreeLegacyImage (&LoadedImageRec->LoadedImage); + FreePool (LoadedImageRec); + return EFI_SUCCESS; +} + +/** + Download the kernel, the initial ramdisk, and the kernel command line fr= om + QEMU's fw_cfg. The kernel will be instructed via its command line to load + the initrd from the same Simple FileSystem. + + @param[out] ImageHandle The image handle that was allocated for + loading the image + @param[out] LoadedImage The loaded image protocol that was install= ed + on ImageHandle by the LoadImage boot servi= ce. + + @retval EFI_SUCCESS The image was loaded successfully. + @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. +**/ +EFI_STATUS +EFIAPI +QemuLoadKernelImage ( + OUT EFI_HANDLE *ImageHandle + ) +{ + EFI_STATUS Status; + EFI_HANDLE KernelImageHandle; + EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage; + UINTN CommandLineSize; + CHAR8 *CommandLine; + UINTN InitrdSize; + + // + // Load the image. This should call back into the QEMU EFI loader file s= ystem. + // + Status =3D gBS->LoadImage ( + FALSE, // BootPolicy: exact match req= uired + gImageHandle, // ParentImageHandle + (EFI_DEVICE_PATH_PROTOCOL *)&mKernelDevicePath, + NULL, // SourceBuffer + 0, // SourceSize + &KernelImageHandle + ); + switch (Status) { + case EFI_SUCCESS: + break; + + case EFI_NOT_FOUND: + // + // The image does not exist - no -kernel image was supplied via the + // command line so no point in invoking the legacy fallback + // + return EFI_NOT_FOUND; + + case EFI_SECURITY_VIOLATION: + // + // We are running with UEFI secure boot enabled, and the image failed = to + // authenticate. For compatibility reasons, we fall back to the legacy + // loader in this case. Since the image has been loaded, we need to un= load + // it before proceeding + // + gBS->UnloadImage (KernelImageHandle); + // + // Fall through + // + case EFI_UNSUPPORTED: + // + // The image is not natively supported or cross-type supported. Let's = try + // loading it using the loader that parses the bzImage metadata direct= ly. + // + KernelImageHandle =3D NULL; + Status =3D QemuLoadLegacyImage (&KernelImageHandle); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: QemuLoadLegacyImage(): %r\n", __FUNCTION__, + Status)); + return Status; + } + *ImageHandle =3D KernelImageHandle; + return EFI_SUCCESS; + + default: + DEBUG ((DEBUG_ERROR, "%a: LoadImage(): %r\n", __FUNCTION__, Status)); + return Status; + } + + // + // Construct the kernel command line. + // + Status =3D gBS->OpenProtocol ( + KernelImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **)&KernelLoadedImage, + gImageHandle, // AgentHandle + NULL, // ControllerHandle + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + ASSERT_EFI_ERROR (Status); + + QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize); + CommandLineSize =3D (UINTN) QemuFwCfgRead64 (); + + if (CommandLineSize =3D=3D 0) { + KernelLoadedImage->LoadOptionsSize =3D 0; + } else { + CommandLine =3D AllocatePool (CommandLineSize); + ASSERT (CommandLine !=3D NULL); + + QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData); + QemuFwCfgReadBytes (CommandLineSize, CommandLine); + + // + // Verify NUL-termination of the command line. + // + if (CommandLine[CommandLineSize - 1] !=3D '\0') { + DEBUG ((DEBUG_ERROR, "%a: kernel command line is not NUL-terminated\= n", + __FUNCTION__)); + Status =3D EFI_PROTOCOL_ERROR; + goto FreeCommandLine; + } + + // + // Drop the terminating NUL, convert to UTF-16. + // + KernelLoadedImage->LoadOptionsSize =3D (CommandLineSize - 1) * 2; + } + + QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize); + InitrdSize =3D (UINTN) QemuFwCfgRead64 (); + + if (InitrdSize > 0) { + // + // Append ' initrd=3Dinitrd' in UTF-16. + // + KernelLoadedImage->LoadOptionsSize +=3D sizeof (L" initrd=3Dinitrd") -= 2; + } + + if (KernelLoadedImage->LoadOptionsSize =3D=3D 0) { + KernelLoadedImage->LoadOptions =3D NULL; + } else { + // + // NUL-terminate in UTF-16. + // + KernelLoadedImage->LoadOptionsSize +=3D 2; + + KernelLoadedImage->LoadOptions =3D AllocatePool ( + KernelLoadedImage->LoadOptionsSize); + if (KernelLoadedImage->LoadOptions =3D=3D NULL) { + KernelLoadedImage->LoadOptionsSize =3D 0; + Status =3D EFI_OUT_OF_RESOURCES; + goto FreeCommandLine; + } + + UnicodeSPrintAsciiFormat ( + KernelLoadedImage->LoadOptions, + KernelLoadedImage->LoadOptionsSize, + "%a%a", + (CommandLineSize =3D=3D 0) ? "" : CommandLine, + (InitrdSize =3D=3D 0) ? "" : " initrd=3Dinitrd" + ); + DEBUG ((DEBUG_INFO, "%a: command line: \"%s\"\n", __FUNCTION__, + (CHAR16 *)KernelLoadedImage->LoadOptions)); + } + + *ImageHandle =3D KernelImageHandle; + return EFI_SUCCESS; + +FreeCommandLine: + FreePool (CommandLine); + gBS->UnloadImage (KernelImageHandle); + + return Status; +} + +/** + Transfer control to a kernel image loaded with QemuLoadKernelImage () + + @param[in] ImageHandle Handle of image to be started. + + @retval EFI_INVALID_PARAMETER ImageHandle is either an invalid image h= andle + or the image has already been initialize= d with + StartImage + @retval EFI_SECURITY_VIOLATION The current platform policy specifies th= at the + image should not be started. + + @return Error codes returned by the started image +**/ +EFI_STATUS +EFIAPI +QemuStartKernelImage ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + + Status =3D gBS->StartImage ( + ImageHandle, + NULL, // ExitDataSize + NULL // ExitData + ); + + switch (Status) { +#ifdef MDE_CPU_IA32 + case EFI_UNSUPPORTED: + // + // On IA32, EFI_UNSUPPORTED means that the image's machine type is X64= while + // we are expecting a IA32 one, and the StartImage () boot service is = unable + // to handle it, either because the image does not have the special .c= ompat + // PE/COFF section that Linux specifies for mixed mode capable images,= or + // because we are running without the support code for that. So do a l= egacy + // load instead, but do it first so we can reuse the same handle. Then, + // unload the normally loaded image. + // + Status =3D QemuLoadLegacyImage (&ImageHandle); + if (EFI_ERROR (Status)) { + return Status; + } + QemuUnloadKernelImage (ImageHandle); + // + // Fall through + // +#endif + case EFI_INVALID_PARAMETER: + return QemuStartLegacyImage (ImageHandle); + default: + break; + } + return Status; +} + +/** + Unloads an image loaded with QemuLoadKernelImage (). + + @param ImageHandle Handle that identifies the image to be + unloaded. + + @retval EFI_SUCCESS The image has been unloaded. + @retval EFI_UNSUPPORTED The image has been started, and does not + support unload. + @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle. + +**/ +EFI_STATUS +EFIAPI +QemuUnloadKernelImage ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_LOADED_IMAGE_PROTOCOL *KernelLoadedImage; + EFI_STATUS Status; + + Status =3D gBS->OpenProtocol ( + ImageHandle, + &gEfiLoadedImageProtocolGuid, + (VOID **)&KernelLoadedImage, + gImageHandle, // AgentHandle + NULL, // ControllerHandle + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (Status =3D=3D EFI_UNSUPPORTED) { + return QemuUnloadLegacyImage (ImageHandle); + } else if (EFI_ERROR (Status)) { + return EFI_INVALID_PARAMETER; + } + + if (KernelLoadedImage->LoadOptions !=3D NULL) { + FreePool (KernelLoadedImage->LoadOptions); + KernelLoadedImage->LoadOptions =3D NULL; + } + KernelLoadedImage->LoadOptionsSize =3D 0; + + return gBS->UnloadImage (ImageHandle); +} diff --git a/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf b/= OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf new file mode 100644 index 000000000000..4208f5da3b31 --- /dev/null +++ b/OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf @@ -0,0 +1,42 @@ +## @file +# X86 specific implementation of QemuLoadImageLib library class interface +# with support for loading mixed mode images and non-EFI stub images +# +# Copyright (c) 2020, ARM Ltd. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 1.27 + BASE_NAME =3D X86QemuLoadImageLib + FILE_GUID =3D 2304df80-e21d-4170-9c3c-113c878f7ac0 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D QemuLoadImageLib|DXE_DRIVER + +[Sources] + X86QemuLoadImageLib.c + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + DebugLib + MemoryAllocationLib + LoadLinuxLib + PrintLib + QemuFwCfgLib + ReportStatusCodeLib + UefiBootServicesTableLib + +[Protocols] + gEfiDevicePathProtocolGuid + gEfiLoadedImageProtocolGuid + +[Guids] + gQemuKernelLoaderFsMediaGuid + gX86QemuKernelLoadedImageGuid diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec index 26f977bad795..e66af38f4290 100644 --- a/OvmfPkg/OvmfPkg.dec +++ b/OvmfPkg/OvmfPkg.dec @@ -93,6 +93,7 @@ [Guids] gEfiLegacyDevOrderVariableGuid =3D {0xa56074db, 0x65fe, 0x45f7, {0x= bd, 0x21, 0x2d, 0x2b, 0xdd, 0x8e, 0x96, 0x52}} gLinuxEfiInitrdMediaGuid =3D {0x5568e427, 0x68fc, 0x4f3d, {0x= ac, 0x74, 0xca, 0x55, 0x52, 0x31, 0xcc, 0x68}} gQemuKernelLoaderFsMediaGuid =3D {0x1428f772, 0xb64a, 0x441e, {0x= b8, 0xc3, 0x9e, 0xbd, 0xd7, 0xf8, 0x93, 0xc7}} + gX86QemuKernelLoadedImageGuid =3D {0xa3edc05d, 0xb618, 0x4ff6, {0x= 95, 0x52, 0x76, 0xd7, 0x88, 0x63, 0x43, 0xc8}} =20 [Protocols] gVirtioDeviceProtocolGuid =3D {0xfa920010, 0x6785, 0x4941, {0x= b6, 0xec, 0x49, 0x8c, 0x57, 0x9f, 0x16, 0x0a}} --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55148): https://edk2.groups.io/g/devel/message/55148 Mute This Topic: https://groups.io/mt/71669022/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55149+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55149+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134196; cv=none; d=zohomail.com; s=zohoarc; b=OfFOtXOkCBz/2PgNXU/E1Rs2q3LNMUjwAmcFDTmS1peai+claLR7WCbexjkWYKBhRxbI5ePreS2LiAg7a5cKDPQo07TiR3uCaY6ri1AfX6uQuiw+LCSrnig2EqG9CIAutoCVIHtBa2huHvpok5zgXMe4sMWhXkDoHA+6EreDg44= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134196; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=j26B4QZepj3p+/7DtHUfib4+Hfbg5kLh42I7jC7/QOg=; b=cv+HQFTKZ1T13MuDHWvjAJcgioA1wXxi1uEZxk0bGxMuwfudSGZtBmqeyQIO1UEcDd6bjViXzLvQDwoIcXwAu8ke5NVBAu6qbHGPVWFqjqYC6js3c+97wwiNLtq2b20nX7m8hOZlHHTvd04cwOWd1u14YTgxCEuSqWHdlSinuNA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55149+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134195974668.9763032797771; Sun, 1 Mar 2020 23:29:55 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id mRL1YY1788612x1AutzU0Wts; Sun, 01 Mar 2020 23:29:54 -0800 X-Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) by mx.groups.io with SMTP id smtpd.web12.10944.1583134194311703003 for ; Sun, 01 Mar 2020 23:29:54 -0800 X-Received: by mail-wr1-f53.google.com with SMTP id t11so4728570wrw.5 for ; Sun, 01 Mar 2020 23:29:54 -0800 (PST) X-Gm-Message-State: znaecWV4kjOlCx4OyIcZEKAux1787277AA= X-Google-Smtp-Source: ADFU+vtaDqgepGxdnRZCMRCOKmaoDJTT/8iQf0VyLl2UfflbV/BzXfkqG9jtLslYPlHvEqTnwaCwYg== X-Received: by 2002:adf:a419:: with SMTP id d25mr3168593wra.210.1583134192666; Sun, 01 Mar 2020 23:29:52 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:51 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 10/13] OvmfPkg: add new QEMU kernel image loader components Date: Mon, 2 Mar 2020 08:29:33 +0100 Message-Id: <20200302072936.29221-11-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134194; bh=fjs6SKEupCeyTmntbHIuXGcwz5zRoNrFX6CqDBS7gDE=; h=Cc:Date:From:Reply-To:Subject:To; b=BAbsYy1gBsZhiw8k+3n6vpSOB6DM0CY7qBLjxYdMOwRGSERk0HHRXsDRCs6u2FYtrYQ ySvkP+lwTvnelU52CceWxEWqG3WmNuoj/d2aM5nLC3YILILUFzGtkI5Tg5KK15Fds6mRA cgOOeVKi+Bn8a2f+Ezy1+qc3YDoNS90QRIA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add the components that expose the QEMU abstract loader file system so that we can switch over our PlatformBmLib over to it in a subsequent patch. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- OvmfPkg/OvmfPkgIa32.dsc | 2 ++ OvmfPkg/OvmfPkgIa32.fdf | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 2 ++ OvmfPkg/OvmfPkgIa32X64.fdf | 1 + OvmfPkg/OvmfPkgX64.dsc | 2 ++ OvmfPkg/OvmfPkgX64.fdf | 1 + 6 files changed, 9 insertions(+) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 8d91903f8b4e..2cc924a6986a 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -361,6 +361,7 @@ [LibraryClasses.common.DXE_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf + QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib= .inf !if $(TPM2_ENABLE) =3D=3D TRUE Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf !endif @@ -711,6 +712,7 @@ [Components] NULL|OvmfPkg/Csm/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf !endif } + OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf OvmfPkg/Virtio10Dxe/Virtio10.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf index f57de4a26f92..61287bd51f84 100644 --- a/OvmfPkg/OvmfPkgIa32.fdf +++ b/OvmfPkg/OvmfPkgIa32.fdf @@ -242,6 +242,7 @@ [FV.DXEFV] INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.= inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf +INF OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 842b4a028913..21d1f156973b 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -365,6 +365,7 @@ [LibraryClasses.common.DXE_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf + QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib= .inf !if $(TPM2_ENABLE) =3D=3D TRUE Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf !endif @@ -723,6 +724,7 @@ [Components.X64] NULL|OvmfPkg/Csm/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf !endif } + OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf OvmfPkg/Virtio10Dxe/Virtio10.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf index 69c133ec08d5..7b770f8fa424 100644 --- a/OvmfPkg/OvmfPkgIa32X64.fdf +++ b/OvmfPkg/OvmfPkgIa32X64.fdf @@ -243,6 +243,7 @@ [FV.DXEFV] INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.= inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf +INF OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 0b1e45d1f15a..f3d0f18db7e2 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -365,6 +365,7 @@ [LibraryClasses.common.DXE_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf + QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib= .inf !if $(TPM2_ENABLE) =3D=3D TRUE Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf !endif @@ -721,6 +722,7 @@ [Components] NULL|OvmfPkg/Csm/LegacyBootMaintUiLib/LegacyBootMaintUiLib.inf !endif } + OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf OvmfPkg/Virtio10Dxe/Virtio10.inf OvmfPkg/VirtioBlkDxe/VirtioBlk.inf diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf index 69c133ec08d5..7b770f8fa424 100644 --- a/OvmfPkg/OvmfPkgX64.fdf +++ b/OvmfPkg/OvmfPkgX64.fdf @@ -243,6 +243,7 @@ [FV.DXEFV] INF MdeModulePkg/Universal/DriverHealthManagerDxe/DriverHealthManagerDxe.= inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf +INF OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf INF MdeModulePkg/Universal/PrintDxe/PrintDxe.inf INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55149): https://edk2.groups.io/g/devel/message/55149 Mute This Topic: https://groups.io/mt/71669023/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55150+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55150+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134197; cv=none; d=zohomail.com; s=zohoarc; b=LKyqKcwzfUPD/abEuJ4FDFRVX5w89w4XAF+8AtbXSED+uRODEvx5r71mLzNk1GqwmWatYYo4ls0uEuxmrLw2dnilKRA3BNMiRgaGJvAI+2YnLrL6qttF8AUifstqb3mKurWLTTK0l+8iAEmvNnFLSSFrjMgzYUagXsnhnFi/av8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134197; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=NUBg3eGnYswxhJlUnUkzl6Yl1k4ijFiEBlJUd7RmelQ=; b=EzpyEFvQS7he/L1KaLkjeYi5n7KPkoGp1o0QrivorCqU7Y39TMcoRqt0ADoIaLRsI3BVxaWXZbgbaYYdXw+tK22kcN/wdjPQSO+yIYpza4tDqTHXTxOthqG6B7GOdIWq8CtgkKxpMwTLTksnzT01mq13PaTMqGxsS8ewC+cqCG0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55150+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134197579689.959351057814; Sun, 1 Mar 2020 23:29:57 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id plxUYY1788612xfntLTVcUXc; Sun, 01 Mar 2020 23:29:56 -0800 X-Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by mx.groups.io with SMTP id smtpd.web09.11014.1583134195900579336 for ; Sun, 01 Mar 2020 23:29:56 -0800 X-Received: by mail-wm1-f66.google.com with SMTP id 6so1382775wmi.5 for ; Sun, 01 Mar 2020 23:29:55 -0800 (PST) X-Gm-Message-State: N3bR3rGX2tRnvz0zREueDQ9Vx1787277AA= X-Google-Smtp-Source: APXvYqxeF31XiU5P2jzlyUfKfKTw5oVsiKCgsSyN+FDWSHjPEvhDezAl09w2p24EBL1z+fZdAbIbGg== X-Received: by 2002:a05:600c:34b:: with SMTP id u11mr18081136wmd.69.1583134193840; Sun, 01 Mar 2020 23:29:53 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:52 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 11/13] OvmfPkg/PlatformBootManagerLib: switch to QemuLoadImageLib Date: Mon, 2 Mar 2020 08:29:34 +0100 Message-Id: <20200302072936.29221-12-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134196; bh=03E1cMcG+7TrjUN2ZNonibyfqKEpHLsNKa7hQqDew9A=; h=Cc:Date:From:Reply-To:Subject:To; b=HsPANRwDlw6F4BgYUbfcQICVxGRQIGl6vzwgTpOLqKe/A2eRhZBsQkyNsqa/6co9SpC aIfTbCiwD8Sh8HB8kTqgojWLHqztLU57sSEzdRow5z68F7unW/4AqLO4s4Cc01KJKFQL2 0V8Dls+TPUTWl1+XNKOhcoaJAMoibbJCFTk= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Replace the open coded sequence to load Linux on x86 with a short and generic sequence invoking QemuLoadImageLib, which can be provided by a generic version that only supports the LoadImage and StartImage boot services, and one that incorporates the entire legacy loading sequence as well. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel --- OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf | 2 +- OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c | 157 ++= +----------------- 2 files changed, 24 insertions(+), 135 deletions(-) diff --git a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.= inf b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf index f89cce187942..40ac5dd7f9d5 100644 --- a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf +++ b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf @@ -48,7 +48,7 @@ [LibraryClasses] NvVarsFileLib QemuFwCfgLib QemuFwCfgS3Lib - LoadLinuxLib + QemuLoadImageLib QemuBootOrderLib ReportStatusCodeLib UefiLib diff --git a/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c b/OvmfPkg/= Library/PlatformBootManagerLib/QemuKernel.c index ddfef925edd3..a15b48d360d2 100644 --- a/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c +++ b/OvmfPkg/Library/PlatformBootManagerLib/QemuKernel.c @@ -9,11 +9,8 @@ =20 #include #include -#include -#include -#include +#include #include -#include #include =20 =20 @@ -23,146 +20,38 @@ TryRunningQemuKernel ( ) { EFI_STATUS Status; - UINTN KernelSize; - UINTN KernelInitialSize; - VOID *KernelBuf; - UINTN SetupSize; - VOID *SetupBuf; - UINTN CommandLineSize; - CHAR8 *CommandLine; - UINTN InitrdSize; - VOID* InitrdData; - - SetupBuf =3D NULL; - SetupSize =3D 0; - KernelBuf =3D NULL; - KernelInitialSize =3D 0; - CommandLine =3D NULL; - CommandLineSize =3D 0; - InitrdData =3D NULL; - InitrdSize =3D 0; - - if (!QemuFwCfgIsAvailable ()) { - return EFI_NOT_FOUND; - } - - QemuFwCfgSelectItem (QemuFwCfgItemKernelSize); - KernelSize =3D (UINTN) QemuFwCfgRead64 (); - - QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupSize); - SetupSize =3D (UINTN) QemuFwCfgRead64 (); - - if (KernelSize =3D=3D 0 || SetupSize =3D=3D 0) { - DEBUG ((EFI_D_INFO, "qemu -kernel was not used.\n")); - return EFI_NOT_FOUND; - } - - SetupBuf =3D LoadLinuxAllocateKernelSetupPages (EFI_SIZE_TO_PAGES (Setup= Size)); - if (SetupBuf =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel setup!\n")); - return EFI_OUT_OF_RESOURCES; - } - - DEBUG ((EFI_D_INFO, "Setup size: 0x%x\n", (UINT32) SetupSize)); - DEBUG ((EFI_D_INFO, "Reading kernel setup image ...")); - QemuFwCfgSelectItem (QemuFwCfgItemKernelSetupData); - QemuFwCfgReadBytes (SetupSize, SetupBuf); - DEBUG ((EFI_D_INFO, " [done]\n")); - - Status =3D LoadLinuxCheckKernelSetup (SetupBuf, SetupSize); - if (EFI_ERROR (Status)) { - goto FreeAndReturn; - } - - Status =3D LoadLinuxInitializeKernelSetup (SetupBuf); - if (EFI_ERROR (Status)) { - goto FreeAndReturn; - } - - KernelInitialSize =3D LoadLinuxGetKernelSize (SetupBuf, KernelSize); - if (KernelInitialSize =3D=3D 0) { - Status =3D EFI_UNSUPPORTED; - goto FreeAndReturn; - } - - KernelBuf =3D LoadLinuxAllocateKernelPages ( - SetupBuf, - EFI_SIZE_TO_PAGES (KernelInitialSize)); - if (KernelBuf =3D=3D NULL) { - DEBUG ((EFI_D_ERROR, "Unable to allocate memory for kernel!\n")); - Status =3D EFI_OUT_OF_RESOURCES; - goto FreeAndReturn; - } - - DEBUG ((EFI_D_INFO, "Kernel size: 0x%x\n", (UINT32) KernelSize)); - DEBUG ((EFI_D_INFO, "Reading kernel image ...")); - QemuFwCfgSelectItem (QemuFwCfgItemKernelData); - QemuFwCfgReadBytes (KernelSize, KernelBuf); - DEBUG ((EFI_D_INFO, " [done]\n")); - - QemuFwCfgSelectItem (QemuFwCfgItemCommandLineSize); - CommandLineSize =3D (UINTN) QemuFwCfgRead64 (); - - if (CommandLineSize > 0) { - CommandLine =3D LoadLinuxAllocateCommandLinePages ( - EFI_SIZE_TO_PAGES (CommandLineSize)); - QemuFwCfgSelectItem (QemuFwCfgItemCommandLineData); - QemuFwCfgReadBytes (CommandLineSize, CommandLine); - } else { - CommandLine =3D NULL; - } - - Status =3D LoadLinuxSetCommandLine (SetupBuf, CommandLine); - if (EFI_ERROR (Status)) { - goto FreeAndReturn; - } - - QemuFwCfgSelectItem (QemuFwCfgItemInitrdSize); - InitrdSize =3D (UINTN) QemuFwCfgRead64 (); - - if (InitrdSize > 0) { - InitrdData =3D LoadLinuxAllocateInitrdPages ( - SetupBuf, - EFI_SIZE_TO_PAGES (InitrdSize) - ); - DEBUG ((EFI_D_INFO, "Initrd size: 0x%x\n", (UINT32) InitrdSize)); - DEBUG ((EFI_D_INFO, "Reading initrd image ...")); - QemuFwCfgSelectItem (QemuFwCfgItemInitrdData); - QemuFwCfgReadBytes (InitrdSize, InitrdData); - DEBUG ((EFI_D_INFO, " [done]\n")); - } else { - InitrdData =3D NULL; - } - - Status =3D LoadLinuxSetInitrd (SetupBuf, InitrdData, InitrdSize); - if (EFI_ERROR (Status)) { - goto FreeAndReturn; + EFI_HANDLE KernelImageHandle; + + Status =3D QemuLoadKernelImage (&KernelImageHandle); + if (EFI_ERROR (Status)) { + if (Status !=3D EFI_SECURITY_VIOLATION) { + return Status; + } + // + // From the resource allocation perspective, EFI_SECURITY_VIOLATION me= ans + // "success", so we must roll back the image loading. + // + goto UnloadKernelImage; } =20 // - // Signal the EVT_SIGNAL_READY_TO_BOOT event + // Signal the EFI_EVENT_GROUP_READY_TO_BOOT event. // EfiSignalEventReadyToBoot(); =20 REPORT_STATUS_CODE (EFI_PROGRESS_CODE, (EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_DXE_BS_PC_READY_TO_BOOT_EVENT)); =20 - Status =3D LoadLinux (KernelBuf, SetupBuf); + // + // Start the image. + // + Status =3D QemuStartKernelImage (KernelImageHandle); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "%a: StartImage(): %r\n", __FUNCTION__, Status)); + } =20 -FreeAndReturn: - if (SetupBuf !=3D NULL) { - FreePages (SetupBuf, EFI_SIZE_TO_PAGES (SetupSize)); - } - if (KernelBuf !=3D NULL) { - FreePages (KernelBuf, EFI_SIZE_TO_PAGES (KernelInitialSize)); - } - if (CommandLine !=3D NULL) { - FreePages (CommandLine, EFI_SIZE_TO_PAGES (CommandLineSize)); - } - if (InitrdData !=3D NULL) { - FreePages (InitrdData, EFI_SIZE_TO_PAGES (InitrdSize)); - } +UnloadKernelImage: + QemuUnloadKernelImage (KernelImageHandle); =20 return Status; } - --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55150): https://edk2.groups.io/g/devel/message/55150 Mute This Topic: https://groups.io/mt/71669024/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55151+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55151+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134198; cv=none; d=zohomail.com; s=zohoarc; b=TlouEwRbXn5TIIvLds3VhgtnAORzY2eHuHFS61UXkol3IdKhQ8yKFOLV942e3f96Y2zdLbUqCZQMGE4S1mZC1yw3tiEAE5zl9K0umnBj3qIa8H2IZyblSoM7X4bPV4G6PtiegImAULLiocjcKLuMArbAEq4DRhtRmU2bMkGSmRE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134198; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=wh4VSh0dfDmiRIevoWMSZnFoeiug0ZdFVsos8qiWlcE=; b=XNX5IocVv8NXrGq7ycKjzmzf6gYL9h7IcbceWmVaceP4bFYvioph8TeUXLVLRmhkcYqZgu+FLhwXQqGbKLVMptgsWVR8+GgMObGfIWT5SmsrwPBXhJFs+zZlXu3/rsSTsWI4p58juwIeKeTb4PcL/jHEF8Dv3vOdKHCeoXcbKtg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55151+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 158313419836393.59021599118012; Sun, 1 Mar 2020 23:29:58 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id nySBYY1788612xIdJI8buD7L; Sun, 01 Mar 2020 23:29:57 -0800 X-Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by mx.groups.io with SMTP id smtpd.web12.10945.1583134196557642091 for ; Sun, 01 Mar 2020 23:29:56 -0800 X-Received: by mail-wm1-f65.google.com with SMTP id z12so9834645wmi.4 for ; Sun, 01 Mar 2020 23:29:56 -0800 (PST) X-Gm-Message-State: 62FdMQPj2vdN8bocnQZCnC2Gx1787277AA= X-Google-Smtp-Source: ADFU+vulRVLrN3kpcaDPEu0pA/o449gsPlP7N4X9BLsBYzbR0KAzL2a+/S5qsqx3FlTosxhghI5tBg== X-Received: by 2002:a1c:4681:: with SMTP id t123mr9425671wma.86.1583134194867; Sun, 01 Mar 2020 23:29:54 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:54 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 12/13] OvmfPkg/QemuKernelLoaderFsDxe: add support for new Linux initrd device path Date: Mon, 2 Mar 2020 08:29:35 +0100 Message-Id: <20200302072936.29221-13-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134197; bh=c1Cz9+kzDvIvEMekjWWir8l4HkVacQB8qxNaAvGYyKY=; h=Cc:Date:From:Reply-To:Subject:To; b=EG6k/eKoUd/9Q58n3q6WNhynAw3ktj7nRaqx7UFvTR+pi+rgEJmDyHaWobjMqgw5fpG s4ws3oj9dZT5K6S+Vf88uIlm7rhrZjkgfMxtu14zpnqFnZkHZuZW9+XfYGo1LWCASzIkh QmPfpu6oLZvWjKssxrA5zpkCasfhy+fro4Q= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=3D2566 Signed-off-by: Ard Biesheuvel --- OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 79 +++++++++++++= +++++++ OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf | 2 + 2 files changed, 81 insertions(+) diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPk= g/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c index 77d8fedb738a..415946edf22a 100644 --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c @@ -13,15 +13,18 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include #include #include +#include #include =20 // @@ -84,6 +87,19 @@ STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mFileSystemDev= icePath =3D { } }; =20 +STATIC CONST SINGLE_VENMEDIA_NODE_DEVPATH mInitrdDevicePath =3D { + { + { + 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 mFileSyst= em =3D { StubFileSystemOpenVolume }; =20 +STATIC +EFI_STATUS +EFIAPI +InitrdLoadFile2 ( + IN EFI_LOAD_FILE2_PROTOCOL *This, + IN EFI_DEVICE_PATH_PROTOCOL *FilePath, + IN BOOLEAN BootPolicy, + IN OUT UINTN *BufferSize, + IN VOID *Buffer OPTIONAL + ) +{ + CONST KERNEL_BLOB *InitrdBlob =3D &mKernelBlob[KernelBlobTypeInitrd]; + + ASSERT (InitrdBlob->Size > 0); + + if (BootPolicy) { + return EFI_UNSUPPORTED; + } + + if (BufferSize =3D=3D NULL || !IsDevicePathValid (FilePath, 0)) { + return EFI_INVALID_PARAMETER; + } + + if (FilePath->Type !=3D END_DEVICE_PATH_TYPE || + FilePath->SubType !=3D END_ENTIRE_DEVICE_PATH_SUBTYPE) { + return EFI_NOT_FOUND; + } + + if (Buffer =3D=3D NULL || *BufferSize < InitrdBlob->Size) { + *BufferSize =3D InitrdBlob->Size; + return EFI_BUFFER_TOO_SMALL; + } + + CopyMem (Buffer, InitrdBlob->Data, InitrdBlob->Size); + + *BufferSize =3D InitrdBlob->Size; + return EFI_SUCCESS; +} + +STATIC CONST EFI_LOAD_FILE2_PROTOCOL mInitrdLoadFile2 =3D { + InitrdLoadFile2, +}; =20 // // Utility functions. @@ -945,6 +1003,7 @@ QemuKernelLoaderFsDxeEntrypoint ( KERNEL_BLOB *KernelBlob; EFI_STATUS Status; EFI_HANDLE FileSystemHandle; + EFI_HANDLE InitrdLoadFile2Handle; =20 if (!QemuFwCfgIsAvailable ()) { return EFI_NOT_FOUND; @@ -989,8 +1048,28 @@ QemuKernelLoaderFsDxeEntrypoint ( goto FreeBlobs; } =20 + if (KernelBlob[KernelBlobTypeInitrd].Size > 0) { + InitrdLoadFile2Handle =3D NULL; + Status =3D gBS->InstallMultipleProtocolInterfaces (&InitrdLoadFile2Han= dle, + &gEfiDevicePathProtocolGuid, &mInitrdDevicePath, + &gEfiLoadFile2ProtocolGuid, &mInitrdLoadFile2, + NULL); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: InstallMultipleProtocolInterfaces(): %r\n", + __FUNCTION__, Status)); + goto UninstallFileSystemHandle; + } + } + return EFI_SUCCESS; =20 +UninstallFileSystemHandle: + Status =3D gBS->UninstallMultipleProtocolInterfaces (FileSystemHandle, + &gEfiDevicePathProtocolGuid, &mFileSystemDevicePat= h, + &gEfiSimpleFileSystemProtocolGuid, &mFileSystem, + NULL); + ASSERT_EFI_ERROR (Status); + FreeBlobs: while (BlobType > 0) { CurrentBlob =3D &mKernelBlob[--BlobType]; diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf b/Ovmf= Pkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf index f4b50c265027..737f9b87a7c7 100644 --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf @@ -28,6 +28,7 @@ [LibraryClasses] BaseLib BaseMemoryLib DebugLib + DevicePathLib MemoryAllocationLib UefiBootServicesTableLib QemuFwCfgLib @@ -42,6 +43,7 @@ [Guids] =20 [Protocols] gEfiDevicePathProtocolGuid ## PRODUCES + gEfiLoadFile2ProtocolGuid ## PRODUCES gEfiSimpleFileSystemProtocolGuid ## PRODUCES =20 [Depex] --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55151): https://edk2.groups.io/g/devel/message/55151 Mute This Topic: https://groups.io/mt/71669026/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sun May 5 13:43:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+55152+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55152+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1583134199; cv=none; d=zohomail.com; s=zohoarc; b=aJLf64jGZeH+q50dVYYGVTrFbY8uJwo5ZqrmiW2JyJNOK4fJK9N0SUc9gkm8NIdZnXeOo52eY+Hp4r+ayWZp63w0pZmPK7Y41AROEnRmDR84bL/qexI+Lxzx9+3nb75eJu+3U0ECnapHhjTuPh5hJCExXE7L7DjUg6NbuzfhOdQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1583134199; h=Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:Message-ID:Reply-To:References:Sender:Subject:To; bh=kKYAw813G2SPXFa3qTEGM6qghbVETjMiD7bgMpCsN8A=; b=FeYqVkYwwM8V91mbnejEJYRjXUEySbhm474ApEvyZW0e2ZSWBICWDYVcmi04YFSwGDPSen5uVVM58YT7NveSVYyuGgHJ+Imqr8XmScySRvsEHUYk2SgnpkP/UW1kixm27AvJc1v95l19e0Q3RfOiPow2Y6pjrWEAdRtcwKYh7TQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+55152+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1583134199641719.828400606861; Sun, 1 Mar 2020 23:29:59 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id W7QQYY1788612xWStprNnh8l; Sun, 01 Mar 2020 23:29:58 -0800 X-Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by mx.groups.io with SMTP id smtpd.web12.10946.1583134197792851718 for ; Sun, 01 Mar 2020 23:29:58 -0800 X-Received: by mail-wm1-f65.google.com with SMTP id 6so1382820wmi.5 for ; Sun, 01 Mar 2020 23:29:57 -0800 (PST) X-Gm-Message-State: m7t3Lw2qyTsBWtM6P5DKh8oNx1787277AA= X-Google-Smtp-Source: APXvYqwPAquq3xOBqjJJHubST5N165ldzyObbr5U8OnW8M8PZaO1PpuHNEvscJQRuub5kPCzPfyuiA== X-Received: by 2002:a7b:c257:: with SMTP id b23mr17864673wmj.70.1583134196058; Sun, 01 Mar 2020 23:29:56 -0800 (PST) X-Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id z131sm6347153wmg.25.2020.03.01.23.29.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Mar 2020 23:29:55 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [edk2-devel] [PATCH 13/13] OvmfPkg: use generic QEMU image loader for secure boot enabled builds Date: Mon, 2 Mar 2020 08:29:36 +0100 Message-Id: <20200302072936.29221-14-ard.biesheuvel@linaro.org> In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-1-ard.biesheuvel@linaro.org> Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ard.biesheuvel@linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1583134198; bh=xkRwV4ec0E0WzK/S8On4nZD2oNB3KEv6A6C6TbK2CEM=; h=Cc:Date:From:Reply-To:Subject:To; b=NuLr3HAirVcuAfkQKgYw7sdQ8jz5L14JdFHPqD5YgGoHOldRiqAx6AzhblUQ4F3CF53 hy7Gwjn+KnGjQ2gpFZ8fRE/zc5yjJc9g7n5FQSKNS4zzj7pSPrxpLWg9UESfCCRAnGW7q 4fgoX7njEOdzUcEdW1V4WAiuqf/wN7da8uQ= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The QemuLoadImageLib implementation we currently use for all OVMF builds copies the behavior of the QEMU loader code that precedes it, which is to disregard UEFI secure boot policies entirely when it comes to loading kernel images that have been specified on the QEMU command line. This behavior deviates from ArmVirtQemu based builds, which do take UEFI secure boot policies into account, and refuse to load images from the command line that cannot be authenticated. The disparity was originally due to the fact that the QEMU command line kernel loader did not use LoadImage and StartImage at all, but this changed recently, and now, there are only a couple of reasons left to stick with the legacy loader: - it permits loading images that lack a valid PE/COFF header, - it permits loading X64 kernels on IA32 firmware running on a X64 capable system. Since every non-authentic PE/COFF image can trivially be converted into an image that lacks a valid PE/COFF header, the former case can simply not be supported in a UEFI secure boot context. The latter case is highly theoretical, given that one could easily switch to native X64 firmware in a VM scenario. That leaves us with little justification to use the legacy loader at all when UEFI secure boot policies are in effect, so let's switch to the generic loader for UEFI secure boot enabled builds. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2566 Signed-off-by: Ard Biesheuvel Reviewed-by: Laszlo Ersek --- OvmfPkg/OvmfPkgIa32.dsc | 4 ++++ OvmfPkg/OvmfPkgIa32X64.dsc | 4 ++++ OvmfPkg/OvmfPkgX64.dsc | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index 2cc924a6986a..eceddb71948f 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -361,7 +361,11 @@ [LibraryClasses.common.DXE_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +!if $(SECURE_BOOT_ENABLE) =3D=3D TRUE + QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf +!else QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib= .inf +!endif !if $(TPM2_ENABLE) =3D=3D TRUE Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf !endif diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 21d1f156973b..8bdf2e692b00 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -365,7 +365,11 @@ [LibraryClasses.common.DXE_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +!if $(SECURE_BOOT_ENABLE) =3D=3D TRUE + QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf +!else QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib= .inf +!endif !if $(TPM2_ENABLE) =3D=3D TRUE Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf !endif diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index f3d0f18db7e2..bc0a3e438d2a 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -365,7 +365,11 @@ [LibraryClasses.common.DXE_DRIVER] PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf +!if $(SECURE_BOOT_ENABLE) =3D=3D TRUE + QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf +!else QemuLoadImageLib|OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib= .inf +!endif !if $(TPM2_ENABLE) =3D=3D TRUE Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibTcg2/Tpm2DeviceLibTcg2.inf !endif --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#55152): https://edk2.groups.io/g/devel/message/55152 Mute This Topic: https://groups.io/mt/71669027/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-