2006-01-15 20:48:24

by Jeff Dike

[permalink] [raw]
Subject: [PATCH 11/11] UML - TT mode softint fixes

From: Bodo Stroesser <[email protected]>

Some fixes to make softints work in tt mode.

Signed-off-by: Jeff Dike <[email protected]>

Index: linux-2.6.15-mm/arch/um/kernel/time_kern.c
===================================================================
--- linux-2.6.15-mm.orig/arch/um/kernel/time_kern.c 2006-01-06 21:49:51.000000000 -0500
+++ linux-2.6.15-mm/arch/um/kernel/time_kern.c 2006-01-06 22:06:42.000000000 -0500
@@ -187,8 +187,9 @@ void timer_handler(int sig, union uml_pt
{
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: linux-2.6.15-mm/arch/um/kernel/tt/trap_user.c
===================================================================
--- linux-2.6.15-mm.orig/arch/um/kernel/tt/trap_user.c 2006-01-06 21:46:18.000000000 -0500
+++ linux-2.6.15-mm/arch/um/kernel/tt/trap_user.c 2006-01-06 22:06:42.000000000 -0500
@@ -18,7 +18,7 @@ void sig_handler_common_tt(int sig, void
{
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
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;