|
|
|
@ -475,12 +475,7 @@ static struct fsr_info { |
|
|
|
|
{ do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, |
|
|
|
|
{ do_bad, SIGKILL, 0, "terminal exception" }, |
|
|
|
|
{ do_bad, SIGBUS, BUS_ADRALN, "alignment exception" }, |
|
|
|
|
/* Do we need runtime check ? */ |
|
|
|
|
#if __LINUX_ARM_ARCH__ < 6 |
|
|
|
|
{ do_bad, SIGBUS, 0, "external abort on linefetch" }, |
|
|
|
|
#else |
|
|
|
|
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "I-cache maintenance fault" }, |
|
|
|
|
#endif |
|
|
|
|
{ do_translation_fault, SIGSEGV, SEGV_MAPERR, "section translation fault" }, |
|
|
|
|
{ do_bad, SIGBUS, 0, "external abort on linefetch" }, |
|
|
|
|
{ do_page_fault, SIGSEGV, SEGV_MAPERR, "page translation fault" }, |
|
|
|
@ -605,3 +600,14 @@ do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs) |
|
|
|
|
arm_notify_die("", regs, &info, ifsr, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int __init exceptions_init(void) |
|
|
|
|
{ |
|
|
|
|
if (cpu_architecture() >= CPU_ARCH_ARMv6) { |
|
|
|
|
hook_fault_code(4, do_translation_fault, SIGSEGV, SEGV_MAPERR, |
|
|
|
|
"I-cache maintenance fault"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
arch_initcall(exceptions_init); |
|
|
|
|