Received: by 2002:a05:6358:700f:b0:131:369:b2a3 with SMTP id 15csp1161566rwo; Wed, 2 Aug 2023 09:33:29 -0700 (PDT) X-Google-Smtp-Source: APBJJlHcPP6AYSSOQJR8DDUBkf170lXQRk5dBrIXFKFv9a/Krswloj76KxipaX0+wREwpjNaKcWB X-Received: by 2002:a05:6a00:2386:b0:66f:578c:59fb with SMTP id f6-20020a056a00238600b0066f578c59fbmr16602595pfc.10.1690994008951; Wed, 02 Aug 2023 09:33:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690994008; cv=none; d=google.com; s=arc-20160816; b=ue5/Q3Zk+zY5FUsvzJEV9J+8t8fyS5bB0Z+lpwsp/sCtfFieo2vGF9GhfW8RE6PHEE Y5C6qWgzeNU40xzZuiBNg3rrD4oMuA15KCjjelaulw8o8IL3PUae2mQRfLPTAFBDMayz mSsFnXbH4BzSvmwGPVBbk8hOYXN4kYDLIjBqrmeJC03Lt5YPQ3sBH1EUcAXfPtxNWBn7 COkWBBWJhz4lgYz1zVQRVLOn+JjX+ENMjXV4YLDU2aBiyG9233fQMTh1e/2VdxmQOkaG ssBHla0No44swkY01GtYMUAwfExNgY/F3eoA7WgBt6zq60CyI79wekq3cvw05+8rH7W2 /X3w== 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=4sMmglM9Vr107T1QoAhPtL5Nv2v/o4mAf2FDRAXNsr8=; fh=UoPnrMfWVKGOqsML3Cwqzr4dYAyNRBpPmY/ITnBmPi0=; b=GhUXfTeeCBdkNDerOklidWFYXFAyDToFPBuEDO5/bbNeKeHjV14QGbh9ephGbJDI52 QYbYhG/XINhY03FoKRFWkknv5pB7Dnx2D93WPnWnMoPx9Q508m66CoTPk4i6HZ3fwy6l dxsa8BCe/90syNrfvlljqWOghSCKaGyYrdgNWQEXWbx+Qu9Xj57VQclUGC/TwTVN/vf/ P2ObJXfHc5JQwFhMZCs5oTNvhALcCk5PeLUZds4FGDh1PpnXOAV/6+I0MacUm8bTQ41a t6pl5pJICas8l3i0bCW9mJhCGV0XtZorFLYt9o9CbxOVktG7uHVdD7ZerpCpXHc8dHo8 FBHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=uautC8rP; 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 bv3-20020a056a00414300b0068746776e98si3870156pfb.136.2023.08.02.09.33.16; Wed, 02 Aug 2023 09:33:28 -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=uautC8rP; 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 S235356AbjHBPts (ORCPT + 99 others); Wed, 2 Aug 2023 11:49:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234975AbjHBPtd (ORCPT ); Wed, 2 Aug 2023 11:49:33 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA4D7268D; Wed, 2 Aug 2023 08:49:19 -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 01080619F7; Wed, 2 Aug 2023 15:49:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8124FC433CA; Wed, 2 Aug 2023 15:49:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690991358; bh=usQB03nvoiZEOQomH9z1zpnfhZCXgY7eC83YRzvcdlw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uautC8rPoHKKUHZmPHalxfl7gL7EaoI9VMkRL1sWKgtz+mRXwxfoXYqyiWD2eoAL9 OQ0zOQtAlYCONt45CQ3NvWfbbdR9QLDuaLT0ozF/VAN13hUnMLrVsHKBIeFJz5EQ2A BxhnqWUfjkVn2aM5Y4YvENsRVMu/lAH0L+Sm23nLNNw4sDCLfDvWUzd8YDevaBhMAj 7+06pOEu7US2yl2LhpfaVUVYtwpFBLlJ7z+qBNVhGxUP00uh+BkVTqNkt19lyXPvG5 CmKwqNbg5TXFcsJPMokBH5KT/jmloH2f82tPq44bxxnxGVjiS2B1jWXM3QQIH2F4Rt 9KmKXW+zZMo0A== 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 v8 06/23] x86/efistub: Clear BSS in EFI handover protocol entrypoint Date: Wed, 2 Aug 2023 17:48:14 +0200 Message-Id: <20230802154831.2147855-7-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230802154831.2147855-1-ardb@kernel.org> References: <20230802154831.2147855-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=usQB03nvoiZEOQomH9z1zpnfhZCXgY7eC83YRzvcdlw=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIeVU1Y4mob1H55cZJKx6uTfdYdK5XTsLduQzatuIrxIpe X05OpC3o5SFQYyDQVZMkUVg9t93O09PlKp1niULM4eVCWQIAxenAExE9AvDP83Cxg9b17186v9F lVXQ/0/ErWf+y94btpjv5eD1qb551JeR4Vh8Qtm5rlb9mZsM/hdzPD4TPHFyVMq8f2JBjhJaF9+ 5MwIA 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 3f3b3edf7a387d7c..9247dbc7dbbd12ef 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