generic-y += emergency-restart.h
 generic-y += errno.h
 generic-y += exec.h
+generic-y += extable.h
 generic-y += futex.h
 generic-y += hw_irq.h
 generic-y += ioctl.h
 
        wrusp(usp);
 }
 
-#ifdef CONFIG_MMU
-extern int handle_kernel_fault(struct pt_regs *regs);
-#else
-static inline  int handle_kernel_fault(struct pt_regs *regs)
-{
-       /* Any fault in kernel is fatal on non-mmu */
-       return 0;
-}
-#endif
-
 /* Forward declaration, a strange C thing */
 struct task_struct;
 
 
 #include <asm/uaccess_mm.h>
 #endif
 
+#include <asm/extable.h>
 #ifdef CONFIG_CPU_HAS_NO_UNALIGNED
 #include <asm-generic/uaccess-unaligned.h>
 #else
 
 #define        MOVES   "move"
 #endif
 
-/*
- * The exception table consists of pairs of addresses: the first is the
- * address of an instruction that is allowed to fault, and the second is
- * the address at which the program should continue.  No registers are
- * modified, so it is entirely up to the continuation code to figure out
- * what to do.
- *
- * All the routines below use bits of fixup code that are out of line
- * with the main instruction path.  This means when everything is well,
- * we don't even have to jump over them.  Further, they do not intrude
- * on our cache or tlb entries.
- */
-
-struct exception_table_entry
-{
-       unsigned long insn, fixup;
-};
-
 extern int __put_user_bad(void);
 extern int __get_user_bad(void);
 
 
        return 1;
 }
 
-/*
- * The exception table consists of pairs of addresses: the first is the
- * address of an instruction that is allowed to fault, and the second is
- * the address at which the program should continue.  No registers are
- * modified, so it is entirely up to the continuation code to figure out
- * what to do.
- *
- * All the routines below use bits of fixup code that are out of line
- * with the main instruction path.  This means when everything is well,
- * we don't even have to jump over them.  Further, they do not intrude
- * on our cache or tlb entries.
- */
-
-struct exception_table_entry
-{
-       unsigned long insn, fixup;
-};
-
-
 /*
  * These are the main single-value transfer routines.  They automatically
  * use the right size if we just have the right pointer type.
 
        return frame_size_change[f];
 }
 
-int handle_kernel_fault(struct pt_regs *regs)
+int fixup_exception(struct pt_regs *regs)
 {
        const struct exception_table_entry *fixup;
        struct pt_regs *tregs;
 
                        /* traced a trapping instruction on a 68020/30,
                         * real exception will be executed afterwards.
                         */
-               } else if (!handle_kernel_fault(&fp->ptregs))
-                       bad_super_trap(fp);
+                       return;
+               }
+#ifdef CONFIG_MMU
+               if (fixup_exception(&fp->ptregs))
+                       return;
+#endif
+               bad_super_trap(fp);
                return;
        }
 
 
                force_sig_info(siginfo.si_signo,
                               &siginfo, current);
        } else {
-               if (handle_kernel_fault(regs))
+               if (fixup_exception(regs))
                        return -1;
 
                //if (siginfo.si_signo == SIGBUS)