File: probe-stack.txt

package info (click to toggle)
user-mode-linux-doc 20020523-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 1,592 kB
  • ctags: 340
  • sloc: makefile: 32
file content (124 lines) | stat: -rw-r--r-- 3,613 bytes parent folder | download | duplicates (2)
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(&current->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++;