From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by mx.groups.io with SMTP id smtpd.web10.9180.1583315561955725641 for ; Wed, 04 Mar 2020 01:52:42 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=n4VIUWcW; spf=pass (domain: linaro.org, ip: 209.85.221.49, mailfrom: ard.biesheuvel@linaro.org) Received: by mail-wr1-f49.google.com with SMTP id y17so1560628wrn.6 for ; Wed, 04 Mar 2020 01:52:41 -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; bh=OT0GnPwcgrRdsajFvSjJP6Abc5VDK1bG6zHZx50DCoM=; b=n4VIUWcWtKFiI7VB58097GDUDSijYhxaxEZMyTQQf4QGITzoOyVl/01jXHtCFmu3TA LRqII2eYdAr8EzRPPRL+8AKLbSlE2/w4vygVvicXfFjuhH0RUKBm0IA73YT5vlPajq10 sTXNIGsQQwdQeM8E3R4vDrF8AwoDZbMuLWCDveO9qDnsOx7wZ/GdpwPdAIzTP9X0UBS5 i9s8SmLtYjwzrBR53RRACOq5i5CGIDB1Aj7tSKbAnGeyQGVTbkzxQx7KuDpZJbphI5Rc Kdx0hYmFEcaQTmJTNwoCVGO8b7hYQ62avOOj4sqKsZgShqIGfqFJCQ2dn7/ZGArNBl7r aQfA== 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; bh=OT0GnPwcgrRdsajFvSjJP6Abc5VDK1bG6zHZx50DCoM=; b=j4fhLwlPF1+pyG2dXuO/BzlivgYHYMpgOba+cAvGi+r8vMroZStCzijx31qXvUvYtC 0h+6HgLnyNUnRfPHvebmIHDQjjiOJqzPVrIrSx+cTJxUsIM+ZMq+lyatVjUomoOGjgA7 h20JY8zUEP4Y6W4HREQ2890faW6wqQE60QyRCJq/J+whkr6VdgkP0Bwv15HJsbmgU4W9 EhBbewCrLMZYTpCC1hcRzP6W5DR4nZceqnxHXzL+r2Y5TaFrn0VoT6k6vz3aVk8Bp+Jw AXmEzlWov7CYHJwDBBTCqcylM+1ecyde2mFO90JdoT1TlLb3PYjvJI0DjDo4C2zQg9YA DlVw== X-Gm-Message-State: ANhLgQ1iTdW4m1ycBrC+J//oX1u1jxtjO4yW7gtIL4NPyfZ7rmnK29sY l+2kQgzlFpnSdZRS3TtdqhEbe83PdV16ng== X-Google-Smtp-Source: ADFU+vt6/FuWYlQl9R1mhEo5dGuXIc6m+CxV1qvna9lzQ5wP09X27/MOscem+zARQ6UMM2YQFB2png== X-Received: by 2002:a5d:6082:: with SMTP id w2mr3274564wrt.300.1583315560074; Wed, 04 Mar 2020 01:52:40 -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.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 01:52:39 -0800 (PST) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: lersek@redhat.com, Ard Biesheuvel Subject: [PATCH v2 00/14] Ovmf: use LoadImage/StartImage for loading command line images Date: Wed, 4 Mar 2020 10:52:19 +0100 Message-Id: <20200304095233.21046-1-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 On ArmVirtQemu, we require the kernel passed via the QEMU -kernel option to have a PE/COFF header and an EFI stub, so that it can be loaded and started using the LoadImage and StartImage boot services, respectively. This means that, on builds that enable secure boot or measured boot, the kernel image gets authenticated and/or measured as well. On X86, for historical reasons, we never use LoadImage or StartImage, which means that: - kernel images are never authenticated or measured, - calling Exit() from within the boot stub will attempt tp terminate the calling image, which is likely to end badly. So instead, split and generalize the code that exists today for ArmVirtQemu, and wire it up for x86 so that LoadImage and StartImage are used unless there is a true need for the special Linux boot protocol. The first 6 patches are only intended to be a refactoring of the existing code, and should not result in any functional changes for either ArmVirtQemu or OVMF. Patch #12 adds the new Linux specific initrd loadfile2 protocol that aims to simplify initrd loading from Linux when booting via the PE stub. Patch #13 is optional, and disables the Linux loader fallback on builds that have secure boot enabled. Changes since [v1]: - handle EFI_SECURITY_VIOLATION return codes from gBS->LoadImage inside the QemuLoadImageLib implementation consistently, instead of propagating it - change the prototype of QemuStartKernelImage () to take the handle by reference, allowing the fallback x86 code to reload the image onto a fresh handle if needed - add new patch to declare gX86QemuKernelLoadedImageGuid, and make it a true protocol instead of just a GUID - drop unnecessary 'wrapper' struct around QEMU_LEGACY_LOADED_IMAGE (#10) - switch to QemuFwCfgRead32() consistently - fix numerous other minor style and logic issues pointed out by Laszlo - add Laszlo's ack to #1, #2, #3, #5, #7, #11 and #14 Code can be found here: https://github.com/ardbiesheuvel/edk2/tree/ovmf-loadimage-startimage-v1 https://github.com/ardbiesheuvel/edk2/tree/ovmf-loadimage-startimage-v2 [v1] http://mid.mail-archive.com/20200302072936.29221-1-ard.biesheuvel@linaro.org Ard Biesheuvel (14): OvmfPkg: add GUID for the QEMU kernel loader fs media device path OvmfPkg: export abstract QEMU blob filesystem in standalone driver OvmfPkg: introduce QemuLoadImageLib library class OvmfPkg: provide a generic implementation of QemuLoadImageLib ArmVirtPkg: incorporate the new QEMU kernel loader driver and library ArmVirtPkg/PlatformBootManagerLib: switch to separate QEMU loader OvmfPkg/QemuKernelLoaderFsDxe: don't expose kernel command line OvmfPkg/QemuKernelLoaderFsDxe: add support for the kernel setup block OvmfPkg: create protocol and GUID header for legacy loaded images OvmfPkg: implement QEMU loader library for X86 with legacy fallback OvmfPkg: add new QEMU kernel image loader components OvmfPkg/PlatformBootManagerLib: switch to QemuLoadImageLib OvmfPkg/QemuKernelLoaderFsDxe: add support for new Linux initrd device path OvmfPkg: use generic QEMU image loader for secure boot enabled builds ArmVirtPkg/ArmVirtQemu.dsc | 2 + ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 1 + ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 + .../PlatformBootManagerLib.inf | 9 +- .../PlatformBootManagerLib/QemuKernel.c | 1061 +---------------- .../Include/Guid/QemuKernelLoaderFsMedia.h | 18 + OvmfPkg/Include/Library/QemuLoadImageLib.h | 84 ++ .../Protocol/X86QemuKernelLoadedImage.h | 19 + .../GenericQemuLoadImageLib.c | 278 +++++ .../GenericQemuLoadImageLib.inf | 38 + .../PlatformBootManagerLib.inf | 2 +- .../PlatformBootManagerLib/QemuKernel.c | 144 +-- .../X86QemuLoadImageLib/X86QemuLoadImageLib.c | 564 +++++++++ .../X86QemuLoadImageLib.inf | 42 + OvmfPkg/OvmfPkg.dec | 7 + OvmfPkg/OvmfPkgIa32.dsc | 6 + OvmfPkg/OvmfPkgIa32.fdf | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 6 + OvmfPkg/OvmfPkgIa32X64.fdf | 1 + OvmfPkg/OvmfPkgX64.dsc | 6 + OvmfPkg/OvmfPkgX64.fdf | 1 + .../QemuKernelLoaderFsDxe.c | 367 +++--- .../QemuKernelLoaderFsDxe.inf | 50 + 23 files changed, 1315 insertions(+), 1394 deletions(-) create mode 100644 OvmfPkg/Include/Guid/QemuKernelLoaderFsMedia.h create mode 100644 OvmfPkg/Include/Library/QemuLoadImageLib.h create mode 100644 OvmfPkg/Include/Protocol/X86QemuKernelLoadedImage.h create mode 100644 OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.c create mode 100644 OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf create mode 100644 OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.c create mode 100644 OvmfPkg/Library/X86QemuLoadImageLib/X86QemuLoadImageLib.inf copy ArmVirtPkg/Library/PlatformBootManagerLib/QemuKernel.c => OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.c (77%) create mode 100644 OvmfPkg/QemuKernelLoaderFsDxe/QemuKernelLoaderFsDxe.inf -- 2.17.1