patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / arch / i386 / kernel / msr.c
index 3b32670..1a1093e 100644 (file)
 
 static inline int wrmsr_eio(u32 reg, u32 eax, u32 edx)
 {
-  int err;
-
-  asm volatile(
-              "1:      wrmsr\n"
-              "2:\n"
-              ".section .fixup,\"ax\"\n"
-              "3:      movl %4,%0\n"
-              "        jmp 2b\n"
-              ".previous\n"
-              ".section __ex_table,\"a\"\n"
-              "        .align 4\n"
-              "        .long 1b,3b\n"
-              ".previous"
-              : "=&bDS" (err)
-              : "a" (eax), "d" (edx), "c" (reg), "i" (-EIO), "0" (0));
-
-  return err;
+       int err;
+
+       asm volatile ("1:       wrmsr\n"
+                     "2:\n"
+                     ".section .fixup,\"ax\"\n"
+                     "3:       movl %4,%0\n"
+                     " jmp 2b\n"
+                     ".previous\n"
+                     ".section __ex_table,\"a\"\n"
+                     " .align 4\n" "   .long 1b,3b\n" ".previous":"=&bDS" (err)
+                     :"a"(eax), "d"(edx), "c"(reg), "i"(-EIO), "0"(0));
+
+       return err;
 }
 
 static inline int rdmsr_eio(u32 reg, u32 *eax, u32 *edx)
 {
-  int err;
-
-  asm volatile(
-              "1:      rdmsr\n"
-              "2:\n"
-              ".section .fixup,\"ax\"\n"
-              "3:      movl %4,%0\n"
-              "        jmp 2b\n"
-              ".previous\n"
-              ".section __ex_table,\"a\"\n"
-              "        .align 4\n"
-              "        .long 1b,3b\n"
-              ".previous"
-              : "=&bDS" (err), "=a" (*eax), "=d" (*edx)
-              : "c" (reg), "i" (-EIO), "0" (0));
-
-  return err;
+       int err;
+
+       asm volatile ("1:       rdmsr\n"
+                     "2:\n"
+                     ".section .fixup,\"ax\"\n"
+                     "3:       movl %4,%0\n"
+                     " jmp 2b\n"
+                     ".previous\n"
+                     ".section __ex_table,\"a\"\n"
+                     " .align 4\n"
+                     " .long 1b,3b\n"
+                     ".previous":"=&bDS" (err), "=a"(*eax), "=d"(*edx)
+                     :"c"(reg), "i"(-EIO), "0"(0));
+
+       return err;
 }
 
 #ifdef CONFIG_SMP
 
 struct msr_command {
-  int cpu;
-  int err;
-  u32 reg;
-  u32 data[2];
+       int cpu;
+       int err;
+       u32 reg;
+       u32 data[2];
 };
 
 static void msr_smp_wrmsr(void *cmd_block)
 {
-  struct msr_command *cmd = (struct msr_command *) cmd_block;
-  
-  if ( cmd->cpu == smp_processor_id() )
-    cmd->err = wrmsr_eio(cmd->reg, cmd->data[0], cmd->data[1]);
+       struct msr_command *cmd = (struct msr_command *)cmd_block;
+
+       if (cmd->cpu == smp_processor_id())
+               cmd->err = wrmsr_eio(cmd->reg, cmd->data[0], cmd->data[1]);
 }
 
 static void msr_smp_rdmsr(void *cmd_block)
 {
-  struct msr_command *cmd = (struct msr_command *) cmd_block;
-  
-  if ( cmd->cpu == smp_processor_id() )
-    cmd->err = rdmsr_eio(cmd->reg, &cmd->data[0], &cmd->data[1]);
+       struct msr_command *cmd = (struct msr_command *)cmd_block;
+
+       if (cmd->cpu == smp_processor_id())
+               cmd->err = rdmsr_eio(cmd->reg, &cmd->data[0], &cmd->data[1]);
 }
 
 static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
 {
-  struct msr_command cmd;
-  int ret;
-
-  preempt_disable();
-  if ( cpu == smp_processor_id() ) {
-    ret = wrmsr_eio(reg, eax, edx);
-  } else {
-    cmd.cpu = cpu;
-    cmd.reg = reg;
-    cmd.data[0] = eax;
-    cmd.data[1] = edx;
-    
-    smp_call_function(msr_smp_wrmsr, &cmd, 1, 1);
-    ret = cmd.err;
-  }
-  preempt_enable();
-  return ret;
+       struct msr_command cmd;
+       int ret;
+
+       preempt_disable();
+       if (cpu == smp_processor_id()) {
+               ret = wrmsr_eio(reg, eax, edx);
+       } else {
+               cmd.cpu = cpu;
+               cmd.reg = reg;
+               cmd.data[0] = eax;
+               cmd.data[1] = edx;
+
+               smp_call_function(msr_smp_wrmsr, &cmd, 1, 1);
+               ret = cmd.err;
+       }
+       preempt_enable();
+       return ret;
 }
 
-static inline int do_rdmsr(int cpu, u32 reg, u32 *eax, u32 *edx)
+static inline int do_rdmsr(int cpu, u32 reg, u32 * eax, u32 * edx)
 {
-  struct msr_command cmd;
-  int ret;
-
-  preempt_disable();
-  if ( cpu == smp_processor_id() ) {
-    ret = rdmsr_eio(reg, eax, edx);
-  } else {
-    cmd.cpu = cpu;
-    cmd.reg = reg;
-
-    smp_call_function(msr_smp_rdmsr, &cmd, 1, 1);
-    
-    *eax = cmd.data[0];
-    *edx = cmd.data[1];
-
-    ret = cmd.err;
-  }
-  preempt_enable();
-  return ret;
+       struct msr_command cmd;
+       int ret;
+
+       preempt_disable();
+       if (cpu == smp_processor_id()) {
+               ret = rdmsr_eio(reg, eax, edx);
+       } else {
+               cmd.cpu = cpu;
+               cmd.reg = reg;
+
+               smp_call_function(msr_smp_rdmsr, &cmd, 1, 1);
+
+               *eax = cmd.data[0];
+               *edx = cmd.data[1];
+
+               ret = cmd.err;
+       }
+       preempt_enable();
+       return ret;
 }
 
-#else /* ! CONFIG_SMP */
+#else                          /* ! CONFIG_SMP */
 
 static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
 {
-  return wrmsr_eio(reg, eax, edx);
+       return wrmsr_eio(reg, eax, edx);
 }
 
 static inline int do_rdmsr(int cpu, u32 reg, u32 *eax, u32 *edx)
 {
-  return rdmsr_eio(reg, eax, edx);
+       return rdmsr_eio(reg, eax, edx);
 }
 
-#endif /* ! CONFIG_SMP */
+#endif                         /* ! CONFIG_SMP */
 
 static loff_t msr_seek(struct file *file, loff_t offset, int orig)
 {
-  loff_t ret = -EINVAL;
-  lock_kernel();
-  switch (orig) {
-  case 0:
-    file->f_pos = offset;
-    ret = file->f_pos;
-    break;
-  case 1:
-    file->f_pos += offset;
-    ret = file->f_pos;
-  }
-  unlock_kernel();
-  return ret;
+       loff_t ret = -EINVAL;
+
+       lock_kernel();
+       switch (orig) {
+       case 0:
+               file->f_pos = offset;
+               ret = file->f_pos;
+               break;
+       case 1:
+               file->f_pos += offset;
+               ret = file->f_pos;
+       }
+       unlock_kernel();
+       return ret;
 }
 
-static ssize_t msr_read(struct file * file, char __user * buf,
-                       size_t count, loff_t *ppos)
+static ssize_t msr_read(struct file *file, char __user * buf,
+                       size_t count, loff_t * ppos)
 {
-  u32 *tmp = (u32 *)buf;
-  u32 data[2];
-  size_t rv;
-  u32 reg = *ppos;
-  int cpu = iminor(file->f_dentry->d_inode);
-  int err;
-
-  if ( count % 8 )
-    return -EINVAL; /* Invalid chunk size */
-  
-  for ( rv = 0 ; count ; count -= 8 ) {
-    err = do_rdmsr(cpu, reg, &data[0], &data[1]);
-    if ( err )
-      return err;
-    if ( copy_to_user(tmp,&data,8) )
-      return -EFAULT;
-    tmp += 2;
-  }
-
-  return ((char *)tmp) - buf;
+       u32 __user *tmp = (u32 __user *) buf;
+       u32 data[2];
+       size_t rv;
+       u32 reg = *ppos;
+       int cpu = iminor(file->f_dentry->d_inode);
+       int err;
+
+       if (count % 8)
+               return -EINVAL; /* Invalid chunk size */
+
+       for (rv = 0; count; count -= 8) {
+               err = do_rdmsr(cpu, reg, &data[0], &data[1]);
+               if (err)
+                       return err;
+               if (copy_to_user(tmp, &data, 8))
+                       return -EFAULT;
+               tmp += 2;
+       }
+
+       return ((char __user *)tmp) - buf;
 }
 
-static ssize_t msr_write(struct file * file, const char __user * 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;
-  u32 data[2];
-  size_t rv;
-  u32 reg = *ppos;
-  int cpu = iminor(file->f_dentry->d_inode);
-  int err;
-
-  if ( count % 8 )
-    return -EINVAL; /* Invalid chunk size */
-  
-  for ( rv = 0 ; count ; count -= 8 ) {
-    if ( copy_from_user(&data,tmp,8) )
-      return -EFAULT;
-    err = do_wrmsr(cpu, reg, data[0], data[1]);
-    if ( err )
-      return err;
-    tmp += 2;
-  }
-
-  return ((char *)tmp) - buf;
+       const u32 __user *tmp = (const u32 __user *)buf;
+       u32 data[2];
+       size_t rv;
+       u32 reg = *ppos;
+       int cpu = iminor(file->f_dentry->d_inode);
+       int err;
+
+       if (count % 8)
+               return -EINVAL; /* Invalid chunk size */
+
+       for (rv = 0; count; count -= 8) {
+               if (copy_from_user(&data, tmp, 8))
+                       return -EFAULT;
+               err = do_wrmsr(cpu, reg, data[0], data[1]);
+               if (err)
+                       return err;
+               tmp += 2;
+       }
+
+       return ((char __user *)tmp) - buf;
 }
 
 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))
-    return -ENXIO;             /* No such CPU */
-  if ( !cpu_has(c, X86_FEATURE_MSR) )
-    return -EIO;               /* MSR not supported */
-  
-  return 0;
+       unsigned int cpu = iminor(file->f_dentry->d_inode);
+       struct cpuinfo_x86 *c = &(cpu_data)[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 */
+
+       return 0;
 }
 
 /*
  * File operations we support
  */
 static struct file_operations msr_fops = {
-  .owner       = THIS_MODULE,
-  .llseek      = msr_seek,
-  .read                = msr_read,
-  .write       = msr_write,
-  .open                = msr_open,
+       .owner = THIS_MODULE,
+       .llseek = msr_seek,
+       .read = msr_read,
+       .write = msr_write,
+       .open = msr_open,
 };
 
 int __init msr_init(void)
 {
-  if (register_chrdev(MSR_MAJOR, "cpu/msr", &msr_fops)) {
-    printk(KERN_ERR "msr: unable to get major %d for msr\n",
-          MSR_MAJOR);
-    return -EBUSY;
-  }
-  
-  return 0;
+       if (register_chrdev(MSR_MAJOR, "cpu/msr", &msr_fops)) {
+               printk(KERN_ERR "msr: unable to get major %d for msr\n",
+                      MSR_MAJOR);
+               return -EBUSY;
+       }
+
+       return 0;
 }
 
 void __exit msr_exit(void)
 {
-  unregister_chrdev(MSR_MAJOR, "cpu/msr");
+       unregister_chrdev(MSR_MAJOR, "cpu/msr");
 }
 
 module_init(msr_init);