@ -16,37 +16,46 @@ static void __rdmsr_on_cpu(void *info)
rdmsr ( rv - > msr_no , rv - > l , rv - > h ) ;
}
static void __rd msr_safe _on_cpu ( void * info )
static void __w rmsr_on_cpu ( void * info )
{
struct msr_info * rv = info ;
rv - > err = rdmsr_safe ( rv - > msr_no , & rv - > l , & rv - > h ) ;
wrmsr ( rv - > msr_no , rv - > l , rv - > h ) ;
}
static int _ rdmsr_on_cpu( unsigned int cpu , u32 msr_no , u32 * l , u32 * h , int safe )
int rdmsr_on_cpu ( unsigned int cpu , u32 msr_no , u32 * l , u32 * h )
{
int err = 0 ;
int err ;
struct msr_info rv ;
rv . msr_no = msr_no ;
if ( safe ) {
err = smp_call_function_single ( cpu , __rdmsr_safe_on_cpu ,
& rv , 1 ) ;
err = err ? err : rv . err ;
} else {
err = smp_call_function_single ( cpu , __rdmsr_on_cpu , & rv , 1 ) ;
}
err = smp_call_function_single ( cpu , __rdmsr_on_cpu , & rv , 1 ) ;
* l = rv . l ;
* h = rv . h ;
return err ;
}
static void __wrmsr_on_cpu ( void * info )
int wrmsr_on_cpu ( unsigned int cpu , u32 msr_no , u32 l , u32 h )
{
int err ;
struct msr_info rv ;
rv . msr_no = msr_no ;
rv . l = l ;
rv . h = h ;
err = smp_call_function_single ( cpu , __wrmsr_on_cpu , & rv , 1 ) ;
return err ;
}
/* These "safe" variants are slower and should be used when the target MSR
may not actually exist . */
static void __rdmsr_safe_on_cpu ( void * info )
{
struct msr_info * rv = info ;
wrmsr ( rv - > msr_no , rv - > l , rv - > h ) ;
rv - > err = rdmsr_safe ( rv - > msr_no , & rv - > l , & rv - > h ) ;
}
static void __wrmsr_safe_on_cpu ( void * info )
@ -56,45 +65,30 @@ static void __wrmsr_safe_on_cpu(void *info)
rv - > err = wrmsr_safe ( rv - > msr_no , rv - > l , rv - > h ) ;
}
static int _w rmsr_on_cpu( unsigned int cpu , u32 msr_no , u32 l , u32 h , int safe )
int rd msr_safe _on_cpu ( unsigned int cpu , u32 msr_no , u32 * l , u32 * h )
{
int err = 0 ;
int err ;
struct msr_info rv ;
rv . msr_no = msr_no ;
rv . l = l ;
rv . h = h ;
if ( safe ) {
err = smp_call_function_single ( cpu , __wrmsr_safe_on_cpu ,
& rv , 1 ) ;
err = err ? err : rv . err ;
} else {
err = smp_call_function_single ( cpu , __wrmsr_on_cpu , & rv , 1 ) ;
}
return err ;
}
err = smp_call_function_single ( cpu , __rdmsr_safe_on_cpu , & rv , 1 ) ;
* l = rv . l ;
* h = rv . h ;
int wrmsr_on_cpu ( unsigned int cpu , u32 msr_no , u32 l , u32 h )
{
return _wrmsr_on_cpu ( cpu , msr_no , l , h , 0 ) ;
return err ? err : rv . err ;
}
int rdmsr_on_cpu ( unsigned int cpu , u32 msr_no , u32 * l , u32 * h )
{
return _rdmsr_on_cpu ( cpu , msr_no , l , h , 0 ) ;
}
/* These "safe" variants are slower and should be used when the target MSR
may not actually exist . */
int wrmsr_safe_on_cpu ( unsigned int cpu , u32 msr_no , u32 l , u32 h )
{
return _wrmsr_on_cpu ( cpu , msr_no , l , h , 1 ) ;
}
int err ;
struct msr_info rv ;
int rdmsr_safe_on_cpu ( unsigned int cpu , u32 msr_no , u32 * l , u32 * h )
{
return _rdmsr_on_cpu ( cpu , msr_no , l , h , 1 ) ;
rv . msr_no = msr_no ;
rv . l = l ;
rv . h = h ;
err = smp_call_function_single ( cpu , __wrmsr_safe_on_cpu , & rv , 1 ) ;
return err ? err : rv . err ;
}
EXPORT_SYMBOL ( rdmsr_on_cpu ) ;