|
@@ -70,14 +70,14 @@ extern struct tracepoint __tracepoint_read_msr;
|
|
|
extern struct tracepoint __tracepoint_write_msr;
|
|
|
extern struct tracepoint __tracepoint_rdpmc;
|
|
|
#define msr_tracepoint_active(t) static_key_false(&(t).key)
|
|
|
-extern void do_trace_write_msr(unsigned msr, u64 val, int failed);
|
|
|
-extern void do_trace_read_msr(unsigned msr, u64 val, int failed);
|
|
|
-extern void do_trace_rdpmc(unsigned msr, u64 val, int failed);
|
|
|
+extern void do_trace_write_msr(unsigned int msr, u64 val, int failed);
|
|
|
+extern void do_trace_read_msr(unsigned int msr, u64 val, int failed);
|
|
|
+extern void do_trace_rdpmc(unsigned int msr, u64 val, int failed);
|
|
|
#else
|
|
|
#define msr_tracepoint_active(t) false
|
|
|
-static inline void do_trace_write_msr(unsigned msr, u64 val, int failed) {}
|
|
|
-static inline void do_trace_read_msr(unsigned msr, u64 val, int failed) {}
|
|
|
-static inline void do_trace_rdpmc(unsigned msr, u64 val, int failed) {}
|
|
|
+static inline void do_trace_write_msr(unsigned int msr, u64 val, int failed) {}
|
|
|
+static inline void do_trace_read_msr(unsigned int msr, u64 val, int failed) {}
|
|
|
+static inline void do_trace_rdpmc(unsigned int msr, u64 val, int failed) {}
|
|
|
#endif
|
|
|
|
|
|
static inline unsigned long long native_read_msr(unsigned int msr)
|
|
@@ -115,22 +115,36 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
|
|
|
}
|
|
|
|
|
|
/* Can be uninlined because referenced by paravirt */
|
|
|
-notrace static inline void native_write_msr(unsigned int msr,
|
|
|
- unsigned low, unsigned high)
|
|
|
+static inline void notrace
|
|
|
+__native_write_msr_notrace(unsigned int msr, u32 low, u32 high)
|
|
|
{
|
|
|
asm volatile("1: wrmsr\n"
|
|
|
"2:\n"
|
|
|
_ASM_EXTABLE_HANDLE(1b, 2b, ex_handler_wrmsr_unsafe)
|
|
|
: : "c" (msr), "a"(low), "d" (high) : "memory");
|
|
|
+}
|
|
|
+
|
|
|
+/* Can be uninlined because referenced by paravirt */
|
|
|
+static inline void notrace
|
|
|
+native_write_msr(unsigned int msr, u32 low, u32 high)
|
|
|
+{
|
|
|
+ __native_write_msr_notrace(msr, low, high);
|
|
|
if (msr_tracepoint_active(__tracepoint_write_msr))
|
|
|
do_trace_write_msr(msr, ((u64)high << 32 | low), 0);
|
|
|
}
|
|
|
|
|
|
+static inline void
|
|
|
+wrmsr_notrace(unsigned int msr, u32 low, u32 high)
|
|
|
+{
|
|
|
+ __native_write_msr_notrace(msr, low, high);
|
|
|
+}
|
|
|
+
|
|
|
/* Can be uninlined because referenced by paravirt */
|
|
|
-notrace static inline int native_write_msr_safe(unsigned int msr,
|
|
|
- unsigned low, unsigned high)
|
|
|
+static inline int notrace
|
|
|
+native_write_msr_safe(unsigned int msr, u32 low, u32 high)
|
|
|
{
|
|
|
int err;
|
|
|
+
|
|
|
asm volatile("2: wrmsr ; xor %[err],%[err]\n"
|
|
|
"1:\n\t"
|
|
|
".section .fixup,\"ax\"\n\t"
|
|
@@ -223,7 +237,7 @@ do { \
|
|
|
(void)((high) = (u32)(__val >> 32)); \
|
|
|
} while (0)
|
|
|
|
|
|
-static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
|
|
|
+static inline void wrmsr(unsigned int msr, u32 low, u32 high)
|
|
|
{
|
|
|
native_write_msr(msr, low, high);
|
|
|
}
|
|
@@ -231,13 +245,13 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
|
|
|
#define rdmsrl(msr, val) \
|
|
|
((val) = native_read_msr((msr)))
|
|
|
|
|
|
-static inline void wrmsrl(unsigned msr, u64 val)
|
|
|
+static inline void wrmsrl(unsigned int msr, u64 val)
|
|
|
{
|
|
|
native_write_msr(msr, (u32)(val & 0xffffffffULL), (u32)(val >> 32));
|
|
|
}
|
|
|
|
|
|
/* wrmsr with exception handling */
|
|
|
-static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
|
|
+static inline int wrmsr_safe(unsigned int msr, u32 low, u32 high)
|
|
|
{
|
|
|
return native_write_msr_safe(msr, low, high);
|
|
|
}
|
|
@@ -252,7 +266,7 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
|
|
__err; \
|
|
|
})
|
|
|
|
|
|
-static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
|
|
|
+static inline int rdmsrl_safe(unsigned int msr, unsigned long long *p)
|
|
|
{
|
|
|
int err;
|
|
|
|
|
@@ -325,12 +339,12 @@ static inline int wrmsrl_on_cpu(unsigned int cpu, u32 msr_no, u64 q)
|
|
|
static inline void rdmsr_on_cpus(const struct cpumask *m, u32 msr_no,
|
|
|
struct msr *msrs)
|
|
|
{
|
|
|
- rdmsr_on_cpu(0, msr_no, &(msrs[0].l), &(msrs[0].h));
|
|
|
+ rdmsr_on_cpu(0, msr_no, &(msrs[0].l), &(msrs[0].h));
|
|
|
}
|
|
|
static inline void wrmsr_on_cpus(const struct cpumask *m, u32 msr_no,
|
|
|
struct msr *msrs)
|
|
|
{
|
|
|
- wrmsr_on_cpu(0, msr_no, msrs[0].l, msrs[0].h);
|
|
|
+ wrmsr_on_cpu(0, msr_no, msrs[0].l, msrs[0].h);
|
|
|
}
|
|
|
static inline int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no,
|
|
|
u32 *l, u32 *h)
|