diff options
Diffstat (limited to 'arch/x86/kernel/cpu/mcheck/mce_64.c')
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_64.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/arch/x86/kernel/cpu/mcheck/mce_64.c b/arch/x86/kernel/cpu/mcheck/mce_64.c index 4b21d29fb5aa..9a699ed03598 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_64.c | |||
@@ -63,7 +63,7 @@ static DECLARE_WAIT_QUEUE_HEAD(mce_wait); | |||
63 | * separate MCEs from kernel messages to avoid bogus bug reports. | 63 | * separate MCEs from kernel messages to avoid bogus bug reports. |
64 | */ | 64 | */ |
65 | 65 | ||
66 | struct mce_log mcelog = { | 66 | static struct mce_log mcelog = { |
67 | MCE_LOG_SIGNATURE, | 67 | MCE_LOG_SIGNATURE, |
68 | MCE_LOG_LEN, | 68 | MCE_LOG_LEN, |
69 | }; | 69 | }; |
@@ -80,7 +80,7 @@ void mce_log(struct mce *mce) | |||
80 | /* When the buffer fills up discard new entries. Assume | 80 | /* When the buffer fills up discard new entries. Assume |
81 | that the earlier errors are the more interesting. */ | 81 | that the earlier errors are the more interesting. */ |
82 | if (entry >= MCE_LOG_LEN) { | 82 | if (entry >= MCE_LOG_LEN) { |
83 | set_bit(MCE_OVERFLOW, &mcelog.flags); | 83 | set_bit(MCE_OVERFLOW, (unsigned long *)&mcelog.flags); |
84 | return; | 84 | return; |
85 | } | 85 | } |
86 | /* Old left over entry. Skip. */ | 86 | /* Old left over entry. Skip. */ |
@@ -110,12 +110,12 @@ static void print_mce(struct mce *m) | |||
110 | KERN_EMERG | 110 | KERN_EMERG |
111 | "CPU %d: Machine Check Exception: %16Lx Bank %d: %016Lx\n", | 111 | "CPU %d: Machine Check Exception: %16Lx Bank %d: %016Lx\n", |
112 | m->cpu, m->mcgstatus, m->bank, m->status); | 112 | m->cpu, m->mcgstatus, m->bank, m->status); |
113 | if (m->rip) { | 113 | if (m->ip) { |
114 | printk(KERN_EMERG "RIP%s %02x:<%016Lx> ", | 114 | printk(KERN_EMERG "RIP%s %02x:<%016Lx> ", |
115 | !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "", | 115 | !(m->mcgstatus & MCG_STATUS_EIPV) ? " !INEXACT!" : "", |
116 | m->cs, m->rip); | 116 | m->cs, m->ip); |
117 | if (m->cs == __KERNEL_CS) | 117 | if (m->cs == __KERNEL_CS) |
118 | print_symbol("{%s}", m->rip); | 118 | print_symbol("{%s}", m->ip); |
119 | printk("\n"); | 119 | printk("\n"); |
120 | } | 120 | } |
121 | printk(KERN_EMERG "TSC %Lx ", m->tsc); | 121 | printk(KERN_EMERG "TSC %Lx ", m->tsc); |
@@ -156,16 +156,16 @@ static int mce_available(struct cpuinfo_x86 *c) | |||
156 | static inline void mce_get_rip(struct mce *m, struct pt_regs *regs) | 156 | static inline void mce_get_rip(struct mce *m, struct pt_regs *regs) |
157 | { | 157 | { |
158 | if (regs && (m->mcgstatus & MCG_STATUS_RIPV)) { | 158 | if (regs && (m->mcgstatus & MCG_STATUS_RIPV)) { |
159 | m->rip = regs->rip; | 159 | m->ip = regs->ip; |
160 | m->cs = regs->cs; | 160 | m->cs = regs->cs; |
161 | } else { | 161 | } else { |
162 | m->rip = 0; | 162 | m->ip = 0; |
163 | m->cs = 0; | 163 | m->cs = 0; |
164 | } | 164 | } |
165 | if (rip_msr) { | 165 | if (rip_msr) { |
166 | /* Assume the RIP in the MSR is exact. Is this true? */ | 166 | /* Assume the RIP in the MSR is exact. Is this true? */ |
167 | m->mcgstatus |= MCG_STATUS_EIPV; | 167 | m->mcgstatus |= MCG_STATUS_EIPV; |
168 | rdmsrl(rip_msr, m->rip); | 168 | rdmsrl(rip_msr, m->ip); |
169 | m->cs = 0; | 169 | m->cs = 0; |
170 | } | 170 | } |
171 | } | 171 | } |
@@ -192,10 +192,10 @@ void do_machine_check(struct pt_regs * regs, long error_code) | |||
192 | 192 | ||
193 | atomic_inc(&mce_entry); | 193 | atomic_inc(&mce_entry); |
194 | 194 | ||
195 | if (regs) | 195 | if ((regs |
196 | notify_die(DIE_NMI, "machine check", regs, error_code, 18, | 196 | && notify_die(DIE_NMI, "machine check", regs, error_code, |
197 | SIGKILL); | 197 | 18, SIGKILL) == NOTIFY_STOP) |
198 | if (!banks) | 198 | || !banks) |
199 | goto out2; | 199 | goto out2; |
200 | 200 | ||
201 | memset(&m, 0, sizeof(struct mce)); | 201 | memset(&m, 0, sizeof(struct mce)); |
@@ -288,7 +288,7 @@ void do_machine_check(struct pt_regs * regs, long error_code) | |||
288 | * instruction which caused the MCE. | 288 | * instruction which caused the MCE. |
289 | */ | 289 | */ |
290 | if (m.mcgstatus & MCG_STATUS_EIPV) | 290 | if (m.mcgstatus & MCG_STATUS_EIPV) |
291 | user_space = panicm.rip && (panicm.cs & 3); | 291 | user_space = panicm.ip && (panicm.cs & 3); |
292 | 292 | ||
293 | /* | 293 | /* |
294 | * If we know that the error was in user space, send a | 294 | * If we know that the error was in user space, send a |
@@ -564,7 +564,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | |||
564 | loff_t *off) | 564 | loff_t *off) |
565 | { | 565 | { |
566 | unsigned long *cpu_tsc; | 566 | unsigned long *cpu_tsc; |
567 | static DECLARE_MUTEX(mce_read_sem); | 567 | static DEFINE_MUTEX(mce_read_mutex); |
568 | unsigned next; | 568 | unsigned next; |
569 | char __user *buf = ubuf; | 569 | char __user *buf = ubuf; |
570 | int i, err; | 570 | int i, err; |
@@ -573,12 +573,12 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | |||
573 | if (!cpu_tsc) | 573 | if (!cpu_tsc) |
574 | return -ENOMEM; | 574 | return -ENOMEM; |
575 | 575 | ||
576 | down(&mce_read_sem); | 576 | mutex_lock(&mce_read_mutex); |
577 | next = rcu_dereference(mcelog.next); | 577 | next = rcu_dereference(mcelog.next); |
578 | 578 | ||
579 | /* Only supports full reads right now */ | 579 | /* Only supports full reads right now */ |
580 | if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { | 580 | if (*off != 0 || usize < MCE_LOG_LEN*sizeof(struct mce)) { |
581 | up(&mce_read_sem); | 581 | mutex_unlock(&mce_read_mutex); |
582 | kfree(cpu_tsc); | 582 | kfree(cpu_tsc); |
583 | return -EINVAL; | 583 | return -EINVAL; |
584 | } | 584 | } |
@@ -621,7 +621,7 @@ static ssize_t mce_read(struct file *filp, char __user *ubuf, size_t usize, | |||
621 | memset(&mcelog.entry[i], 0, sizeof(struct mce)); | 621 | memset(&mcelog.entry[i], 0, sizeof(struct mce)); |
622 | } | 622 | } |
623 | } | 623 | } |
624 | up(&mce_read_sem); | 624 | mutex_unlock(&mce_read_mutex); |
625 | kfree(cpu_tsc); | 625 | kfree(cpu_tsc); |
626 | return err ? -EFAULT : buf - ubuf; | 626 | return err ? -EFAULT : buf - ubuf; |
627 | } | 627 | } |
@@ -634,8 +634,7 @@ static unsigned int mce_poll(struct file *file, poll_table *wait) | |||
634 | return 0; | 634 | return 0; |
635 | } | 635 | } |
636 | 636 | ||
637 | static int mce_ioctl(struct inode *i, struct file *f,unsigned int cmd, | 637 | static long mce_ioctl(struct file *f, unsigned int cmd, unsigned long arg) |
638 | unsigned long arg) | ||
639 | { | 638 | { |
640 | int __user *p = (int __user *)arg; | 639 | int __user *p = (int __user *)arg; |
641 | 640 | ||
@@ -664,7 +663,7 @@ static const struct file_operations mce_chrdev_ops = { | |||
664 | .release = mce_release, | 663 | .release = mce_release, |
665 | .read = mce_read, | 664 | .read = mce_read, |
666 | .poll = mce_poll, | 665 | .poll = mce_poll, |
667 | .ioctl = mce_ioctl, | 666 | .unlocked_ioctl = mce_ioctl, |
668 | }; | 667 | }; |
669 | 668 | ||
670 | static struct miscdevice mce_log_device = { | 669 | static struct miscdevice mce_log_device = { |
@@ -745,7 +744,7 @@ static void mce_restart(void) | |||
745 | 744 | ||
746 | static struct sysdev_class mce_sysclass = { | 745 | static struct sysdev_class mce_sysclass = { |
747 | .resume = mce_resume, | 746 | .resume = mce_resume, |
748 | set_kset_name("machinecheck"), | 747 | .name = "machinecheck", |
749 | }; | 748 | }; |
750 | 749 | ||
751 | DEFINE_PER_CPU(struct sys_device, device_mce); | 750 | DEFINE_PER_CPU(struct sys_device, device_mce); |
@@ -855,8 +854,8 @@ static void mce_remove_device(unsigned int cpu) | |||
855 | } | 854 | } |
856 | 855 | ||
857 | /* Get notified when a cpu comes on/off. Be hotplug friendly. */ | 856 | /* Get notified when a cpu comes on/off. Be hotplug friendly. */ |
858 | static int | 857 | static int __cpuinit mce_cpu_callback(struct notifier_block *nfb, |
859 | mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | 858 | unsigned long action, void *hcpu) |
860 | { | 859 | { |
861 | unsigned int cpu = (unsigned long)hcpu; | 860 | unsigned int cpu = (unsigned long)hcpu; |
862 | 861 | ||
@@ -873,7 +872,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
873 | return NOTIFY_OK; | 872 | return NOTIFY_OK; |
874 | } | 873 | } |
875 | 874 | ||
876 | static struct notifier_block mce_cpu_notifier = { | 875 | static struct notifier_block mce_cpu_notifier __cpuinitdata = { |
877 | .notifier_call = mce_cpu_callback, | 876 | .notifier_call = mce_cpu_callback, |
878 | }; | 877 | }; |
879 | 878 | ||