|
@@ -241,15 +241,16 @@ static inline void vmexit_fill_RSB(void)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-#define alternative_msr_write(_msr, _val, _feature) \
|
|
|
|
- asm volatile(ALTERNATIVE("", \
|
|
|
|
- "movl %[msr], %%ecx\n\t" \
|
|
|
|
- "movl %[val], %%eax\n\t" \
|
|
|
|
- "movl $0, %%edx\n\t" \
|
|
|
|
- "wrmsr", \
|
|
|
|
- _feature) \
|
|
|
|
- : : [msr] "i" (_msr), [val] "i" (_val) \
|
|
|
|
- : "eax", "ecx", "edx", "memory")
|
|
|
|
|
|
+static __always_inline
|
|
|
|
+void alternative_msr_write(unsigned int msr, u64 val, unsigned int feature)
|
|
|
|
+{
|
|
|
|
+ asm volatile(ALTERNATIVE("", "wrmsr", %c[feature])
|
|
|
|
+ : : "c" (msr),
|
|
|
|
+ "a" (val),
|
|
|
|
+ "d" (val >> 32),
|
|
|
|
+ [feature] "i" (feature)
|
|
|
|
+ : "memory");
|
|
|
|
+}
|
|
|
|
|
|
static inline void indirect_branch_prediction_barrier(void)
|
|
static inline void indirect_branch_prediction_barrier(void)
|
|
{
|
|
{
|