Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp36556294rwd; Tue, 11 Jul 2023 02:34:30 -0700 (PDT) X-Google-Smtp-Source: APBJJlHRg8bmhQ04XSYvdTVLI7Tuwkzd38dAoLYc+1pTv7nMGBMGkUdNTrG+Ys47M/u3WB3V5N1u X-Received: by 2002:a17:902:c3c6:b0:1b8:1c9e:444e with SMTP id j6-20020a170902c3c600b001b81c9e444emr16258864plj.25.1689068070428; Tue, 11 Jul 2023 02:34:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689068070; cv=none; d=google.com; s=arc-20160816; b=AhwTgg+bk8Lah5EkH+FQ5DJCmZKA4s+myn0b2JtyIQSHAtZTcbRXTAOETOBYdFZFdo WaTSR8GPgr8wmIi2mpwtnK2cpPGYZFzEo8lM0AoXsuSFLm2Sz0TOKnp8x4xDIpqMdLvm 8jHqCZ9XoJ3XYMl6pMzrOyaW5MHGqsw4h0YS6+WybkyIBSEY/2N4KDXazAJaAFeof5/J cDctBzqdsKbW28tbQHoX4fyxKiD0OYAlccPc6vbBk3+A1dS88MK2dp0zOo0CPeeCDkuo wx9rprT7f3zSxFbV4DHO7xDEfJHIBb3JcAnBBT2T1hsFd8Ntrnx/yNlatrl9CgFkdwqN HcWg== 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=6cBtlUhgHyRcnuC4Ouusj/QZh3k3XwWIqDJv0HOzo+Y=; fh=UoPnrMfWVKGOqsML3Cwqzr4dYAyNRBpPmY/ITnBmPi0=; b=QGPF7Kh6kFseDW4CfDyFskofdwVQnqvcpMTxNCfa3DqkgGGe8Sq/8VasDDBnhTgCkk PpKuF0Osz4SFTh8v77if2Sk8IoWImE4ZrqOjU0qIGv+ZgCC608HPHjK9jcZjCV8Izxg7 so84RhNhEMJJnX3x5WeMNTnXhbj5l2GZlbrhODGWmR44Lylt9EfiHHxzYDGxGWR4EJzy 7O+1TqqTTkC1UmW6xYc1OO3XpDNvJdyEgUibNH9alSwl/5lNj5Rd72KnJEy4Q2MMGupw QqFG+RPiNY+hsjC4/cvosFR601WltijpMjO1sXt6M4YqoX6dti8w7M9ZPnnKJD6NLHL5 ZvBQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=cSYasv6i; 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 x9-20020a170902ec8900b001b53d2870d8si1383203plg.33.2023.07.11.02.34.01; Tue, 11 Jul 2023 02:34:30 -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=cSYasv6i; 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 S232033AbjGKJQF (ORCPT + 99 others); Tue, 11 Jul 2023 05:16:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43534 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232025AbjGKJPi (ORCPT ); Tue, 11 Jul 2023 05:15:38 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1D6781724; Tue, 11 Jul 2023 02:15:25 -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 279046142F; Tue, 11 Jul 2023 09:15:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AD977C433C8; Tue, 11 Jul 2023 09:15:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689066924; bh=1uUURGYHh6gp1uj1SgOD55SOPPzPsQeMQl9hTqhNVG8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cSYasv6iUpezIDK1jpK4/5jDKxqU4m6t6ZCC4BXaRh56rAessJ44VEHMZnl47Sx81 FIOIsZg+sUtgHMBeUzpNG2e53qSXX0AQ3SxgOfbPr9+tEnaXhl0/3JdqY9vdwAdhvJ wQEsoim0KXxz3JYjsrUKhHv1S+5Fbmv9wMb7xvIblLRLWmlq+JGaGR2c7ueC9uObpW GLVvVpkV/fkO6OQehrT6q5uIaCaYz9aIROYq2oVfs9J/uZ9AbNJf33yZ7yHKVR/y1S r7zjlG1uCK2KctDyJEICZJnKD+vZEb0IrrP5DlzQtB/JUwPsuae9GgmL5tpqo1Phjb DiM8GpfWitvkg== From: Ard Biesheuvel To: linux-efi@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel , Evgeniy Baskov , Borislav Petkov , Andy Lutomirski , Dave Hansen , Ingo Molnar , Peter Zijlstra , Thomas Gleixner , Alexey Khoroshilov , Peter Jones , Gerd Hoffmann , Dave Young , Mario Limonciello , Kees Cook , Tom Lendacky , "Kirill A . Shutemov" , Linus Torvalds , Joerg Roedel Subject: [PATCH v6 05/21] x86/efistub: Clear BSS in EFI handover protocol entrypoint Date: Tue, 11 Jul 2023 11:14:37 +0200 Message-Id: <20230711091453.2543622-6-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230711091453.2543622-1-ardb@kernel.org> References: <20230711091453.2543622-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2971; i=ardb@kernel.org; h=from:subject; bh=1uUURGYHh6gp1uj1SgOD55SOPPzPsQeMQl9hTqhNVG8=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIWWtbLWtfPizFecn1P77pt9uKcQZtNbiQEiBUjcHl1Dws SDR5fc6SlkYxDgYZMUUWQRm/3238/REqVrnWbIwc1iZQIYwcHEKwET6TzP8d/DLVNcuPSO9pDSs 9u7N9l3fr83Oijmz/Yeqy82sGjaudIb/RSeSzz5Z/WeuxGSnJC5lzcps1zT+CZ6bXri+bjoyqfU jNwA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 The so-called EFI handover protocol is value-add from the distros that permits a loader to simply copy a PE kernel image into memory and call an alternative entrypoint that is described by an embedded boot_params structure. Most implementations of this protocol do not bother to check the PE header for minimum alignment, section placement, etc, and therefore also don't clear the image's BSS, or even allocate enough memory for it. Allocating more memory on the fly is rather difficult, but at least clear the BSS region explicitly when entering in this manner, so that the EFI stub code does not get confused by global variables that were not zero-initialized correctly. When booting in mixed mode, this BSS clearing must occur before any global state is created, so clear it in the 32-bit asm entry point. Signed-off-by: Ard Biesheuvel --- arch/x86/boot/compressed/efi_mixed.S | 14 +++++++++++++- drivers/firmware/efi/libstub/x86-stub.c | 13 +++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/arch/x86/boot/compressed/efi_mixed.S b/arch/x86/boot/compressed/efi_mixed.S index 9308b595f6f0a5de..8a02a151806df14c 100644 --- a/arch/x86/boot/compressed/efi_mixed.S +++ b/arch/x86/boot/compressed/efi_mixed.S @@ -142,6 +142,18 @@ SYM_FUNC_END(__efi64_thunk) .code32 #ifdef CONFIG_EFI_HANDOVER_PROTOCOL SYM_FUNC_START(efi32_stub_entry) + call 1f +1: popl %ecx + + /* Clear BSS */ + xorl %eax, %eax + leal (_bss - 1b)(%ecx), %edi + leal (_ebss - 1b)(%ecx), %ecx + subl %edi, %ecx + shrl $2, %ecx + cld + rep stosl + add $0x4, %esp /* Discard return address */ popl %ecx popl %edx @@ -334,7 +346,7 @@ SYM_FUNC_END(efi32_pe_entry) .org efi32_stub_entry + 0x200 .code64 SYM_FUNC_START_NOALIGN(efi64_stub_entry) - jmp efi_stub_entry + jmp efi_handover_entry SYM_FUNC_END(efi64_stub_entry) #endif diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c index 1180ccd3cd426918..9e1994c6afc672ca 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -970,12 +970,21 @@ void __noreturn efi_stub_entry(efi_handle_t handle, } #ifdef CONFIG_EFI_HANDOVER_PROTOCOL +void efi_handover_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg, + struct boot_params *boot_params) +{ + extern char _bss[], _ebss[]; + + memset(_bss, 0, _ebss - _bss); + efi_stub_entry(handle, sys_table_arg, boot_params); +} + #ifndef CONFIG_EFI_MIXED -extern __alias(efi_stub_entry) +extern __alias(efi_handover_entry) void efi32_stub_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg, struct boot_params *boot_params); -extern __alias(efi_stub_entry) +extern __alias(efi_handover_entry) void efi64_stub_entry(efi_handle_t handle, efi_system_table_t *sys_table_arg, struct boot_params *boot_params); #endif -- 2.39.2