From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by mx.groups.io with SMTP id smtpd.web09.9060.1583315572695641681 for ; Wed, 04 Mar 2020 01:52:53 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=oOCuWYGJ; spf=pass (domain: linaro.org, ip: 209.85.221.66, mailfrom: ard.biesheuvel@linaro.org) Received: by mail-wr1-f66.google.com with SMTP id j7so1532197wrp.13 for ; Wed, 04 Mar 2020 01:52:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/2oO2oFCARWGXSWBW5LbxvQgmgBnxg7nJ494xosNLDU=; b=oOCuWYGJq9YBK95Mbp4b1fuCin5kijVL/5cL8r3Rw8v8ToC5aqVRMN9J8cj0plzbg6 qyrlGgfNuJF5PsT93KGomiqK1ScO08dHEC6kSOhARjE6uVFfG7WJT7aFGJU+pYBeIyqw KKcEIPTnhVuy7Dbp1b6HieIg9Pyx0gkNtDRDT/Z2M2EM9zw0PCnlLLo5LOJKofFkUTHO 2mge0pxIZ2pENLvTpRzDXilsi7we74fCW+iIP7rGKuV6/VFnoHWC/ygO08MO0TTtMftQ hBofZTWRALgDFyYddgDQXPxjYf7tIPnCBGH6W6NkmFAHbAcnv+MaMsluIwZ8qWzsjg/y EddQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/2oO2oFCARWGXSWBW5LbxvQgmgBnxg7nJ494xosNLDU=; b=CXDZ8Ar6wLq5udseXzCgrAZ+7OsEmzURv22mjE/XjDe3OuzlCyAA9hyj614PIbFjAk eNEBJxzOeWOcUTZ41lG1yE4k0ZxBBK8D3QCKQqDexKKaBOq+oGYglGyoRQUsyuCP00Hb fTkh3WbJM7WjCLX1/++aJ7eJUks0DaBgQIcHnjaC2g+41SZqZHHkweYRgHMhj+fQa82f +qqAcmMyDxPDcYD1f1sdo3ZeBTPKWouL8ye03SqpkG4wCFZUFVP40L2JxPg9WhMF7tQi 23XimH7VDIqMasXz5qupCwyhX/kjryyGenEvs9NOKdMcQLEZfDhCvu+EZ+FhaIz5rbm0 W+JA== X-Gm-Message-State: ANhLgQ0GVrhYrwc7mtWVl5R5mhK/E08aTXPjqkUe9WRlsYW7NVn2MdE5 ntiksPXJiIMq9WyoWMynvKZD3UDvpjK7bA== X-Google-Smtp-Source: ADFU+vudhfFmsmiPpcsb88/S70ibfw5wZI+lZARIu037pNSJyPkzJ2bDCcoaDLGZX6dqlAUdjOoRQA== X-Received: by 2002:adf:eec3:: with SMTP id a3mr3447518wrp.170.1583315570925; Wed, 04 Mar 2020 01:52:50 -0800 (PST) Return-Path: Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id v16sm20781095wrp.84.2020.03.04.01.52.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 01:52:49 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [PATCH v2 08/14] OvmfPkg/QemuKernelLoaderFsDxe: add support for the kernel setup block Date: Wed, 4 Mar 2020 10:52:27 +0100 Message-Id: <20200304095233.21046-9-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200304095233.21046-1-ard.biesheuvel@linaro.org> References: <20200304095233.21046-1-ard.biesheuvel@linaro.org> 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(-) 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; } -- 2.17.1