From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754838AbbIBXb1 (ORCPT ); Wed, 2 Sep 2015 19:31:27 -0400 Received: from mga09.intel.com ([134.134.136.24]:1322 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751897AbbIBXb0 (ORCPT ); Wed, 2 Sep 2015 19:31:26 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,457,1437462000"; d="scan'208";a="796659408" Subject: [PATCH 02/15] x86, fpu: move XSAVE-disabling code to a helper To: dave@sr71.net Cc: dave.hansen@linux.intel.com, mingo@redhat.com, x86@kernel.org, bp@alien8.de, fenghua.yu@intel.com, tim.c.chen@linux.intel.com, linux-kernel@vger.kernel.org From: Dave Hansen Date: Wed, 02 Sep 2015 16:31:24 -0700 References: <20150902233123.3A7E5FB0@viggo.jf.intel.com> In-Reply-To: <20150902233123.3A7E5FB0@viggo.jf.intel.com> Message-Id: <20150902233124.EA9A70E5@viggo.jf.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Hansen When we want to _completely_ disable XSAVE support as far as the kernel is concerned, we have a big set of feature flags to clear. We currently only do this in cases where the user asks for it to be disabled, but we are about to expand the places where we do it to handle errors too. Move the code in to xstate.c, and put it in the xstate.h header. We will use it in the next patch too. Signed-off-by: Dave Hansen Cc: Ingo Molnar Cc: x86@kernel.org Cc: Borislav Petkov Cc: Fenghua Yu Cc: Tim Chen Cc: linux-kernel@vger.kernel.org --- b/arch/x86/include/asm/fpu/xstate.h | 1 + b/arch/x86/kernel/fpu/init.c | 12 +----------- b/arch/x86/kernel/fpu/xstate.c | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) diff -puN arch/x86/include/asm/fpu/xstate.h~clear-all-xsave-cpu-caps arch/x86/include/asm/fpu/xstate.h --- a/arch/x86/include/asm/fpu/xstate.h~clear-all-xsave-cpu-caps 2015-09-02 15:52:47.582783889 -0700 +++ b/arch/x86/include/asm/fpu/xstate.h 2015-09-02 16:26:19.739216233 -0700 @@ -40,6 +40,7 @@ extern u64 xstate_fx_sw_bytes[USER_XSTAT extern void update_regset_xstate_info(unsigned int size, u64 xstate_mask); +void fpu__xstate_clear_all_cpu_caps(void); void *get_xsave_addr(struct xregs_state *xsave, int xstate); const void *get_xsave_field_ptr(int xstate_field); diff -puN arch/x86/kernel/fpu/init.c~clear-all-xsave-cpu-caps arch/x86/kernel/fpu/init.c --- a/arch/x86/kernel/fpu/init.c~clear-all-xsave-cpu-caps 2015-09-02 15:52:47.583783934 -0700 +++ b/arch/x86/kernel/fpu/init.c 2015-09-02 16:26:19.739216233 -0700 @@ -354,17 +354,7 @@ static int __init x86_noxsave_setup(char if (strlen(s)) return 0; - setup_clear_cpu_cap(X86_FEATURE_XSAVE); - setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT); - setup_clear_cpu_cap(X86_FEATURE_XSAVEC); - setup_clear_cpu_cap(X86_FEATURE_XSAVES); - setup_clear_cpu_cap(X86_FEATURE_AVX); - setup_clear_cpu_cap(X86_FEATURE_AVX2); - setup_clear_cpu_cap(X86_FEATURE_AVX512F); - setup_clear_cpu_cap(X86_FEATURE_AVX512PF); - setup_clear_cpu_cap(X86_FEATURE_AVX512ER); - setup_clear_cpu_cap(X86_FEATURE_AVX512CD); - setup_clear_cpu_cap(X86_FEATURE_MPX); + fpu__xstate_clear_all_cpu_caps(); return 1; } diff -puN arch/x86/kernel/fpu/xstate.c~clear-all-xsave-cpu-caps arch/x86/kernel/fpu/xstate.c --- a/arch/x86/kernel/fpu/xstate.c~clear-all-xsave-cpu-caps 2015-09-02 15:52:47.585784026 -0700 +++ b/arch/x86/kernel/fpu/xstate.c 2015-09-02 16:26:25.775490411 -0700 @@ -39,6 +39,25 @@ static unsigned int xstate_comp_offsets[ static unsigned int xfeatures_nr; /* + * Clear all of the X86_FEATURE_* bits that are unavailable + * when the CPU has no XSAVE support. + */ +void fpu__xstate_clear_all_cpu_caps(void) +{ + setup_clear_cpu_cap(X86_FEATURE_XSAVE); + setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT); + setup_clear_cpu_cap(X86_FEATURE_XSAVEC); + setup_clear_cpu_cap(X86_FEATURE_XSAVES); + setup_clear_cpu_cap(X86_FEATURE_AVX); + setup_clear_cpu_cap(X86_FEATURE_AVX2); + setup_clear_cpu_cap(X86_FEATURE_AVX512F); + setup_clear_cpu_cap(X86_FEATURE_AVX512PF); + setup_clear_cpu_cap(X86_FEATURE_AVX512ER); + setup_clear_cpu_cap(X86_FEATURE_AVX512CD); + setup_clear_cpu_cap(X86_FEATURE_MPX); +} + +/* * Return whether the system supports a given xfeature. * * Also return the name of the (most advanced) feature that the caller requested: _