From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by mx.groups.io with SMTP id smtpd.web11.12601.1583415982098614378 for ; Thu, 05 Mar 2020 05:46:22 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=pzVLL8FJ; spf=pass (domain: linaro.org, ip: 209.85.128.68, mailfrom: ard.biesheuvel@linaro.org) Received: by mail-wm1-f68.google.com with SMTP id a25so7131335wmm.0 for ; Thu, 05 Mar 2020 05:46:21 -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=5bIcADcy+NKbPaP/7gPkiKZ9zfnWlMWZ64JX5R4lHBw=; b=pzVLL8FJVUJTqSV3ki/QJ+trD6MbS7sBpxNOZMOeMSqmYJjn0BuKfggluSEwqAXs7h YHGlwUfTRcSVKgesYjD4Uo/K20xjrOwG6UoaMbf+AZtIFLcAwrZXUGx3i5QhHyD1W1Aw MTTckJV2PxP+v6yFdhIuW1n3ldlOxW+d3srkvbbOqYCUGEk2WLd61Nq/S5uWBWy2Y/vX 3Z8ey1YKmc0PWRJTU2D/BT5SiH4uB0kldf8yxRVTrrliV2KR9rW8WSfbmYi+ohaEnL4r YwDCp/rY09mq7dp8VjrkjGvIEKnx0D8asLjRzdl4K4HAnIGEzJegDcwNoV5nsKeURe1Z kSJg== 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=5bIcADcy+NKbPaP/7gPkiKZ9zfnWlMWZ64JX5R4lHBw=; b=nHvzaqXuonqCNZs+Wn9iUFghsLRcgDRh+iT+JbjROLI621QtY9vabXKsE0RYVbFx0e ZyC/e7JBmA5Ml6EQB3CUqnU0Dj8xpyEnr9X3ukei0ItJnbD1L+JS0Bt57jALxrGI3PoX KCDVFGJ9nwHixr/DERSTKRkQWK3S7m4cYS8xaVh0BJ3I4N1YtZgfrPeBKCiKVewLHtRz Rz7n2uWOUoAaRsaLcgOlzcLzecBc1iW4nC/+SF1rVMG+aT3UoYXLrvdDXhN8d14GAmRF gS8naAbAKYihqpKTChDEvn/Vy+feSHfIfTVNC++ZPy22tWt6DCiQ5+e4sCcrtXmJ7eOd WvJA== X-Gm-Message-State: ANhLgQ1A8tRSyU6ePfODMEjgE/frpkugLOOl553nfw3O9hZFNlNXawwx VIbVhVD/sNCHsAjIqkpwOXT9uDHgS0GzlQ== X-Google-Smtp-Source: ADFU+vtNa5ZBINmPeBLoze6JgzSfbrSV6VdF0qhX4SxxbqwbC78ayPVcdj6I4LxhSByPYO+GegSqsA== X-Received: by 2002:a7b:cb12:: with SMTP id u18mr9833483wmj.153.1583415980217; Thu, 05 Mar 2020 05:46:20 -0800 (PST) Return-Path: Received: from e123331-lin.home ([2a01:cb1d:112:6f00:816e:ff0d:fb69:f613]) by smtp.gmail.com with ESMTPSA id m19sm9278701wmc.34.2020.03.05.05.46.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 05 Mar 2020 05:46:19 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [PATCH v3 08/14] OvmfPkg/QemuKernelLoaderFsDxe: add support for the kernel setup block Date: Thu, 5 Mar 2020 14:46:01 +0100 Message-Id: <20200305134607.20125-9-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200305134607.20125-1-ard.biesheuvel@linaro.org> References: <20200305134607.20125-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 Reviewed-by: Laszlo Ersek --- 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