X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fx86_64%2Fkernel%2Fmsr.c;h=654e4578d021e879b773dc62d23b9a04b81fe337;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hp=2621d9f0bba24dffcc94ec7cb067f3564b944212;hpb=c449269f45c2cdf53af08c8d0af37472f66539d9;p=linux-2.6.git diff --git a/arch/x86_64/kernel/msr.c b/arch/x86_64/kernel/msr.c index 2621d9f0b..654e4578d 100644 --- a/arch/x86_64/kernel/msr.c +++ b/arch/x86_64/kernel/msr.c @@ -1,4 +1,3 @@ -#ident "$Id$" /* ----------------------------------------------------------------------- * * * Copyright 2000 H. Peter Anvin - All Rights Reserved @@ -187,10 +186,10 @@ static loff_t msr_seek(struct file *file, loff_t offset, int orig) return ret; } -static ssize_t msr_read(struct file * file, char * buf, +static ssize_t msr_read(struct file * file, char __user * buf, size_t count, loff_t *ppos) { - u32 *tmp = (u32 *)buf; + char __user *tmp = buf; u32 data[2]; size_t rv; u32 reg = *ppos; @@ -206,16 +205,16 @@ static ssize_t msr_read(struct file * file, char * buf, return err; if ( copy_to_user(tmp,&data,8) ) return -EFAULT; - tmp += 2; + tmp += 8; } - return ((char *)tmp) - buf; + return tmp - buf; } -static ssize_t msr_write(struct file * file, const char * buf, +static ssize_t msr_write(struct file * file, const char __user * buf, size_t count, loff_t *ppos) { - const u32 *tmp = (const u32 *)buf; + const char __user *tmp = buf; u32 data[2]; size_t rv; u32 reg = *ppos; @@ -231,10 +230,10 @@ static ssize_t msr_write(struct file * file, const char * buf, err = do_wrmsr(cpu, reg, data[0], data[1]); if ( err ) return err; - tmp += 2; + tmp += 8; } - return ((char *)tmp) - buf; + return tmp - buf; } static int msr_open(struct inode *inode, struct file *file) @@ -242,7 +241,7 @@ static int msr_open(struct inode *inode, struct file *file) int cpu = iminor(file->f_dentry->d_inode); struct cpuinfo_x86 *c = &(cpu_data)[cpu]; - if (!cpu_online(cpu)) + if (cpu >= NR_CPUS || !cpu_online(cpu)) return -ENXIO; /* No such CPU */ if ( !cpu_has(c, X86_FEATURE_MSR) ) return -EIO; /* MSR not supported */