1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
--- 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;i<max_fd;i++){
+ for(i=0;i<=max_fd;i++){
if(FD_ISSET(i, &fds)) FD_CLR(i, &active_fd_mask);
}
for(irq_fd=active_fds;irq_fd != NULL;irq_fd = irq_fd->next){
--- 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++;
|