Commit b454feb9 authored by Yu-cheng Yu's avatar Yu-cheng Yu Committed by Borislav Petkov

x86/fpu/xstate: Add supervisor PASID state for ENQCMD

The ENQCMD instruction reads a PASID from the IA32_PASID MSR. The
MSR is stored in the task's supervisor XSAVE* PASID state and is
context-switched by XSAVES/XRSTORS.

 [ bp: Add (in-)definite articles and massage. ]
Signed-off-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
Co-developed-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Signed-off-by: default avatarFenghua Yu <fenghua.yu@intel.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Reviewed-by: default avatarTony Luck <tony.luck@intel.com>
Link: https://lkml.kernel.org/r/1600187413-163670-6-git-send-email-fenghua.yu@intel.com
parent ff4f8281
...@@ -114,7 +114,7 @@ enum xfeature { ...@@ -114,7 +114,7 @@ enum xfeature {
XFEATURE_Hi16_ZMM, XFEATURE_Hi16_ZMM,
XFEATURE_PT_UNIMPLEMENTED_SO_FAR, XFEATURE_PT_UNIMPLEMENTED_SO_FAR,
XFEATURE_PKRU, XFEATURE_PKRU,
XFEATURE_RSRVD_COMP_10, XFEATURE_PASID,
XFEATURE_RSRVD_COMP_11, XFEATURE_RSRVD_COMP_11,
XFEATURE_RSRVD_COMP_12, XFEATURE_RSRVD_COMP_12,
XFEATURE_RSRVD_COMP_13, XFEATURE_RSRVD_COMP_13,
...@@ -134,6 +134,7 @@ enum xfeature { ...@@ -134,6 +134,7 @@ enum xfeature {
#define XFEATURE_MASK_Hi16_ZMM (1 << XFEATURE_Hi16_ZMM) #define XFEATURE_MASK_Hi16_ZMM (1 << XFEATURE_Hi16_ZMM)
#define XFEATURE_MASK_PT (1 << XFEATURE_PT_UNIMPLEMENTED_SO_FAR) #define XFEATURE_MASK_PT (1 << XFEATURE_PT_UNIMPLEMENTED_SO_FAR)
#define XFEATURE_MASK_PKRU (1 << XFEATURE_PKRU) #define XFEATURE_MASK_PKRU (1 << XFEATURE_PKRU)
#define XFEATURE_MASK_PASID (1 << XFEATURE_PASID)
#define XFEATURE_MASK_LBR (1 << XFEATURE_LBR) #define XFEATURE_MASK_LBR (1 << XFEATURE_LBR)
#define XFEATURE_MASK_FPSSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE) #define XFEATURE_MASK_FPSSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE)
...@@ -256,6 +257,14 @@ struct arch_lbr_state { ...@@ -256,6 +257,14 @@ struct arch_lbr_state {
struct lbr_entry entries[]; struct lbr_entry entries[];
} __packed; } __packed;
/*
* State component 10 is supervisor state used for context-switching the
* PASID state.
*/
struct ia32_pasid_state {
u64 pasid;
} __packed;
struct xstate_header { struct xstate_header {
u64 xfeatures; u64 xfeatures;
u64 xcomp_bv; u64 xcomp_bv;
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
XFEATURE_MASK_BNDCSR) XFEATURE_MASK_BNDCSR)
/* All currently supported supervisor features */ /* All currently supported supervisor features */
#define XFEATURE_MASK_SUPERVISOR_SUPPORTED (0) #define XFEATURE_MASK_SUPERVISOR_SUPPORTED (XFEATURE_MASK_PASID)
/* /*
* A supervisor state component may not always contain valuable information, * A supervisor state component may not always contain valuable information,
......
...@@ -37,6 +37,7 @@ static const char *xfeature_names[] = ...@@ -37,6 +37,7 @@ static const char *xfeature_names[] =
"AVX-512 ZMM_Hi256" , "AVX-512 ZMM_Hi256" ,
"Processor Trace (unused)" , "Processor Trace (unused)" ,
"Protection Keys User registers", "Protection Keys User registers",
"PASID state",
"unknown xstate feature" , "unknown xstate feature" ,
}; };
...@@ -51,6 +52,7 @@ static short xsave_cpuid_features[] __initdata = { ...@@ -51,6 +52,7 @@ static short xsave_cpuid_features[] __initdata = {
X86_FEATURE_AVX512F, X86_FEATURE_AVX512F,
X86_FEATURE_INTEL_PT, X86_FEATURE_INTEL_PT,
X86_FEATURE_PKU, X86_FEATURE_PKU,
X86_FEATURE_ENQCMD,
}; };
/* /*
...@@ -318,6 +320,7 @@ static void __init print_xstate_features(void) ...@@ -318,6 +320,7 @@ static void __init print_xstate_features(void)
print_xstate_feature(XFEATURE_MASK_ZMM_Hi256); print_xstate_feature(XFEATURE_MASK_ZMM_Hi256);
print_xstate_feature(XFEATURE_MASK_Hi16_ZMM); print_xstate_feature(XFEATURE_MASK_Hi16_ZMM);
print_xstate_feature(XFEATURE_MASK_PKRU); print_xstate_feature(XFEATURE_MASK_PKRU);
print_xstate_feature(XFEATURE_MASK_PASID);
} }
/* /*
...@@ -592,6 +595,7 @@ static void check_xstate_against_struct(int nr) ...@@ -592,6 +595,7 @@ static void check_xstate_against_struct(int nr)
XCHECK_SZ(sz, nr, XFEATURE_ZMM_Hi256, struct avx_512_zmm_uppers_state); XCHECK_SZ(sz, nr, XFEATURE_ZMM_Hi256, struct avx_512_zmm_uppers_state);
XCHECK_SZ(sz, nr, XFEATURE_Hi16_ZMM, struct avx_512_hi16_state); XCHECK_SZ(sz, nr, XFEATURE_Hi16_ZMM, struct avx_512_hi16_state);
XCHECK_SZ(sz, nr, XFEATURE_PKRU, struct pkru_state); XCHECK_SZ(sz, nr, XFEATURE_PKRU, struct pkru_state);
XCHECK_SZ(sz, nr, XFEATURE_PASID, struct ia32_pasid_state);
/* /*
* Make *SURE* to add any feature numbers in below if * Make *SURE* to add any feature numbers in below if
...@@ -601,7 +605,7 @@ static void check_xstate_against_struct(int nr) ...@@ -601,7 +605,7 @@ static void check_xstate_against_struct(int nr)
if ((nr < XFEATURE_YMM) || if ((nr < XFEATURE_YMM) ||
(nr >= XFEATURE_MAX) || (nr >= XFEATURE_MAX) ||
(nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) || (nr == XFEATURE_PT_UNIMPLEMENTED_SO_FAR) ||
((nr >= XFEATURE_RSRVD_COMP_10) && (nr <= XFEATURE_LBR))) { ((nr >= XFEATURE_RSRVD_COMP_11) && (nr <= XFEATURE_LBR))) {
WARN_ONCE(1, "no structure for xstate: %d\n", nr); WARN_ONCE(1, "no structure for xstate: %d\n", nr);
XSTATE_WARN_ON(1); XSTATE_WARN_ON(1);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment