Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e627f8dc authored by Christophe Leroy's avatar Christophe Leroy Committed by Scott Wood
Browse files

powerpc/8xx: add dedicated machine check handler



During a machine check, the 8xx provides indication of
whether the check is due to data or instruction access, so
let's display it.

Lets also move 8xx specific handling into the new handler.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarScott Wood <oss@buserror.net>
parent f307939f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ extern int machine_check_e500mc(struct pt_regs *regs);
extern int machine_check_e500(struct pt_regs *regs);
extern int machine_check_e200(struct pt_regs *regs);
extern int machine_check_47x(struct pt_regs *regs);
int machine_check_8xx(struct pt_regs *regs);

extern void cpu_down_flush_e500v2(void);
extern void cpu_down_flush_e500mc(void);
+1 −0
Original line number Diff line number Diff line
@@ -1248,6 +1248,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
		.mmu_features		= MMU_FTR_TYPE_8xx,
		.icache_bsize		= 16,
		.dcache_bsize		= 16,
		.machine_check		= machine_check_8xx,
		.platform		= "ppc823",
	},
#endif /* CONFIG_8xx */
+25 −11
Original line number Diff line number Diff line
@@ -667,6 +667,31 @@ int machine_check_e200(struct pt_regs *regs)

	return 0;
}
#elif defined(CONFIG_PPC_8xx)
int machine_check_8xx(struct pt_regs *regs)
{
	unsigned long reason = get_mc_reason(regs);

	pr_err("Machine check in kernel mode.\n");
	pr_err("Caused by (from SRR1=%lx): ", reason);
	if (reason & 0x40000000)
		pr_err("Fetch error at address %lx\n", regs->nip);
	else
		pr_err("Data access error at address %lx\n", regs->dar);

#ifdef CONFIG_PCI
	/* the qspan pci read routines can cause machine checks -- Cort
	 *
	 * yuck !!! that totally needs to go away ! There are better ways
	 * to deal with that than having a wart in the mcheck handler.
	 * -- BenH
	 */
	bad_page_fault(regs, regs->dar, SIGBUS);
	return 1;
#else
	return 0;
#endif
}
#else
int machine_check_generic(struct pt_regs *regs)
{
@@ -726,17 +751,6 @@ void machine_check_exception(struct pt_regs *regs)
	if (recover > 0)
		goto bail;

#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
	/* the qspan pci read routines can cause machine checks -- Cort
	 *
	 * yuck !!! that totally needs to go away ! There are better ways
	 * to deal with that than having a wart in the mcheck handler.
	 * -- BenH
	 */
	bad_page_fault(regs, regs->dar, SIGBUS);
	goto bail;
#endif

	if (debugger_fault_handler(regs))
		goto bail;