From nobody Thu Sep 11 21:09:12 2025 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 C9488C001DE for ; Tue, 8 Aug 2023 16:30:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232846AbjHHQ3i (ORCPT ); Tue, 8 Aug 2023 12:29:38 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232731AbjHHQ20 (ORCPT ); Tue, 8 Aug 2023 12:28:26 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8297A1251D; Tue, 8 Aug 2023 08:51:02 -0700 (PDT) Date: Tue, 08 Aug 2023 08:43:59 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1691484239; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r8MSe0CeLnSuXDYNXmQMGffVQ+qqWANcy97jyL1wqRA=; b=ZRTnQ2X/RZ70sXWwIrfUBcu8cWR3hvaqzrzYrHIoRrBbpdx3WfABs0BZG7eiq4I4dT+Ui6 WJSDqY0fVR5WXXBtdAKmznTxX/wwCT4G3qXt9btoyZiAPdLfG00uDxnqYiUkQOqjzG9n0p sF7PVCDV9/WbO33LnSUgc9fW2QSDx4cB87vF80CRrC5ImyOlZCejWfPAW8SXd+kQntOtTq bUj3RoEBIFcg6cEPb/rEHAfD4fPnx0+YhIAYdAVE6k4SX0tqFECEDnxYbWP5wPWYeaMtJN 3ZgyaOSffTVsyJPHv2IVpM03K5L7xLyGadRF6Nd7nmNsyu4V0PtT/v1dVGbbbw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1691484239; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r8MSe0CeLnSuXDYNXmQMGffVQ+qqWANcy97jyL1wqRA=; b=j2aHBmoGe5zObUg1ajj5udUKdf8gpjp6/755aVGDJJ+G31NJtq+86PyRcz5H4AjKcXhbTi lg1QM2wczZtv7CDQ== From: "tip-bot2 for Ard Biesheuvel" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/boot] x86/decompressor: Factor out kernel decompression and relocation Cc: Ard Biesheuvel , "Borislav Petkov (AMD)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20230807162720.545787-21-ardb@kernel.org> References: <20230807162720.545787-21-ardb@kernel.org> MIME-Version: 1.0 Message-ID: <169148423908.27769.3075033623173952060.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/boot branch of tip: Commit-ID: 83381519352d6b5b3e429bf72aaab907480cb6b6 Gitweb: https://git.kernel.org/tip/83381519352d6b5b3e429bf72aaab9074= 80cb6b6 Author: Ard Biesheuvel AuthorDate: Mon, 07 Aug 2023 18:27:17 +02:00 Committer: Borislav Petkov (AMD) CommitterDate: Mon, 07 Aug 2023 20:59:13 +02:00 x86/decompressor: Factor out kernel decompression and relocation Factor out the decompressor sequence that invokes the decompressor, parses the ELF and applies the relocations so that it can be called directly from the EFI stub. Signed-off-by: Ard Biesheuvel Signed-off-by: Borislav Petkov (AMD) Link: https://lore.kernel.org/r/20230807162720.545787-21-ardb@kernel.org --- arch/x86/boot/compressed/misc.c | 28 +++++++++++++++++++++++----- arch/x86/include/asm/boot.h | 8 ++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/mis= c.c index 2d91d56..f711f2a 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -330,11 +330,33 @@ static size_t parse_elf(void *output) return ehdr.e_entry - LOAD_PHYSICAL_ADDR; } =20 +const unsigned long kernel_total_size =3D VO__end - VO__text; + static u8 boot_heap[BOOT_HEAP_SIZE] __aligned(4); =20 extern unsigned char input_data[]; extern unsigned int input_len, output_len; =20 +unsigned long decompress_kernel(unsigned char *outbuf, unsigned long virt_= addr, + void (*error)(char *x)) +{ + unsigned long entry; + + if (!free_mem_ptr) { + free_mem_ptr =3D (unsigned long)boot_heap; + free_mem_end_ptr =3D (unsigned long)boot_heap + sizeof(boot_heap); + } + + if (__decompress(input_data, input_len, NULL, NULL, outbuf, output_len, + NULL, error) < 0) + return ULONG_MAX; + + entry =3D parse_elf(outbuf); + handle_relocations(outbuf, output_len, virt_addr); + + return entry; +} + /* * The compressed kernel image (ZO), has been moved so that its position * is against the end of the buffer used to hold the uncompressed kernel @@ -354,7 +376,6 @@ extern unsigned int input_len, output_len; */ asmlinkage __visible void *extract_kernel(void *rmode, unsigned char *outp= ut) { - const unsigned long kernel_total_size =3D VO__end - VO__text; unsigned long virt_addr =3D LOAD_PHYSICAL_ADDR; memptr heap =3D (memptr)boot_heap; unsigned long needed_size; @@ -463,10 +484,7 @@ asmlinkage __visible void *extract_kernel(void *rmode,= unsigned char *output) accept_memory(__pa(output), __pa(output) + needed_size); } =20 - __decompress(input_data, input_len, NULL, NULL, output, output_len, - NULL, error); - entry_offset =3D parse_elf(output); - handle_relocations(output, output_len, virt_addr); + entry_offset =3D decompress_kernel(output, virt_addr, error); =20 debug_putstr("done.\nBooting the kernel (entry_offset: 0x"); debug_puthex(entry_offset); diff --git a/arch/x86/include/asm/boot.h b/arch/x86/include/asm/boot.h index 9191280..4ae1433 100644 --- a/arch/x86/include/asm/boot.h +++ b/arch/x86/include/asm/boot.h @@ -62,4 +62,12 @@ # define BOOT_STACK_SIZE 0x1000 #endif =20 +#ifndef __ASSEMBLY__ +extern unsigned int output_len; +extern const unsigned long kernel_total_size; + +unsigned long decompress_kernel(unsigned char *outbuf, unsigned long virt_= addr, + void (*error)(char *x)); +#endif + #endif /* _ASM_X86_BOOT_H */