Received: by 2002:a25:23cc:0:0:0:0:0 with SMTP id j195csp849868ybj; Thu, 7 May 2020 09:01:25 -0700 (PDT) X-Google-Smtp-Source: APiQypJAW7j8gIAJdmB3+TbpRUw3b6jX/foyF1NyVFlWOfTquTi3aLv278xNmScqjsUNWO8q9pLn X-Received: by 2002:a50:f381:: with SMTP id g1mr12606787edm.219.1588867285601; Thu, 07 May 2020 09:01:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1588867285; cv=none; d=google.com; s=arc-20160816; b=rvB9m7m3hW1qHNZ7DduhIhmULhTh9u1t2FX7hFuqSKeV6jQ/RgZ3QAXS8MRtmcZKmR Sx7MVSKj5nuG5w6ni9jlKuhBNsw71EikDDB4/guq5C676kGNxxXsHObd2APdy4XdoK7X wLRu2E5o1/pvJ7eKL2FHyNj0EEq8Zl/mG45DVBEBKg22oW3TiuG7+Cjot/TQl8B7Qjfd Sbb5BDUSvrEHGpIKyGt3EIlDj7IRpqZp1amW0aJ68oX4GkSmN7pUYfliXoowIznmQazn 7Kjs9WLRB6JwLR7nu/vr/Doc0cTjmtc8mXfGUNMVK716Dv15U/gn5iz/3VK6aFSdfCNh Fyog== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=rr+AMLbEKgFcWB/YOJFG1aDhip6cpV1MIzCTkBAbBSY=; b=J+cWdxRX9fTNXQtieWxXiVqaoZgRhL0+kxxswwD2FmTPs+qm4pJ6QvORwJlPurZjC5 oOcPYSbBZvVORIUajpCDViwdaKRiMye+kkhd+JcZoYSjNs7r8CNmm2KKs+lX8ZdEq5S8 wRY+Qm2GeXTRUlKfcZfi/t20fYVRixClXWMlwi3FXkTAXRqdFYJzVr4tN3iM3Z75gtc+ pgeCzGK9e8NCzAuxZisHF1CBLm4x1iY2rFu19XhhSHMobhHhKa+AHRetRrx+nJD0vh7O CfiD/mJbOvofq+BiMNKhUBIeXPgll2yzUNda1ayujmL5nsk1vN/Lrjkei2o5UT8RaHG6 YlaA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i21si3490447ejh.256.2020.05.07.09.00.53; Thu, 07 May 2020 09:01:25 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727857AbgEGP6P (ORCPT + 99 others); Thu, 7 May 2020 11:58:15 -0400 Received: from mga12.intel.com ([192.55.52.136]:33248 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726029AbgEGP6P (ORCPT ); Thu, 7 May 2020 11:58:15 -0400 IronPort-SDR: 8ZNZfHpNyQk9cxLl51mxR5d+FzwiJFETorbkOhr4ASUDM5L7pu5mx/sW2nq8yM4Menj8Gb5SxD 3jFixHdRnAiA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2020 08:58:14 -0700 IronPort-SDR: DKvZ4Y0WgUj+jR3xUIP422g2bmkjshteb4SkyARNZKL0Quu5rjeQkDchpgfiS12QyN/4Nqsnat ELe7RVZCn1xA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.73,364,1583222400"; d="scan'208";a="249326305" Received: from yyu32-desk.sc.intel.com ([143.183.136.146]) by orsmga007.jf.intel.com with ESMTP; 07 May 2020 08:58:14 -0700 From: Yu-cheng Yu To: linux-kernel@vger.kernel.org, x86@kernel.org, "H. Peter Anvin" , Thomas Gleixner , Ingo Molnar , Dave Hansen , Tony Luck , Andy Lutomirski , Borislav Petkov , Rik van Riel , "Ravi V. Shankar" , Sebastian Andrzej Siewior , Fenghua Yu , Peter Zijlstra Cc: Yu-cheng Yu Subject: [PATCH v3 07/10] x86/fpu/xstate: Update copy_kernel_to_xregs_err() for XSAVES supervisor states Date: Thu, 7 May 2020 08:58:16 -0700 Message-Id: <20200507155816.26059-1-yu-cheng.yu@intel.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20200328164307.17497-8-yu-cheng.yu@intel.com> References: <20200328164307.17497-8-yu-cheng.yu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The function copy_kernel_to_xregs_err() uses XRSTOR, which can work with standard or compacted format without supervisor xstates. However, when supervisor xstates are present, XRSTORS must be used. Fix it by using XRSTORS when XSAVES is enabled. I also considered if there were additional cases where XRSTOR might be mistakenly called instead of XRSTORS. There are only three XRSTOR sites in kernel: 1. copy_kernel_to_xregs_booting(), already switches between XRSTOR and XRSTORS based on X86_FEATURE_XSAVES. 2. copy_user_to_xregs(), which *needs* XRSTOR because it is copying from userspace and must never copy supervisor state with XRSTORS. 3. copy_kernel_to_xregs_err() mistakenly used XRSTOR only. Fixed it. Signed-off-by: Yu-cheng Yu Reviewed-by: Dave Hansen --- arch/x86/include/asm/fpu/internal.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h index a42fcb4b690d..42159f45bf9c 100644 --- a/arch/x86/include/asm/fpu/internal.h +++ b/arch/x86/include/asm/fpu/internal.h @@ -400,7 +400,10 @@ static inline int copy_kernel_to_xregs_err(struct xregs_state *xstate, u64 mask) u32 hmask = mask >> 32; int err; - XSTATE_OP(XRSTOR, xstate, lmask, hmask, err); + if (static_cpu_has(X86_FEATURE_XSAVES)) + XSTATE_OP(XRSTORS, xstate, lmask, hmask, err); + else + XSTATE_OP(XRSTOR, xstate, lmask, hmask, err); return err; } -- 2.21.0