/* Inject mce on current CPU */ static void raise_mce(unsigned long data) { struct delayed_mce *dm = (struct delayed_mce *)data; struct mce *m = &dm->m; int cpu = m->extcpu; inject_mce(m); if (m->status & MCI_STATUS_UC) { struct pt_regs regs; memset(®s, 0, sizeof(struct pt_regs)); regs.ip = m->ip; regs.cs = m->cs; printk(KERN_INFO "Triggering MCE exception on CPU %d\n", cpu); do_machine_check(®s, 0); printk(KERN_INFO "MCE exception done on CPU %d\n", cpu); } else { mce_banks_t b; memset(&b, 0xff, sizeof(mce_banks_t)); printk(KERN_INFO "Starting machine check poll CPU %d\n", cpu); machine_check_poll(0, &b); mce_notify_irq(); printk(KERN_INFO "Finished machine check poll on CPU %d\n", cpu); } kfree(dm); }
static void do_machine_check_vector(struct pt_regs *regs, long error_code) { #ifdef CONFIG_X86_MCE #ifdef CONFIG_X86_32 extern void (*machine_check_vector)(struct pt_regs *, long error_code); machine_check_vector(regs, error_code); #else do_machine_check(regs, error_code); #endif #endif /* CONFIG_X86_MCE */ }
static void raise_exception(struct mce *m, struct pt_regs *pregs) { struct pt_regs regs; unsigned long flags; if (!pregs) { memset(®s, 0, sizeof(struct pt_regs)); regs.ip = m->ip; regs.cs = m->cs; pregs = ®s; } local_irq_save(flags); do_machine_check(pregs, 0); local_irq_restore(flags); m->finished = 0; }
static void raise_exception(struct mce *m, struct pt_regs *pregs) { struct pt_regs regs; unsigned long flags; if (!pregs) { memset(®s, 0, sizeof(struct pt_regs)); regs.rip = m->ip; regs.cs = m->cs; pregs = ®s; } /* in mcheck exeception handler, irq will be disabled */ local_irq_save(flags); do_machine_check(pregs, 0); local_irq_restore(flags); m->finished = 0; }