aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/mce.h1
-rw-r--r--arch/x86/kernel/cpu/mcheck/mce-inject.c16
2 files changed, 9 insertions, 8 deletions
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 8945be9ad2b1..b608a64c5814 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -44,6 +44,7 @@
44#define MCJ_CTX_PROCESS 1 /* inject context: process */ 44#define MCJ_CTX_PROCESS 1 /* inject context: process */
45#define MCJ_CTX_IRQ 2 /* inject context: IRQ */ 45#define MCJ_CTX_IRQ 2 /* inject context: IRQ */
46#define MCJ_NMI_BROADCAST 4 /* do NMI broadcasting */ 46#define MCJ_NMI_BROADCAST 4 /* do NMI broadcasting */
47#define MCJ_EXCEPTION 8 /* raise as exception */
47 48
48/* Fields are zero when not available */ 49/* Fields are zero when not available */
49struct mce { 50struct mce {
diff --git a/arch/x86/kernel/cpu/mcheck/mce-inject.c b/arch/x86/kernel/cpu/mcheck/mce-inject.c
index ad5d92790ebc..7029f0e2acad 100644
--- a/arch/x86/kernel/cpu/mcheck/mce-inject.c
+++ b/arch/x86/kernel/cpu/mcheck/mce-inject.c
@@ -44,7 +44,7 @@ static void inject_mce(struct mce *m)
44 i->finished = 1; 44 i->finished = 1;
45} 45}
46 46
47static void raise_corrected(struct mce *m) 47static void raise_poll(struct mce *m)
48{ 48{
49 unsigned long flags; 49 unsigned long flags;
50 mce_banks_t b; 50 mce_banks_t b;
@@ -56,7 +56,7 @@ static void raise_corrected(struct mce *m)
56 m->finished = 0; 56 m->finished = 0;
57} 57}
58 58
59static void raise_uncorrected(struct mce *m, struct pt_regs *pregs) 59static void raise_exception(struct mce *m, struct pt_regs *pregs)
60{ 60{
61 struct pt_regs regs; 61 struct pt_regs regs;
62 unsigned long flags; 62 unsigned long flags;
@@ -85,10 +85,10 @@ static int mce_raise_notify(struct notifier_block *self,
85 if (val != DIE_NMI_IPI || !cpu_isset(cpu, mce_inject_cpumask)) 85 if (val != DIE_NMI_IPI || !cpu_isset(cpu, mce_inject_cpumask))
86 return NOTIFY_DONE; 86 return NOTIFY_DONE;
87 cpu_clear(cpu, mce_inject_cpumask); 87 cpu_clear(cpu, mce_inject_cpumask);
88 if (m->status & MCI_STATUS_UC) 88 if (m->inject_flags & MCJ_EXCEPTION)
89 raise_uncorrected(m, args->regs); 89 raise_exception(m, args->regs);
90 else if (m->status) 90 else if (m->status)
91 raise_corrected(m); 91 raise_poll(m);
92 return NOTIFY_STOP; 92 return NOTIFY_STOP;
93} 93}
94 94
@@ -104,7 +104,7 @@ static int raise_local(struct mce *m)
104 int ret = 0; 104 int ret = 0;
105 int cpu = m->extcpu; 105 int cpu = m->extcpu;
106 106
107 if (m->status & MCI_STATUS_UC) { 107 if (m->inject_flags & MCJ_EXCEPTION) {
108 printk(KERN_INFO "Triggering MCE exception on CPU %d\n", cpu); 108 printk(KERN_INFO "Triggering MCE exception on CPU %d\n", cpu);
109 switch (context) { 109 switch (context) {
110 case MCJ_CTX_IRQ: 110 case MCJ_CTX_IRQ:
@@ -115,7 +115,7 @@ static int raise_local(struct mce *m)
115 */ 115 */
116 /*FALL THROUGH*/ 116 /*FALL THROUGH*/
117 case MCJ_CTX_PROCESS: 117 case MCJ_CTX_PROCESS:
118 raise_uncorrected(m, NULL); 118 raise_exception(m, NULL);
119 break; 119 break;
120 default: 120 default:
121 printk(KERN_INFO "Invalid MCE context\n"); 121 printk(KERN_INFO "Invalid MCE context\n");
@@ -124,7 +124,7 @@ static int raise_local(struct mce *m)
124 printk(KERN_INFO "MCE exception done on CPU %d\n", cpu); 124 printk(KERN_INFO "MCE exception done on CPU %d\n", cpu);
125 } else if (m->status) { 125 } else if (m->status) {
126 printk(KERN_INFO "Starting machine check poll CPU %d\n", cpu); 126 printk(KERN_INFO "Starting machine check poll CPU %d\n", cpu);
127 raise_corrected(m); 127 raise_poll(m);
128 mce_notify_irq(); 128 mce_notify_irq();
129 printk(KERN_INFO "Machine check poll done on CPU %d\n", cpu); 129 printk(KERN_INFO "Machine check poll done on CPU %d\n", cpu);
130 } else 130 } else