25 #include <linux/module.h>
27 #include <linux/types.h>
28 #include <linux/errno.h>
29 #include <linux/fcntl.h>
31 #include <linux/poll.h>
35 #include <linux/device.h>
41 #include <asm/processor.h>
44 static struct class *msr_class;
68 static ssize_t msr_read(
struct file *file,
char __user *
buf,
69 size_t count, loff_t *ppos)
74 int cpu = iminor(file->
f_path.dentry->d_inode);
81 for (;
count; count -= 8) {
93 return bytes ? bytes :
err;
96 static ssize_t msr_write(
struct file *file,
const char __user *buf,
97 size_t count, loff_t *ppos)
102 int cpu = iminor(file->
f_path.dentry->d_inode);
109 for (;
count; count -= 8) {
121 return bytes ? bytes :
err;
124 static long msr_ioctl(
struct file *file,
unsigned int ioc,
unsigned long arg)
128 int cpu = iminor(file->
f_path.dentry->d_inode);
172 static int msr_open(
struct inode *inode,
struct file *file)
177 cpu = iminor(file->
f_path.dentry->d_inode);
197 .unlocked_ioctl = msr_ioctl,
198 .compat_ioctl = msr_ioctl,
201 static int __cpuinit msr_device_create(
int cpu)
207 return IS_ERR(dev) ? PTR_ERR(dev) : 0;
210 static void msr_device_destroy(
int cpu)
216 unsigned long action,
void *hcpu)
218 unsigned int cpu = (
unsigned long)hcpu;
223 err = msr_device_create(cpu);
228 msr_device_destroy(cpu);
231 return notifier_from_errno(err);
235 .notifier_call = msr_class_cpu_callback,
243 static int __init msr_init(
void)
255 if (IS_ERR(msr_class)) {
256 err = PTR_ERR(msr_class);
259 msr_class->
devnode = msr_devnode;
262 err = msr_device_create(i);
275 msr_device_destroy(i);
284 static
void __exit msr_exit(
void)
289 msr_device_destroy(cpu);