From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.120]) by mx.groups.io with SMTP id smtpd.web09.10407.1583403176930856583 for ; Thu, 05 Mar 2020 02:12:57 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=TjUOeBex; spf=pass (domain: redhat.com, ip: 205.139.110.120, mailfrom: lersek@redhat.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1583403176; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=APM2y9Bb/zHy5CfqyaYkVecZE3IBCphKVtJpZ4Zzgwo=; b=TjUOeBexstG7Hc5XSvkiEk7LD/1Y6AWt/6oYX9WZMHG8dEwEnGh1v6cHvqhwmBb9S9vSnm PCoWjvfjnLNjvZWJ29VOu6aE6CeQIuBXunDTMnP4GTFe5NJGzQ4uopJMj4VNaWJsM9Z41N ZMQpaKfY3Dw6+YEYVLro72WxZBkZAws= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-420-wvddK3sNPTqsiPtz8s7pFA-1; Thu, 05 Mar 2020 05:12:52 -0500 X-MC-Unique: wvddK3sNPTqsiPtz8s7pFA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1833C800D54; Thu, 5 Mar 2020 10:12:51 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-117-216.ams2.redhat.com [10.36.117.216]) by smtp.corp.redhat.com (Postfix) with ESMTP id 46D5973874; Thu, 5 Mar 2020 10:12:50 +0000 (UTC) Subject: Re: [edk2-devel] [PATCH v2 08/14] OvmfPkg/QemuKernelLoaderFsDxe: add support for the kernel setup block To: devel@edk2.groups.io, ard.biesheuvel@linaro.org References: <20200304095233.21046-1-ard.biesheuvel@linaro.org> <20200304095233.21046-9-ard.biesheuvel@linaro.org> From: "Laszlo Ersek" Message-ID: <8e59210d-7eb9-3db2-a312-e357c9067212@redhat.com> Date: Thu, 5 Mar 2020 11:12:49 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20200304095233.21046-9-ard.biesheuvel@linaro.org> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit On 03/04/20 10:52, Ard Biesheuvel wrote: > 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=2566 > Signed-off-by: Ard Biesheuvel > --- > OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c | 74 ++++++++++++++------ > 1 file changed, 53 insertions(+), 21 deletions(-) Reviewed-by: Laszlo Ersek Thanks, Laszlo > diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c > index dc86a48af378..8ccb1983170c 100644 > --- a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c > +++ b/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c > @@ -34,16 +34,29 @@ typedef enum { > } KERNEL_BLOB_TYPE; > > 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; > > STATIC KERNEL_BLOB mKernelBlob[KernelBlobTypeMax] = { > - { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, L"kernel" }, > - { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, L"initrd" }, > + { > + L"kernel", > + { > + { QemuFwCfgItemKernelSetupSize, QemuFwCfgItemKernelSetupData, }, > + { QemuFwCfgItemKernelSize, QemuFwCfgItemKernelData, }, > + } > + }, { > + L"initrd", > + { > + { QemuFwCfgItemInitrdSize, QemuFwCfgItemInitrdData, }, > + } > + } > }; > > STATIC UINT64 mTotalBlobBytes; > @@ -850,12 +863,21 @@ FetchBlob ( > ) > { > UINT32 Left; > + UINTN Idx; > + UINT8 *ChunkData; > > // > // Read blob size. > // > - QemuFwCfgSelectItem (Blob->SizeKey); > - Blob->Size = QemuFwCfgRead32 (); > + Blob->Size = 0; > + for (Idx = 0; Idx < ARRAY_SIZE (Blob->FwCfgItem); Idx++) { > + if (Blob->FwCfgItem[Idx].SizeKey == 0) { > + break; > + } > + QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].SizeKey); > + Blob->FwCfgItem[Idx].Size = QemuFwCfgRead32 (); > + Blob->Size += Blob->FwCfgItem[Idx].Size; > + } > if (Blob->Size == 0) { > return EFI_SUCCESS; > } > @@ -872,18 +894,28 @@ FetchBlob ( > > DEBUG ((DEBUG_INFO, "%a: loading %Ld bytes for \"%s\"\n", __FUNCTION__, > (INT64)Blob->Size, Blob->Name)); > - QemuFwCfgSelectItem (Blob->DataKey); > - > - Left = Blob->Size; > - do { > - UINT32 Chunk; > - > - Chunk = (Left < SIZE_1MB) ? Left : SIZE_1MB; > - QemuFwCfgReadBytes (Chunk, Blob->Data + (Blob->Size - Left)); > - Left -= Chunk; > - DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\"\n", > - __FUNCTION__, (INT64)Left, Blob->Name)); > - } while (Left > 0); > + > + ChunkData = Blob->Data; > + for (Idx = 0; Idx < ARRAY_SIZE (Blob->FwCfgItem); Idx++) { > + if (Blob->FwCfgItem[Idx].DataKey == 0) { > + break; > + } > + QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].DataKey); > + > + Left = Blob->FwCfgItem[Idx].Size; > + while (Left > 0) { > + UINT32 Chunk; > + > + Chunk = (Left < SIZE_1MB) ? Left : SIZE_1MB; > + QemuFwCfgReadBytes (Chunk, ChunkData + Blob->FwCfgItem[Idx].Size - Left); > + Left -= Chunk; > + DEBUG ((DEBUG_VERBOSE, "%a: %Ld bytes remaining for \"%s\" (%d)\n", > + __FUNCTION__, (INT64)Left, Blob->Name, (INT32)Idx)); > + } > + > + ChunkData += Blob->FwCfgItem[Idx].Size; > + } > + > return EFI_SUCCESS; > } > >