Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp2463261imd; Fri, 2 Nov 2018 11:51:02 -0700 (PDT) X-Google-Smtp-Source: AJdET5fYEfCR6KM1q17U1M0jEovu19ZGhLaJTVUYBbLZhFXXV52VxPPSTnPonHJyLD861/KWzwkZ X-Received: by 2002:a62:7f8c:: with SMTP id a134-v6mr13148900pfd.22.1541184662842; Fri, 02 Nov 2018 11:51:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541184662; cv=none; d=google.com; s=arc-20160816; b=oc1I2T2plzMVXXrEkTQk8zsQaI92OUKN+/b97N62KSbY3a1VfaIFrZZffQ/p3tT2B0 jXiguFRUULl1zPslPkJczbi1LZ31Y/PAnv9wyBsA3hPb1jVs4Ppfz05wrfsFJ0gz/s4S co+16/NrBl4lBOGkUVyOdTANwPiu/bp4FGdOLYphC2mfoMJuB7NQpBShn/jNiwMvvOYK XOx1wRZi/MVGAcFxk7WlOiMWmMbVlyupWS+4b1oZlbDBqtgeR0MbSscfoWyxv2xpaOKe x9vkhratSAckxqSp2yVm/nbSrTPRCWcHEvbbGApH9mPFhDZrB27EEzL4tVszK/m0h5v6 SWTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=d78n95zAvb5D9ntp6pHUNvUhErp65KQat4eIQacMXAc=; b=ifOIs0v1+r+5DfbvDFPbaMTLxhj6PHGXCjYztAUd/Fj2mkNAU1y+iV02CPlkJGYkB7 2+CYRsG6dTv6pDQDKtlwvWvKtO6zDGnZhzoyK0Hu9v0MHrhiVQGG6wy7TBjtjYpvRo0F x6841V/jZ+41P5ROZVWubXiNZF4cg58MfGuJqu5UYCafkKjhYLRI11RpCNqXZ5fkgBty AZKT9i0x5HSlwXc+pNQZrrLbgpTX2kllI98d2ClYh0594GnlzVfSzYF6qgwvbpO1t/wE vsy2Rpsz/3WLgy5PHIec3O6G9Hp359hBra2DFEC5saZr9LQrZ5YDyE+vDAVG1MEHgrRe XtJw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ihS+Bs2Y; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d37-v6si24102980plb.167.2018.11.02.11.50.47; Fri, 02 Nov 2018 11:51:02 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ihS+Bs2Y; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730577AbeKCD6n (ORCPT + 99 others); Fri, 2 Nov 2018 23:58:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:54488 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728280AbeKCD6m (ORCPT ); Fri, 2 Nov 2018 23:58:42 -0400 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id BCD792082D; Fri, 2 Nov 2018 18:50:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541184627; bh=HYKb19qxrzGNVS4eiCeYlgFDMGy6cC5Z/UlYXrE6ndM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ihS+Bs2Y5WGvLRzb8zXh0FWsxScjB2kpAyozuMtQs5zQLHsrCQsGPeoGMXhoED0OQ 5kTwnSD3nKEslAfpfxfgCD6g6GuwiP/F/cEhu4xa1mwuocfPLOyL86MtLWYQjhRrAO J7tbmEJ83BTRTfBz7v+k9F7INu7DVlypy9WXL9V8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jarkko Nikula , Andy Lutomirski , Thomas Gleixner , Peter Zijlstra , Borislav Petkov , Linus Torvalds , Ingo Molnar , Sasha Levin Subject: [PATCH 4.14 053/143] x86/power: Fix some ordering bugs in __restore_processor_context() Date: Fri, 2 Nov 2018 19:33:58 +0100 Message-Id: <20181102182901.303280657@linuxfoundation.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181102182857.064326086@linuxfoundation.org> References: <20181102182857.064326086@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit 5b06bbcfc2c621da3009da8decb7511500c293ed ] __restore_processor_context() had a couple of ordering bugs. It restored GSBASE after calling load_gs_index(), and the latter can call into tracing code. It also tried to restore segment registers before restoring the LDT, which is straight-up wrong. Reorder the code so that we restore GSBASE, then the descriptor tables, then the segments. This fixes two bugs. First, it fixes a regression that broke resume under certain configurations due to irqflag tracing in native_load_gs_index(). Second, it fixes resume when the userspace process that initiated suspect had funny segments. The latter can be reproduced by compiling this: // SPDX-License-Identifier: GPL-2.0 /* * ldt_echo.c - Echo argv[1] while using an LDT segment */ int main(int argc, char **argv) { int ret; size_t len; char *buf; const struct user_desc desc = { .entry_number = 0, .base_addr = 0, .limit = 0xfffff, .seg_32bit = 1, .contents = 0, /* Data, grow-up */ .read_exec_only = 0, .limit_in_pages = 1, .seg_not_present = 0, .useable = 0 }; if (argc != 2) errx(1, "Usage: %s STRING", argv[0]); len = asprintf(&buf, "%s\n", argv[1]); if (len < 0) errx(1, "Out of memory"); ret = syscall(SYS_modify_ldt, 1, &desc, sizeof(desc)); if (ret < -1) errno = -ret; if (ret) err(1, "modify_ldt"); asm volatile ("movw %0, %%es" :: "rm" ((unsigned short)7)); write(1, buf, len); return 0; } and running ldt_echo >/sys/power/mem Without the fix, the latter causes a triple fault on resume. Fixes: ca37e57bbe0c ("x86/entry/64: Add missing irqflags tracing to native_load_gs_index()") Reported-by: Jarkko Nikula Signed-off-by: Andy Lutomirski Signed-off-by: Thomas Gleixner Tested-by: Jarkko Nikula Cc: Peter Zijlstra Cc: Borislav Petkov Cc: Linus Torvalds Link: https://lkml.kernel.org/r/6b31721ea92f51ea839e79bd97ade4a75b1eeea2.1512057304.git.luto@kernel.org Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin --- arch/x86/power/cpu.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index 04d5157fe7f8..a51d2dfb57d1 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -228,8 +228,20 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) load_idt((const struct desc_ptr *)&ctxt->idt_limit); #endif +#ifdef CONFIG_X86_64 /* - * segment registers + * We need GSBASE restored before percpu access can work. + * percpu access can happen in exception handlers or in complicated + * helpers like load_gs_index(). + */ + wrmsrl(MSR_GS_BASE, ctxt->gs_base); +#endif + + fix_processor_context(); + + /* + * Restore segment registers. This happens after restoring the GDT + * and LDT, which happen in fix_processor_context(). */ #ifdef CONFIG_X86_32 loadsegment(es, ctxt->es); @@ -250,13 +262,14 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) load_gs_index(ctxt->gs); asm volatile ("movw %0, %%ss" :: "r" (ctxt->ss)); + /* + * Restore FSBASE and user GSBASE after reloading the respective + * segment selectors. + */ wrmsrl(MSR_FS_BASE, ctxt->fs_base); - wrmsrl(MSR_GS_BASE, ctxt->gs_base); wrmsrl(MSR_KERNEL_GS_BASE, ctxt->gs_kernel_base); #endif - fix_processor_context(); - do_fpu_end(); tsc_verify_tsc_adjust(true); x86_platform.restore_sched_clock_state(); -- 2.17.1