From mboxrd@z Thu Jan 1 00:00:00 1970 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5D10BC77B78 for ; Wed, 26 Apr 2023 15:58:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=79QFL0SvbfWKMEn5XYjQCiN6UxNvuG5DPAwOTKhYbIE=; b=24WafVOxDBUjdB /ldogETTw1LYO9/lmkwk6ZiNpg5I90/vN8MCx2b03RGJMipxIDp8spTyLIJeAs3CTQRYZTUXdMo8W ClY05TN9REEJyc4wjBphr8yKmDzb1XkhoBsgAMMO2ojG1EWWDTA+4hqcPJZnRKdc8OCv0uOMLZBxe 16D65DRy4PLu9OYxK3D6EVMj9oe2LFC2jZdpNR/heUsrUimwETVC/kcRtI7aT1rxt0gARMi6F72u0 RKE3s/ZRZqmF6k6d0UM9Sa5bJ/Ye5Bc5sD1S3mV1rVWGpalWApU83U7hwGzhoIykXibRrPru8hUS4 N3usBwnn8zx3KdINt0Lw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1prhWs-004L9b-2J; Wed, 26 Apr 2023 15:58:02 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1prhWp-004L7r-0J for linux-arm-kernel@lists.infradead.org; Wed, 26 Apr 2023 15:58:01 +0000 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 B55051FB; Wed, 26 Apr 2023 08:58:36 -0700 (PDT) Received: from FVFF77S0Q05N (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E1C933F587; Wed, 26 Apr 2023 08:57:51 -0700 (PDT) Date: Wed, 26 Apr 2023 16:57:42 +0100 From: Mark Rutland To: Ard Biesheuvel Cc: linux-arm-kernel@lists.infradead.org, linux-efi@vger.kernel.org, catalin.marinas@arm.com, will@kernel.org Subject: Re: [PATCH 2/2] efi/zboot: arm64: Grab kernel code size from zboot payload Message-ID: References: <20230426141103.2464423-1-ardb@kernel.org> <20230426141103.2464423-3-ardb@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230426_085759_249069_57707642 X-CRM114-Status: GOOD ( 32.80 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Wed, Apr 26, 2023 at 03:20:43PM +0100, Ard Biesheuvel wrote: > On Wed, 26 Apr 2023 at 15:11, Ard Biesheuvel wrote: > > > > Instead of relying on a dodgy dd hack to copy the image code size from > > the uncompressed image's PE header to the end of the compressed image, > > > > let's grab the code size from the text_offset field of the arm64 image > > header after decompression, which is where the arm64 specific EFI zboot > > make rules will poke the code size when generating the zboot specific > > version of the binary Image payload. > > > > Apologies, I failed to update the above when I changed the actual > patch. It should read: > > "let's grab the code size from the symbol that is injected into the > ELF by the Kbuild rules that generate the compressed payload". With the corrected wording: Acked-by: Mark Rutland Mark. > > > > Signed-off-by: Ard Biesheuvel > > --- > > drivers/firmware/efi/libstub/Makefile.zboot | 14 +++----------- > > drivers/firmware/efi/libstub/arm64.c | 19 +++++++++++++------ > > drivers/firmware/efi/libstub/efistub.h | 3 +-- > > drivers/firmware/efi/libstub/zboot.c | 15 ++++----------- > > 4 files changed, 21 insertions(+), 30 deletions(-) > > > > diff --git a/drivers/firmware/efi/libstub/Makefile.zboot b/drivers/firmware/efi/libstub/Makefile.zboot > > index 1b101d9076fd49e5..89ef820f3b34483a 100644 > > --- a/drivers/firmware/efi/libstub/Makefile.zboot > > +++ b/drivers/firmware/efi/libstub/Makefile.zboot > > @@ -24,21 +24,13 @@ comp-type-$(CONFIG_KERNEL_ZSTD) := zstd22 > > # causing the original tools to complain when checking image integrity. > > # So disregard it when calculating the payload size in the zimage header. > > zboot-method-y := $(comp-type-y)_with_size > > -zboot-size-len-y := 12 > > +zboot-size-len-y := 4 > > > > zboot-method-$(CONFIG_KERNEL_GZIP) := gzip > > -zboot-size-len-$(CONFIG_KERNEL_GZIP) := 8 > > - > > -# Copy the SizeOfHeaders and SizeOfCode fields from the payload to the end of > > -# the compressed image. Note that this presupposes a PE header offset of 64 > > -# bytes, which is what arm64, RISC-V and LoongArch use. > > -quiet_cmd_compwithsize = $(quiet_cmd_$(zboot-method-y)) > > - cmd_compwithsize = $(cmd_$(zboot-method-y)) && ( \ > > - dd status=none if=$< bs=4 count=1 skip=37 ; \ > > - dd status=none if=$< bs=4 count=1 skip=23 ) >> $@ > > +zboot-size-len-$(CONFIG_KERNEL_GZIP) := 0 > > > > $(obj)/vmlinuz: $(obj)/vmlinux.bin FORCE > > - $(call if_changed,compwithsize) > > + $(call if_changed,$(zboot-method-y)) > > > > OBJCOPYFLAGS_vmlinuz.o := -I binary -O $(EFI_ZBOOT_BFD_TARGET) $(EFI_ZBOOT_OBJCOPY_FLAGS) \ > > --rename-section .data=.gzdata,load,alloc,readonly,contents > > diff --git a/drivers/firmware/efi/libstub/arm64.c b/drivers/firmware/efi/libstub/arm64.c > > index 8aad8c49d43f18e0..446e35eaf3d9434c 100644 > > --- a/drivers/firmware/efi/libstub/arm64.c > > +++ b/drivers/firmware/efi/libstub/arm64.c > > @@ -9,6 +9,7 @@ > > > > #include > > #include > > +#include > > #include > > #include > > > > @@ -88,9 +89,10 @@ efi_status_t check_platform_features(void) > > #define DCTYPE "cvau" > > #endif > > > > +u32 __weak code_size; > > + > > void efi_cache_sync_image(unsigned long image_base, > > - unsigned long alloc_size, > > - unsigned long code_size) > > + unsigned long alloc_size) > > { > > u32 ctr = read_cpuid_effective_cachetype(); > > u64 lsize = 4 << cpuid_feature_extract_unsigned_field(ctr, > > @@ -98,16 +100,21 @@ void efi_cache_sync_image(unsigned long image_base, > > > > /* only perform the cache maintenance if needed for I/D coherency */ > > if (!(ctr & BIT(CTR_EL0_IDC_SHIFT))) { > > + unsigned long base = image_base; > > + unsigned long size = code_size; > > + > > do { > > - asm("dc " DCTYPE ", %0" :: "r"(image_base)); > > - image_base += lsize; > > - code_size -= lsize; > > - } while (code_size >= lsize); > > + asm("dc " DCTYPE ", %0" :: "r"(base)); > > + base += lsize; > > + size -= lsize; > > + } while (size >= lsize); > > } > > > > asm("ic ialluis"); > > dsb(ish); > > isb(); > > + > > + efi_remap_image(image_base, alloc_size, code_size); > > } > > > > unsigned long __weak primary_entry_offset(void) > > diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h > > index 148013bcb5f89fdd..67d5a20802e0b7c6 100644 > > --- a/drivers/firmware/efi/libstub/efistub.h > > +++ b/drivers/firmware/efi/libstub/efistub.h > > @@ -1066,8 +1066,7 @@ struct screen_info *__alloc_screen_info(void); > > void free_screen_info(struct screen_info *si); > > > > void efi_cache_sync_image(unsigned long image_base, > > - unsigned long alloc_size, > > - unsigned long code_size); > > + unsigned long alloc_size); > > > > struct efi_smbios_record { > > u8 type; > > diff --git a/drivers/firmware/efi/libstub/zboot.c b/drivers/firmware/efi/libstub/zboot.c > > index 63ece480090032c1..e5d7fa1f1d8fd160 100644 > > --- a/drivers/firmware/efi/libstub/zboot.c > > +++ b/drivers/firmware/efi/libstub/zboot.c > > @@ -50,8 +50,7 @@ static unsigned long alloc_preferred_address(unsigned long alloc_size) > > } > > > > void __weak efi_cache_sync_image(unsigned long image_base, > > - unsigned long alloc_size, > > - unsigned long code_size) > > + unsigned long alloc_size) > > { > > // Provided by the arch to perform the cache maintenance necessary for > > // executable code loaded into memory to be safe for execution. > > @@ -66,7 +65,7 @@ asmlinkage efi_status_t __efiapi > > efi_zboot_entry(efi_handle_t handle, efi_system_table_t *systab) > > { > > unsigned long compressed_size = _gzdata_end - _gzdata_start; > > - unsigned long image_base, alloc_size, code_size; > > + unsigned long image_base, alloc_size; > > efi_loaded_image_t *image; > > efi_status_t status; > > char *cmdline_ptr; > > @@ -91,13 +90,9 @@ efi_zboot_entry(efi_handle_t handle, efi_system_table_t *systab) > > efi_info("Decompressing Linux Kernel...\n"); > > > > // SizeOfImage from the compressee's PE/COFF header > > - alloc_size = round_up(get_unaligned_le32(_gzdata_end - 12), > > + alloc_size = round_up(get_unaligned_le32(_gzdata_end - 4), > > EFI_ALLOC_ALIGN); > > > > - // SizeOfHeaders and SizeOfCode from the compressee's PE/COFF header > > - code_size = get_unaligned_le32(_gzdata_end - 4) + > > - get_unaligned_le32(_gzdata_end - 8); > > - > > // If the architecture has a preferred address for the image, > > // try that first. > > image_base = alloc_preferred_address(alloc_size); > > @@ -140,9 +135,7 @@ efi_zboot_entry(efi_handle_t handle, efi_system_table_t *systab) > > goto free_image; > > } > > > > - efi_cache_sync_image(image_base, alloc_size, code_size); > > - > > - efi_remap_image(image_base, alloc_size, code_size); > > + efi_cache_sync_image(image_base, alloc_size); > > > > status = efi_stub_common(handle, image, image_base, cmdline_ptr); > > > > -- > > 2.39.2 > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel