From patchwork Mon May 22 07:13:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 97142 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp1272867vqo; Mon, 22 May 2023 00:46:10 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4CnojlPgSsXhxUrA6Ol24SaWglWirknVzOOO/ApHcecHprweAHuof25+P3EVbPYkgfeOM3 X-Received: by 2002:a17:902:e80c:b0:1ad:f407:37d2 with SMTP id u12-20020a170902e80c00b001adf40737d2mr12536803plg.5.1684741570583; Mon, 22 May 2023 00:46:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684741570; cv=none; d=google.com; s=arc-20160816; b=lTHlL1hwj3slqBJif5jXMFvn0VzBw/VeSH9fvAwkZ8Q01kvEpYKfYRTUDTBoorhKrP ba209q1Iwnf80vmSe4sCauAf+N09JGqiNTi1sNVu3PYnqiLwE1aVpPaIr6c3iAkMoami Tvt1cSlSaBiw6zAPUfDwX6aS77UbFFgwQhL203bO0sK41oTguc+LAhujPWxR1zBIycaT D9/WWDO9KhneVhIvxj/3BiyVtt3nOTW5X+HMtewv/9aFCBIEoKPEVQVt2ogwelvo5XFc uDQKvl0HxF4YQA7Rpt7LORhOMwiHsgcMCsDFNbacuGcTA2nPpjNDUuR5yYU0u03AQP0d Cy3A== 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=KnbIczG5VJn+Jh7FPVtSUai82qqjNe0euxAX6s+PaBo=; b=tCfrLiodLLP7tn3YHnwngbXIFcuPhJOjp0i7ZMcQzRdZ8a8yfrc9k9uszu+SDYZKlR 4BK4BiH5DTrUNukTaZBFSN4l4PDSXUYx0I0ZQKCqDi1Ou80NkgDnaz2IrB4ZQq8tDzLy dWcd/RW0w9VMWWWq/Yhq8kVSA/TdAE5E9gAzVJEA82XM+XYTqJuowOMGzV5KK22jPbtv fRc58ST9N2CGlc7rJ4hjw7XIxOzYpGJ4SfhktF8wiMISTjQ+Jt7DOOOoQODj9qKnliHs c2q/zJbkdiGzBRuQL5lxKX+Kij3Ww4g6GA39zo+b20UOD6HKj3KYJXaOup5xfyYRQKZU oaYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=otLwxEON; 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: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id w189-20020a6382c6000000b00530b7eca08dsi4654537pgd.51.2023.05.22.00.45.55; Mon, 22 May 2023 00:46:10 -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=otLwxEON; 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 S231675AbjEVHPH (ORCPT + 99 others); Mon, 22 May 2023 03:15:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232523AbjEVHOx (ORCPT ); Mon, 22 May 2023 03:14:53 -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 A882594; Mon, 22 May 2023 00:14:51 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3BF3961DC4; Mon, 22 May 2023 07:14:51 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id EA4DBC4339E; Mon, 22 May 2023 07:14:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1684739690; bh=GI53KZcq3ZI3RxFd9aG0XytLXRdQ1EhHXwVomNHohgI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=otLwxEON9iJ+ZI6BCN9YAbKtZnBDHq6IdNPb/4XDqFwgee1+vXR5i5ac88qs0acoQ G67JEC/bGL1GStjgIDfG9HAmyx/PR1byEARlw3pScOH7bG8LkUxtPAtzLpTHfM+qWP Y26SWLmoKv2OwL7OrRwGQZELJUsfsCyHSTS6tX1nndOOdQCDfJ8DQWQo4kND9djWVG lWWWGEHVsvp8cRhPBspQpkgCys9yZyJRXJcA3Xqs3KzmNwViA/BXoZAH5kvrvQtWEz Y2Yf1PkKKKMebsw9TzPo+SEJrokn+xLLvF9LhcKe6zeq1EOXk8HhnsXVHxlM5MIWC+ 0jUyU+BU7vyjA== 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 Subject: [PATCH v3 04/21] x86/efistub: Clear BSS in EFI handover protocol entrypoint Date: Mon, 22 May 2023 09:13:58 +0200 Message-Id: <20230522071415.501717-5-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230522071415.501717-1-ardb@kernel.org> References: <20230522071415.501717-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=GI53KZcq3ZI3RxFd9aG0XytLXRdQ1EhHXwVomNHohgI=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JISVbzCh+k2N2zVP21WnK71riE97Oi5L3ShPeM9esfPuSx i2fDRM7SlkYxDgYZMUUWQRm/3238/REqVrnWbIwc1iZQIYwcHEKwET2GTIyXFu947S07Bq/pJS9 RRvOWewM0mj2ynzyvyB8ooh2R2fKX4b/LlJ2N3KZDJw8xXJT7Go7di1Kfdu/efIK3oNZKcf57H7 wAAA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1766579576765422644?= X-GMAIL-MSGID: =?utf-8?q?1766579576765422644?= 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 d6a376e52cbe1399..d010448dffb12cb8 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -934,12 +934,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