Subject: [PATCH] m68k: Allow all kernel traps to be handled via exception fixups From: Andreas Schwab Allow all kernel traps to be handled via exception fixups. Signed-off-by: Andreas Schwab Signed-off-by: Geert Uytterhoeven --- arch/m68k/kernel/traps.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c @@ -50,6 +50,7 @@ asmlinkage void fpu_emu(void); e_vector vectors[256] = { [VEC_BUSERR] = buserr, + [VEC_ILLEGAL] = trap, /* needed for nf_init */ [VEC_SYS] = system_call, }; @@ -1018,8 +1019,28 @@ void dump_stack(void) EXPORT_SYMBOL(dump_stack); +extern const int frame_extra_sizes[]; /* in m68k/kernel/signal.c */ + void bad_super_trap (struct frame *fp) { + const struct exception_table_entry *fixup; + + /* Are we prepared to handle this kernel fault? */ + fixup = search_exception_tables(fp->ptregs.pc); + if (fixup) { + struct pt_regs *regs, *tregs; + /* Create a new four word stack frame, discarding the old + one. */ + regs = &fp->ptregs; + regs->stkadj = frame_extra_sizes[regs->format]; + tregs = (struct pt_regs *)((ulong)regs + regs->stkadj); + tregs->vector = regs->vector; + tregs->format = 0; + tregs->pc = fixup->fixup; + tregs->sr = regs->sr; + return; + } + console_verbose(); if (fp->ptregs.vector < 4 * ARRAY_SIZE(vec_names)) printk ("*** %s *** FORMAT=%X\n",