diff options
Diffstat (limited to 'arch/x86/lib/msr-smp.c')
| -rw-r--r-- | arch/x86/lib/msr-smp.c | 62 | 
1 files changed, 62 insertions, 0 deletions
diff --git a/arch/x86/lib/msr-smp.c b/arch/x86/lib/msr-smp.c index a6b1b86d225..518532e6a3f 100644 --- a/arch/x86/lib/msr-smp.c +++ b/arch/x86/lib/msr-smp.c @@ -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.  | 
