From patchwork Wed Jun 7 07:23:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 104312 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp75898vqr; Wed, 7 Jun 2023 00:38:24 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4Cr49XfJkfqua69L/pTM4wl7eP4snISrrtBwYOspnCMiPD23decAO9sZgB+oO0B+ogjy+n X-Received: by 2002:a05:6a21:900c:b0:10b:e90d:13a2 with SMTP id tq12-20020a056a21900c00b0010be90d13a2mr2094667pzb.36.1686123503935; Wed, 07 Jun 2023 00:38:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686123503; cv=none; d=google.com; s=arc-20160816; b=frNt9b4bYMioHwh/u8rc6cue4uaLBmaxahLmenoi5iGhNnbj4vAA4vUMSqyYAc6miF 8OK67zGoRYVtTFZfM++TKhqz9J17Z6CVoJPP61xZdR6/Oz5+zO9buKGuJJjGJPb+Kt0y qiOi1JEHbZuv1o8S6s6w5ACooNe6w2mLY1xEvGr/V85umdapIBtRAAV5/ovcxAv0/ei/ ay5raWyorSms+PV1APH8K/0czY91Bfj3/3+YusoiF89GOQki2MMTUebKJ+nxbHjGhcgy Cg6i0GkjXeWmZp5zfJxtL8FA67V+KR6mBoOpnVRXFlO4tZFwD3+oGHkPCEfDbURkX0rA lUyg== 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=A7psBbiOfZAd0QbGmLtYpHQhUjDQ0NxJS83UjKOqeO0=; b=SYlueQSQHjGJxJ7EkXrji6K8M6TxtLu7HV8EWERDKM+I4LaoQJYCZNKxp+rlPoXaJV HMyHRhDlk30dft6Q5MC3neAjaQq41lJsY+u84R9O0Y3hyiEu7E7bKSxriFRGM/bxh92K 7RvOIT4VnzpdaPNCHVjGQPdKr6FFOBoU2/YXKZvzwAq2waNurjx8maWxXP2FFnbJl5mf ewbs+uq6M8pksl5TeZMqsHIqPzSgqHv0laEkLzpEebyJEFddFDzA5qm8kOdAlY9E88ik Z+g2jhrzkyICXDfLBwsejPdiQpLk/ULDspK25VEX9576+3JLsezorkUXKUDs0G2jEZWF yBMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b="Gz9GzW/y"; 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 u8-20020a170902e5c800b001a59439dbfesi8903231plf.529.2023.06.07.00.38.10; Wed, 07 Jun 2023 00:38:23 -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="Gz9GzW/y"; 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 S235467AbjFGHZ3 (ORCPT + 99 others); Wed, 7 Jun 2023 03:25:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53538 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239310AbjFGHY4 (ORCPT ); Wed, 7 Jun 2023 03:24:56 -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 0D8591BDC; Wed, 7 Jun 2023 00:24:15 -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 E03F063B5C; Wed, 7 Jun 2023 07:24:13 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7F9FAC4339C; Wed, 7 Jun 2023 07:24:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1686122653; bh=noxdmhKmlrx1dvn8Z1FgJIl9KblkeEYhFso88MlTjTc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Gz9GzW/yVz3UEVoG3d5J3Tht2msZHcUDWORT+8B2L/+tpheo3+tg+5DTHOMjgUz34 SVH6ENb7Q51NZz+D/h4SJNNomCLVMCr8ijDQdWIpTsKiM2MCpgvqHDp94oVUoLNKDV KuASwIfmpChq8x9vaNMeEohedXelKnTJNalhXIm8SYiLZay3nKodR6ecl16UXuadpX olVXXuj1J1jMoIYeJQ/KVQTKLePSQCsRSGsFUCN7ALPT2cHM8u8Ah6UFpdNsC9Fb83 XgMt+ESgqiq2kYUXAPmbPidtpaQ9G7vZCJKYQ5H+biYJrmiRDsNygQzHsOeBQrFybF XeoDwnKnpq47g== 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 v5 04/20] x86/efistub: Clear BSS in EFI handover protocol entrypoint Date: Wed, 7 Jun 2023 09:23:26 +0200 Message-Id: <20230607072342.4054036-5-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230607072342.4054036-1-ardb@kernel.org> References: <20230607072342.4054036-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=noxdmhKmlrx1dvn8Z1FgJIl9KblkeEYhFso88MlTjTc=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIaXBILPzyK+u+TI+Te90fv28ss82munuVsX4QJsdS5YYK 504fHtJRykLgxgHg6yYIovA7L/vdp6eKFXrPEsWZg4rE8gQBi5OAZjIzUZGhnOC4iXn96iuMw0O 4TQPyTkjlnN+TsFd/5TnjxbGTqlQPMnIcCor5P+fj4z71CryBPfxdC043fm3cNfmCcYq7pLuUWq vOAA= 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?1768028639098595075?= X-GMAIL-MSGID: =?utf-8?q?1768028639098595075?= 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 4e01278c3f3d55f3..517cd68ea86cb7f4 100644 --- a/drivers/firmware/efi/libstub/x86-stub.c +++ b/drivers/firmware/efi/libstub/x86-stub.c @@ -971,12 +971,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