diff options
-rw-r--r-- | arch/x86/include/asm/mce.h | 1 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce-inject.c | 16 |
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 */ |
49 | struct mce { | 50 | struct 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 | ||
47 | static void raise_corrected(struct mce *m) | 47 | static 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 | ||
59 | static void raise_uncorrected(struct mce *m, struct pt_regs *pregs) | 59 | static 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 |