Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp2565069rwd; Mon, 22 May 2023 00:20:45 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6eJpAIqW7wU7iXKb+S0jrKDJxmKJx0LbuFST3mlX14uvl93k8/04CGc9k7kksQA9t9+oTJ X-Received: by 2002:a05:6a20:3952:b0:104:d7e6:a8f2 with SMTP id r18-20020a056a20395200b00104d7e6a8f2mr11035009pzg.3.1684740045482; Mon, 22 May 2023 00:20:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1684740045; cv=none; d=google.com; s=arc-20160816; b=DkS0YXPQvRmgy4gEtnHURXWyBa552MeKO0pYE51d11GxzU/OXZq9bLsgPRb6b6ydPd PjhhjnViphblce44jHdDR9ZSF64rj/x5MCh85NKEIhMgy32OVcCEYqQ2QH+/k8seiwxW xyVcFHc3uElxjRNQU1BHmvVdJJ7M5plr9x0d0D0NhRmlNQ3SqILRJd37rHEnDYV0CFVN DCiYUPyKkTsvUL+aR2ZlCAPL9hFp/Q6EyapR5cEpNITWsE8s40qjw4JiW/qE11GHV2hm bGkHXfjZyp8RQZozgMsHdt97eTFV1MiXqx80Nd5Y+OMVZsJSyawtWDvu3ckQVPGBtz7w uSYg== 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=x6HDeOfTmKCWyOfu+z54dADCNk6vl1IOzYSyYB4KuDs=; b=I7AlzDAG2vV8uQtguQdJCOI+dYW2ir3+zT8FO53UMLfejZqct6GK4tsPhake6IX8AI bGU/NdzpW5CYcTJMrWtURF80VeYxYU8gzsE3TevY519CQrwltG25JxN07KlOOvOdJl5i DAHDloP7BHoPw7LhSH46tMMyCiiyJwLeBQ0mRIbpkIVQ2DTkQIv+AvRcZdBP6w4RoJVL EM1z47n/W8mztVg4L3h00019wBQlLDGrp5nURJ4Q8+QwtWnQLrv8Hteqg4NbaB1xpOUP F4LLnaW2UcC2b/g1TSAUJl3mblAAUMMXLu7nKipXckIjaUPefjSNgyyWDONSd36OYn74 Bsqw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=FyjAA71P; 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 x71-20020a63864a000000b0053b52fed717si3184011pgd.864.2023.05.22.00.20.29; Mon, 22 May 2023 00:20:45 -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=FyjAA71P; 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 S232214AbjEVHQM (ORCPT + 99 others); Mon, 22 May 2023 03:16:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46230 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232397AbjEVHPr (ORCPT ); Mon, 22 May 2023 03:15:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CED7118F; Mon, 22 May 2023 00:15:20 -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 532D261DD3; Mon, 22 May 2023 07:15:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0CA83C4339C; Mon, 22 May 2023 07:15:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1684739719; bh=u+mBV9LASMmynY9CQFGbcEYb3DED+j3/4fMymyiLQXA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FyjAA71PYrnpMLQHPHv32CH7/BWCS6DH91r8ny9yChy7sOq8/30xAg760z547M2O5 YthevGeJ5sdMO7RP0KpjBmHDCZm04SpHkKUXGGPnk1oh093YhuyEgjQbsYhBOFllUy hngucDLL8pwjGpkykQX8i/QhwBJRfES+9nDgsMOUkUjJRpT1tU/5p8VxYg/1KTb6DZ N/rpOcxxe8by8sDqBShDD0CHILaxXjWD9+EJ4pliMvzYNnCQbekaazrRfrBJ59Ut1T QfAGS2j0BtezeMB9Z74qvE1h6+fFWXtuqTyivAbAP7t6DnJzlG0gAYDK2sRSbMCqHR ufxYdIy6qrd2A== 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 11/21] x86/decompressor: Only call the trampoline when changing paging levels Date: Mon, 22 May 2023 09:14:05 +0200 Message-Id: <20230522071415.501717-12-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=3739; i=ardb@kernel.org; h=from:subject; bh=u+mBV9LASMmynY9CQFGbcEYb3DED+j3/4fMymyiLQXA=; b=owGbwMvMwCFmkMcZplerG8N4Wi2JISVbzMrC9nxPor1CuD6POqfBqxxt7VtsE05xa3y19Hiz8 VL3Y9eOUhYGMQ4GWTFFFoHZf9/tPD1RqtZ5lizMHFYmkCEMXJwCMJENcxj+2cW3taQ3TdRs3W80 u1L4BD9nxvrHpRFMWyt/C83jrll2jpFhdVCjxOEvb1LvXTrkl1bDI7eq4PSsuY6lJSZ7+I/2FbI wAwA= X-Developer-Key: i=ardb@kernel.org; a=openpgp; fpr=F43D03328115A198C90016883D200E9CA6329909 Content-Transfer-Encoding: 8bit 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,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 a60ec9283bd760e3..403c96dae34d9c6d 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 b62b6819dcdd01be..b92cf1d6e156d5f6 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; } + /* + * We are not going to use the trampoline if we + * are already in the desired paging mode. + */ + 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