From patchwork Wed Aug 17 11:03:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 598294 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 05674C32772 for ; Wed, 17 Aug 2022 11:04:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238909AbiHQLEI (ORCPT ); Wed, 17 Aug 2022 07:04:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43384 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239138AbiHQLED (ORCPT ); Wed, 17 Aug 2022 07:04:03 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8E4352DD7 for ; Wed, 17 Aug 2022 04:04:00 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 446A8B81CD3 for ; Wed, 17 Aug 2022 11:03:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 49170C433B5; Wed, 17 Aug 2022 11:03:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660734238; bh=3PrJjnOGtOD0UKlkOGdoGZPYOPQoP/mzktlyZiou0eg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cFSEPM9iCVJs2nZ05M/iZHgZR3Mwkt6rtFtFMpXry1jnFEli+Yc3h/uhd4YhbJG67 vc9nOx4IUAfndzWet4MLG6V5VCcGI5itwmHMt/bTByxNAwTfFjQlyiU0KqnhQ9nmq2 KMGt6+b8a/T0U5HO+NlHalhNFZrwh1OY1pIsa/X6q6uUYxC/jR/WtxmN5zfkXaEMaT 8KhMXasuGCFfbH2nZxQH/php3izftAW8tHmC06NgUcQmI5g8cITuVhxE+fMy+lCgOq cH4XhGpdw4zfWKm+DMweCSBcWs+5vTYcqT00rL+BO8UBZ9M7aTJgVcGsQRPhS76Vhf PVV5HnVbgRfng== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: Ard Biesheuvel , "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Lennart Poettering , Jeremy Linton Subject: [PATCH v3 1/6] efi/libstub: use EFI provided memcpy/memset routines Date: Wed, 17 Aug 2022 13:03:40 +0200 Message-Id: <20220817110345.1771267-2-ardb@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817110345.1771267-1-ardb@kernel.org> References: <20220817110345.1771267-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5962; i=ardb@kernel.org; h=from:subject; bh=3PrJjnOGtOD0UKlkOGdoGZPYOPQoP/mzktlyZiou0eg=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBi/MsEVN9/aOFe4exvn4xjsTaddu1D5BPP/D+AXZzo JgLh5A2JAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYvzLBAAKCRDDTyI5ktmPJMHcC/ 486HzEeFpQ9oSYux6evpO4iM7RTPjdp/8SPrXU9uDcRFWjdav9zAOrrQhHwNwVV2w+FWSKxZIQl/0f Pw8nDxhXfkph8FniAqPJufMRwPgLT//mBOUtSau14B1YAdig1zfr/wCkX/cFEuioMKpYMSF1OoFMFg y1MkNz7kkT2kzUvObcvgH2fMU7q/jj/NFmMgx72MAh58ufGHL9RMOBKKXpA3Zqge/wMeke9Jx03fSX 9TQRc7GOyCW94Sr8/KvPcQlEbX7a/Sf3VG3jamHrfVIOecMkOEpY01Lu3y0Qs6oMmE4D1z6Hm+1kWX o+KyTPOsbxZ91WDxYkglRqy0pxTsiwY9bBWrAvZ/g3dBH8UIGglEAR7p5xpm6VTBpXgi3qbOrGPZGU QWNPAwERVQKCQAO39zJZyjOMHshzzpiUwh5ef1v1A6vYZbDxfXpDI+I4tHMJWhEvB7pPZIBOhfhxIf dgeuN2gKDMC6b7fp5rUSuCpDdvojiCj9LALGW6/pq9Oyw= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org The stub is used in different execution environments, but on arm64 and RISC-V, we still use the core kernel's implementation of memcpy and memset, as they are just a branch instruction away, and can generally be reused even from code such as the EFI stub that runs in a completely different address space. KAsan complicates this slightly, resulting in the need for some hacks to expose the uninstrumented, __ prefixed versions as the normal ones, as the latter are instrumented to include the KAsan checks, which only work in the core kernel. Unfortunately, #define'ing memcpy to __memcpy when building C code does not guarantee that no explicit memcpy() calls will be emitted. And with the upcoming zboot support, which consists of a separate binary which therefore needs its own implementation of memcpy/memset anyway, it's better to provide one explicitly instead of linking to the existing one. Given that EFI exposes implementations of memmove() and memset() via the boot services table, let's wire those up in the appropriate way, and drop the references to the core kernel ones. Signed-off-by: Ard Biesheuvel --- arch/arm64/kernel/image-vars.h | 13 --------- arch/riscv/kernel/image-vars.h | 9 ------ drivers/firmware/efi/libstub/Makefile | 3 +- drivers/firmware/efi/libstub/efistub.h | 4 +-- drivers/firmware/efi/libstub/intrinsics.c | 30 ++++++++++++++++++++ 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/arch/arm64/kernel/image-vars.h b/arch/arm64/kernel/image-vars.h index 3285b9847871..6e94c728295b 100644 --- a/arch/arm64/kernel/image-vars.h +++ b/arch/arm64/kernel/image-vars.h @@ -23,9 +23,6 @@ PROVIDE(__efistub_primary_entry = primary_entry); */ PROVIDE(__efistub_memcmp = __pi_memcmp); PROVIDE(__efistub_memchr = __pi_memchr); -PROVIDE(__efistub_memcpy = __pi_memcpy); -PROVIDE(__efistub_memmove = __pi_memmove); -PROVIDE(__efistub_memset = __pi_memset); PROVIDE(__efistub_strlen = __pi_strlen); PROVIDE(__efistub_strnlen = __pi_strnlen); PROVIDE(__efistub_strcmp = __pi_strcmp); @@ -38,16 +35,6 @@ PROVIDE(__efistub__edata = _edata); PROVIDE(__efistub_screen_info = screen_info); PROVIDE(__efistub__ctype = _ctype); -/* - * The __ prefixed memcpy/memset/memmove symbols are provided by KASAN, which - * instruments the conventional ones. Therefore, any references from the EFI - * stub or other position independent, low level C code should be redirected to - * the non-instrumented versions as well. - */ -PROVIDE(__efistub___memcpy = __pi_memcpy); -PROVIDE(__efistub___memmove = __pi_memmove); -PROVIDE(__efistub___memset = __pi_memset); - PROVIDE(__pi___memcpy = __pi_memcpy); PROVIDE(__pi___memmove = __pi_memmove); PROVIDE(__pi___memset = __pi_memset); diff --git a/arch/riscv/kernel/image-vars.h b/arch/riscv/kernel/image-vars.h index 71a76a623257..d6e5f739905e 100644 --- a/arch/riscv/kernel/image-vars.h +++ b/arch/riscv/kernel/image-vars.h @@ -25,21 +25,12 @@ */ __efistub_memcmp = memcmp; __efistub_memchr = memchr; -__efistub_memcpy = memcpy; -__efistub_memmove = memmove; -__efistub_memset = memset; __efistub_strlen = strlen; __efistub_strnlen = strnlen; __efistub_strcmp = strcmp; __efistub_strncmp = strncmp; __efistub_strrchr = strrchr; -#ifdef CONFIG_KASAN -__efistub___memcpy = memcpy; -__efistub___memmove = memmove; -__efistub___memset = memset; -#endif - __efistub__start = _start; __efistub__start_kernel = _start_kernel; __efistub__end = _end; diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile index d0537573501e..d7303c94b4a7 100644 --- a/drivers/firmware/efi/libstub/Makefile +++ b/drivers/firmware/efi/libstub/Makefile @@ -55,7 +55,8 @@ KCOV_INSTRUMENT := n lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \ file.o mem.o random.o randomalloc.o pci.o \ skip_spaces.o lib-cmdline.o lib-ctype.o \ - alignedmem.o relocate.o vsprintf.o + alignedmem.o relocate.o vsprintf.o \ + intrinsics.o # include the stub's generic dependencies from lib/ when building for ARM/arm64 efi-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index ab9e990447d3..a3377f0b1251 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h @@ -280,8 +280,8 @@ union efi_boot_services { void *install_multiple_protocol_interfaces; void *uninstall_multiple_protocol_interfaces; void *calculate_crc32; - void *copy_mem; - void *set_mem; + void (__efiapi *copy_mem)(void *, const void *, unsigned long); + void (__efiapi *set_mem)(void *, unsigned long, unsigned char); void *create_event_ex; }; struct { diff --git a/drivers/firmware/efi/libstub/intrinsics.c b/drivers/firmware/efi/libstub/intrinsics.c new file mode 100644 index 000000000000..a04ab39292b6 --- /dev/null +++ b/drivers/firmware/efi/libstub/intrinsics.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include + +#include "efistub.h" + +#ifdef CONFIG_KASAN +#undef memcpy +#undef memmove +#undef memset +void *__memcpy(void *__dest, const void *__src, size_t __n) __alias(memcpy); +void *__memmove(void *__dest, const void *__src, size_t count) __alias(memmove); +void *__memset(void *s, int c, size_t count) __alias(memset); +#endif + +void *memcpy(void *dst, const void *src, size_t len) +{ + efi_bs_call(copy_mem, dst, src, len); + return dst; +} + +extern void *memmove(void *dst, const void *src, size_t len) __alias(memcpy); + +void *memset(void *dst, int c, size_t len) +{ + efi_bs_call(set_mem, dst, len, c & U8_MAX); + return dst; +} From patchwork Wed Aug 17 11:03:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 598293 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2487EC25B08 for ; Wed, 17 Aug 2022 11:04:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235721AbiHQLEN (ORCPT ); Wed, 17 Aug 2022 07:04:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239112AbiHQLEI (ORCPT ); Wed, 17 Aug 2022 07:04:08 -0400 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7ECCE543F4 for ; Wed, 17 Aug 2022 04:04:06 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id C6742CE1B46 for ; Wed, 17 Aug 2022 11:04:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7B975C433D7; Wed, 17 Aug 2022 11:03:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660734241; bh=PVzMuYMI51jPWnC5qPoxg799IuTEnko1dKe+EJ+Curs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=syAaBCmrl327HE06N9F+iRwUCjV+ulvgpIqGKRIlMRlnMqxHOeFqF7YS2E8EJon3d zhu2YGtK95B0QoKV4YghCuus7TRMNl2yqf6leFk8MF2zvJZjKwwrrPzY2/AGN3QWAY FvfYqRE5/tz7OmrVJLjPNGtf6n/RKpL9PM+qavE90sDqIXJhvfs8b0NWqscVpAf7aw hJmobmQvpM1wn/yqvNHQuYo3+cY2VDQKUjG6ns3oiNxZ3TEreVohEpwUvg8S//hX8p ZqnylMaOHgJsLVjr4NU05k9IRd73jlHyZ0kpGTVCrQMLoThAKkGkAa2GG+vGQ8H7XO dFaX5h9AJ3kQA== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: Ard Biesheuvel , "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Lennart Poettering , Jeremy Linton Subject: [PATCH v3 2/6] efi/libstub: add some missing boot service prototypes Date: Wed, 17 Aug 2022 13:03:41 +0200 Message-Id: <20220817110345.1771267-3-ardb@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817110345.1771267-1-ardb@kernel.org> References: <20220817110345.1771267-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1197; i=ardb@kernel.org; h=from:subject; bh=PVzMuYMI51jPWnC5qPoxg799IuTEnko1dKe+EJ+Curs=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBi/MsGGgLjshKD1C5PpWI3wmvxJsJfUnGCpsiuzzds WA/wrAOJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYvzLBgAKCRDDTyI5ktmPJAhtC/ 9dcpcTTXz4brbpsYjihM/bLDysewlJU07M9ezz6SYjuRoC4dARvLgLD44EjoTdElzFw0Xa2dHHHlK4 k/GO4QqUv1UZfKKRyaIeoY1qmf9FpSWWAST2b94iiGnx0TuVVilUYbWr9JwZLMwEqP3f+hV51CjexI qGj27Ro5xusQqll5P6rsJqF4UCNGJ4n2WbEPbPFIoRkmDZb1g8DJnU1DbNZXN+Ex3KsK7j0i0EmTHw fSsGhHhD4rhc9rbqGzN6F0dT3UEItPEPHhX+CFWaFqLv633t/r5PwK+tZ+aP4WtCt0tpMTsU0Jh1vo 6Giz0Nl6h5Hdd28wfQLLwsoeSXurm2doy+tXi7vfq3zRLsiexKp62DezLIsZl8qvGCiqjFsErlyYGM op4nzzJ1dBd7zqVbgAZZghB2g3BiJiwYfevytdMch3ws89xyql8h3KmZmFDulro+giaFpTrAO+IFq4 GoOa7RlO0CeIhST8hWEVNSc/Bo92tnogpy8fAcBg1Od5A= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org Define the correct prototypes for the load_image/start_image boot service pointers so we can call them from the EFI zboot code. Reviewed-by: Heinrich Schuchardt Signed-off-by: Ard Biesheuvel --- drivers/firmware/efi/libstub/efistub.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index a3377f0b1251..fbf2c83d6bf8 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h @@ -254,8 +254,12 @@ union efi_boot_services { efi_handle_t *); efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *, void *); - void *load_image; - void *start_image; + efi_status_t (__efiapi *load_image)(bool, efi_handle_t, + efi_device_path_protocol_t *, + void *, unsigned long, + efi_handle_t *); + efi_status_t (__efiapi *start_image)(efi_handle_t, unsigned long *, + efi_char16_t **); efi_status_t __noreturn (__efiapi *exit)(efi_handle_t, efi_status_t, unsigned long, From patchwork Wed Aug 17 11:03:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 597975 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6001AC25B08 for ; Wed, 17 Aug 2022 11:04:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239087AbiHQLER (ORCPT ); Wed, 17 Aug 2022 07:04:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43004 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239136AbiHQLEI (ORCPT ); Wed, 17 Aug 2022 07:04:08 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 11BDE5247F for ; Wed, 17 Aug 2022 04:04:06 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id A7A16B81C06 for ; Wed, 17 Aug 2022 11:04:05 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AB94EC433B5; Wed, 17 Aug 2022 11:04:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660734244; bh=tr21ngQHYKH/+KaT9/BCJPAMv3B9MW+jQ61wZD38oq8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R1sC1GM41HVJPjoKxazsK88daA/OqYVa7HD9dQs9Fg1BQc+blcOnAiV1FRYwz4Z3E BA3n4pPYKuLHSRvpMUuCshrj2fx6feNnHdV12Z9UHdE+z25LJwJg16tG0pk+EFU9RL NerXus0zmbon35A5tFW5fLnhWJ7FcFQ0liPLdOcPOfuY823XkECw1aoJX5y18VeTnh G38FQrP+l8bcTyy8VpGIt8G3jdR0khYmnXO1B7FeUcHu2A/czAx0yG2g030XkkihEX EHnj8R5o/oeE1gQcmLu5BjFI+RIaWaNH9d4otzVQop4ZJ9/Tmv8fktJBbWXQH8SRhl a/HjUxgdNq9qg== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: Ard Biesheuvel , "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Lennart Poettering , Jeremy Linton Subject: [PATCH v3 3/6] efi/libstub: move efi_system_table global var into separate object Date: Wed, 17 Aug 2022 13:03:42 +0200 Message-Id: <20220817110345.1771267-4-ardb@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817110345.1771267-1-ardb@kernel.org> References: <20220817110345.1771267-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1993; i=ardb@kernel.org; h=from:subject; bh=tr21ngQHYKH/+KaT9/BCJPAMv3B9MW+jQ61wZD38oq8=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBi/MsIYyGb4oObd/AMa+0Ewhp+ZKIPotQV+jRRBlfH iZs/sAKJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYvzLCAAKCRDDTyI5ktmPJFjxC/ 9yQquopj3AbKkOTqdNTSRhQP+3KaEfubCxILOrqDHhm51EIEGpjNFX8Kaf/GLbw3HpXeZsQTNp8/tp T6x0OiqfWxDQj0JB39BGFizbd6Yz6wb9kAZNJxT9a1xcqCqxNhy5DI+h3a0NkZmNQqAONlu9EKsy2S l/cM+lOx7zohEX92B5RoLarE5WdIkrOz363t0PCc0DEBz7Wy+wdVcAqJW1/GXwKMua9rJMtOVgqByR 2CZcVaqljjulzxPE0WoK+eg/0jZEQGUHTkyU5/+t8gXOL9fbMqno3XH3WTOJ+QbiPGcTtuGmOqItnc LSbu02SgvvFKR6d6j2Xckoh+taXYSV/xAqCDW/O04loUfK6MLt2KAdUZTyxkN9jVtfjCVv6yAniSpi qxD4VA6QK0uJWQl999NvH8BPSecIMC1U/EKJNhum/siOCgVdlelFOxNI2/Z5CHMzgZ8kd57JlEg+Wo pU5/Yt33TqJBAR7Yg912Y5OiVtu5390JfCI7XkpvXnwnA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org To avoid pulling in the wrong object when using the libstub static library to build the decompressor, define efi_system_table in a separate compilation unit. Signed-off-by: Ard Biesheuvel --- drivers/firmware/efi/libstub/Makefile | 2 +- drivers/firmware/efi/libstub/efi-stub.c | 2 -- drivers/firmware/efi/libstub/systable.c | 8 ++++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile index d7303c94b4a7..1406dc78edaa 100644 --- a/drivers/firmware/efi/libstub/Makefile +++ b/drivers/firmware/efi/libstub/Makefile @@ -56,7 +56,7 @@ lib-y := efi-stub-helper.o gop.o secureboot.o tpm.o \ file.o mem.o random.o randomalloc.o pci.o \ skip_spaces.o lib-cmdline.o lib-ctype.o \ alignedmem.o relocate.o vsprintf.o \ - intrinsics.o + intrinsics.o systable.o # include the stub's generic dependencies from lib/ when building for ARM/arm64 efi-deps-y := fdt_rw.c fdt_ro.c fdt_wip.c fdt.c fdt_empty_tree.c fdt_sw.c diff --git a/drivers/firmware/efi/libstub/efi-stub.c b/drivers/firmware/efi/libstub/efi-stub.c index f515394cce6e..ad179632f99f 100644 --- a/drivers/firmware/efi/libstub/efi-stub.c +++ b/drivers/firmware/efi/libstub/efi-stub.c @@ -49,8 +49,6 @@ static u64 virtmap_base = EFI_RT_VIRTUAL_BASE; static bool flat_va_mapping; -const efi_system_table_t *efi_system_table; - static struct screen_info *setup_graphics(void) { efi_guid_t gop_proto = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; diff --git a/drivers/firmware/efi/libstub/systable.c b/drivers/firmware/efi/libstub/systable.c new file mode 100644 index 000000000000..91d016b02f8c --- /dev/null +++ b/drivers/firmware/efi/libstub/systable.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include + +#include "efistub.h" + +const efi_system_table_t *efi_system_table; From patchwork Wed Aug 17 11:03:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 598292 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCF69C2BB41 for ; Wed, 17 Aug 2022 11:04:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239144AbiHQLER (ORCPT ); Wed, 17 Aug 2022 07:04:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42798 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239133AbiHQLEK (ORCPT ); Wed, 17 Aug 2022 07:04:10 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DC4CF558CF for ; Wed, 17 Aug 2022 04:04:08 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 41369614AB for ; Wed, 17 Aug 2022 11:04:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DC098C433D7; Wed, 17 Aug 2022 11:04:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660734247; bh=vyu+y3QYaG/i9NAqPJZ9e5xOVp4RiGzO5QMphfS/v5E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EdC3v8CSBpPmguXMem61RYiUSS//aeTxs+SghHm0g4O9XMjjGFkEWCG0YvIYQHl8v JzQst84QF1rvqsVds+oVwMlcbVftcsEt/kjAnJf/rpSy4MYhmpy3F3MNvjPhI6MdTG AVWr4sJ981y9ql2KUNY3/KHz0di1lHtdEVa4CzFzspVS9t7X16sUnA505BnjPyx+f4 pOT0ljRu5dIY3FfgKeef2KWkRsoTKMJVYdbv9qe/wpwlSElIlRrXSwE7eVMzL0/EAx ydyfreuBDQ7Td3fXjNbuYBayJbwD4MBPNvIKHl+s2i3Tv1GO+NxPO3UbAC8JcoMOEF 6DSoZ6z7rA7aQ== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: Ard Biesheuvel , "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Lennart Poettering , Jeremy Linton Subject: [PATCH v3 4/6] efi/libstub: implement generic EFI zboot Date: Wed, 17 Aug 2022 13:03:43 +0200 Message-Id: <20220817110345.1771267-5-ardb@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817110345.1771267-1-ardb@kernel.org> References: <20220817110345.1771267-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=15554; i=ardb@kernel.org; h=from:subject; bh=vyu+y3QYaG/i9NAqPJZ9e5xOVp4RiGzO5QMphfS/v5E=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBi/MsLNDt7XiQULbmTVApvwFOiZrZ4lhV1NEECzPHg UWI5ULCJAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYvzLCwAKCRDDTyI5ktmPJEA1C/ 426jt1CZq1DnnJhJ5wdjDWA88jXC/1oFpIQWOjXDhN0oU36r6sT99Bnb/XTpVS0E8QjizaId5bmyAK u0tiqLSzAnyRkutajSUe9+VwkxzGdKVsr9GTeefaggJNA8zQ838fxNdXBekagLtMr6VEH/Eb/m/G5s fvvT+OHsBkJnWks4hey08gBPSrW8ZP6LO0OLBLudi6BiymDu9pOs/4nWW68My4sWnmpoXLaX4bpO7A sbiEdbE4XjbQ8dz+/Di52ON2a2NLmsFRVYR/bpWmiHnPeaYE+neinxczr4nZ6UBDYtQBnFRc7w0rVW O71A7wxAVBPHFru33FoOlIDhugy4h4Yll/U66B/gZdf71IUoK33J241yCR1N/0125koGZabmlm1QPo aVAVskuDH3u//avGbDZG/ytWDu9HGuVA5RMRWzwJ5oeNb9dM1caPySN4zi7T0hvOtWKSxVZMJCyuec w+uSbCI/DZarSyTobnOk1gnsgGmukmyS3175wCmG+1cQM= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org Implement a minimal EFI app that decompresses the real kernel image and launches it using the firmware's LoadImage and StartImage boot services. This removes the need for any arch-specific hacks. Note that on systems that have UEFI secure boot policies enabled, LoadImage/StartImage require images to be signed, or their hashes known a priori, in order to be permitted to boot. There are various possible strategies to work around this requirement, but they all rely either on overriding internal PI/DXE protocols (which are not part of the EFI spec) or omitting the firmware provided LoadImage() and StartImage() boot services, which is also undesirable, given that they encapsulate platform specific policies related to secure boot and measured boot, but also related to memory permissions (whether or not and which types of heap allocations have both write and execute permissions.) The only generic and truly portable way around this is to simply sign both the inner and the outer image with the same key/cert pair, so this is what is implemented here. BZIP2 has been omitted from the set of supported compression algorithms, given that its performance is mediocre both in speed and size, and it uses a disproportionate amount of memory. For optimal compression, use LZMA. For the fastest boot speed, use LZO. Signed-off-by: Ard Biesheuvel --- drivers/firmware/efi/Kconfig | 31 ++++- drivers/firmware/efi/libstub/Makefile | 8 +- drivers/firmware/efi/libstub/Makefile.zboot | 69 ++++++++++ drivers/firmware/efi/libstub/zboot-header.S | 139 ++++++++++++++++++++ drivers/firmware/efi/libstub/zboot.c | 101 ++++++++++++++ drivers/firmware/efi/libstub/zboot.lds | 39 ++++++ 6 files changed, 382 insertions(+), 5 deletions(-) diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig index 6cb7384ad2ac..0c7beb8e3633 100644 --- a/drivers/firmware/efi/Kconfig +++ b/drivers/firmware/efi/Kconfig @@ -105,9 +105,36 @@ config EFI_RUNTIME_WRAPPERS config EFI_GENERIC_STUB bool +config EFI_ZBOOT + bool "Enable the generic EFI decompressor" + depends on EFI_GENERIC_STUB && !ARM + select HAVE_KERNEL_GZIP + select HAVE_KERNEL_LZ4 + select HAVE_KERNEL_LZMA + select HAVE_KERNEL_LZO + +config EFI_ZBOOT_SIGNED + bool "Sign the EFI decompressor for UEFI secure boot" + depends on EFI_ZBOOT + help + Use the 'sbsign' command line tool (which must exist on the host + path) to sign both the EFI decompressor PE/COFF image, as well as the + encapsulated PE/COFF image, which is subsequently compressed and + wrapped by the former image. + +config EFI_ZBOOT_SIGNING_CERT + string "Certificate to use for signing the compressed EFI boot image" + depends on EFI_ZBOOT_SIGNED + default "" + +config EFI_ZBOOT_SIGNING_KEY + string "Private key to use for signing the compressed EFI boot image" + depends on EFI_ZBOOT_SIGNED + default "" + config EFI_ARMSTUB_DTB_LOADER bool "Enable the DTB loader" - depends on EFI_GENERIC_STUB && !RISCV + depends on EFI_GENERIC_STUB && !RISCV && !EFI_ZBOOT default y help Select this config option to add support for the dtb= command @@ -124,7 +151,7 @@ config EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER bool "Enable the command line initrd loader" if !X86 depends on EFI_STUB && (EFI_GENERIC_STUB || X86) default y if X86 - depends on !RISCV + depends on !RISCV && !EFI_ZBOOT help Select this config option to add support for the initrd= command line parameter, allowing an initrd that resides on the same volume diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile index 1406dc78edaa..a3d3d38d5afd 100644 --- a/drivers/firmware/efi/libstub/Makefile +++ b/drivers/firmware/efi/libstub/Makefile @@ -73,6 +73,11 @@ lib-$(CONFIG_X86) += x86-stub.o lib-$(CONFIG_RISCV) += riscv-stub.o CFLAGS_arm32-stub.o := -DTEXT_OFFSET=$(TEXT_OFFSET) +lib-$(CONFIG_EFI_ZBOOT) += zboot.o + +extra-y := $(lib-y) +lib-y := $(patsubst %.o,%.stub.o,$(lib-y)) + # Even when -mbranch-protection=none is set, Clang will generate a # .note.gnu.property for code-less object files (like lib/ctype.c), # so work around this by explicitly removing the unwanted section. @@ -112,9 +117,6 @@ STUBCOPY_RELOC-$(CONFIG_ARM) := R_ARM_ABS # a verification pass to see if any absolute relocations exist in any of the # object files. # -extra-y := $(lib-y) -lib-y := $(patsubst %.o,%.stub.o,$(lib-y)) - STUBCOPY_FLAGS-$(CONFIG_ARM64) += --prefix-alloc-sections=.init \ --prefix-symbols=__efistub_ STUBCOPY_RELOC-$(CONFIG_ARM64) := R_AARCH64_ABS diff --git a/drivers/firmware/efi/libstub/Makefile.zboot b/drivers/firmware/efi/libstub/Makefile.zboot new file mode 100644 index 000000000000..38dee29103ae --- /dev/null +++ b/drivers/firmware/efi/libstub/Makefile.zboot @@ -0,0 +1,69 @@ +# SPDX-License-Identifier: GPL-2.0 + +# to be include'd by arch/$(ARCH)/boot/Makefile after setting +# EFI_ZBOOT_PAYLOAD, EFI_ZBOOT_BFD_TARGET and EFI_ZBOOT_MACH_TYPE + +comp-type-$(CONFIG_KERNEL_GZIP) := gzip +comp-type-$(CONFIG_KERNEL_LZ4) := lz4 +comp-type-$(CONFIG_KERNEL_LZMA) := lzma +comp-type-$(CONFIG_KERNEL_LZO) := lzo + +# in GZIP, the appended le32 carrying the uncompressed size is part of the +# format, but in other cases, we just append it at the end for convenience, +# causing the original tools to complain when checking image integrity. +# So disregard it when calculating the payload size in the zimage header. +zimage-method-y := $(comp-type-y)_with_size +zimage-size-len-y := 4 + +zimage-method-$(CONFIG_KERNEL_GZIP) := gzip +zimage-size-len-$(CONFIG_KERNEL_GZIP) := 0 + +quiet_cmd_sbsign = SBSIGN $@ + cmd_sbsign = sbsign --out $@ $< \ + --key $(CONFIG_EFI_ZBOOT_SIGNING_KEY) \ + --cert $(CONFIG_EFI_ZBOOT_SIGNING_CERT) \ + 2>/dev/null + +$(obj)/Image.signed: $(EFI_ZBOOT_PAYLOAD) FORCE + $(call if_changed,sbsign) + +ZBOOT_PAYLOAD-y := $(EFI_ZBOOT_PAYLOAD) +ZBOOT_PAYLOAD-$(CONFIG_EFI_ZBOOT_SIGNED) := $(obj)/Image.signed + +$(obj)/zImage: $(ZBOOT_PAYLOAD-y) FORCE + $(call if_changed,$(zimage-method-y)) + +OBJCOPYFLAGS_zImage.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) \ + --rename-section .data=.gzdata,load,alloc,readonly,contents +$(obj)/zImage.o: $(obj)/zImage FORCE + $(call if_changed,objcopy) + +AFLAGS_zboot-header.o += -DMACHINE_TYPE=IMAGE_FILE_MACHINE_$(EFI_ZBOOT_MACH_TYPE) \ + -DZIMG_EFI_PATH="\"$(realpath $(obj)/zImage.efi.elf)\"" \ + -DZIMG_SIZE_LEN=$(zimage-size-len-y) \ + -DCOMP_TYPE="\"$(comp-type-y)\"" + +$(obj)/zboot-header.o: $(srctree)/drivers/firmware/efi/libstub/zboot-header.S FORCE + $(call if_changed_rule,as_o_S) + +ZBOOT_DEPS := $(obj)/zboot-header.o $(objtree)/drivers/firmware/efi/libstub/lib.a + +LDFLAGS_zImage.efi.elf := -T $(srctree)/drivers/firmware/efi/libstub/zboot.lds +$(obj)/zImage.efi.elf: $(obj)/zImage.o $(ZBOOT_DEPS) FORCE + $(call if_changed,ld) + +ZIMAGE_EFI-y := zImage.efi +ZIMAGE_EFI-$(CONFIG_EFI_ZBOOT_SIGNED) := zImage.efi.unsigned + +OBJCOPYFLAGS_$(ZIMAGE_EFI-y) := -O binary +$(obj)/$(ZIMAGE_EFI-y): $(obj)/zImage.efi.elf FORCE + $(call if_changed,objcopy) + +targets += zboot-header.o zImage zImage.o zImage.efi.elf zImage.efi + +ifneq ($(CONFIG_EFI_ZBOOT_SIGNED),) +$(obj)/zImage.efi: $(obj)/zImage.efi.unsigned FORCE + $(call if_changed,sbsign) + +targets += Image.signed zImage.efi.unsigned +endif diff --git a/drivers/firmware/efi/libstub/zboot-header.S b/drivers/firmware/efi/libstub/zboot-header.S new file mode 100644 index 000000000000..ee6a3cd69773 --- /dev/null +++ b/drivers/firmware/efi/libstub/zboot-header.S @@ -0,0 +1,139 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include + +#ifdef CONFIG_64BIT + .set .Lextra_characteristics, 0x0 + .set .Lpe_opt_magic, PE_OPT_MAGIC_PE32PLUS +#else + .set .Lextra_characteristics, IMAGE_FILE_32BIT_MACHINE + .set .Lpe_opt_magic, PE_OPT_MAGIC_PE32 +#endif + + .section ".head", "a" + .globl __efistub_efi_zboot_header +__efistub_efi_zboot_header: +.Ldoshdr: + .long MZ_MAGIC + .ascii "zimg" // image type + .long __efistub__gzdata_start - .Ldoshdr // payload offset + .long __efistub__gzdata_size - ZIMG_SIZE_LEN // payload size + .long 0, 0 // reserved + .asciz COMP_TYPE // compression type + .org .Ldoshdr + 0x3c + .long .Lpehdr - .Ldoshdr // PE header offset + +.Lpehdr: + .long PE_MAGIC + .short MACHINE_TYPE + .short .Lsection_count + .long 0 + .long 0 + .long 0 + .short .Lsection_table - .Loptional_header + .short IMAGE_FILE_DEBUG_STRIPPED | \ + IMAGE_FILE_EXECUTABLE_IMAGE | \ + IMAGE_FILE_LINE_NUMS_STRIPPED |\ + .Lextra_characteristics + +.Loptional_header: + .short .Lpe_opt_magic + .byte 0, 0 + .long _etext - .Lefi_header_end + .long __data_size + .long 0 + .long __efistub_efi_zboot_entry - .Ldoshdr + .long .Lefi_header_end - .Ldoshdr + +#ifdef CONFIG_64BIT + .quad 0 +#else + .long _etext - .Ldoshdr, 0x0 +#endif + .long 4096 + .long 512 + .short 0, 0 + .short LINUX_EFISTUB_MAJOR_VERSION // MajorImageVersion + .short LINUX_EFISTUB_MINOR_VERSION // MinorImageVersion + .short 0, 0 + .long 0 + .long _end - .Ldoshdr + + .long .Lefi_header_end - .Ldoshdr + .long 0 + .short IMAGE_SUBSYSTEM_EFI_APPLICATION + .short 0 + .quad 0, 0, 0, 0 + .long 0 + .long (.Lsection_table - .) / 8 + + .quad 0 // ExportTable + .quad 0 // ImportTable + .quad 0 // ResourceTable + .quad 0 // ExceptionTable + .quad 0 // CertificationTable + .quad 0 // BaseRelocationTable +#ifdef CONFIG_DEBUG_EFI + .long .Lefi_debug_table - .Ldoshdr // DebugTable + .long .Lefi_debug_table_size +#endif + +.Lsection_table: + .ascii ".text\0\0\0" + .long _etext - .Lefi_header_end + .long .Lefi_header_end - .Ldoshdr + .long _etext - .Lefi_header_end + .long .Lefi_header_end - .Ldoshdr + + .long 0, 0 + .short 0, 0 + .long IMAGE_SCN_CNT_CODE | \ + IMAGE_SCN_MEM_READ | \ + IMAGE_SCN_MEM_EXECUTE + + .ascii ".data\0\0\0" + .long __data_size + .long _etext - .Ldoshdr + .long __data_rawsize + .long _etext - .Ldoshdr + + .long 0, 0 + .short 0, 0 + .long IMAGE_SCN_CNT_INITIALIZED_DATA | \ + IMAGE_SCN_MEM_READ | \ + IMAGE_SCN_MEM_WRITE + + .set .Lsection_count, (. - .Lsection_table) / 40 + +#ifdef CONFIG_DEBUG_EFI + .section ".rodata", "a" + .align 2 +.Lefi_debug_table: + // EFI_IMAGE_DEBUG_DIRECTORY_ENTRY + .long 0 // Characteristics + .long 0 // TimeDateStamp + .short 0 // MajorVersion + .short 0 // MinorVersion + .long IMAGE_DEBUG_TYPE_CODEVIEW // Type + .long .Lefi_debug_entry_size // SizeOfData + .long 0 // RVA + .long .Lefi_debug_entry - .Ldoshdr // FileOffset + + .set .Lefi_debug_table_size, . - .Lefi_debug_table + .previous + +.Lefi_debug_entry: + // EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY + .ascii "NB10" // Signature + .long 0 // Unknown + .long 0 // Unknown2 + .long 0 // Unknown3 + + .asciz ZIMG_EFI_PATH + + .set .Lefi_debug_entry_size, . - .Lefi_debug_entry +#endif + + .p2align 12 +.Lefi_header_end: + diff --git a/drivers/firmware/efi/libstub/zboot.c b/drivers/firmware/efi/libstub/zboot.c new file mode 100644 index 000000000000..9cf968e90775 --- /dev/null +++ b/drivers/firmware/efi/libstub/zboot.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include + +#include "efistub.h" + +static unsigned char zboot_heap[SZ_64K] __aligned(64); +static unsigned long free_mem_ptr, free_mem_end_ptr; + +#define STATIC static +#if defined(CONFIG_KERNEL_GZIP) +#include "../../../../lib/decompress_inflate.c" +#elif defined(CONFIG_KERNEL_LZ4) +#include "../../../../lib/decompress_unlz4.c" +#elif defined(CONFIG_KERNEL_LZMA) +#include "../../../../lib/decompress_unlzma.c" +#elif defined(CONFIG_KERNEL_LZO) +#include "../../../../lib/decompress_unlzo.c" +#endif + +extern char _gzdata_start[], _gzdata_end[]; +extern u32 uncompressed_size __aligned(1); + +static void log(efi_char16_t str[]) +{ + efi_call_proto(efi_table_attr(efi_system_table, con_out), + output_string, L"EFI decompressor: "); + efi_call_proto(efi_table_attr(efi_system_table, con_out), + output_string, str); +} + +static void error(char *x) +{ + log(L"error() called from decompressor library\n"); +} + +efi_status_t __efiapi efi_zboot_entry(efi_handle_t handle, + efi_system_table_t *systab) +{ + static efi_guid_t loaded_image = LOADED_IMAGE_PROTOCOL_GUID; + efi_loaded_image_t *parent, *child; + unsigned long image_buffer; + efi_handle_t child_handle; + efi_status_t status; + int ret; + + WRITE_ONCE(efi_system_table, systab); + + free_mem_ptr = (unsigned long)&zboot_heap; + free_mem_end_ptr = free_mem_ptr + sizeof(zboot_heap); + + status = efi_bs_call(handle_protocol, handle, &loaded_image, + (void **)&parent); + if (status != EFI_SUCCESS) { + log(L"Failed to locate parent's loaded image protocol\n"); + return status; + } + + status = efi_allocate_pages(uncompressed_size, &image_buffer, ULONG_MAX); + if (status != EFI_SUCCESS) { + log(L"Failed to allocate memory\n"); + return status; + } + + ret = __decompress(_gzdata_start, _gzdata_end - _gzdata_start, NULL, + NULL, (unsigned char *)image_buffer, 0, NULL, + error); + if (ret < 0) { + log(L"Decompression failed\n"); + return EFI_LOAD_ERROR; + } + + status = efi_bs_call(load_image, false, handle, NULL, + (void *)image_buffer, uncompressed_size, + &child_handle); + if (status != EFI_SUCCESS) { + log(L"Failed to load image\n"); + return status; + } + + status = efi_bs_call(handle_protocol, child_handle, &loaded_image, + (void **)&child); + if (status != EFI_SUCCESS) { + log(L"Failed to locate child's loaded image protocol\n"); + return status; + } + + // Copy the kernel command line + child->load_options = parent->load_options; + child->load_options_size = parent->load_options_size; + + status = efi_bs_call(start_image, child_handle, NULL, NULL); + if (status != EFI_SUCCESS) { + log(L"StartImage() returned with error\n"); + return status; + } + + return EFI_SUCCESS; +} diff --git a/drivers/firmware/efi/libstub/zboot.lds b/drivers/firmware/efi/libstub/zboot.lds new file mode 100644 index 000000000000..d6ba89a0c294 --- /dev/null +++ b/drivers/firmware/efi/libstub/zboot.lds @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +ENTRY(__efistub_efi_zboot_header); + +SECTIONS +{ + .text : ALIGN(4096) { + *(.head) + *(.text* .init.text*) + } + + .rodata : ALIGN(8) { + __efistub__gzdata_start = .; + *(.gzdata) + __efistub__gzdata_end = .; + *(.rodata* .init.rodata* .srodata*) + _etext = ALIGN(4096); + . = _etext; + } + + .data : ALIGN(4096) { + *(.data* .init.data*) + _edata = ALIGN(512); + . = _edata; + } + + .bss : { + *(.bss* .init.bss*) + _end = ALIGN(512); + . = _end; + } +} + +PROVIDE(__efistub__gzdata_size = ABSOLUTE(. - __efistub__gzdata_start)); + +PROVIDE(__efistub_uncompressed_size = __efistub__gzdata_end - 4); + +PROVIDE(__data_rawsize = ABSOLUTE(_edata - _etext)); +PROVIDE(__data_size = ABSOLUTE(_end - _etext)); From patchwork Wed Aug 17 11:03:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 597974 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80676C25B08 for ; Wed, 17 Aug 2022 11:04:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238854AbiHQLEV (ORCPT ); Wed, 17 Aug 2022 07:04:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239142AbiHQLEO (ORCPT ); Wed, 17 Aug 2022 07:04:14 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5579E543F5 for ; Wed, 17 Aug 2022 04:04:13 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 10832B81C94 for ; Wed, 17 Aug 2022 11:04:12 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 18DC4C43140; Wed, 17 Aug 2022 11:04:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660734250; bh=9+ofsl/lYT2YsqupXZY+5H4l+P8l1Its507nAq1D/W0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y1Nzl/Al19tElg1vUByyt8bfpJQv6nIPaJGStdP4Hxxt0tgfAqdVHcwlOYPf3J1Du ulyoSCK0AQPuMu5hYZV0MDrESTPq+uKBr4XQsOF4piSoRCBmXd1VERiGgKBqh8JSCR N2049bijFKyebuZ+TWlA9rGluy19O7U5PmFzom8jLXCmaGFE5tAq2eW57itxKhMQi9 yTpis8bNBrLgMsiNFRip+GBSb10p5b0JYSM0axB6bXkLYDXxMzu7WDS/h6u/L1+6Et fF5idqUB3ljx/Dh/UNF8pMuO6K2ZOu3VX6NxhnC8iVHV4Xp0qYc0r2aV6AwOvagVRl dHvWYt/qXxS/g== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: Ard Biesheuvel , "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Lennart Poettering , Jeremy Linton Subject: [PATCH v3 5/6] arm64: efi: enable generic EFI compressed boot Date: Wed, 17 Aug 2022 13:03:44 +0200 Message-Id: <20220817110345.1771267-6-ardb@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817110345.1771267-1-ardb@kernel.org> References: <20220817110345.1771267-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1400; i=ardb@kernel.org; h=from:subject; bh=9+ofsl/lYT2YsqupXZY+5H4l+P8l1Its507nAq1D/W0=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBi/MsN8wIhbNTqYfvWhUEyy8iAqP2gZK1cpyI2H82N 1z0EFT2JAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYvzLDQAKCRDDTyI5ktmPJOYMC/ 9yundKxAU9HHj6Dcyb1uKD2ErOlyWmh8YlYsXp/eOtIl9LUVWQ9ojFDGvkRItwocdLsvWJVTbm2rmU v+S5jmBOg6U2Gk0JotdEOIa4IIs9+Wd/xgbafbO9AHkLRP/NIFiA0NzcvQ5aZt07SuXVALT/3vO1YA HUELQnBGCykGIKYg80bgW5jo05YnTbREurpfT1PqwdH+vQm8OLwZIEpma01aqfugmSmg7dEPmrlbS4 g/MIB3dSiBAHCWSfia23kwcSaJGenwmuNYazVY8yEsswAlSbr8wQlMqgiB2ApnYF0j6/aKAk+MRU52 tJIV3Fof5vtE1WYV6GysQh1+fev01uhBglGPBOqbquq84Uztaw7sNf0yoViCEkAvEjH+HkI437Ie+B /e5qlsUrg4MDO3wYMl1WHRt1TOuqUCqzM+mnvJu1x4XyKR9ZHleHIF86yywCW5xcQUds/TSl2kmSpK LAk4DTzEREzXXE8dvNzhGJEs10cjFTEWp/pMHXbVj3NOA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org Wire up the generic EFI zboot support for arm64. Signed-off-by: Ard Biesheuvel --- arch/arm64/Makefile | 7 ++++++- arch/arm64/boot/Makefile | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile index 6d9d4a58b898..6a8b81cfa648 100644 --- a/arch/arm64/Makefile +++ b/arch/arm64/Makefile @@ -153,7 +153,7 @@ libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a boot := arch/arm64/boot KBUILD_IMAGE := $(boot)/Image.gz -all: Image.gz +all: $(notdir $(KBUILD_IMAGE)) Image: vmlinux @@ -162,6 +162,11 @@ Image: vmlinux Image.%: Image $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ +ifneq ($(CONFIG_EFI_ZBOOT),) +zImage.efi: Image + $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ +endif + install: KBUILD_IMAGE := $(boot)/Image install zinstall: $(call cmd,install) diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile index a0e3dedd2883..3e16bb85cdad 100644 --- a/arch/arm64/boot/Makefile +++ b/arch/arm64/boot/Makefile @@ -38,3 +38,9 @@ $(obj)/Image.lzo: $(obj)/Image FORCE $(obj)/Image.zst: $(obj)/Image FORCE $(call if_changed,zstd) + +EFI_ZBOOT_PAYLOAD := $(obj)/Image +EFI_ZBOOT_BFD_TARGET := elf64-littleaarch64 +EFI_ZBOOT_MACH_TYPE := ARM64 + +include $(srctree)/drivers/firmware/efi/libstub/Makefile.zboot From patchwork Wed Aug 17 11:03:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 598291 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 76ED3C25B08 for ; Wed, 17 Aug 2022 11:04:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236214AbiHQLEY (ORCPT ); Wed, 17 Aug 2022 07:04:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42798 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239138AbiHQLER (ORCPT ); Wed, 17 Aug 2022 07:04:17 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C3D6A52E7C for ; Wed, 17 Aug 2022 04:04:16 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 678B9B81CC2 for ; Wed, 17 Aug 2022 11:04:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4959DC433D6; Wed, 17 Aug 2022 11:04:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1660734254; bh=8IAJ0ZQrulsaPBLmhj3ziWJ6mZQt2SMXAvZ7QS0nG24=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V3TRiajrs05cwLyxXwsSzz/NH8snY8Gac2nP3zw0aUg9pR1gigN58M2NEAwIxt5c8 iuZNCK3BI3aHlvyPrQkPCDfLxX1gZN7nc+Q80YnjwFkSzfbCmxvUsj64pNMgBaPflR nV+75bXTEg8Cw/R8CsYjB1+ceePhDWc3hvJoX2v5NmcrLxCoB1e9xJgMmTaUMCSKNJ eU/8jj7txUQ/Y/ZXPB+oLeOGc6V8jCAGusv26R3BBbEa/kg/+kLjD7dpD8WXCOM3xb oZg0ahDK2KqZyxYEi6AoVmgSh7oI/HBlZnIWBoxQCdH2tQQOXsCCCI91xxmB9zOafE c9bkKSHq0BdrQ== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: Ard Biesheuvel , "James E.J. Bottomley" , Matthew Garrett , Peter Jones , Ilias Apalodimas , Heinrich Schuchardt , AKASHI Takahiro , Palmer Dabbelt , Atish Patra , Arnd Bergmann , Huacai Chen , Lennart Poettering , Jeremy Linton Subject: [PATCH v3 6/6] riscv: efi: enable generic EFI compressed boot Date: Wed, 17 Aug 2022 13:03:45 +0200 Message-Id: <20220817110345.1771267-7-ardb@kernel.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220817110345.1771267-1-ardb@kernel.org> References: <20220817110345.1771267-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1200; i=ardb@kernel.org; h=from:subject; bh=8IAJ0ZQrulsaPBLmhj3ziWJ6mZQt2SMXAvZ7QS0nG24=; b=owEB7QES/pANAwAKAcNPIjmS2Y8kAcsmYgBi/MsPOCIYdhgRvcW6uwKzfxp5TtSdl6L7YsvEuI23 SfpyFj6JAbMEAAEKAB0WIQT72WJ8QGnJQhU3VynDTyI5ktmPJAUCYvzLDwAKCRDDTyI5ktmPJHmzDA C/8mxrYSs+Ew1Ho63n634wqspGqrCXwePQArdpWTKfBkqRTz7tppFW41dVsF6uEbzC8X5JTrX0K8Yd QgK3/QwyBLX4Mu3qq1iNM9r8J0fnpHjGkV9gncudwdofESj8i0Kq3k58z2SibRf/qBD9wpWMbyCTS/ mtVYm6Z24FSXDUvoP/qa2XlF2Bt2N1CZN7Ga4v6nhgyqL2ZzmeOM3jCJWe0UZvbkS12sC/VOX5RGJ7 TLXuErECXo9LQ17zl1KHFCjVu9pQdUtz6Wem0yURIMIan5/HIw47JzEpo5GJLcvsCETl1/btVt8+Zx CgtUpz+CDSKep1DN0542RGSCYoyAUcSf9TTJnZ7aBZGtmt16XU5kWNzY3hf8a8pedxdPZmYZSPk3kI VGCAm3yQ9e2SHUoszehe/jlMJEGIlkBOLo+lwS4ijEK+jqWGyt30enPGFo2WaV3Fsctdut7Irh+044 +VE+OkLDho4fCFDsK+/aRPfzkEHcvqZDYA97tCLYdWt5Y= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Precedence: bulk List-ID: X-Mailing-List: linux-efi@vger.kernel.org Wire up the generic EFI zboot support for RISC-V. Signed-off-by: Ard Biesheuvel --- arch/riscv/Makefile | 5 +++++ arch/riscv/boot/Makefile | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile index 3fa8ef336822..23f1b934c825 100644 --- a/arch/riscv/Makefile +++ b/arch/riscv/Makefile @@ -150,6 +150,11 @@ $(BOOT_TARGETS): vmlinux Image.%: Image $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ +ifneq ($(CONFIG_EFI_ZBOOT),) +zImage.efi: Image + $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ +endif + install: KBUILD_IMAGE := $(boot)/Image zinstall: KBUILD_IMAGE := $(boot)/Image.gz install zinstall: diff --git a/arch/riscv/boot/Makefile b/arch/riscv/boot/Makefile index becd0621071c..82970c4a91b5 100644 --- a/arch/riscv/boot/Makefile +++ b/arch/riscv/boot/Makefile @@ -58,3 +58,9 @@ $(obj)/Image.lzo: $(obj)/Image FORCE $(obj)/loader.bin: $(obj)/loader FORCE $(call if_changed,objcopy) + +EFI_ZBOOT_PAYLOAD := $(obj)/Image +EFI_ZBOOT_BFD_TARGET := elf$(BITS)-littleriscv +EFI_ZBOOT_MACH_TYPE := RISCV$(BITS) + +include $(srctree)/drivers/firmware/efi/libstub/Makefile.zboot