|
@@ -217,16 +217,7 @@ enum spectre_v2_mitigation {
|
|
|
SPECTRE_V2_IBRS,
|
|
|
};
|
|
|
|
|
|
-/*
|
|
|
- * The Intel specification for the SPEC_CTRL MSR requires that we
|
|
|
- * preserve any already set reserved bits at boot time (e.g. for
|
|
|
- * future additions that this kernel is not currently aware of).
|
|
|
- * We then set any additional mitigation bits that we want
|
|
|
- * ourselves and always use this as the base for SPEC_CTRL.
|
|
|
- * We also use this when handling guest entry/exit as below.
|
|
|
- */
|
|
|
extern void x86_spec_ctrl_set(u64);
|
|
|
-extern u64 x86_spec_ctrl_get_default(void);
|
|
|
|
|
|
/* The Speculative Store Bypass disable variants */
|
|
|
enum ssb_mitigation {
|
|
@@ -278,6 +269,9 @@ static inline void indirect_branch_prediction_barrier(void)
|
|
|
alternative_msr_write(MSR_IA32_PRED_CMD, val, X86_FEATURE_USE_IBPB);
|
|
|
}
|
|
|
|
|
|
+/* The Intel SPEC CTRL MSR base value cache */
|
|
|
+extern u64 x86_spec_ctrl_base;
|
|
|
+
|
|
|
/*
|
|
|
* With retpoline, we must use IBRS to restrict branch prediction
|
|
|
* before calling into firmware.
|
|
@@ -286,7 +280,7 @@ static inline void indirect_branch_prediction_barrier(void)
|
|
|
*/
|
|
|
#define firmware_restrict_branch_speculation_start() \
|
|
|
do { \
|
|
|
- u64 val = x86_spec_ctrl_get_default() | SPEC_CTRL_IBRS; \
|
|
|
+ u64 val = x86_spec_ctrl_base | SPEC_CTRL_IBRS; \
|
|
|
\
|
|
|
preempt_disable(); \
|
|
|
alternative_msr_write(MSR_IA32_SPEC_CTRL, val, \
|
|
@@ -295,7 +289,7 @@ do { \
|
|
|
|
|
|
#define firmware_restrict_branch_speculation_end() \
|
|
|
do { \
|
|
|
- u64 val = x86_spec_ctrl_get_default(); \
|
|
|
+ u64 val = x86_spec_ctrl_base; \
|
|
|
\
|
|
|
alternative_msr_write(MSR_IA32_SPEC_CTRL, val, \
|
|
|
X86_FEATURE_USE_IBRS_FW); \
|