Received: by 2002:ac0:da4c:0:0:0:0:0 with SMTP id a12csp457520imi; Fri, 22 Jul 2022 02:48:51 -0700 (PDT) X-Google-Smtp-Source: AGRyM1unCfRe6nFOsMpsNPvwLNC1+3XnFG49T4PjNfhGWs+9gKns+61VwAWNiEzez2H0luxRAdvY X-Received: by 2002:a17:90b:1e12:b0:1f0:4b4c:868a with SMTP id pg18-20020a17090b1e1200b001f04b4c868amr3128124pjb.57.1658483331065; Fri, 22 Jul 2022 02:48:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1658483331; cv=none; d=google.com; s=arc-20160816; b=VtE65+3p5xv2tgLof7rnCeKoVCn0hroIrb9FY05EUO5Hn7rD6mEmXM/MVMbzsP1G6k FPqEkcMqyyEDe2sScJ4K9fpYwOWag9A5rf/cjjn3XuI58kEsCBpdqoEWyRLXFdFX+avN DdDeJk8R+XcGWzuP3UrjotP2HKsPX5ZemPvTsmHAw6Xrg/B1ev35wL+Kf2PJWsEHMZe2 lU8e+TKOWYbREh5OluXCV2UElxiie3FViH2ttYd3cb9qz3tHpsjyAarCvNCcud0uztSb YQalbQTtcREvf2l6zV01X6BMCJbcz3Exxnl0ZhPH5p9jcfsh2hkGx0/3Ly4j3VPIviA2 63Ew== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=L9xMJk0fp8ElNcwGPR3taL9lEcDgyGOnQXUZPlZzbkk=; b=XehiJsImkiG9BcVlRxLUaRHacQbv6dvxY/6kqkHe28Dtwz9aufLMFNI6z1+DydE+qS XGKiwOz6ABR8sHChHc1Sby2Axfk7bWE8dzRtCl2cTU/WY6wULiA2NQrj48kLJoZW99jJ Ujkk4XB7nJg/jpztq+8YZ3xgH7Qvfz9LVO1xzGUNKO7Z0GNoLc61FSQQsIqctUXuWvjp mtE3a7R8ekSS7NvOrj01Sb32xxINfmSRx2J4Fun6vUgcCdVWZImG5Gw3wKMkEKMZA5O4 VOA163R3ryWKIzFDvdvCnCH04HaA5nFrsAwPZBpvoRLMJUOazKEoH548ZbLy82zMxDSF wfGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=xREj9Lnc; 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=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id r138-20020a632b90000000b0040dea78a5b8si4632399pgr.637.2022.07.22.02.48.35; Fri, 22 Jul 2022 02:48:51 -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=@linuxfoundation.org header.s=korg header.b=xREj9Lnc; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235596AbiGVJSP (ORCPT + 99 others); Fri, 22 Jul 2022 05:18:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50944 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235821AbiGVJRr (ORCPT ); Fri, 22 Jul 2022 05:17:47 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BCE2BB852F; Fri, 22 Jul 2022 02:12:38 -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 F283461F65; Fri, 22 Jul 2022 09:12:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0630CC341C6; Fri, 22 Jul 2022 09:12:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1658481157; bh=1DCPxPvjrPP4RCFt/kmt9VosaPKCE1ukz5C8TaZI250=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=xREj9Lnct+c387AfA4H6fBtOnoxgruQ6mKjQwAWi7srZcXvBOvKx3LOLaT9FD7YEY /0oTkEwjFNDnadMpR+nRUPILtFY7XvKT0PWSrEOqMiK9bZBwwyn2EpxxqkE1CmiS0R NVO2XEyImHtNyoH09XTmpzVWyzEapGkM1/DIdV74= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lai Jiangshan , Borislav Petkov , Thadeu Lima de Souza Cascardo Subject: [PATCH 5.15 02/89] x86/entry: Switch the stack after error_entry() returns Date: Fri, 22 Jul 2022 11:10:36 +0200 Message-Id: <20220722091133.500016168@linuxfoundation.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220722091133.320803732@linuxfoundation.org> References: <20220722091133.320803732@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.8 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 From: Lai Jiangshan commit 520a7e80c96d655fbe4650d9cc985bd9d0443389 upstream. error_entry() calls fixup_bad_iret() before sync_regs() if it is a fault from a bad IRET, to copy pt_regs to the kernel stack. It switches to the kernel stack directly after sync_regs(). But error_entry() itself is also a function call, so it has to stash the address it is going to return to, in %r12 which is unnecessarily complicated. Move the stack switching after error_entry() and get rid of the need to handle the return address. [ bp: Massage commit message. ] Signed-off-by: Lai Jiangshan Signed-off-by: Borislav Petkov Link: https://lore.kernel.org/r/20220503032107.680190-3-jiangshanlai@gmail.com Signed-off-by: Thadeu Lima de Souza Cascardo Signed-off-by: Greg Kroah-Hartman --- arch/x86/entry/entry_64.S | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -323,6 +323,8 @@ SYM_CODE_END(ret_from_fork) .macro idtentry_body cfunc has_error_code:req call error_entry + movq %rax, %rsp /* switch to the task stack if from userspace */ + ENCODE_FRAME_POINTER UNWIND_HINT_REGS movq %rsp, %rdi /* pt_regs pointer into 1st argument*/ @@ -982,14 +984,10 @@ SYM_CODE_START_LOCAL(error_entry) /* We have user CR3. Change to kernel CR3. */ SWITCH_TO_KERNEL_CR3 scratch_reg=%rax + leaq 8(%rsp), %rdi /* arg0 = pt_regs pointer */ .Lerror_entry_from_usermode_after_swapgs: /* Put us onto the real thread stack. */ - popq %r12 /* save return addr in %12 */ - movq %rsp, %rdi /* arg0 = pt_regs pointer */ call sync_regs - movq %rax, %rsp /* switch stack */ - ENCODE_FRAME_POINTER - pushq %r12 RET /* @@ -1021,6 +1019,7 @@ SYM_CODE_START_LOCAL(error_entry) */ .Lerror_entry_done_lfence: FENCE_SWAPGS_KERNEL_ENTRY + leaq 8(%rsp), %rax /* return pt_regs pointer */ RET .Lbstep_iret: @@ -1041,12 +1040,9 @@ SYM_CODE_START_LOCAL(error_entry) * Pretend that the exception came from user mode: set up pt_regs * as if we faulted immediately after IRET. */ - popq %r12 /* save return addr in %12 */ - movq %rsp, %rdi /* arg0 = pt_regs pointer */ + leaq 8(%rsp), %rdi /* arg0 = pt_regs pointer */ call fixup_bad_iret - mov %rax, %rsp - ENCODE_FRAME_POINTER - pushq %r12 + mov %rax, %rdi jmp .Lerror_entry_from_usermode_after_swapgs SYM_CODE_END(error_entry)