Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp957505rwb; Fri, 28 Jul 2023 02:27:53 -0700 (PDT) X-Google-Smtp-Source: APBJJlF/yqgzDZsewtMU9I34d1tMI93f5R5/T7A83yutZrqIyH3uYgD3psd4UNLZYvEZ8PGps3zR X-Received: by 2002:a50:e602:0:b0:521:d368:1628 with SMTP id y2-20020a50e602000000b00521d3681628mr2202769edm.16.1690536473408; Fri, 28 Jul 2023 02:27:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690536473; cv=none; d=google.com; s=arc-20160816; b=iDKtds/mDMt1JKGK1mDfGr9iVcNsos7dubpEZLLkQ+puTjQpJ+I8YucdKjW2Egffpv W56HEl5dpDPTT5zLpWk2i38ei4uoks2+6VSHFFHjScqQN5f+LTRFeq84q4rRpUS9scnj sj7yiHvBG+1VqqvV0rDjBagskTahd2uc7szZASfts+2wCPx0K79nuj1LA8iKUpAhllU5 FJN7ad/C8dgYP7TS20vXCbOOUL/Eds3VT8Dv/yrh2SvX+YSn0vT3PcE8FyL9mdrOIPiy PW6gokMM7kZ9KgPfDepy+WJDUkzYzhGvAO/dljrh/U0DaMTdSR2UtGfXZAffoIs3NGTs N8BQ== 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=n/bWGL0p4yB2Goc7R1sXthep0PH41Xsa11pDUx5Phq2EBm6ZOlOBUAgLGcVM+w/DAA m34uwRzi86vlmrNo7kSi8B/q9NSXL3Sj2XfnHbaXis598v3ZtahOBMJeXIBKGjXkeeQ/ 2vcCNKEPJT+iARQYLxKt1zqqTMmtDmeGdAODtLQ6JXMn/iqmryX3hzyhst9QnnBsW7Gf aI/674ezKYjNUU2je2IfAEwc0boWATMn47uQGKkK+EosbMIM7UEB45pvyoyJOrCD9hgH ztSHi9RtJSwxnirhEBAWTeJOpl9geKZzsuW/eR2oB0XpML0ewLLw9o7FIlelOdfmYjva aVeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=rc4aAIGy; 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 bm10-20020a0564020b0a00b0052250b9a185si1257625edb.95.2023.07.28.02.27.26; Fri, 28 Jul 2023 02:27:53 -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=rc4aAIGy; 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 S235216AbjG1JOg (ORCPT + 99 others); Fri, 28 Jul 2023 05:14:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34244 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234068AbjG1JMn (ORCPT ); Fri, 28 Jul 2023 05:12:43 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2ECB73AAA; Fri, 28 Jul 2023 02:11:09 -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 B462162062; Fri, 28 Jul 2023 09:11:08 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 67A9EC433CA; Fri, 28 Jul 2023 09:11:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690535468; bh=1uUURGYHh6gp1uj1SgOD55SOPPzPsQeMQl9hTqhNVG8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rc4aAIGyje0JGv/pO5VYSHPQ9dETCMsDO91HnUPyd6HClciDHPYa4zXVbkCqeX9LV v0ixmcH2NtfHSPCmULTNJ6KKrFEJ08RgxHPzJFia3Sv9z1W1sIODYMYOIKxG4EKX0g 7T4jDnVyETGItvUou2zZXYdLoC3XK5GWY6XkJckHpuGR4NoBgCnILuUPsHsLXNxAIM Efc4K15BR3cJIeKImEMEPnsgf/oC0Kv/8cJ8DAY5uDVyn8bp3yoq/ruIQF3/gpF5qR hNtdPwgy9vX6ntymXQiXgrrGglXisobUK4Akh3kzphYLnfYv4xJSdqQvBOidmzuhl/ xahSZW0dlJCuQ== 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 v7 06/22] x86/efistub: Clear BSS in EFI handover protocol entrypoint Date: Fri, 28 Jul 2023 11:09:00 +0200 Message-Id: <20230728090916.1538550-7-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230728090916.1538550-1-ardb@kernel.org> References: <20230728090916.1538550-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=owGbwMvMwCFmkMcZplerG8N4Wi2JIeVw6wpb+fBnK85PqP33Tb/dUogzaK3FgZACpW4OLqHgY 0Giy+91lLIwiHEwyIopsgjM/vtu5+mJUrXOs2Rh5rAygQxh4OIUgIlsKmBk6Lz+Y/e/lV15h9KY hWr7eW3Fl9lPTU+5cVLXX+oXV8ECfoa/EubzVoqXdB3qZ06TS5PO6li+u2fVfxe5Hs6ojjluXju ZAA== X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, 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