Received: by 2002:a05:7412:31a9:b0:e2:908c:2ebd with SMTP id et41csp2802066rdb; Tue, 12 Sep 2023 12:29:49 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGKPg7uPSAgA304k+Bz3x1Y5hS9Cbv3vTqxgbKSKE3/eznPaot79z1D1DjyjimzfU5nEc/g X-Received: by 2002:a05:6808:21a6:b0:3a9:d957:efba with SMTP id be38-20020a05680821a600b003a9d957efbamr725774oib.4.1694546988877; Tue, 12 Sep 2023 12:29:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694546988; cv=none; d=google.com; s=arc-20160816; b=WbfL+DP4a+gy8HQRRvoc1nBJBHLDAt+/uxWubog+zIgaUeOsslNwDPOdPNufvaXaWj +fRM8hoNfuqzW1duVoVlMRrqktqcvh7A6SuC2NAsELypqlcjm4ltqgQQ3PaNgqoni1ck Wq7B1kcG6Zr5azxBYemCfAdacgx7Lwp2ZwxNVkjKD+iZ1mWq5XneYFnUj0nr1n80BTt+ tzkVknABNcq7byhdu60EJW/wOqMPU5FAC9I1vECd6x6YblwuDW+b3EAiuG157Hw5CvYK z6n2t26QnIh8W2p6x6N/KqLzID8WMg/kkHD9V/giRUVXa5o5sKmHtdCQ+ORiMj7F1TEQ kWOA== 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=VKh367hgmQvZD8a+n/+xOMhd8K9Jz3TJJTXcd9sGb+U=; fh=WGxnbchXB1nh8WtfYTQqAYq5ggcl91wEfddYAfjE7VI=; b=OA6nfMBCGimlJTLUOlfRFgj4M9QmIbPxKXIc/U/GEvsSslfXR1aLVlK0GQg9EATkrv MUs+futBBUvErZcmgvv8pFAN/Z503S021N2k9eWf+Z1ILnem8PCIsUjUBjNgfxH9hBXE i0M/O2EoeTKfmTQ2/YuYjgd0j/yBSTGD8Owql9tRvJGG98tBEA6w0poe4tggJ4NdiOGC 6TC7sTaglylltw1ByYwAQrjrV7tCJHEsw0s5J5MHX2VRs4k7upciLJZeS1bk0YDXp98T WNBNA/MfM7g06k+GZvwJfdIzWrGvNNsWC/wU4C4/CZn/93luOw6ZpVyOVo+q6er/IYLk f6aw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=QLswDYXt; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 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 howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id t7-20020a634607000000b00565323c8295si8247842pga.749.2023.09.12.12.29.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 12:29:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=QLswDYXt; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 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 howler.vger.email (Postfix) with ESMTP id 63460850D4DC; Tue, 12 Sep 2023 02:03:01 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233561AbjILJC6 (ORCPT + 99 others); Tue, 12 Sep 2023 05:02:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50510 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233236AbjILJB5 (ORCPT ); Tue, 12 Sep 2023 05:01:57 -0400 Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 901841705 for ; Tue, 12 Sep 2023 02:01:53 -0700 (PDT) Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-59b5a586da6so72362497b3.1 for ; Tue, 12 Sep 2023 02:01:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1694509312; x=1695114112; 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=VKh367hgmQvZD8a+n/+xOMhd8K9Jz3TJJTXcd9sGb+U=; b=QLswDYXtM1tNXk7dQGykZWjfatwjyasRoR+f1SQ13Xi2yJxVLrGPl2hzJt4B0N0FFQ gqlV2fICQg7wR7kYDkxug6laKjFUyQLuZIw+1JAqLJSRIDBymSH09YI45foxLPiRPnQ9 jzgjQew5HJWnCDf7gjJeEuqHjvWukASQTzeL0X20OsqJx4GsJHOw11c1YvsQJAMCrF47 HeiqS/j4ycN6oECMAUueWEXQ8xsot+V3lbDzs5htYntFN2llzx043eOYefANTlqQE86t 7bh+1zlue39tm7y4ycQAq0+/htTn8A6D0z+mLxr3OUMrkDQBB/gDDoL1UiKN1CD6nbph FdTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694509312; x=1695114112; 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=VKh367hgmQvZD8a+n/+xOMhd8K9Jz3TJJTXcd9sGb+U=; b=By1oFNcaaR2Ga4dwNI1h9RvFiq/5Wwa+vVHii8F0Rt/SqTc7vlILt2hHi+Uf7Lu15b 2Fwm0iEyb+lL/TlHF8ucrN6acwdo9N84eklVyg+IO8MKpigBUDZ58fnkQtD/pszM2+HY 5qmwXfe5vwlYTbnOMyrz2CHZi0CJ/HfotIX3kNUE/KORHWOmlPBkQ9BZMbITeGCoS557 q8/XF6IWNnt0bPQtNiSFX3r5JjF7mg1uonSqASK0HZGJv9MjriDfUqgUo+4hGvN9LZTY CS7bbAkvRP8pxMrZzHTzKJzqgYs2bAf/lBEr451oY5gOB/zZbGR/xeG7E48P8duWt5Ro ChEg== X-Gm-Message-State: AOJu0YwlAvrKt+3c/e8WjocT77CikEa3e1owT37O/yBfsYnFheYn39Gs J1Fxr99fLw7uIfEy4ELIC/iLOlcl X-Received: from palermo.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:118a]) (user=ardb job=sendgmr) by 2002:a81:c40e:0:b0:58c:e8da:4d1a with SMTP id j14-20020a81c40e000000b0058ce8da4d1amr61791ywi.2.1694509312588; Tue, 12 Sep 2023 02:01:52 -0700 (PDT) Date: Tue, 12 Sep 2023 09:01:02 +0000 In-Reply-To: <20230912090051.4014114-17-ardb@google.com> Mime-Version: 1.0 References: <20230912090051.4014114-17-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=+O/KFdhMJMnIogIj3fdlcqOX6X2/aP+6Tar/b+0W/54=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIZVB46KSnd5N17n3tPfuFGZf7fRs36pVBsa7Eq2S0g/P+ CX8UUago5SFQYyDQVZMkUVg9t93O09PlKp1niULM4eVCWQIAxenAEzkMhsjw31Ws41CYrt4tKQu CtRPdEjfxbx39gx7q1VFOqk5cwwecjEynOTWYdZWnFDndK35rH7PrlXXbmoodPnF+fOzxdjxrsx kAgA= X-Mailer: git-send-email 2.42.0.283.g2d96d420d3-goog Message-ID: <20230912090051.4014114-28-ardb@google.com> Subject: [PATCH v2 11/15] 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" 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 (howler.vger.email [0.0.0.0]); Tue, 12 Sep 2023 02:03:01 -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..5326f3b44194 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.283.g2d96d420d3-goog