Received: by 2002:a05:6359:6284:b0:131:369:b2a3 with SMTP id se4csp3205738rwb; Mon, 7 Aug 2023 09:42:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGmfkdWn31FuGsVT+aeVeibPpIByaVz5WYeobx6OrPAQTEgS9HNrNVR75kEGmAfNQRQvr4s X-Received: by 2002:a17:90a:648e:b0:269:621e:a673 with SMTP id h14-20020a17090a648e00b00269621ea673mr2169950pjj.1.1691426567756; Mon, 07 Aug 2023 09:42:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691426567; cv=none; d=google.com; s=arc-20160816; b=JjeW+TG2QW4cbX+N91NySghllrztyvDHv7rYvPiGOk4rF+U1gA3p5thPhvsqgF/7a8 RbXg2Yl3IdEWGw+AY6wJrNcF0abGGtXtce4x33d5FkhRS6RyV/cyl7+aOlpoyjL2ogI1 L9esxNHCEfLfyx56qpACdGukjOztE9M1WjbUq3tuvEK5gowr11CUk+ldaWApN+VT67i/ BVVoTgh6lJKJFBBJUc/niUIT7Rr/2/fkUosPxHQ8alKDGINvKJgxQh+dBactWTXQ36Qm Fi57++eQ1zBbbn2MtckZu7SVb6U0VMrF8jSav1ZZxdyS5istlwJhVnhY8SWyDH1+6FTA sKYw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=zW8jY2pNK1XqhCVf9zwn8MoXVkfdk0NGUJ3de32botk=; fh=cABQbWJU7O0a+UPgHSiwUQ6sY/R0G63oUvu0DeYA5T8=; b=f1qL+XmYK3OMmru6SwKW7bDtL7dhgTAOVbDqRp06U7MF8vu6xf3vUdnZVWm2WAI5Mw MDUmu6TjmbMd1AtlszjF/vxfEMjr2dqu4syaUODm4wbggFiB43lMTIy6t5GShMSG65kK aYL2Lb7yUXQJlxu8uoakhPh0t74jfBZxg7IO4g6G/mzzqPI0AHnlnnv5hya29RdLq0yA K4jDZz+xrlzVMngtgewpfJyomSL4ajvEGrR32xb13cOgpvsj/SBlw4qA57j03CDOsfwW 3amQtQnDIJT7aaeNzMP7rO5MqvL1w7ddbqd3iXNswh8qgpO2UJiMb7iXmq0ssISz395j 2GvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=pQpCedhr; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id lj7-20020a17090b344700b0026826148914si6056374pjb.32.2023.08.07.09.42.36; Mon, 07 Aug 2023 09:42:47 -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; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=pQpCedhr; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231609AbjHGQ3O (ORCPT + 99 others); Mon, 7 Aug 2023 12:29:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231792AbjHGQ2v (ORCPT ); Mon, 7 Aug 2023 12:28:51 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CCEA019A9; Mon, 7 Aug 2023 09:28:21 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A648161E12; Mon, 7 Aug 2023 16:28:21 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 883A2C433BC; Mon, 7 Aug 2023 16:28:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1691425701; bh=6lDMuI/WecUFs3bb1WoCYz9wip7qMV2yUSkgF3fUv7Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pQpCedhrdplqsjEYDg4ukXxPY/T16Q1CgawHlFqogi0L1SoVMMxLjdDnY2QBc4pH2 JgpqbckvaFE7YVGgJk8d5Is7pQFLsvKg0A+aCngUZb6lYXprNhhE7qn2Kx5NmQGxgm wvxHghdQeP4NnL6tUyKWHgeyG1Brc/MyoZDreeRub3NOVuty7NP5O2xFE+DcnCJUUx BGuTe1KyGe7R5Lpm/yWnSYB2DB8TqqDP31fpJDX9I/K1EVUYDvy6GSXzQ6YV3uLAIf 9Od9e9UxzB/0HHs1mADSAWP7rIFUZLm+tzIG2fwntFs7MvPKQx57GISLdXb9wzL+cw +iqUW5J8Kw6MQ== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel , Borislav Petkov , Dave Hansen , Ingo Molnar , Thomas Gleixner Subject: [PATCH v9 19/23] x86/decompressor: Move global symbol references to C code Date: Mon, 7 Aug 2023 18:27:16 +0200 Message-Id: <20230807162720.545787-20-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230807162720.545787-1-ardb@kernel.org> References: <20230807162720.545787-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5127; i=ardb@kernel.org; h=from:subject; bh=6lDMuI/WecUFs3bb1WoCYz9wip7qMV2yUSkgF3fUv7Q=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIeWidNLjeXPX+C6sUxddsTtwseNzdaFZddvVd4gzz02IU VmztDOuo5SFQYyDQVZMkUVg9t93O09PlKp1niULM4eVCWQIAxenAEyE9wDDXwFthzbLLayhzstY XzK26jv6dyy+4Dlfu2UuizILZ6LMLob/Pgsy1Vdqxj2oCJMzS/z3pmwnY94hrxc+x27/yvn06pc FFwA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS 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 It is no longer necessary to be cautious when referring to global variables in the position independent decompressor code, now that it is built using PIE codegen and makes an assertion in the linker script that no GOT entries exist (which would require adjustment for the actual runtime load address of the decompressor binary). This means global variables can be referenced directly from C code, instead of having to pass their runtime addresses into C routines from asm code, which needs to happen at each call site. Do so for the code that will be called directly from the EFI stub after a subsequent patch, and avoid the need to duplicate this logic a third time. Signed-off-by: Ard Biesheuvel --- arch/x86/boot/compressed/head_32.S | 8 -------- arch/x86/boot/compressed/head_64.S | 10 ++-------- arch/x86/boot/compressed/misc.c | 16 +++++++++------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index 8876ffe30e9a4819..3af4a383615b3e1f 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S @@ -168,13 +168,7 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) */ /* push arguments for extract_kernel: */ - pushl output_len@GOTOFF(%ebx) /* decompressed length, end of relocs */ pushl %ebp /* output address */ - pushl input_len@GOTOFF(%ebx) /* input_len */ - leal input_data@GOTOFF(%ebx), %eax - pushl %eax /* input_data */ - leal boot_heap@GOTOFF(%ebx), %eax - pushl %eax /* heap area */ pushl %esi /* real mode pointer */ call extract_kernel /* returns kernel entry point in %eax */ addl $24, %esp @@ -202,8 +196,6 @@ SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end) */ .bss .balign 4 -boot_heap: - .fill BOOT_HEAP_SIZE, 1, 0 boot_stack: .fill BOOT_STACK_SIZE, 1, 0 boot_stack_end: diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index fb0e562c26f64c9c..28f46051c706724e 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -493,13 +493,9 @@ SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated) /* * Do the extraction, and jump to the new kernel.. */ - /* pass struct boot_params pointer */ + /* pass struct boot_params pointer and output target address */ movq %r15, %rdi - leaq boot_heap(%rip), %rsi /* malloc area for uncompression */ - leaq input_data(%rip), %rdx /* input_data */ - movl input_len(%rip), %ecx /* input_len */ - movq %rbp, %r8 /* output target address */ - movl output_len(%rip), %r9d /* decompressed length, end of relocs */ + movq %rbp, %rsi call extract_kernel /* returns kernel entry point in %rax */ /* @@ -657,8 +653,6 @@ SYM_DATA_END_LABEL(boot_idt, SYM_L_GLOBAL, boot_idt_end) */ .bss .balign 4 -SYM_DATA_LOCAL(boot_heap, .fill BOOT_HEAP_SIZE, 1, 0) - SYM_DATA_START_LOCAL(boot_stack) .fill BOOT_STACK_SIZE, 1, 0 .balign 16 diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 94b7abcf624b3b55..2d91d56b59e1af93 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c @@ -330,6 +330,11 @@ static size_t parse_elf(void *output) return ehdr.e_entry - LOAD_PHYSICAL_ADDR; } +static u8 boot_heap[BOOT_HEAP_SIZE] __aligned(4); + +extern unsigned char input_data[]; +extern unsigned int input_len, output_len; + /* * 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 @@ -347,14 +352,11 @@ static size_t parse_elf(void *output) * |-------uncompressed kernel image---------| * */ -asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, - unsigned char *input_data, - unsigned long input_len, - unsigned char *output, - unsigned long output_len) +asmlinkage __visible void *extract_kernel(void *rmode, unsigned char *output) { const unsigned long kernel_total_size = VO__end - VO__text; unsigned long virt_addr = LOAD_PHYSICAL_ADDR; + memptr heap = (memptr)boot_heap; unsigned long needed_size; size_t entry_offset; @@ -412,7 +414,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, * entries. This ensures the full mapped area is usable RAM * and doesn't include any reserved areas. */ - needed_size = max(output_len, kernel_total_size); + needed_size = max_t(unsigned long, output_len, kernel_total_size); #ifdef CONFIG_X86_64 needed_size = ALIGN(needed_size, MIN_KERNEL_ALIGN); #endif @@ -443,7 +445,7 @@ asmlinkage __visible void *extract_kernel(void *rmode, memptr heap, #ifdef CONFIG_X86_64 if (heap > 0x3fffffffffffUL) error("Destination address too large"); - if (virt_addr + max(output_len, kernel_total_size) > KERNEL_IMAGE_SIZE) + if (virt_addr + needed_size > KERNEL_IMAGE_SIZE) error("Destination virtual address is beyond the kernel mapping area"); #else if (heap > ((-__PAGE_OFFSET-(128<<20)-1) & 0x7fffffff)) -- 2.39.2