[PATCH] uml: TT mode softint fixes
authorBodo Stroesser <bstroesser@fujitsu-siemens.com>
Thu, 19 Jan 2006 01:42:51 +0000 (17:42 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 19 Jan 2006 03:20:20 +0000 (19:20 -0800)
Some fixes to make softints work in tt mode.

Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/um/kernel/time_kern.c
arch/um/kernel/tt/trap_user.c

index 6fa4e1b..3c7626c 100644 (file)
@@ -187,8 +187,9 @@ void timer_handler(int sig, union uml_pt_regs *regs)
 {
        local_irq_disable();
        irq_enter();
-       update_process_times(CHOOSE_MODE(user_context(UPT_SP(regs)),
-                                        (regs)->skas.is_user));
+       update_process_times(CHOOSE_MODE(
+                            (UPT_SC(regs) && user_context(UPT_SP(regs))),
+                            (regs)->skas.is_user));
        irq_exit();
        local_irq_enable();
        if(current_thread->cpu == 0)
index a414c52..b5d9d64 100644 (file)
@@ -18,7 +18,7 @@ void sig_handler_common_tt(int sig, void *sc_ptr)
 {
        struct sigcontext *sc = sc_ptr;
        struct tt_regs save_regs, *r;
-       int save_errno = errno, is_user;
+       int save_errno = errno, is_user = 0;
        void (*handler)(int, union uml_pt_regs *);
 
        /* This is done because to allow SIGSEGV to be delivered inside a SEGV
@@ -35,7 +35,8 @@ void sig_handler_common_tt(int sig, void *sc_ptr)
                 GET_FAULTINFO_FROM_SC(r->faultinfo, sc);
         }
        save_regs = *r;
-       is_user = user_context(SC_SP(sc));
+       if (sc)
+               is_user = user_context(SC_SP(sc));
        r->sc = sc;
        if(sig != SIGUSR2) 
                r->syscall = -1;