Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp794710rwb; Thu, 6 Oct 2022 04:46:16 -0700 (PDT) X-Google-Smtp-Source: AMsMyM5eOgUMX0UVlDpvygFXSGlJgQ4xMQdtTj73NKD5VBGw8LMLFzdHMAUPtJo9nOG3s22uuDO5 X-Received: by 2002:a65:44c5:0:b0:439:4697:ead0 with SMTP id g5-20020a6544c5000000b004394697ead0mr4135824pgs.45.1665056776583; Thu, 06 Oct 2022 04:46:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665056776; cv=none; d=google.com; s=arc-20160816; b=FIZvrsCtKlIE93A6m1egD8ON/Oc6iGeOnSFeVc9msjqGW5i1h/TfaYmTDNZR3OtVqP JpfwNy4z/E29g29u8l1D+RIgNPZb8PygX3kTtEO8W+ZvhsWI7pfQz1KYnWFOZMBDxPYv f+jCaa5BX71Qx6HhIGOEocmMDj+JzJPObYl7eQWb9b5k8Jii4ITx6hiVG9wKSTy6cuzw 2dSkDIwSUdp/gEgY029ftpVRZmHLwDU9zKT8tVZykxDYuzA0aoX/FidrJuAF5brMo+jZ zVtCPdc8yJC02Fr5+kTMEM7ZYWATZ4B+dnllCrHrli35JVmHNfZ2rpzQarWOMIZV/Zg7 eSDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=iGT4wBpsKky2lxVBUTtuVJbxNZ/zLAlLdGthPN3pr/U=; b=hDipCmPqTeZfA1uZK/MieJ5Czo4wV3EFY0uGESIyt23l8NBxl3n82wXxxziV6+5Hs5 0BP+3xBKLClyYAL0yRD1zvJ4/cJpm7vEmuQcM0paaPOrQKXEFsqBvi8Q2egUWMMFn5kF lypQL/iJa0gXRF0sj0w/rl1yreWpABcCY4gQiV33sMFdoI6xUivPrQVBqTGdCnrjNLFa IinWL6KvddMWSitqpkScOnMHXXLvlHHl3iZ3c7wNB6fukEIWq+T3Rm3OgEhlOOFMHAwv Ka4qn0cjMPUfJs44f/0f6pxHF1PTI37Y5Lbrn244q5YPFVKajgTJuEUhE6+egCPYxDUh 8Mjw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=P6NQcbHX; 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 h19-20020a170902eed300b001754410b705si18136607plb.268.2022.10.06.04.46.03; Thu, 06 Oct 2022 04:46:16 -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=P6NQcbHX; 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 S231613AbiJFLaO (ORCPT + 99 others); Thu, 6 Oct 2022 07:30:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45970 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230225AbiJFLaM (ORCPT ); Thu, 6 Oct 2022 07:30:12 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B66225C75; Thu, 6 Oct 2022 04:30:11 -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 ams.source.kernel.org (Postfix) with ESMTPS id F1251B82064; Thu, 6 Oct 2022 11:30:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A00F4C433C1; Thu, 6 Oct 2022 11:30:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1665055808; bh=5LgFNtqy92bY4lq9P95C4sy291naVE3GnG0i/RMkzbQ=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=P6NQcbHXdPZp8W9Pw42UETn4EjjGM5QpEZsRP7CRLrGxZlztZP+2G7F6x0Q28ksl3 C1vHQ5+LqNVj1yx+pedKx6UbWMCm0gPos9VnPv63d43XlZY24vcPObo/IMdMB3BDfT uMOyAWtwFzp//ycCsakb80xlgBMHo7nw3yyI5ZGxezfI2XO8pOYj4sin2ylHeXmD/I TFubWaiiKYNWHQ03jfdTNdontrLcESSZJgIE+UPhZGzfbAM3Hr1JAYgLI/XU/GDsMv SMOpmx9utBZsdXSp2gB4g60XI5s0ByfUs5aUVAdYXVcYHrdae94PNjp4SW/ZKiE2dA UpAwNxwY5W/Rw== Received: by mail-lf1-f42.google.com with SMTP id y5so2255414lfl.4; Thu, 06 Oct 2022 04:30:08 -0700 (PDT) X-Gm-Message-State: ACrzQf0Reskrj73XOjt3KPGoArbBMph/AKxjfV9v4Fk4Sufe/PmjoZxC HugZ7Q/aVONPe9O0L215h7iwLRRetCGbxpD/UMI= X-Received: by 2002:a19:c20b:0:b0:4a2:40e5:78b1 with SMTP id l11-20020a19c20b000000b004a240e578b1mr1628632lfc.228.1665055806638; Thu, 06 Oct 2022 04:30:06 -0700 (PDT) MIME-Version: 1.0 References: <20220921145422.437618-1-ardb@kernel.org> <20220921145422.437618-4-ardb@kernel.org> In-Reply-To: From: Ard Biesheuvel Date: Thu, 6 Oct 2022 13:29:55 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v2 03/16] x86/compressed: efi-mixed: move bootargs parsing out of 32-bit startup code To: Borislav Petkov Cc: linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org, Thomas Gleixner , Ingo Molnar , Dave Hansen , Michael Roth Content-Type: text/plain; charset="UTF-8" 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 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 On Thu, 6 Oct 2022 at 13:03, Borislav Petkov wrote: > > On Wed, Sep 21, 2022 at 04:54:09PM +0200, Ard Biesheuvel wrote: > > Move the logic that chooses between the different EFI entrypoints out of > > the 32-bit boot path, and into a 64-bit helper that can perform the same > > task much more cleanly. While at it, document the mixed mode boot flow > > in a code comment. > > > > Signed-off-by: Ard Biesheuvel > > --- > > arch/x86/boot/compressed/efi_mixed.S | 43 ++++++++++++++++++++ > > arch/x86/boot/compressed/head_64.S | 24 ++--------- > > 2 files changed, 47 insertions(+), 20 deletions(-) > > > > diff --git a/arch/x86/boot/compressed/efi_mixed.S b/arch/x86/boot/compressed/efi_mixed.S > > index 67e7edcdfea8..77e77c3ea393 100644 > > --- a/arch/x86/boot/compressed/efi_mixed.S > > +++ b/arch/x86/boot/compressed/efi_mixed.S > > @@ -22,6 +22,49 @@ > > > > .code64 > > .text > > +/* > > + * When booting in 64-bit mode on 32-bit EFI firmware, startup_64_mixedmode() > > + * is the first thing that runs after switching to long mode. Depending on > > + * whether the EFI handover protocol or the compat entry point was used to > > + * enter the kernel, it will either branch to the 64-bit EFI handover > > + * entrypoint at offset 0x390 in the image, or to the 64-bit EFI PE/COFF > > + * entrypoint efi_pe_entry(). In the former case, the bootloader must provide a > > + * struct bootparams pointer as the third argument, so the presence of such a > > + * pointer is used to disambiguate. > > + * > > + * +--------------+ > > + * +------------------+ +------------+ +------>| efi_pe_entry | > > + * | efi32_pe_entry |---->| | | +-----------+--+ > > + * +------------------+ | | +------+---------------+ | > > + * | startup_32 |---->| startup_64_mixedmode | | > > + * +------------------+ | | +------+---------------+ V > > + * | efi32_stub_entry |---->| | | +------------------+ > > + * +------------------+ +------------+ +---->| efi64_stub_entry | > > + * +-------------+----+ > > + * +------------+ +----------+ | > > + * | startup_64 |<----| efi_main |<--------------+ > > + * +------------+ +----------+ > > + */ > > That is much appreciated. > > Questions: > > - is this whole handover ABI documented somewhere? > Documentation/x86/boot.rst has a section on this (at the end), but we should really stop using it. It is only implemented by out-of-tree GRUB at the moment (last time I checked) and leaking all those struct bootparams specific details into every bootloader is not great, especially the ones that intend to be generic and boot any EFI OS on any EFI arch. > - efi32_pe_entry() is the 32-bit PE/COFF entry point? I.e., that is > called by a 32-bit EFI fw when the kernel is a PE/COFF executable? > Yes. But I should note that this is actually something that goes outside of the EFI spec as well: 32-bit firmware can /load/ 64-bit PE/COFF binaries but not *start* them. Commit 97aa276579b28b86f4a3e235b50762c0191c2ac3 has some more background. This is currently implement by 32-bit OVMF, and systemd-boot. > But then Documentation/admin-guide/efi-stub.rst talks about the EFI stub > and exactly that. Hmm, so what is efi32_pe_entry() then? > That is the same thing. The EFI stub is what enables the kernel (or decompressor) to masquerade as a PE/COFF executable. In short, every EFI stub kernel on every architecture has a native PE/COFF entry point that calls the EFI stub, and the EFi stub does the arch-specific bootloader work and boots it. In addition, the x86_64 EFI stub kernel has an extra, non-native PE/COFF entry point, which is exposed in a way that is not covered by the EFI spec, but which allows Linux specific loaders such as systemd-boot to boot such kernels on 32-bit firmware without having to do the whole struct bootparams dance in the bootloader.