Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp1996471rwb; Sun, 18 Sep 2022 19:40:58 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6vNcklJ/cZ+sAQxTHrM3mFD3fX5Uk3IcgK809C4HQqhO24WcbygD8vjH+9k17R8ZIy1LwQ X-Received: by 2002:a17:90b:1b4d:b0:202:c05f:6ea0 with SMTP id nv13-20020a17090b1b4d00b00202c05f6ea0mr17818344pjb.7.1663555258438; Sun, 18 Sep 2022 19:40:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663555258; cv=none; d=google.com; s=arc-20160816; b=cRlGYXk8l7t/B3GJZDWTSuw+M3tbnqulN7RmcQIq8aeErw/pM/l0Di7UH2vtOYkxaZ YT8BAjHnRnRfU9hMoViE8ZP6bzSV6y1Z5k8FkHJaPTVP6EKM/RcoentZtgnD1ezmHv7D BrDoH76YKzjese9yZ4xZCEGtkpPX+m68Vh9P3DABgegivJsO/EDkG0inh/XZUxS53vpt 7iG1sBzupTD7E6Jbu7f5NrjElbofdQUwjc7ajgB0K1gAXbzGgyJ8q9rNm9HiI6nabGmd 3B/R8mKSPUtUHmnI+z1NoSoJMiDy3D3SrcAjlBT7n7Dlfwky0pbmr3PnuEbqOY2vTNuq SH7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=ooRQCYjBHI6gzuoI9EKQGj/1cXHaAJQAapRfNahVfeQ=; b=NhCQKzzzI2yKy7nnjpQpsCJFZk0RNPKUFV9It0TFp9bs3j5tyWfEkmVtKZh5Yq2fXk ZSz7kPj5rsBfYNKv9XdqDT7syY0QHz/ZYFGkIR3L+jcR/fk2YVa8SQ4cjWiwCGy4HJpt BoFCE9oJGSH98jhUsjDjfLfirT9ADIbsavvM9AamQYV8DzlfcRbhJCoZ3egp+YuhorKq EDCzeJeZC7fRwzpBPeRExfLUM1veilLClNJDd3pi1fME8XUSIh879VROmTl46MmocPla D9LOt4qnxENNlUbk6pB1VAh63e87iQ6j2eBZqUNI2ERPIcbNZaREAeFINvA9ADRsEZ56 j8+w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u26-20020a056a00099a00b0053e79de3fc6si39176653pfg.50.2022.09.18.19.40.46; Sun, 18 Sep 2022 19:40:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229662AbiISCWh (ORCPT + 99 others); Sun, 18 Sep 2022 22:22:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229483AbiISCWg (ORCPT ); Sun, 18 Sep 2022 22:22:36 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 234F813F1A; Sun, 18 Sep 2022 19:22:33 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C065613D5; Sun, 18 Sep 2022 19:22:39 -0700 (PDT) Received: from [192.168.122.164] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7B0F33F73B; Sun, 18 Sep 2022 19:22:32 -0700 (PDT) Message-ID: Date: Sun, 18 Sep 2022 21:22:22 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.0 Subject: Re: [PATCH v5 0/8] efi: implement generic compressed boot support Content-Language: en-US To: Ard Biesheuvel , linux-efi@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Xi Ruoyao , Lennart Poettering , Will Deacon , Catalin Marinas References: <20220910081152.2238369-1-ardb@kernel.org> From: Jeremy Linton In-Reply-To: <20220910081152.2238369-1-ardb@kernel.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, With the BSS "fix" in grub for fedora/rhel, this is now working fine for both systemd-boot and normal grub2, as well as booting directly from the UEFI shell. Given both the magic number and the bss fix were merged at the same time I don't think anyone should ever see the bad bss message, at least not on the above distro's. I've largely been testing this on the PFTF/RPi4, and in a libvirt qemu/kvm env with/without ksan/etc on a mostly fedora configured kernel. Hooking this up to kinstall makes sense and works, although i'm not a big fan. So, its looking good. All thumbs up here :) Tested-by: Jeremy Linton On 9/10/22 03:11, Ard Biesheuvel wrote: > Relatively modern architectures such as arm64 or RISC-V don't implement > a self-decompressing kernel, and leave it up to the bootloader to > decompress the compressed image before executing it. For bare metal > boot, this policy makes sense, as a self-decompressing image essentially > duplicates a lot of fiddly preparation work to create a 1:1 mapping and > set up the C runtime, and to discover or infer where DRAM lives from > device trees or other firmware tables. > > For EFI boot, the situation is a bit different: the EFI entrypoint is > called with a 1:1 cached mapping covering all of DRAM already active, > and with a stack, a heap, a memory map and boot services to load and > start images. This means it is rather trivial to implement a > self-decompressing wrapper for EFI boot in a generic manner, and reuse > it across architectures that implement EFI boot. > > The only slight downside is that when UEFI secure boot is enabled, the > generic LoadImage/StartImage only allow signed images to be loaded and > started, and we would prefer to avoid the need to sign both the inner > and outer PE/COFF images. > > However, the only truly generic and portable way to achieve this is to > rely on LoadImage/StartImage as the EFI spec defines them, and avoid > making assumptions about how things might work under the hood, and how > we might circumvent that. This includes just loading the image into > memory and jumping to the PE entry point: in the context of secure boot, > measured boot and other hardening measures the firmware may take (such > as disallowing mappings that are both writable and executable), using > the firmware's image loading API is the only maintainable choice. > > For this reason, this version of the series includes support for signing > the images using sbsign, if the signing key and cert are specified in > Kconfig. > > The code is wired up for arm64, LoongArch and RISC-V. The latter was > build tested only. > > Changes since v4: > - make CONFIG_EFI_ZBOOT user selectable again, and turn it on by default > only for LoongArch > - set KBUILD_IMAGE to vmlinuz.efi if CONFIG_EFI_ZBOOT=y, so that make > targets such as zinstall and bindeb-pkg do the right thing > - throw an error is BSS was not cleared by the loader - this is needed > to detect broken distro implementations of LoadImage in shim and grub > - add vmlinuz.* to .gitignore on the various architectures > - switch back to defining uncompressed_size as 'extern __aligned(1)' so > that the compiler will perform the unaligned access as appropriate on > the architecture in question - this requires the latest binutils on > LoongArch [0] > > Changes since v3: > - add support for XZ and ZSTD compression > - deal with exit data returned by StartImage() > - use LoadFile2 based image loading instead of passing the raw buffer - > this way, the provenance of the data is more visible, allowing us, > for instance, to deal with initrd= on arm64 transparently (this means > that systemd-boot on arm64 will work unmodified provided that the > [deprecated] command line initrd loader is enabled in the kernel > build) > - include LoongArch support > - rename compressed image to vmlinuz.efi on all architectures > > Changes since v2: > - drop some of the refactoring work to make efi_printk() available in > the decompressor, and just use fixed strings instead; > - provide memcpy/memmove/memset based on the UEFI boot services, instead > of having to specify for each architecture how to wire these up; > - drop PI/DXE based signature check circumvention, and just sign the > inner image instead, if needed; > - add a header to the zimage binary that identifies it as a EFI zboot > image, and describes the compression algorithm and where the payload > lives in the image - this might be used by non-EFI loaders to locate > and decompress the bare metal image, given that the EFI zboot one is > not a hybrid like the one it encapsulates. > > [0] https://sourceware.org/pipermail/binutils/2022-September/122713.html > > Cc: "James E.J. Bottomley" > Cc: Matthew Garrett > Cc: Peter Jones > Cc: Ilias Apalodimas > Cc: Heinrich Schuchardt > Cc: AKASHI Takahiro > Cc: Palmer Dabbelt > Cc: Atish Patra > Cc: Arnd Bergmann > Cc: Huacai Chen > Cc: Xi Ruoyao > Cc: Lennart Poettering > Cc: Jeremy Linton > Cc: Will Deacon > Cc: Catalin Marinas > > Ard Biesheuvel (8): > efi: name the ARCH-stub.c files uniformly > efi/libstub: add some missing EFI prototypes > efi/libstub: use EFI provided memcpy/memset routines > efi/libstub: move efi_system_table global var into separate object > efi/libstub: implement generic EFI zboot > arm64: efi: enable generic EFI compressed boot > riscv: efi: enable generic EFI compressed boot > loongarch: efi: enable generic EFI compressed boot > > arch/arm64/Makefile | 9 +- > arch/arm64/boot/.gitignore | 1 + > arch/arm64/boot/Makefile | 6 + > arch/arm64/kernel/image-vars.h | 13 - > arch/loongarch/Kconfig | 1 + > arch/loongarch/Makefile | 4 +- > arch/loongarch/boot/.gitignore | 1 + > arch/loongarch/boot/Makefile | 6 + > arch/loongarch/kernel/image-vars.h | 3 - > arch/riscv/Makefile | 6 +- > arch/riscv/boot/.gitignore | 1 + > arch/riscv/boot/Makefile | 6 + > arch/riscv/kernel/image-vars.h | 9 - > drivers/firmware/efi/Kconfig | 38 +++ > drivers/firmware/efi/libstub/Makefile | 21 +- > drivers/firmware/efi/libstub/Makefile.zboot | 70 +++++ > drivers/firmware/efi/libstub/{arm32-stub.c => arm-stub.c} | 0 > drivers/firmware/efi/libstub/efi-stub.c | 2 - > drivers/firmware/efi/libstub/efistub.h | 35 ++- > drivers/firmware/efi/libstub/file.c | 17 ++ > drivers/firmware/efi/libstub/intrinsics.c | 30 ++ > drivers/firmware/efi/libstub/systable.c | 8 + > drivers/firmware/efi/libstub/zboot-header.S | 143 ++++++++++ > drivers/firmware/efi/libstub/zboot.c | 296 ++++++++++++++++++++ > drivers/firmware/efi/libstub/zboot.lds | 43 +++ > include/linux/efi.h | 13 + > 26 files changed, 732 insertions(+), 50 deletions(-) > create mode 100644 drivers/firmware/efi/libstub/Makefile.zboot > rename drivers/firmware/efi/libstub/{arm32-stub.c => arm-stub.c} (100%) > create mode 100644 drivers/firmware/efi/libstub/intrinsics.c > create mode 100644 drivers/firmware/efi/libstub/systable.c > create mode 100644 drivers/firmware/efi/libstub/zboot-header.S > create mode 100644 drivers/firmware/efi/libstub/zboot.c > create mode 100644 drivers/firmware/efi/libstub/zboot.lds >