mirror of https://gitee.com/openkylin/linux.git
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: Yu-cheng Yu <yu-cheng.yu@intel.com> Co-developed-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Fenghua Yu <fenghua.yu@intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Tony Luck <tony.luck@intel.com> Link: https://lkml.kernel.org/r/1600187413-163670-6-git-send-email-fenghua.yu@intel.com
This commit is contained in:
parent
ff4f82816d
commit
b454feb9ab
|
@ -114,7 +114,7 @@ enum xfeature {
|
|||
XFEATURE_Hi16_ZMM,
|
||||
XFEATURE_PT_UNIMPLEMENTED_SO_FAR,
|
||||
XFEATURE_PKRU,
|
||||
XFEATURE_RSRVD_COMP_10,
|
||||
XFEATURE_PASID,
|
||||
XFEATURE_RSRVD_COMP_11,
|
||||
XFEATURE_RSRVD_COMP_12,
|
||||
XFEATURE_RSRVD_COMP_13,
|
||||
|
@ -134,6 +134,7 @@ enum xfeature {
|
|||
#define XFEATURE_MASK_Hi16_ZMM (1 << XFEATURE_Hi16_ZMM)
|
||||
#define XFEATURE_MASK_PT (1 << XFEATURE_PT_UNIMPLEMENTED_SO_FAR)
|
||||
#define XFEATURE_MASK_PKRU (1 << XFEATURE_PKRU)
|
||||
#define XFEATURE_MASK_PASID (1 << XFEATURE_PASID)
|
||||
#define XFEATURE_MASK_LBR (1 << XFEATURE_LBR)
|
||||
|
||||
#define XFEATURE_MASK_FPSSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE)
|
||||
|
@ -256,6 +257,14 @@ struct arch_lbr_state {
|
|||
struct lbr_entry entries[];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* State component 10 is supervisor state used for context-switching the
|
||||
* PASID state.
|
||||
*/
|
||||
struct ia32_pasid_state {
|
||||
u64 pasid;
|
||||
} __packed;
|
||||
|
||||
struct xstate_header {
|
||||
u64 xfeatures;
|
||||
u64 xcomp_bv;
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
XFEATURE_MASK_BNDCSR)
|
||||
|
||||
/* 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,
|
||||
|
|
|
@ -37,6 +37,7 @@ static const char *xfeature_names[] =
|
|||
"AVX-512 ZMM_Hi256" ,
|
||||
"Processor Trace (unused)" ,
|
||||
"Protection Keys User registers",
|
||||
"PASID state",
|
||||
"unknown xstate feature" ,
|
||||
};
|
||||
|
||||
|
@ -51,6 +52,7 @@ static short xsave_cpuid_features[] __initdata = {
|
|||
X86_FEATURE_AVX512F,
|
||||
X86_FEATURE_INTEL_PT,
|
||||
X86_FEATURE_PKU,
|
||||
X86_FEATURE_ENQCMD,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -318,6 +320,7 @@ static void __init print_xstate_features(void)
|
|||
print_xstate_feature(XFEATURE_MASK_ZMM_Hi256);
|
||||
print_xstate_feature(XFEATURE_MASK_Hi16_ZMM);
|
||||
print_xstate_feature(XFEATURE_MASK_PKRU);
|
||||
print_xstate_feature(XFEATURE_MASK_PASID);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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_Hi16_ZMM, struct avx_512_hi16_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
|
||||
|
@ -601,7 +605,7 @@ static void check_xstate_against_struct(int nr)
|
|||
if ((nr < XFEATURE_YMM) ||
|
||||
(nr >= XFEATURE_MAX) ||
|
||||
(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);
|
||||
XSTATE_WARN_ON(1);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue