Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp36547649rwd; Tue, 11 Jul 2023 02:25:57 -0700 (PDT) X-Google-Smtp-Source: APBJJlGhU+AeioVn6hhs20A8CTBennjsusbFJArvotZnVxckk2mt8PrJMHbxBgUttOrKBwTQAzKN X-Received: by 2002:a05:6808:1784:b0:3a3:e7fd:a964 with SMTP id bg4-20020a056808178400b003a3e7fda964mr12809476oib.43.1689067557135; Tue, 11 Jul 2023 02:25:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689067557; cv=none; d=google.com; s=arc-20160816; b=sorabJo5IphLnkyK+gbReC8rOcSjVrnHSmGqR1IUGJRXgY3mDEl+VaN15cyd8V7/2y bmOaE0IseuQJTBdoAX/SC2nA+C/CtquzXFf03dyHuVjvpyBp55cRPmi5EsGTP8q5kMfv 8WVqgc6QYL0XgnPZWHaE6+PQA/S/Si7MyD3GyhXgb+Tx3o/23LoHCIQ04nItw1LRUkvR cMWFnhxYzI/S+kzOo75FLZpq8GWmjqyWnYqt8CDlxOF9KSV6j4vxbPSBkgLnLOVx+woW sRKoEkoV3lEyfsw4LAvQ/dPb2dGvgeZZmCfBuTxeymo0Cj6g0kwReNO9EIY4SSXVEYiY 8dsA== 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=0g3/1TFW7J9C3LovEcd6iofw0OUU02hI0pTDHabu7Qs=; fh=UoPnrMfWVKGOqsML3Cwqzr4dYAyNRBpPmY/ITnBmPi0=; b=qWETqbWhqsTkMtkeT3PQSdcDRnqSOu978u/myx4QYdG2QIVW5hbqIL93CCDdXeAK4Z L4ELo+2EEFMlSEilx9hbnyPN63LmraWdG2LLD6WdfaIkzIPOEeWQZa0sf1VVROC6/lif MNLcwzmDJi860r3otCHt+7YL/iFUv1i93WSYHq4UkOzWs1VcWLnzyRnbfBrO041TOXmB MsqMKJ9LJHgW+nxD3d8KBIF2rKoa7EzPfpqKsviWKtKF60RqsN6G99sqIAqXpvTF7/71 HC8iiHvjcK9misLy89GCCqEw2WbrTMDx0E0ENE1d7XSyHAv1CFCORBoDQpld+ZJP4H4K jRWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=MsIaXIxb; 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 x16-20020a056a00189000b0065bbe39e1b3si1257415pfh.146.2023.07.11.02.25.45; Tue, 11 Jul 2023 02:25:57 -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=MsIaXIxb; 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 S232071AbjGKJR0 (ORCPT + 99 others); Tue, 11 Jul 2023 05:17:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43632 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232011AbjGKJQg (ORCPT ); Tue, 11 Jul 2023 05:16:36 -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 D56561BEE; Tue, 11 Jul 2023 02:15:55 -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 4078A6141C; Tue, 11 Jul 2023 09:15:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CB6BBC433C8; Tue, 11 Jul 2023 09:15:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689066954; bh=cnhCrU302lBWpqqSZEtBVpwpUyFOTI0LwYyd4a513JI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MsIaXIxb+07nyrykDDXDageQhDSgeCIixPzAgcdGS13ZW7suHp9s78psDRlpZ3hf8 knMy2K9BrFq3De+Du+G73iuB3juTwrE+j+0vcSBytn+3AymAyAjlXdzuIQ3teXoCFd ZeSwtyM6y3VNQvoY1II3TuhhoCgO++GKvHQZllsnHrGBomf5FIfEcdL2lCrERA7EwS xdATQ2XFPE+zsrKnkSJJjovGP9QuhN1o9XwW4WK+U5UvZfTCk+zQO33QcMrrEnC2eu pgrUxELVKv0EUL499/IiNF1qoKxUbwokj70xC4zrPU0aYRF8ZRC+QC5HpStljU9VTb jtUwoQC3e9Esw== 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 v6 12/21] x86/decompressor: Only call the trampoline when changing paging levels Date: Tue, 11 Jul 2023 11:14:44 +0200 Message-Id: <20230711091453.2543622-13-ardb@kernel.org> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230711091453.2543622-1-ardb@kernel.org> References: <20230711091453.2543622-1-ardb@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3740; i=ardb@kernel.org; h=from:subject; bh=cnhCrU302lBWpqqSZEtBVpwpUyFOTI0LwYyd4a513JI=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JIWWtbJNhotPpmku9D1//6n/EPPETWxKXa+1um7UczTbsB 7lsmX52lLIwiHEwyIopsgjM/vtu5+mJUrXOs2Rh5rAygQxh4OIUgInMW8nIcO1nUk7iYtMrmqXW 7ndvaO5MOcc9b9dl4/Whj6dMPDljZT8jw+PM98s5nc7O3fRePFvy2uIb3Wckpvo4pHOW2MZudzk Zww8A X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,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 Since the current and desired number of paging levels are known when the trampoline is being prepared, avoid calling the trampoline at all if it is clear that calling it is not going to result in a change to the number of paging levels. Given that the CPU is already running in long mode, the PAE and LA57 settings are necessarily consistent with the currently active page tables - the only difference is that CR4.MCE will always be preserved in this case, but it will be cleared by the real kernel startup code if CONFIG_X86_MCE is not enabled. Acked-by: Kirill A. Shutemov Signed-off-by: Ard Biesheuvel --- arch/x86/boot/compressed/head_64.S | 21 +------------------- arch/x86/boot/compressed/pgtable_64.c | 18 +++++++---------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 3d4da7e5270c8d4d..577173be8ec805cd 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -387,10 +387,6 @@ SYM_CODE_START(startup_64) * For the trampoline, we need the top page table to reside in lower * memory as we don't have a way to load 64-bit values into CR3 in * 32-bit mode. - * - * We go though the trampoline even if we don't have to: if we're - * already in a desired paging mode. This way the trampoline code gets - * tested on every boot. */ /* Make sure we have GDT with 32-bit code segment */ @@ -542,25 +538,10 @@ SYM_CODE_START(trampoline_32bit_src) btrl $X86_CR0_PG_BIT, %eax movl %eax, %cr0 - /* Check what paging mode we want to be in after the trampoline */ - testl %esi, %esi - jz 1f - - /* We want 5-level paging: don't touch CR3 if it already points to 5-level page tables */ - movl %cr4, %eax - testl $X86_CR4_LA57, %eax - jnz 3f - jmp 2f -1: - /* We want 4-level paging: don't touch CR3 if it already points to 4-level page tables */ - movl %cr4, %eax - testl $X86_CR4_LA57, %eax - jz 3f -2: /* Point CR3 to the trampoline's new top level page table */ leal TRAMPOLINE_32BIT_PGTABLE_OFFSET(%edi), %eax movl %eax, %cr3 -3: + /* Set EFER.LME=1 as a precaution in case hypervsior pulls the rug */ movl $MSR_EFER, %ecx rdmsr diff --git a/arch/x86/boot/compressed/pgtable_64.c b/arch/x86/boot/compressed/pgtable_64.c index 649c51935fdec7ef..4016444e6788304f 100644 --- a/arch/x86/boot/compressed/pgtable_64.c +++ b/arch/x86/boot/compressed/pgtable_64.c @@ -128,6 +128,13 @@ asmlinkage void set_paging_levels(void *rmode) l5_required = true; } + /* + * The trampoline will not be used if the paging mode is already set to + * the desired one. + */ + if (l5_required == !!(native_read_cr4() & X86_CR4_LA57)) + return; + trampoline_32bit = (unsigned long *)find_trampoline_placement(); /* Preserve trampoline memory */ @@ -155,18 +162,8 @@ asmlinkage void set_paging_levels(void *rmode) * * The new page table will be used by trampoline code for switching * from 4- to 5-level paging or vice versa. - * - * If switching is not required, the page table is unused: trampoline - * code wouldn't touch CR3. */ - /* - * We are not going to use the page table in trampoline memory if we - * are already in the desired paging mode. - */ - if (l5_required == !!(native_read_cr4() & X86_CR4_LA57)) - goto out; - if (l5_required) { /* * For 4- to 5-level paging transition, set up current CR3 as @@ -189,7 +186,6 @@ asmlinkage void set_paging_levels(void *rmode) (void *)src, PAGE_SIZE); } -out: toggle_la57(trampoline_32bit, l5_required); } -- 2.39.2