microblaze: Add STATE_SAVE_ARG_SPACE for noMMU kernel too
authorMichal Simek <monstr@monstr.eu>
Tue, 21 Apr 2009 12:08:47 +0000 (14:08 +0200)
committerMichal Simek <monstr@monstr.eu>
Thu, 23 Apr 2009 14:27:33 +0000 (16:27 +0200)
For noMMU kernel this change nothing bring but this change
helps with MMU synchronization.

Signed-off-by: Michal Simek <monstr@monstr.eu>
arch/microblaze/include/asm/entry.h
arch/microblaze/include/asm/processor.h
arch/microblaze/kernel/signal.c

index 1019d88b8129e9adcef0be208926cadc3c75cf08..e4c3aef884df0dacdba060af7d6d95dd3e122460 100644 (file)
@@ -31,4 +31,7 @@ DECLARE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */
 DECLARE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */
 # endif /* __ASSEMBLY__ */
 
+/* noMMU hasn't any space for args */
+# define STATE_SAVE_ARG_SPACE  (0)
+
 #endif /* _ASM_MICROBLAZE_ENTRY_H */
index 89aa3956929beb76b8333ba6b0053a4f1d8dae4e..9329029d26148c5c04d10df919c308eee099b1a9 100644 (file)
@@ -15,6 +15,8 @@
 #include <asm/setup.h>
 #include <asm/registers.h>
 #include <asm/segment.h>
+#include <asm/entry.h>
+#include <asm/current.h>
 
 # ifndef __ASSEMBLY__
 /* from kernel/cpu/mb.c */
index 3889cf45fa71451b904dc5e880f2a54c783b4b23..40d36931e363eccefd2857383e60fb162f6bf492 100644 (file)
@@ -178,7 +178,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *rval_p)
 
 asmlinkage int sys_sigreturn(struct pt_regs *regs)
 {
-       struct sigframe *frame = (struct sigframe *)regs->r1;
+       struct sigframe *frame =
+                       (struct sigframe *)(regs->r1 + STATE_SAVE_ARG_SPACE);
+
        sigset_t set;
        int rval;
 
@@ -209,7 +211,9 @@ badframe:
 
 asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
 {
-       struct rt_sigframe *frame = (struct rt_sigframe *)regs->r1;
+       struct rt_sigframe *frame =
+                       (struct rt_sigframe *)(regs->r1 + STATE_SAVE_ARG_SPACE);
+
        sigset_t set;
        stack_t st;
        int rval;
@@ -336,7 +340,8 @@ static void setup_frame(int sig, struct k_sigaction *ka,
                goto give_sigsegv;
 
        /* Set up registers for signal handler */
-       regs->r1 = (unsigned long) frame;
+       regs->r1 = (unsigned long) frame - STATE_SAVE_ARG_SPACE;
+
        /* Signal handler args: */
        regs->r5 = signal; /* Arg 0: signum */
        regs->r6 = (unsigned long) &frame->sc; /* arg 1: sigcontext */
@@ -414,7 +419,8 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                goto give_sigsegv;
 
        /* Set up registers for signal handler */
-       regs->r1 = (unsigned long) frame;
+       regs->r1 = (unsigned long) frame - STATE_SAVE_ARG_SPACE;
+
        /* Signal handler args: */
        regs->r5 = signal; /* arg 0: signum */
        regs->r6 = (unsigned long) &frame->info; /* arg 1: siginfo */