Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp4949378rdb; Fri, 15 Sep 2023 18:45:53 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFhjO5yFGD94mqEzCYVZo/jPJbIO1GEiWsB58BkvYmrFHcVSed0hQEd3rqfxh2z7X+xV+tp X-Received: by 2002:a05:6a20:564c:b0:14c:d494:77c3 with SMTP id is12-20020a056a20564c00b0014cd49477c3mr2849572pzc.33.1694828753161; Fri, 15 Sep 2023 18:45:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694828753; cv=none; d=google.com; s=arc-20160816; b=0wioG1TrqAGg42C+5KMfN0F8GHWf0W2D6sVsIVJSW6OyIV3zesAnnFliCm/NaIULea +N9nR7JP0C4XAk/ynUAno3FaeyzVgxaL/KKgOlYOpMqaW9TlGFmBemwRjG1enuy48IXv hKwf8sqzU0MpBoDMSyY+LMEfjF1yOek9CZFIYAvi5BAlGtcPknq8AOBoM7fdVoLghGcp YXRH+Fy+k++xVeYG8wyoOc3Y3GP2TjTFXGDRbJjcCGLnrcTWvaQxtW+oJuGVBIpwYRLT 1LStkIgrRV9UIurxx0x6OEO3EqC2KJLmGQH9obUKurXtbiOzVshmJ0QXneyY+2aJ6asn VDbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=dns2e/ei4HJSlkg9p+qs7vYRajpuivxlD+SN4Zxl2pk=; fh=WGxnbchXB1nh8WtfYTQqAYq5ggcl91wEfddYAfjE7VI=; b=ITmBloRpxO+3XbblgEb3c5EdS4xIxWCY4o7EeYnQWKyCH/7nOpV5Fwy/HPEpzRNepp 2ckwk2cFZdqcG5QwbndcKD5W4S2ARvTG3SSOemYdFIjQJKODDsvmYbBbKRGpwiltPr0U DyK1ZWgs9H8jQJD5fwdBMDRsS8AjtBgl2+Vsf/6Jk0djUzqjGaVRR6FySpJDty4Pqcc0 KlgGn+NQ5YAIPJcF8ZYOHnkDEG5Vrv/HFZh7PsRriLk+TR9lXdAqjQY1BkZXdPBobA/r Tfb52KYRFmkDk57XsL3vkOPxolWNcPCrj7gjkq8qAYhgjGV4iAFl7Gb8AtWc5XeJCYJf k/QQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=pqpk2r9X; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id j6-20020a170903024600b001b9e31bda39si4488119plh.118.2023.09.15.18.45.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 Sep 2023 18:45:53 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=pqpk2r9X; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id DF42F83A07B1; Fri, 15 Sep 2023 10:18:36 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235861AbjIORRd (ORCPT + 99 others); Fri, 15 Sep 2023 13:17:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41230 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235520AbjIORRM (ORCPT ); Fri, 15 Sep 2023 13:17:12 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0831A186 for ; Fri, 15 Sep 2023 10:17:07 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-597f461adc5so30987857b3.1 for ; Fri, 15 Sep 2023 10:17:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1694798226; x=1695403026; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=dns2e/ei4HJSlkg9p+qs7vYRajpuivxlD+SN4Zxl2pk=; b=pqpk2r9XYHF+apKjWTnl/WWsCOmsuUnMtJa/Na2vk6HgEx4DwaIzYZ/5YQvWFG+bQf tZ2Ogf+JRHstddgdgFrMNM0pC3ZwN7Jj+KPXEB8FDZijW6DnpmV1lLV66aaFHcmzCw/l nmM0lyh1Am4TqwjxFgYC3m4ejm8ZKT7JSBZhI68FjkXc2UBOQwoz6D72W7y7aIUt1J6b H1iRD2M7Z6RHUW6W/6UoVtG5beFy+g1l/ewqL9usGtjilh+ZqywszlHQoEjlIwcII/k1 ZBnMXwjSe/ZldqPsOJnpT6EApQTdT/zxZPcfl/AlQde/fRpqBp5zYLX3+UrYxnOkY3vZ GVgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694798226; x=1695403026; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dns2e/ei4HJSlkg9p+qs7vYRajpuivxlD+SN4Zxl2pk=; b=Rkrja8YqaA7jvfPLEjcR1X37KuzVxTNedjOeOAxup1zXzPKaVzXgPvSNcHBJH6NHyY Nw750EiyQ2OeXtl78tYllGXEpwhmeKT93evi0BrfrWKNynTJtyQ2i+j2r4Gue4gq+Jx9 kUec9Vwio87NXGOicc7NRARjcJT/Ii9v8IA5or0GZeldnh9b5PyzhpzmGcDmU/dXfAzU WHGoXEMiumPyTCps0BhsR0197vMTm38ZybNmpgOeyU/PJkuWToSLqGAC1VMQahrrroqb GF0c6jbY5ksKxRJGo0Fuk1HmRe8X18rglyTrJcBpPzZAkWgf0n0oSPyNejF8Gq5TNdBl 3woQ== X-Gm-Message-State: AOJu0YwBtT1jLKDMFcQFQHl4XNQ4xBSMBM+03bFkZFmkaK0Swfx9AqId dZMzZY4qjWPvo3dgYzrweO99Ap99 X-Received: from palermo.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:118a]) (user=ardb job=sendgmr) by 2002:a81:ad41:0:b0:59b:ea96:8875 with SMTP id l1-20020a81ad41000000b0059bea968875mr54512ywk.2.1694798226304; Fri, 15 Sep 2023 10:17:06 -0700 (PDT) Date: Fri, 15 Sep 2023 17:16:28 +0000 In-Reply-To: <20230915171623.655440-10-ardb@google.com> Mime-Version: 1.0 References: <20230915171623.655440-10-ardb@google.com> X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-Developer-Signature: v=1; a=openpgp-sha256; l=5004; i=ardb@kernel.org; h=from:subject; bh=el53dGhwvl4Ez0cZfyU3upsy6TEtXMx3UHruCwXxMPY=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIZVlYo5J9+M7uWI7vxu/lDir/0upt0H11td3znGrynsqa sPurXDrKGVhEONgkBVTZBGY/ffdztMTpWqdZ8nCzGFlAhnCwMUpABNJ5GL4H3NT3Yk9tfppY83Z U9P6D+n0pX9eMrs6aV3TtP/X5h7e4szIsGWZyPTt1gVrQxTs1nLM3mshu2yH3E4Ro1/x06crve2 LYwEA X-Mailer: git-send-email 2.42.0.459.ge4e396fd5e-goog Message-ID: <20230915171623.655440-14-ardb@google.com> Subject: [PATCH v3 4/8] x86/boot: Derive file size from _edata symbol From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel , Evgeniy Baskov , Borislav Petkov , Dave Hansen , Ingo Molnar , Thomas Gleixner , Peter Jones , Matthew Garrett , Gerd Hoffmann , Kees Cook , "H. Peter Anvin" Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-8.4 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Fri, 15 Sep 2023 10:18:37 -0700 (PDT) From: Ard Biesheuvel Tweak the linker script so that the value of _edata represents the decompressor binary's file size rounded up to the appropriate alignment. This removes the need to calculate it in the build tool, and will make it easier to refer to the file size from the header directly in subsequent changes to the PE header layout. While adding _edata to the sed regex that parses the compressed vmlinux's symbol list, tweak the regex a bit for conciseness. This change has no impact on the resulting bzImage binary when configured with CONFIG_EFI_STUB=y. Signed-off-by: Ard Biesheuvel --- arch/x86/boot/Makefile | 2 +- arch/x86/boot/compressed/vmlinux.lds.S | 3 ++ arch/x86/boot/header.S | 2 +- arch/x86/boot/tools/build.c | 30 +++++--------------- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile index 0e98bc503699..cc04917b1ac6 100644 --- a/arch/x86/boot/Makefile +++ b/arch/x86/boot/Makefile @@ -89,7 +89,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) -sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|efi32_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|z_.*\)$$/\#define ZO_\2 0x\1/p' +sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [a-zA-Z] \(startup_32\|efi.._stub_entry\|efi\(32\)\?_pe_entry\|input_data\|kernel_info\|_end\|_ehead\|_text\|_edata\|z_.*\)$$/\#define ZO_\2 0x\1/p' quiet_cmd_zoffset = ZOFFSET $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@ diff --git a/arch/x86/boot/compressed/vmlinux.lds.S b/arch/x86/boot/compressed/vmlinux.lds.S index 4ff6ab1b67d9..b688598db28e 100644 --- a/arch/x86/boot/compressed/vmlinux.lds.S +++ b/arch/x86/boot/compressed/vmlinux.lds.S @@ -47,6 +47,9 @@ SECTIONS _data = . ; *(.data) *(.data.*) + + /* Add 4 bytes of extra space for a CRC-32 checksum */ + . = ALIGN(. + 4, 0x20); _edata = . ; } . = ALIGN(L1_CACHE_BYTES); diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index 06bd72a324c1..34e9b35b827c 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S @@ -233,7 +233,7 @@ sentinel: .byte 0xff, 0xff /* Used to detect broken loaders */ hdr: .byte setup_sects - 1 root_flags: .word ROOT_RDONLY -syssize: .long 0 /* Filled in by build.c */ +syssize: .long ZO__edata / 16 ram_size: .word 0 /* Obsolete */ vid_mode: .word SVGA_MODE root_dev: .word 0 /* Default to major/minor 0/0 */ diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c index 745d64b6d930..e792c6c5a634 100644 --- a/arch/x86/boot/tools/build.c +++ b/arch/x86/boot/tools/build.c @@ -52,6 +52,7 @@ u8 buf[SETUP_SECT_MAX*512]; static unsigned long efi_pe_entry; static unsigned long efi32_pe_entry; +static unsigned long _edata; static unsigned long _end; /*----------------------------------------------------------------------*/ @@ -308,6 +309,7 @@ static void parse_zoffset(char *fname) while (p && *p) { PARSE_ZOFS(p, efi_pe_entry); PARSE_ZOFS(p, efi32_pe_entry); + PARSE_ZOFS(p, _edata); PARSE_ZOFS(p, _end); p = strchr(p, '\n'); @@ -320,7 +322,6 @@ int main(int argc, char ** argv) { unsigned int i, sz, setup_sectors; int c; - u32 sys_size; struct stat sb; FILE *file, *dest; int fd; @@ -368,24 +369,14 @@ int main(int argc, char ** argv) die("Unable to open `%s': %m", argv[2]); if (fstat(fd, &sb)) die("Unable to stat `%s': %m", argv[2]); - sz = sb.st_size; + if (_edata != sb.st_size) + die("Unexpected file size `%s': %u != %u", argv[2], _edata, + sb.st_size); + sz = _edata - 4; kernel = mmap(NULL, sz, PROT_READ, MAP_SHARED, fd, 0); if (kernel == MAP_FAILED) die("Unable to mmap '%s': %m", argv[2]); - /* Number of 16-byte paragraphs, including space for a 4-byte CRC */ - sys_size = (sz + 15 + 4) / 16; -#ifdef CONFIG_EFI_STUB - /* - * COFF requires minimum 32-byte alignment of sections, and - * adding a signature is problematic without that alignment. - */ - sys_size = (sys_size + 1) & ~1; -#endif - - /* Patch the setup code with the appropriate size parameters */ - put_unaligned_le32(sys_size, &buf[0x1f4]); - - update_pecoff_text(setup_sectors * 512, i + (sys_size * 16)); + update_pecoff_text(setup_sectors * 512, i + _edata); crc = partial_crc32(buf, i, crc); @@ -397,13 +388,6 @@ int main(int argc, char ** argv) if (fwrite(kernel, 1, sz, dest) != sz) die("Writing kernel failed"); - /* Add padding leaving 4 bytes for the checksum */ - while (sz++ < (sys_size*16) - 4) { - crc = partial_crc32_one('\0', crc); - if (fwrite("\0", 1, 1, dest) != 1) - die("Writing padding failed"); - } - /* Write the CRC */ put_unaligned_le32(crc, buf); if (fwrite(buf, 1, 4, dest) != 4) -- 2.42.0.459.ge4e396fd5e-goog