|
@@ -47,6 +47,21 @@ int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
|
|
|
}
|
|
|
EXPORT_SYMBOL(rdmsr_on_cpu);
|
|
|
|
|
|
+int rdmsrl_on_cpu(unsigned int cpu, u32 msr_no, u64 *q)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct msr_info rv;
|
|
|
+
|
|
|
+ memset(&rv, 0, sizeof(rv));
|
|
|
+
|
|
|
+ rv.msr_no = msr_no;
|
|
|
+ err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1);
|
|
|
+ *q = rv.reg.q;
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(rdmsrl_on_cpu);
|
|
|
+
|
|
|
int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
|
|
|
{
|
|
|
int err;
|
|
@@ -63,6 +78,22 @@ int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
|
|
|
}
|
|
|
EXPORT_SYMBOL(wrmsr_on_cpu);
|
|
|
|
|
|
+int wrmsrl_on_cpu(unsigned int cpu, u32 msr_no, u64 q)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct msr_info rv;
|
|
|
+
|
|
|
+ memset(&rv, 0, sizeof(rv));
|
|
|
+
|
|
|
+ rv.msr_no = msr_no;
|
|
|
+ rv.reg.q = q;
|
|
|
+
|
|
|
+ err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1);
|
|
|
+
|
|
|
+ return err;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(wrmsrl_on_cpu);
|
|
|
+
|
|
|
static void __rwmsr_on_cpus(const struct cpumask *mask, u32 msr_no,
|
|
|
struct msr *msrs,
|
|
|
void (*msr_func) (void *info))
|
|
@@ -159,6 +190,37 @@ int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
|
|
|
}
|
|
|
EXPORT_SYMBOL(wrmsr_safe_on_cpu);
|
|
|
|
|
|
+int wrmsrl_safe_on_cpu(unsigned int cpu, u32 msr_no, u64 q)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct msr_info rv;
|
|
|
+
|
|
|
+ memset(&rv, 0, sizeof(rv));
|
|
|
+
|
|
|
+ rv.msr_no = msr_no;
|
|
|
+ rv.reg.q = q;
|
|
|
+
|
|
|
+ err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 1);
|
|
|
+
|
|
|
+ return err ? err : rv.err;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(wrmsrl_safe_on_cpu);
|
|
|
+
|
|
|
+int rdmsrl_safe_on_cpu(unsigned int cpu, u32 msr_no, u64 *q)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ struct msr_info rv;
|
|
|
+
|
|
|
+ memset(&rv, 0, sizeof(rv));
|
|
|
+
|
|
|
+ rv.msr_no = msr_no;
|
|
|
+ err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 1);
|
|
|
+ *q = rv.reg.q;
|
|
|
+
|
|
|
+ return err ? err : rv.err;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(rdmsrl_safe_on_cpu);
|
|
|
+
|
|
|
/*
|
|
|
* These variants are significantly slower, but allows control over
|
|
|
* the entire 32-bit GPR set.
|