From patchwork Fri Jun 2 10:12:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 102447 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp925056vqr; Fri, 2 Jun 2023 03:29:43 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5YcZA8PDFrouwFu4kD9wd9sXCA64e3502RRR7F0z4Np4Jd2WXkrNdgw3gEC0CEk3LcNmKB X-Received: by 2002:a05:6870:73c4:b0:187:9783:a20e with SMTP id a4-20020a05687073c400b001879783a20emr1697378oan.37.1685701783216; Fri, 02 Jun 2023 03:29:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685701783; cv=none; d=google.com; s=arc-20160816; b=C0XPqD85je4SKr0drVNp53loExY8xmiDkr/ezoAiuFgQ386oCc68fd1tAU4+n7Lon/ /8p/kGvvnFUeM4+GkLkcVXNhtJQ79mkLaqxb06Rbh0nqyEcFh/2cBCzWQEU4SuHS9oRa ILy9h/RCNWEgOxAGWPtJirkqCns39PxvCy1DzK0b6C2njii4geLkBpOp2/sBBuqziusL TZlsq40WQoGmWD6fek0zNThrIpROzXEkSMujQpF+qzRR5QGV3KUtebqRgw5m9BPWle6o /e8yulBQeaeSdll77QL+ajLYKv/SWfxIhdwbJ0OmifxekrV5GwH0RV5iwIuUb9EXV7Dn 5Dhg== 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=C8DwcP5HtGzaUx5DS8IrJH3BLG8hV1NdzwL8hKZguJltRVuzder4Qksa5BRrOVYniM EzEDp9VyMAXfMp7Ml1YeyVq9/YjfnXFvpXczezvlbggJoq7Dy3oH99zDzNwNTOd6+Cjy yGg6xqnGaLQMDqCwpvjynhpoSPRY3E5j8YlsfzBf+6bLpDwVForxYwwkuGfM2TR9fZWa y7ZNNdsXJHtfaLq4pmPZI81i3ObWbMqcbaJUeeje+0kYPLI1phxMxg8kIopgtdDEZYoR 2qaNHFpRHiW5Z76DHDtUAy2V5sYR9BUcmANg5zyKoctPh6QQ7lQdkjf9ViI+XPERYKcq N5LA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=J8XIym0L; 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 q29-20020a638c5d000000b0053b9702001csi802792pgn.314.2023.06.02.03.29.28; Fri, 02 Jun 2023 03:29:43 -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=J8XIym0L; 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 S234410AbjFBKXT (ORCPT + 99 others); Fri, 2 Jun 2023 06:23:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46064 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235346AbjFBKW0 (ORCPT ); Fri, 2 Jun 2023 06:22:26 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5EB61AD; Fri, 2 Jun 2023 03:22:25 -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 6245364D72; Fri, 2 Jun 2023 10:22:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D7F09C433EF; Fri, 2 Jun 2023 10:22:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1685701344; bh=GI53KZcq3ZI3RxFd9aG0XytLXRdQ1EhHXwVomNHohgI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J8XIym0Lyhfz4AvAyKuXkqdvzHiAvwTYsNh8b2C+V5KUAfkWwbPccxBAepB/jmwGx CKwDMLbaZBnojettYP09S/iRurmuFOUzshOLeTs4x8Mgmk6i3Tr8sLLfLkunMbYw6q 4Y5XFHNAOhfRyh4jTLSsKw6B8T006NY4dPwAq1ePcMYOD0hnAVad4YdbWTRG9StB9q gr1DJffn+Cah5RqWIKrFIwvQSSwEGEkACput+uX05JOhaWcU9Uh+KkDMy/3/5vukFw 29KkC8Uv0hj/6LqsQ252KOQQ3RheQKfktbz9hhdDvb5szqrnnnWEYQoaCXPER3VxOq iRy23vVmIkhVA== 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 v4 04/21] x86/efistub: Clear BSS in EFI handover protocol entrypoint Date: Fri, 2 Jun 2023 12:12:56 +0200 Message-Id: <20230602101313.3557775-5-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230602101313.3557775-1-ardb@kernel.org> References: <20230602101313.3557775-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=owGbwMvMwCFmkMcZplerG8N4Wi2JIaXywJL4TY7ZNU/ZV6cpv2uJT3g7L0reK014z1yz8u1LG rd8NkzsKGVhEONgkBVTZBGY/ffdztMTpWqdZ8nCzGFlAhnCwMUpABPJXsnI8OpnWZB8rkj81fyI O0z8Dw/M4nR6NtFywRGBtW9N572qs2FkeLT00Yncj/E/xAPyZcQPL/New+NT3Ct1cEn2SsmChL/ J3AA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 X-Spam-Status: No, score=-7.3 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1767586433027399904?= X-GMAIL-MSGID: =?utf-8?q?1767586433027399904?= 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