m68k: Add helper function handle_kernel_fault()
authorRoman Zippel <zippel@linux-m68k.org>
Tue, 18 Nov 2008 20:25:17 +0000 (21:25 +0100)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Wed, 16 Mar 2011 18:10:40 +0000 (19:10 +0100)
Add helper function handle_kernel_fault() in signal.c, so frame_extra_sizes
can become static, and to avoid future code duplication.

Signed-off-by: Roman Zippel <zippel@linux-m68k.org>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
arch/m68k/include/asm/processor.h
arch/m68k/kernel/signal.c
arch/m68k/mm/fault.c

index 278c69bad57a8369a542851df92571cdcf988447..f111b02b704fd6aa12341a8e39216923e291ee58 100644 (file)
@@ -113,6 +113,8 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
        wrusp(usp);
 }
 
+extern int handle_kernel_fault(struct pt_regs *regs);
+
 #else
 
 /*
index d12c3b0d9e4f59efa6c3f043c36242ca5f1851c3..a0afc239304eb9eb40fcbcbffdf21c005cced264 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/personality.h>
 #include <linux/tty.h>
 #include <linux/binfmts.h>
+#include <linux/module.h>
 
 #include <asm/setup.h>
 #include <asm/uaccess.h>
@@ -51,7 +52,7 @@
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
-const int frame_extra_sizes[16] = {
+static const int frame_extra_sizes[16] = {
   [1]  = -1, /* sizeof(((struct frame *)0)->un.fmt1), */
   [2]  = sizeof(((struct frame *)0)->un.fmt2),
   [3]  = sizeof(((struct frame *)0)->un.fmt3),
@@ -69,6 +70,27 @@ const int frame_extra_sizes[16] = {
   [15] = -1, /* sizeof(((struct frame *)0)->un.fmtf), */
 };
 
+int handle_kernel_fault(struct pt_regs *regs)
+{
+       const struct exception_table_entry *fixup;
+       struct pt_regs *tregs;
+
+       /* Are we prepared to handle this kernel fault? */
+       fixup = search_exception_tables(regs->pc);
+       if (!fixup)
+               return 0;
+
+       /* Create a new four word stack frame, discarding the old one. */
+       regs->stkadj = frame_extra_sizes[regs->format];
+       tregs = (struct pt_regs *)((long)regs + regs->stkadj);
+       tregs->vector = regs->vector;
+       tregs->format = 0;
+       tregs->pc = fixup->fixup;
+       tregs->sr = regs->sr;
+
+       return 1;
+}
+
 /*
  * Atomically swap in the new signal mask, and wait for a signal.
  */
index a96394a0333d3d3c82cd70fbd4beb4764b02f018..2db6099784ba33d9254772417dcce05a7ac5eb36 100644 (file)
@@ -18,7 +18,6 @@
 #include <asm/pgalloc.h>
 
 extern void die_if_kernel(char *, struct pt_regs *, long);
-extern const int frame_extra_sizes[]; /* in m68k/kernel/signal.c */
 
 int send_fault_sig(struct pt_regs *regs)
 {
@@ -35,21 +34,8 @@ int send_fault_sig(struct pt_regs *regs)
                force_sig_info(siginfo.si_signo,
                               &siginfo, current);
        } else {
-               const struct exception_table_entry *fixup;
-
-               /* Are we prepared to handle this kernel fault? */
-               if ((fixup = search_exception_tables(regs->pc))) {
-                       struct pt_regs *tregs;
-                       /* Create a new four word stack frame, discarding the old
-                          one.  */
-                       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;
+               if (handle_kernel_fault(regs))
                        return -1;
-               }
 
                //if (siginfo.si_signo == SIGBUS)
                //      force_sig_info(siginfo.si_signo,