提交 d91cab78 编写于 作者: D Dave Hansen 提交者: Ingo Molnar

x86/fpu: Rename XSAVE macros

There are two concepts that have some confusing naming:
 1. Extended State Component numbers (currently called
    XFEATURE_BIT_*)
 2. Extended State Component masks (currently called XSTATE_*)

The numbers are (currently) from 0-9.  State component 3 is the
bounds registers for MPX, for instance.

But when we want to enable "state component 3", we go set a bit
in XCR0.  The bit we set is 1<<3.  We can check to see if a
state component feature is enabled by looking at its bit.

The current 'xfeature_bit's are at best xfeature bit _numbers_.
Calling them bits is at best inconsistent with ending the enum
list with 'XFEATURES_NR_MAX'.

This patch renames the enum to be 'xfeature'.  These also
happen to be what the Intel documentation calls a "state
component".

We also want to differentiate these from the "XSTATE_*" macros.
The "XSTATE_*" macros are a mask, and we rename them to match.

These macros are reasonably widely used so this patch is a
wee bit big, but this really is just a rename.

The only non-mechanical part of this is the

	s/XSTATE_EXTEND_MASK/XFEATURE_MASK_EXTEND/

We need a better name for it, but that's another patch.
Signed-off-by: NDave Hansen <dave.hansen@linux.intel.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: dave@sr71.net
Cc: linux-kernel@vger.kernel.org
Link: http://lkml.kernel.org/r/20150902233126.38653250@viggo.jf.intel.com
[ Ported to v4.3-rc1. ]
Signed-off-by: NIngo Molnar <mingo@kernel.org>
上级 75933433
...@@ -567,7 +567,8 @@ static int __init camellia_aesni_init(void) ...@@ -567,7 +567,8 @@ static int __init camellia_aesni_init(void)
return -ENODEV; return -ENODEV;
} }
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
&feature_name)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -554,7 +554,8 @@ static int __init camellia_aesni_init(void) ...@@ -554,7 +554,8 @@ static int __init camellia_aesni_init(void)
{ {
const char *feature_name; const char *feature_name;
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
&feature_name)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -469,7 +469,8 @@ static int __init cast5_init(void) ...@@ -469,7 +469,8 @@ static int __init cast5_init(void)
{ {
const char *feature_name; const char *feature_name;
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
&feature_name)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -591,7 +591,8 @@ static int __init cast6_init(void) ...@@ -591,7 +591,8 @@ static int __init cast6_init(void)
{ {
const char *feature_name; const char *feature_name;
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
&feature_name)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -130,7 +130,7 @@ static int __init chacha20_simd_mod_init(void) ...@@ -130,7 +130,7 @@ static int __init chacha20_simd_mod_init(void)
#ifdef CONFIG_AS_AVX2 #ifdef CONFIG_AS_AVX2
chacha20_use_avx2 = cpu_has_avx && cpu_has_avx2 && chacha20_use_avx2 = cpu_has_avx && cpu_has_avx2 &&
cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, NULL); cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL);
#endif #endif
return crypto_register_alg(&alg); return crypto_register_alg(&alg);
} }
......
...@@ -184,7 +184,7 @@ static int __init poly1305_simd_mod_init(void) ...@@ -184,7 +184,7 @@ static int __init poly1305_simd_mod_init(void)
#ifdef CONFIG_AS_AVX2 #ifdef CONFIG_AS_AVX2
poly1305_use_avx2 = cpu_has_avx && cpu_has_avx2 && poly1305_use_avx2 = cpu_has_avx && cpu_has_avx2 &&
cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, NULL); cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL);
alg.descsize = sizeof(struct poly1305_simd_desc_ctx); alg.descsize = sizeof(struct poly1305_simd_desc_ctx);
if (poly1305_use_avx2) if (poly1305_use_avx2)
alg.descsize += 10 * sizeof(u32); alg.descsize += 10 * sizeof(u32);
......
...@@ -542,7 +542,8 @@ static int __init init(void) ...@@ -542,7 +542,8 @@ static int __init init(void)
pr_info("AVX2 instructions are not detected.\n"); pr_info("AVX2 instructions are not detected.\n");
return -ENODEV; return -ENODEV;
} }
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
&feature_name)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -597,7 +597,8 @@ static int __init serpent_init(void) ...@@ -597,7 +597,8 @@ static int __init serpent_init(void)
{ {
const char *feature_name; const char *feature_name;
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM,
&feature_name)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -121,7 +121,7 @@ static struct shash_alg alg = { ...@@ -121,7 +121,7 @@ static struct shash_alg alg = {
#ifdef CONFIG_AS_AVX #ifdef CONFIG_AS_AVX
static bool __init avx_usable(void) static bool __init avx_usable(void)
{ {
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, NULL)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
if (cpu_has_avx) if (cpu_has_avx)
pr_info("AVX detected but unusable.\n"); pr_info("AVX detected but unusable.\n");
return false; return false;
......
...@@ -130,7 +130,7 @@ static struct shash_alg algs[] = { { ...@@ -130,7 +130,7 @@ static struct shash_alg algs[] = { {
#ifdef CONFIG_AS_AVX #ifdef CONFIG_AS_AVX
static bool __init avx_usable(void) static bool __init avx_usable(void)
{ {
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, NULL)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
if (cpu_has_avx) if (cpu_has_avx)
pr_info("AVX detected but unusable.\n"); pr_info("AVX detected but unusable.\n");
return false; return false;
......
...@@ -129,7 +129,7 @@ static struct shash_alg algs[] = { { ...@@ -129,7 +129,7 @@ static struct shash_alg algs[] = { {
#ifdef CONFIG_AS_AVX #ifdef CONFIG_AS_AVX
static bool __init avx_usable(void) static bool __init avx_usable(void)
{ {
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, NULL)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
if (cpu_has_avx) if (cpu_has_avx)
pr_info("AVX detected but unusable.\n"); pr_info("AVX detected but unusable.\n");
return false; return false;
......
...@@ -558,7 +558,7 @@ static int __init twofish_init(void) ...@@ -558,7 +558,7 @@ static int __init twofish_init(void)
{ {
const char *feature_name; const char *feature_name;
if (!cpu_has_xfeatures(XSTATE_SSE | XSTATE_YMM, &feature_name)) { if (!cpu_has_xfeatures(XFEATURE_MASK_SSE | XFEATURE_MASK_YMM, NULL)) {
pr_info("CPU feature '%s' is not supported.\n", feature_name); pr_info("CPU feature '%s' is not supported.\n", feature_name);
return -ENODEV; return -ENODEV;
} }
......
...@@ -95,30 +95,36 @@ struct swregs_state { ...@@ -95,30 +95,36 @@ struct swregs_state {
/* /*
* List of XSAVE features Linux knows about: * List of XSAVE features Linux knows about:
*/ */
enum xfeature_bit { enum xfeature {
XSTATE_BIT_FP, XFEATURE_FP,
XSTATE_BIT_SSE, XFEATURE_SSE,
XSTATE_BIT_YMM, /*
XSTATE_BIT_BNDREGS, * Values above here are "legacy states".
XSTATE_BIT_BNDCSR, * Those below are "extended states".
XSTATE_BIT_OPMASK, */
XSTATE_BIT_ZMM_Hi256, XFEATURE_YMM,
XSTATE_BIT_Hi16_ZMM, XFEATURE_BNDREGS,
XFEATURE_BNDCSR,
XFEATURE_OPMASK,
XFEATURE_ZMM_Hi256,
XFEATURE_Hi16_ZMM,
XFEATURES_NR_MAX, XFEATURES_NR_MAX,
}; };
#define XSTATE_FP (1 << XSTATE_BIT_FP) #define XFEATURE_MASK_FP (1 << XFEATURE_FP)
#define XSTATE_SSE (1 << XSTATE_BIT_SSE) #define XFEATURE_MASK_SSE (1 << XFEATURE_SSE)
#define XSTATE_YMM (1 << XSTATE_BIT_YMM) #define XFEATURE_MASK_YMM (1 << XFEATURE_YMM)
#define XSTATE_BNDREGS (1 << XSTATE_BIT_BNDREGS) #define XFEATURE_MASK_BNDREGS (1 << XFEATURE_BNDREGS)
#define XSTATE_BNDCSR (1 << XSTATE_BIT_BNDCSR) #define XFEATURE_MASK_BNDCSR (1 << XFEATURE_BNDCSR)
#define XSTATE_OPMASK (1 << XSTATE_BIT_OPMASK) #define XFEATURE_MASK_OPMASK (1 << XFEATURE_OPMASK)
#define XSTATE_ZMM_Hi256 (1 << XSTATE_BIT_ZMM_Hi256) #define XFEATURE_MASK_ZMM_Hi256 (1 << XFEATURE_ZMM_Hi256)
#define XSTATE_Hi16_ZMM (1 << XSTATE_BIT_Hi16_ZMM) #define XFEATURE_MASK_Hi16_ZMM (1 << XFEATURE_Hi16_ZMM)
#define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) #define XFEATURE_MASK_FPSSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE)
#define XSTATE_AVX512 (XSTATE_OPMASK | XSTATE_ZMM_Hi256 | XSTATE_Hi16_ZMM) #define XFEATURE_MASK_AVX512 (XFEATURE_MASK_OPMASK \
| XFEATURE_MASK_ZMM_Hi256 \
| XFEATURE_MASK_Hi16_ZMM)
/* /*
* There are 16x 256-bit AVX registers named YMM0-YMM15. * There are 16x 256-bit AVX registers named YMM0-YMM15.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
/* Bit 63 of XCR0 is reserved for future expansion */ /* Bit 63 of XCR0 is reserved for future expansion */
#define XSTATE_EXTEND_MASK (~(XSTATE_FPSSE | (1ULL << 63))) #define XFEATURE_MASK_EXTEND (~(XFEATURE_MASK_FPSSE | (1ULL << 63)))
#define XSTATE_CPUID 0x0000000d #define XSTATE_CPUID 0x0000000d
...@@ -19,14 +19,18 @@ ...@@ -19,14 +19,18 @@
#define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET) #define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET)
/* Supported features which support lazy state saving */ /* Supported features which support lazy state saving */
#define XSTATE_LAZY (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \ #define XFEATURE_MASK_LAZY (XFEATURE_MASK_FP | \
| XSTATE_OPMASK | XSTATE_ZMM_Hi256 | XSTATE_Hi16_ZMM) XFEATURE_MASK_SSE | \
XFEATURE_MASK_YMM | \
XFEATURE_MASK_OPMASK | \
XFEATURE_MASK_ZMM_Hi256 | \
XFEATURE_MASK_Hi16_ZMM)
/* Supported features which require eager state saving */ /* Supported features which require eager state saving */
#define XSTATE_EAGER (XSTATE_BNDREGS | XSTATE_BNDCSR) #define XFEATURE_MASK_EAGER (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR)
/* All currently supported features */ /* All currently supported features */
#define XCNTXT_MASK (XSTATE_LAZY | XSTATE_EAGER) #define XCNTXT_MASK (XFEATURE_MASK_LAZY | XFEATURE_MASK_EAGER)
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
#define REX_PREFIX "0x48, " #define REX_PREFIX "0x48, "
......
...@@ -290,11 +290,11 @@ static void __init fpu__init_system_ctx_switch(void) ...@@ -290,11 +290,11 @@ static void __init fpu__init_system_ctx_switch(void)
if (cpu_has_xsaveopt && eagerfpu != DISABLE) if (cpu_has_xsaveopt && eagerfpu != DISABLE)
eagerfpu = ENABLE; eagerfpu = ENABLE;
if (xfeatures_mask & XSTATE_EAGER) { if (xfeatures_mask & XFEATURE_MASK_EAGER) {
if (eagerfpu == DISABLE) { if (eagerfpu == DISABLE) {
pr_err("x86/fpu: eagerfpu switching disabled, disabling the following xstate features: 0x%llx.\n", pr_err("x86/fpu: eagerfpu switching disabled, disabling the following xstate features: 0x%llx.\n",
xfeatures_mask & XSTATE_EAGER); xfeatures_mask & XFEATURE_MASK_EAGER);
xfeatures_mask &= ~XSTATE_EAGER; xfeatures_mask &= ~XFEATURE_MASK_EAGER;
} else { } else {
eagerfpu = ENABLE; eagerfpu = ENABLE;
} }
......
...@@ -66,7 +66,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset, ...@@ -66,7 +66,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
* presence of FP and SSE state. * presence of FP and SSE state.
*/ */
if (cpu_has_xsave) if (cpu_has_xsave)
fpu->state.xsave.header.xfeatures |= XSTATE_FPSSE; fpu->state.xsave.header.xfeatures |= XFEATURE_MASK_FPSSE;
return ret; return ret;
} }
...@@ -326,7 +326,7 @@ int fpregs_set(struct task_struct *target, const struct user_regset *regset, ...@@ -326,7 +326,7 @@ int fpregs_set(struct task_struct *target, const struct user_regset *regset,
* presence of FP. * presence of FP.
*/ */
if (cpu_has_xsave) if (cpu_has_xsave)
fpu->state.xsave.header.xfeatures |= XSTATE_FP; fpu->state.xsave.header.xfeatures |= XFEATURE_MASK_FP;
return ret; return ret;
} }
......
...@@ -107,7 +107,7 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame) ...@@ -107,7 +107,7 @@ static inline int save_xstate_epilog(void __user *buf, int ia32_frame)
* header as well as change any contents in the memory layout. * header as well as change any contents in the memory layout.
* xrestore as part of sigreturn will capture all the changes. * xrestore as part of sigreturn will capture all the changes.
*/ */
xfeatures |= XSTATE_FPSSE; xfeatures |= XFEATURE_MASK_FPSSE;
err |= __put_user(xfeatures, (__u32 *)&x->header.xfeatures); err |= __put_user(xfeatures, (__u32 *)&x->header.xfeatures);
...@@ -207,7 +207,7 @@ sanitize_restored_xstate(struct task_struct *tsk, ...@@ -207,7 +207,7 @@ sanitize_restored_xstate(struct task_struct *tsk,
* layout and not enabled by the OS. * layout and not enabled by the OS.
*/ */
if (fx_only) if (fx_only)
header->xfeatures = XSTATE_FPSSE; header->xfeatures = XFEATURE_MASK_FPSSE;
else else
header->xfeatures &= (xfeatures_mask & xfeatures); header->xfeatures &= (xfeatures_mask & xfeatures);
} }
...@@ -230,7 +230,7 @@ static inline int copy_user_to_fpregs_zeroing(void __user *buf, u64 xbv, int fx_ ...@@ -230,7 +230,7 @@ static inline int copy_user_to_fpregs_zeroing(void __user *buf, u64 xbv, int fx_
{ {
if (use_xsave()) { if (use_xsave()) {
if ((unsigned long)buf % 64 || fx_only) { if ((unsigned long)buf % 64 || fx_only) {
u64 init_bv = xfeatures_mask & ~XSTATE_FPSSE; u64 init_bv = xfeatures_mask & ~XFEATURE_MASK_FPSSE;
copy_kernel_to_xregs(&init_fpstate.xsave, init_bv); copy_kernel_to_xregs(&init_fpstate.xsave, init_bv);
return copy_user_to_fxregs(buf); return copy_user_to_fxregs(buf);
} else { } else {
......
...@@ -72,7 +72,7 @@ int cpu_has_xfeatures(u64 xfeatures_needed, const char **feature_name) ...@@ -72,7 +72,7 @@ int cpu_has_xfeatures(u64 xfeatures_needed, const char **feature_name)
/* /*
* So we use FLS here to be able to print the most advanced * So we use FLS here to be able to print the most advanced
* feature that was requested but is missing. So if a driver * feature that was requested but is missing. So if a driver
* asks about "XSTATE_SSE | XSTATE_YMM" we'll print the * asks about "XFEATURE_MASK_SSE | XFEATURE_MASK_YMM" we'll print the
* missing AVX feature - this is the most informative message * missing AVX feature - this is the most informative message
* to users: * to users:
*/ */
...@@ -131,7 +131,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu) ...@@ -131,7 +131,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu)
/* /*
* FP is in init state * FP is in init state
*/ */
if (!(xfeatures & XSTATE_FP)) { if (!(xfeatures & XFEATURE_MASK_FP)) {
fx->cwd = 0x37f; fx->cwd = 0x37f;
fx->swd = 0; fx->swd = 0;
fx->twd = 0; fx->twd = 0;
...@@ -144,7 +144,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu) ...@@ -144,7 +144,7 @@ void fpstate_sanitize_xstate(struct fpu *fpu)
/* /*
* SSE is in init state * SSE is in init state
*/ */
if (!(xfeatures & XSTATE_SSE)) if (!(xfeatures & XFEATURE_MASK_SSE))
memset(&fx->xmm_space[0], 0, 256); memset(&fx->xmm_space[0], 0, 256);
/* /*
...@@ -223,14 +223,14 @@ static void __init print_xstate_feature(u64 xstate_mask) ...@@ -223,14 +223,14 @@ static void __init print_xstate_feature(u64 xstate_mask)
*/ */
static void __init print_xstate_features(void) static void __init print_xstate_features(void)
{ {
print_xstate_feature(XSTATE_FP); print_xstate_feature(XFEATURE_MASK_FP);
print_xstate_feature(XSTATE_SSE); print_xstate_feature(XFEATURE_MASK_SSE);
print_xstate_feature(XSTATE_YMM); print_xstate_feature(XFEATURE_MASK_YMM);
print_xstate_feature(XSTATE_BNDREGS); print_xstate_feature(XFEATURE_MASK_BNDREGS);
print_xstate_feature(XSTATE_BNDCSR); print_xstate_feature(XFEATURE_MASK_BNDCSR);
print_xstate_feature(XSTATE_OPMASK); print_xstate_feature(XFEATURE_MASK_OPMASK);
print_xstate_feature(XSTATE_ZMM_Hi256); print_xstate_feature(XFEATURE_MASK_ZMM_Hi256);
print_xstate_feature(XSTATE_Hi16_ZMM); print_xstate_feature(XFEATURE_MASK_Hi16_ZMM);
} }
/* /*
...@@ -365,7 +365,11 @@ static int init_xstate_size(void) ...@@ -365,7 +365,11 @@ static int init_xstate_size(void)
return 0; return 0;
} }
void fpu__init_disable_system_xstate(void) /*
* We enabled the XSAVE hardware, but something went wrong and
* we can not use it. Disable it.
*/
static void fpu__init_disable_system_xstate(void)
{ {
xfeatures_mask = 0; xfeatures_mask = 0;
cr4_clear_bits(X86_CR4_OSXSAVE); cr4_clear_bits(X86_CR4_OSXSAVE);
...@@ -398,7 +402,7 @@ void __init fpu__init_system_xstate(void) ...@@ -398,7 +402,7 @@ void __init fpu__init_system_xstate(void)
cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx); cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
xfeatures_mask = eax + ((u64)edx << 32); xfeatures_mask = eax + ((u64)edx << 32);
if ((xfeatures_mask & XSTATE_FPSSE) != XSTATE_FPSSE) { if ((xfeatures_mask & XFEATURE_MASK_FPSSE) != XFEATURE_MASK_FPSSE) {
pr_err("x86/fpu: FP/SSE not present amongst the CPU's xstate features: 0x%llx.\n", xfeatures_mask); pr_err("x86/fpu: FP/SSE not present amongst the CPU's xstate features: 0x%llx.\n", xfeatures_mask);
BUG(); BUG();
} }
...@@ -451,7 +455,7 @@ void fpu__resume_cpu(void) ...@@ -451,7 +455,7 @@ void fpu__resume_cpu(void)
* Inputs: * Inputs:
* xstate: the thread's storage area for all FPU data * xstate: the thread's storage area for all FPU data
* xstate_feature: state which is defined in xsave.h (e.g. * xstate_feature: state which is defined in xsave.h (e.g.
* XSTATE_FP, XSTATE_SSE, etc...) * XFEATURE_MASK_FP, XFEATURE_MASK_SSE, etc...)
* Output: * Output:
* address of the state in the xsave area, or NULL if the * address of the state in the xsave area, or NULL if the
* field is not present in the xsave buffer. * field is not present in the xsave buffer.
...@@ -502,8 +506,8 @@ EXPORT_SYMBOL_GPL(get_xsave_addr); ...@@ -502,8 +506,8 @@ EXPORT_SYMBOL_GPL(get_xsave_addr);
* Note that this only works on the current task. * Note that this only works on the current task.
* *
* Inputs: * Inputs:
* @xsave_state: state which is defined in xsave.h (e.g. XSTATE_FP, * @xsave_state: state which is defined in xsave.h (e.g. XFEATURE_MASK_FP,
* XSTATE_SSE, etc...) * XFEATURE_MASK_SSE, etc...)
* Output: * Output:
* address of the state in the xsave area or NULL if the state * address of the state in the xsave area or NULL if the state
* is not present or is in its 'init state'. * is not present or is in its 'init state'.
......
...@@ -384,7 +384,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code) ...@@ -384,7 +384,7 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
* which is all zeros which indicates MPX was not * which is all zeros which indicates MPX was not
* responsible for the exception. * responsible for the exception.
*/ */
bndcsr = get_xsave_field_ptr(XSTATE_BNDCSR); bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR);
if (!bndcsr) if (!bndcsr)
goto exit_trap; goto exit_trap;
......
...@@ -30,7 +30,7 @@ static u32 xstate_required_size(u64 xstate_bv, bool compacted) ...@@ -30,7 +30,7 @@ static u32 xstate_required_size(u64 xstate_bv, bool compacted)
int feature_bit = 0; int feature_bit = 0;
u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET; u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET;
xstate_bv &= XSTATE_EXTEND_MASK; xstate_bv &= XFEATURE_MASK_EXTEND;
while (xstate_bv) { while (xstate_bv) {
if (xstate_bv & 0x1) { if (xstate_bv & 0x1) {
u32 eax, ebx, ecx, edx, offset; u32 eax, ebx, ecx, edx, offset;
...@@ -51,7 +51,7 @@ u64 kvm_supported_xcr0(void) ...@@ -51,7 +51,7 @@ u64 kvm_supported_xcr0(void)
u64 xcr0 = KVM_SUPPORTED_XCR0 & host_xcr0; u64 xcr0 = KVM_SUPPORTED_XCR0 & host_xcr0;
if (!kvm_x86_ops->mpx_supported()) if (!kvm_x86_ops->mpx_supported())
xcr0 &= ~(XSTATE_BNDREGS | XSTATE_BNDCSR); xcr0 &= ~(XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR);
return xcr0; return xcr0;
} }
......
...@@ -662,9 +662,9 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) ...@@ -662,9 +662,9 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
/* Only support XCR_XFEATURE_ENABLED_MASK(xcr0) now */ /* Only support XCR_XFEATURE_ENABLED_MASK(xcr0) now */
if (index != XCR_XFEATURE_ENABLED_MASK) if (index != XCR_XFEATURE_ENABLED_MASK)
return 1; return 1;
if (!(xcr0 & XSTATE_FP)) if (!(xcr0 & XFEATURE_MASK_FP))
return 1; return 1;
if ((xcr0 & XSTATE_YMM) && !(xcr0 & XSTATE_SSE)) if ((xcr0 & XFEATURE_MASK_YMM) && !(xcr0 & XFEATURE_MASK_SSE))
return 1; return 1;
/* /*
...@@ -672,23 +672,24 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr) ...@@ -672,23 +672,24 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
* saving. However, xcr0 bit 0 is always set, even if the * saving. However, xcr0 bit 0 is always set, even if the
* emulated CPU does not support XSAVE (see fx_init). * emulated CPU does not support XSAVE (see fx_init).
*/ */
valid_bits = vcpu->arch.guest_supported_xcr0 | XSTATE_FP; valid_bits = vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FP;
if (xcr0 & ~valid_bits) if (xcr0 & ~valid_bits)
return 1; return 1;
if ((!(xcr0 & XSTATE_BNDREGS)) != (!(xcr0 & XSTATE_BNDCSR))) if ((!(xcr0 & XFEATURE_MASK_BNDREGS)) !=
(!(xcr0 & XFEATURE_MASK_BNDCSR)))
return 1; return 1;
if (xcr0 & XSTATE_AVX512) { if (xcr0 & XFEATURE_MASK_AVX512) {
if (!(xcr0 & XSTATE_YMM)) if (!(xcr0 & XFEATURE_MASK_YMM))
return 1; return 1;
if ((xcr0 & XSTATE_AVX512) != XSTATE_AVX512) if ((xcr0 & XFEATURE_MASK_AVX512) != XFEATURE_MASK_AVX512)
return 1; return 1;
} }
kvm_put_guest_xcr0(vcpu); kvm_put_guest_xcr0(vcpu);
vcpu->arch.xcr0 = xcr0; vcpu->arch.xcr0 = xcr0;
if ((xcr0 ^ old_xcr0) & XSTATE_EXTEND_MASK) if ((xcr0 ^ old_xcr0) & XFEATURE_MASK_EXTEND)
kvm_update_cpuid(vcpu); kvm_update_cpuid(vcpu);
return 0; return 0;
} }
...@@ -2906,7 +2907,7 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu) ...@@ -2906,7 +2907,7 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu)
* Copy each region from the possibly compacted offset to the * Copy each region from the possibly compacted offset to the
* non-compacted offset. * non-compacted offset.
*/ */
valid = xstate_bv & ~XSTATE_FPSSE; valid = xstate_bv & ~XFEATURE_MASK_FPSSE;
while (valid) { while (valid) {
u64 feature = valid & -valid; u64 feature = valid & -valid;
int index = fls64(feature) - 1; int index = fls64(feature) - 1;
...@@ -2944,7 +2945,7 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src) ...@@ -2944,7 +2945,7 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src)
* Copy each region from the non-compacted offset to the * Copy each region from the non-compacted offset to the
* possibly compacted offset. * possibly compacted offset.
*/ */
valid = xstate_bv & ~XSTATE_FPSSE; valid = xstate_bv & ~XFEATURE_MASK_FPSSE;
while (valid) { while (valid) {
u64 feature = valid & -valid; u64 feature = valid & -valid;
int index = fls64(feature) - 1; int index = fls64(feature) - 1;
...@@ -2972,7 +2973,7 @@ static void kvm_vcpu_ioctl_x86_get_xsave(struct kvm_vcpu *vcpu, ...@@ -2972,7 +2973,7 @@ static void kvm_vcpu_ioctl_x86_get_xsave(struct kvm_vcpu *vcpu,
&vcpu->arch.guest_fpu.state.fxsave, &vcpu->arch.guest_fpu.state.fxsave,
sizeof(struct fxregs_state)); sizeof(struct fxregs_state));
*(u64 *)&guest_xsave->region[XSAVE_HDR_OFFSET / sizeof(u32)] = *(u64 *)&guest_xsave->region[XSAVE_HDR_OFFSET / sizeof(u32)] =
XSTATE_FPSSE; XFEATURE_MASK_FPSSE;
} }
} }
...@@ -2992,7 +2993,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu, ...@@ -2992,7 +2993,7 @@ static int kvm_vcpu_ioctl_x86_set_xsave(struct kvm_vcpu *vcpu,
return -EINVAL; return -EINVAL;
load_xsave(vcpu, (u8 *)guest_xsave->region); load_xsave(vcpu, (u8 *)guest_xsave->region);
} else { } else {
if (xstate_bv & ~XSTATE_FPSSE) if (xstate_bv & ~XFEATURE_MASK_FPSSE)
return -EINVAL; return -EINVAL;
memcpy(&vcpu->arch.guest_fpu.state.fxsave, memcpy(&vcpu->arch.guest_fpu.state.fxsave,
guest_xsave->region, sizeof(struct fxregs_state)); guest_xsave->region, sizeof(struct fxregs_state));
...@@ -7001,7 +7002,7 @@ static void fx_init(struct kvm_vcpu *vcpu) ...@@ -7001,7 +7002,7 @@ static void fx_init(struct kvm_vcpu *vcpu)
/* /*
* Ensure guest xcr0 is valid for loading * Ensure guest xcr0 is valid for loading
*/ */
vcpu->arch.xcr0 = XSTATE_FP; vcpu->arch.xcr0 = XFEATURE_MASK_FP;
vcpu->arch.cr0 |= X86_CR0_ET; vcpu->arch.cr0 |= X86_CR0_ET;
} }
......
...@@ -180,9 +180,9 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata); ...@@ -180,9 +180,9 @@ int kvm_mtrr_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata);
bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn, bool kvm_mtrr_check_gfn_range_consistency(struct kvm_vcpu *vcpu, gfn_t gfn,
int page_num); int page_num);
#define KVM_SUPPORTED_XCR0 (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \ #define KVM_SUPPORTED_XCR0 (XFEATURE_MASK_FP | XFEATURE_MASK_SSE \
| XSTATE_BNDREGS | XSTATE_BNDCSR \ | XFEATURE_MASK_YMM | XFEATURE_MASK_BNDREGS \
| XSTATE_AVX512) | XFEATURE_MASK_BNDCSR | XFEATURE_MASK_AVX512)
extern u64 host_xcr0; extern u64 host_xcr0;
extern u64 kvm_supported_xcr0(void); extern u64 kvm_supported_xcr0(void);
......
...@@ -258,7 +258,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs) ...@@ -258,7 +258,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
goto err_out; goto err_out;
} }
/* get bndregs field from current task's xsave area */ /* get bndregs field from current task's xsave area */
bndregs = get_xsave_field_ptr(XSTATE_BNDREGS); bndregs = get_xsave_field_ptr(XFEATURE_MASK_BNDREGS);
if (!bndregs) { if (!bndregs) {
err = -EINVAL; err = -EINVAL;
goto err_out; goto err_out;
...@@ -315,7 +315,7 @@ static __user void *mpx_get_bounds_dir(void) ...@@ -315,7 +315,7 @@ static __user void *mpx_get_bounds_dir(void)
* The bounds directory pointer is stored in a register * The bounds directory pointer is stored in a register
* only accessible if we first do an xsave. * only accessible if we first do an xsave.
*/ */
bndcsr = get_xsave_field_ptr(XSTATE_BNDCSR); bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR);
if (!bndcsr) if (!bndcsr)
return MPX_INVALID_BOUNDS_DIR; return MPX_INVALID_BOUNDS_DIR;
...@@ -492,7 +492,7 @@ static int do_mpx_bt_fault(void) ...@@ -492,7 +492,7 @@ static int do_mpx_bt_fault(void)
const struct bndcsr *bndcsr; const struct bndcsr *bndcsr;
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
bndcsr = get_xsave_field_ptr(XSTATE_BNDCSR); bndcsr = get_xsave_field_ptr(XFEATURE_MASK_BNDCSR);
if (!bndcsr) if (!bndcsr)
return -EINVAL; return -EINVAL;
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册