From mboxrd@z Thu Jan 1 00:00:00 1970 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 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=BRBvYjr6; spf=pass (domain: linaro.org, ip: 209.85.221.68, mailfrom: ard.biesheuvel@linaro.org) Received: by mail-wr1-f68.google.com with SMTP id l5so11140549wrx.4 for ; Sun, 01 Mar 2020 23:29:51 -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=sBxkp0gSRmttIqNQHayG9Y+3fFVyjnlb08F3MWu5E7k=; b=BRBvYjr6dBIsmE4YpV9zkKxusvzmAbwAqiL5BnpUAAc6D/3g190flBNU/A+Xr+zqZ5 Rh36j/umCyMEpb3k5wh4aLLIQOClXwMD0MlnntyjYN1sdHjwdtsvibXjukTzZwlEyhhG xCgdFvgzr/coLnsbpeVEGkW2izk/xWykRp2n77zReQJTRjBM7hGgnTq009i1TnHPWAuh 2mamsXMtyYGMCs4OQk5jT2cjcFO0IUSkW48OQL3055a4a2ZzkYUnNL+HsUJxrgKDQhfA MJiD0RzBsJDl+MhM7yxdxwr/cU04ATcoJiBsJYkiC7jyE/q6krOEZURIiuv/HTgI7Yog jg5A== 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=sBxkp0gSRmttIqNQHayG9Y+3fFVyjnlb08F3MWu5E7k=; b=Ayp+M7kRiJDbSkaHkjAqTUkEuy8WaW/qsRzURYP9Zh6g8OlMngv3Gj/KF/EeMpc5Eb 5t2dW3p4QL9k9vzaWbVEaVL4+Vx7FSbgdJsakVMmQmKyoQOcwh4G2GlZa5JLLaljx14K 7vMIHkfc3MejWq/YiYYoF22zvovoeRGi5dYwPyADlh04X+1eog56nHikmV/w65TjzXYg 3oHbejWE1qHTERudUehnwM3n+wU35eidIqTAICurOoJc8ugBBJ+36OW2se3mg95sPU0Q AT7yNrc/rVVi0HxSSxkdOiRJzHsbLVu/LHZ46MabwiLgGdeOQcL25othOSVyi4eQB/f8 xeVw== X-Gm-Message-State: APjAAAWKcpRbgYDxYUDuNct4WRRceQ7T0otVaJKIY/x9coZ9M1Fi2yv6 sWr1ZRPUxmBmJYiIh4bVTGJ1mgkMbweRyA== 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) Return-Path: 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: [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> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200302072936.29221-1-ard.biesheuvel@linaro.org> References: <20200302072936.29221-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 | 70 ++++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c b/OvmfPkg/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; 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,20 @@ 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->Size += Blob->FwCfgItem[Idx].Size = QemuFwCfgRead32 (); + } if (Blob->Size == 0) { return EFI_SUCCESS; } @@ -872,18 +893,25 @@ 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++) { + QemuFwCfgSelectItem (Blob->FwCfgItem[Idx].DataKey); + + Left = Blob->FwCfgItem[Idx].Size; + do { + 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, Idx)); + } while (Left > 0); + + ChunkData += Blob->FwCfgItem[Idx].Size; + } + return EFI_SUCCESS; } -- 2.17.1