Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at c9a28fa7b9ac19b676deefa0a171ce7df8755c08 101 lines 2.0 kB view raw
1#include <linux/module.h> 2#include <linux/preempt.h> 3#include <linux/smp.h> 4#include <asm/msr.h> 5 6struct msr_info { 7 u32 msr_no; 8 u32 l, h; 9 int err; 10}; 11 12static void __rdmsr_on_cpu(void *info) 13{ 14 struct msr_info *rv = info; 15 16 rdmsr(rv->msr_no, rv->l, rv->h); 17} 18 19static void __rdmsr_safe_on_cpu(void *info) 20{ 21 struct msr_info *rv = info; 22 23 rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h); 24} 25 26static int _rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h, int safe) 27{ 28 int err = 0; 29 struct msr_info rv; 30 31 rv.msr_no = msr_no; 32 if (safe) { 33 smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 0, 1); 34 err = rv.err; 35 } else { 36 smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 0, 1); 37 } 38 *l = rv.l; 39 *h = rv.h; 40 41 return err; 42} 43 44static void __wrmsr_on_cpu(void *info) 45{ 46 struct msr_info *rv = info; 47 48 wrmsr(rv->msr_no, rv->l, rv->h); 49} 50 51static void __wrmsr_safe_on_cpu(void *info) 52{ 53 struct msr_info *rv = info; 54 55 rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h); 56} 57 58static int _wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h, int safe) 59{ 60 int err = 0; 61 struct msr_info rv; 62 63 rv.msr_no = msr_no; 64 rv.l = l; 65 rv.h = h; 66 if (safe) { 67 smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 0, 1); 68 err = rv.err; 69 } else { 70 smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 0, 1); 71 } 72 73 return err; 74} 75 76void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) 77{ 78 _wrmsr_on_cpu(cpu, msr_no, l, h, 0); 79} 80 81void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) 82{ 83 _rdmsr_on_cpu(cpu, msr_no, l, h, 0); 84} 85 86/* These "safe" variants are slower and should be used when the target MSR 87 may not actually exist. */ 88int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) 89{ 90 return _wrmsr_on_cpu(cpu, msr_no, l, h, 1); 91} 92 93int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) 94{ 95 return _rdmsr_on_cpu(cpu, msr_no, l, h, 1); 96} 97 98EXPORT_SYMBOL(rdmsr_on_cpu); 99EXPORT_SYMBOL(wrmsr_on_cpu); 100EXPORT_SYMBOL(rdmsr_safe_on_cpu); 101EXPORT_SYMBOL(wrmsr_safe_on_cpu);