--- cvs/linux/arch/um/include/kern_util.h Tue Jun 20 15:06:09 2000 +++ um/arch/um/include/kern_util.h Sat Jul 1 10:41:11 2000 @@ -117,6 +117,7 @@ extern void tracing_reboot(void); extern void tracing_halt(void); extern void tracing_cb(void (*proc)(void *), void *arg); +extern void probe_stack(unsigned long sp); #endif /* --- cvs/linux/arch/um/kernel/irq_user.c Tue Jun 20 15:06:09 2000 +++ um/arch/um/kernel/irq_user.c Sat Jul 1 10:50:25 2000 @@ -34,7 +34,10 @@ int i, n, user_mode; user_mode = set_user_thread(NULL, 0, 0); - if(user_mode) change_sig(SIGUSR1, 1); + if(user_mode){ + fill_in_regs(process_state(NULL, NULL, NULL), &sig + 1); + change_sig(SIGUSR1, 1); + } fds = active_fd_mask; tv.tv_sec = 0; tv.tv_usec = 0; @@ -43,7 +46,7 @@ "errno = %d\n", n, errno); return; } - for(i=0;inext){ --- cvs/linux/arch/um/kernel/process_kern.c Tue Jun 20 15:06:09 2000 +++ um/arch/um/kernel/process_kern.c Sat Jul 1 16:29:56 2000 @@ -606,6 +606,17 @@ *((int *) sp) = n; } +void probe_stack(unsigned long sp) +{ + int n, delta; + + delta = current->thread.syscall_stack_size; + n = *((int *) sp); + set_address(sp, n); + n = *((int *) (sp - delta)); + set_address(sp - delta, n); +} + void dump_thread(struct pt_regs *regs, struct user *u) { } @@ -675,6 +686,8 @@ { if(current->need_resched) schedule(); if(current->thread.npending == 0) do_signal(current, NULL, NULL, NULL); + if(current->thread.npending > 0) + probe_stack(current->thread.process_regs.regs[UESP]); } void *um_kmalloc(int size) --- cvs/linux/arch/um/kernel/syscall_user.c Tue Jun 20 15:06:09 2000 +++ um/arch/um/kernel/syscall_user.c Sat Jul 1 15:42:58 2000 @@ -76,9 +76,9 @@ void syscall_handler(int unused) { struct sys_pt_regs *regs; - unsigned long args[6], sp; + unsigned long args[6]; long result; - int index, syscall, again, n; + int index, syscall, again; if(current_pid(NULL) == 1){ set_sigstack(current_sigstack(NULL)); @@ -118,13 +118,7 @@ gettimeofday(&syscall_record[index].end, NULL); ret_from_sys_call(NULL); set_syscall_result(NULL, UM_SYSCALL_RET(regs), again); - if(have_signals(NULL, 0)){ - sp = UM_SP(regs); - n = *((int *) sp); - set_address(sp, n); - n = *((int *) (sp - 512)); - set_address(sp - 512, n); - } + if(have_signals(NULL, 0)) probe_stack(UM_SP(regs)); set_user_thread(NULL, 1, 1); } @@ -159,8 +153,6 @@ tracing = 0; } else if(checking_sigs() || again){ - if(ptrace(PTRACE_GETREGS, pid, 0, regs) < 0) - panic("Couldn't read registers"); regs = syscall_state(task, &stack, &n); if(ptrace(PTRACE_SETREGS, pid, 0, regs) < 0) panic("Couldn't restart system call"); --- cvs/linux/arch/um/kernel/time_kern.c Tue Jun 20 15:06:09 2000 +++ um/arch/um/kernel/time_kern.c Sat Jul 1 10:50:31 2000 @@ -29,7 +29,10 @@ { int user_mode; user_mode = set_user_thread(NULL, 0, 0); - if(user_mode) change_sig(SIGUSR1, 1); + if(user_mode){ + fill_in_regs(¤t->thread.process_regs, &sig + 1); + change_sig(SIGUSR1, 1); + } do_IRQ(TIMER_IRQ, user_mode); if(user_mode){ interrupt_end(); --- cvs/linux/arch/um/kernel/trap_user.c Tue Jun 20 15:06:09 2000 +++ um/arch/um/kernel/trap_user.c Sat Jul 1 10:50:16 2000 @@ -197,6 +197,7 @@ sc = (struct sigcontext_struct *) (&sig + 1); is_user = set_user_thread(NULL, 0, 0); + if(is_user) fill_in_regs(process_state(NULL, NULL, NULL), sc); change_sig(SIGUSR1, 1); lock_trap(); index = segfault_index++;