Beispiel #1
0
/* 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(&regs, 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(&regs, 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 */
}
Beispiel #3
0
static void raise_exception(struct mce *m, struct pt_regs *pregs)
{
	struct pt_regs regs;
	unsigned long flags;

	if (!pregs) {
		memset(&regs, 0, sizeof(struct pt_regs));
		regs.ip = m->ip;
		regs.cs = m->cs;
		pregs = &regs;
	}
	
	local_irq_save(flags);
	do_machine_check(pregs, 0);
	local_irq_restore(flags);
	m->finished = 0;
}
Beispiel #4
0
static void raise_exception(struct mce *m, struct pt_regs *pregs)
{
	struct pt_regs regs;
	unsigned long flags;

	if (!pregs) {
		memset(&regs, 0, sizeof(struct pt_regs));
		regs.rip = m->ip;
		regs.cs = m->cs;
		pregs = &regs;
	}
	/* in mcheck exeception handler, irq will be disabled */
	local_irq_save(flags);
	do_machine_check(pregs, 0);
	local_irq_restore(flags);
	m->finished = 0;
}