return ret;
}
+int mcinfo_dumpped;
+static int x86_mcinfo_dump_panic(mctelem_cookie_t mctc)
+{
+ struct mc_info *mcip = mctelem_dataptr(mctc);
+
+ x86_mcinfo_dump(mcip);
+ mcinfo_dumpped++;
+
+ return 0;
+}
+
+/* XXX shall we dump commited mc_info?? */
+static void mc_panic_dump(void)
+{
+ int cpu;
+
+ dprintk(XENLOG_ERR, "Begin dump mc_info\n");
+ for_each_online_cpu(cpu)
+ mctelem_process_deferred(cpu, x86_mcinfo_dump_panic);
+ dprintk(XENLOG_ERR, "End dump mc_info, %x mcinfo dumped\n", mcinfo_dumpped);
+}
+
void mc_panic(char *s)
{
is_mc_panic = 1;
console_force_unlock();
+
printk("Fatal machine check: %s\n", s);
printk("\n"
"****************************************\n"
"\n"
" The processor has reported a hardware error which cannot\n"
" be recovered from. Xen will now reboot the machine.\n");
+ mc_panic_dump();
panic("HARDWARE ERROR");
}
switch (result)
{
case MCER_RESET:
+ dprintk(XENLOG_ERR, "MCE delayed action failed\n");
+ x86_mcinfo_dump(mctelem_dataptr(mctc));
panic("MCE: Software recovery failed for the UCR\n");
break;
case MCER_RECOVERED:
case MCER_CONTINUE:
dprintk(XENLOG_INFO, "MCE: Error can't be recovered, "
"system is tainted\n");
+ x86_mcinfo_dump(mctelem_dataptr(mctc));
ret = 1;
break;
default:
mctc = mcheck_mca_logout(MCA_MCE_SCAN, mca_allbanks, &bs, clear_bank);
if (bs.errcnt) {
- /* dump MCE error */
- if (mctc != NULL)
- x86_mcinfo_dump(mctelem_dataptr(mctc));
-
/*
* Uncorrected errors must be dealth with in softirq context.
*/