1 diff -Naur host/arch/i386/config.in host-ptrace/arch/i386/config.in
2 --- host/arch/i386/config.in Fri Aug 9 15:57:14 2002
3 +++ host-ptrace/arch/i386/config.in Sun Nov 10 18:40:09 2002
5 bool ' Use real mode APM BIOS call to power off' CONFIG_APM_REAL_MODE_POWER_OFF
8 +bool '/proc/mm' CONFIG_PROC_MM
12 source drivers/mtd/Config.in
13 diff -Naur host/arch/i386/kernel/ldt.c host-ptrace/arch/i386/kernel/ldt.c
14 --- host/arch/i386/kernel/ldt.c Fri Oct 26 00:01:41 2001
15 +++ host-ptrace/arch/i386/kernel/ldt.c Sun Nov 3 18:37:48 2002
17 * assured by user-space anyway. Writes are atomic, to protect
18 * the security checks done on new descriptors.
20 -static int read_ldt(void * ptr, unsigned long bytecount)
21 +static int read_ldt(struct task_struct *task, void * ptr,
22 + unsigned long bytecount)
26 - struct mm_struct * mm = current->mm;
27 + struct mm_struct * mm = task->mm;
30 if (!mm->context.segments)
35 -static int write_ldt(void * ptr, unsigned long bytecount, int oldmode)
36 +static int write_ldt(struct task_struct *task, void * ptr,
37 + unsigned long bytecount, int oldmode)
39 - struct mm_struct * mm = current->mm;
40 + struct mm_struct * mm = task->mm;
41 __u32 entry_1, entry_2, *lp;
43 struct modify_ldt_ldt_s ldt_info;
48 -asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount)
49 +int modify_ldt(struct task_struct *task, int func, void *ptr,
50 + unsigned long bytecount)
56 - ret = read_ldt(ptr, bytecount);
57 + ret = read_ldt(task, ptr, bytecount);
60 - ret = write_ldt(ptr, bytecount, 1);
61 + ret = write_ldt(task, ptr, bytecount, 1);
64 ret = read_default_ldt(ptr, bytecount);
67 - ret = write_ldt(ptr, bytecount, 0);
68 + ret = write_ldt(task, ptr, bytecount, 0);
74 +asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount)
76 + return(modify_ldt(current, func, ptr, bytecount));
78 diff -Naur host/arch/i386/kernel/process.c host-ptrace/arch/i386/kernel/process.c
79 --- host/arch/i386/kernel/process.c Fri Aug 9 15:57:14 2002
80 +++ host-ptrace/arch/i386/kernel/process.c Wed Nov 6 22:12:45 2002
82 * we do not have to muck with descriptors here, that is
83 * done in switch_mm() as needed.
85 -void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
86 +void mm_copy_segments(struct mm_struct *old_mm, struct mm_struct *new_mm)
88 - struct mm_struct * old_mm;
92 - old_mm = current->mm;
93 if (old_mm && (old_ldt = old_mm->context.segments) != NULL) {
95 * Completely new LDT, we initialize it from the parent:
98 new_mm->context.segments = ldt;
99 new_mm->context.cpuvalid = ~0UL; /* valid on all CPU's - they can't have stale data */
102 +void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
104 + mm_copy_segments(current->mm, new_mm);
107 +void copy_task_segments(struct task_struct *from, struct mm_struct *new_mm)
109 + mm_copy_segments(from->mm, new_mm);
113 diff -Naur host/arch/i386/kernel/ptrace.c host-ptrace/arch/i386/kernel/ptrace.c
114 --- host/arch/i386/kernel/ptrace.c Fri Aug 9 15:57:14 2002
115 +++ host-ptrace/arch/i386/kernel/ptrace.c Mon Nov 11 19:03:38 2002
117 put_stack_long(child, EFL_OFFSET, tmp);
120 +extern int modify_ldt(struct task_struct *task, int func, void *ptr,
121 + unsigned long bytecount);
123 +extern struct mm_struct *proc_mm_get_mm(int fd);
125 asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
127 struct task_struct *child;
128 @@ -415,10 +420,57 @@
129 child->ptrace |= PT_TRACESYSGOOD;
131 child->ptrace &= ~PT_TRACESYSGOOD;
136 + case PTRACE_FAULTINFO: {
137 + struct ptrace_faultinfo fault;
139 + fault = ((struct ptrace_faultinfo)
140 + { .is_write = child->thread.error_code,
141 + .addr = child->thread.cr2 });
142 + ret = copy_to_user((unsigned long *) data, &fault,
148 + case PTRACE_SIGPENDING:
149 + ret = copy_to_user((unsigned long *) data,
150 + &child->pending.signal,
151 + sizeof(child->pending.signal));
155 + struct ptrace_ldt ldt;
157 + if(copy_from_user(&ldt, (unsigned long *) data,
162 + ret = modify_ldt(child, ldt.func, ldt.ptr, ldt.bytecount);
165 +#ifdef CONFIG_PROC_MM
166 + case PTRACE_SWITCH_MM: {
167 + struct mm_struct *old = child->mm;
168 + struct mm_struct *new = proc_mm_get_mm(data);
171 + ret = PTR_ERR(new);
175 + atomic_inc(&new->mm_users);
177 + child->active_mm = new;
187 diff -Naur host/arch/i386/kernel/sys_i386.c host-ptrace/arch/i386/kernel/sys_i386.c
188 --- host/arch/i386/kernel/sys_i386.c Mon Mar 19 15:35:09 2001
189 +++ host-ptrace/arch/i386/kernel/sys_i386.c Mon Nov 11 17:23:25 2002
193 /* common code for old and new mmaps */
194 -static inline long do_mmap2(
195 +long do_mmap2(struct mm_struct *mm,
196 unsigned long addr, unsigned long len,
197 unsigned long prot, unsigned long flags,
198 unsigned long fd, unsigned long pgoff)
203 - down_write(¤t->mm->mmap_sem);
204 - error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
205 - up_write(¤t->mm->mmap_sem);
206 + down_write(&mm->mmap_sem);
207 + error = do_mmap_pgoff(mm, file, addr, len, prot, flags, pgoff);
208 + up_write(&mm->mmap_sem);
213 unsigned long prot, unsigned long flags,
214 unsigned long fd, unsigned long pgoff)
216 - return do_mmap2(addr, len, prot, flags, fd, pgoff);
217 + return do_mmap2(current->mm, addr, len, prot, flags, fd, pgoff);
222 if (a.offset & ~PAGE_MASK)
225 - err = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
226 + err = do_mmap2(current->mm, a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
230 diff -Naur host/include/asm-i386/processor.h host-ptrace/include/asm-i386/processor.h
231 --- host/include/asm-i386/processor.h Sun Nov 10 18:47:37 2002
232 +++ host-ptrace/include/asm-i386/processor.h Mon Nov 11 17:33:30 2002
234 extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
236 /* Copy and release all segment info associated with a VM */
237 +extern void mm_copy_segments(struct mm_struct *old_mm,
238 + struct mm_struct *new_mm);
239 extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
240 extern void release_segments(struct mm_struct * mm);
242 diff -Naur host/include/asm-i386/ptrace.h host-ptrace/include/asm-i386/ptrace.h
243 --- host/include/asm-i386/ptrace.h Sun Sep 23 19:20:51 2001
244 +++ host-ptrace/include/asm-i386/ptrace.h Sun Nov 10 18:36:22 2002
247 #define PTRACE_SETOPTIONS 21
249 +struct ptrace_faultinfo {
251 + unsigned long addr;
257 + unsigned long bytecount;
260 +#define PTRACE_FAULTINFO 52
261 +#define PTRACE_SIGPENDING 53
262 +#define PTRACE_LDT 54
263 +#define PTRACE_SWITCH_MM 55
265 /* options set using PTRACE_SETOPTIONS */
266 #define PTRACE_O_TRACESYSGOOD 0x00000001
268 --- linux-2.4.20/arch/um/include/skas_ptrace.h.orig Sat Mar 15 23:38:50 2003
269 +++ linux-2.4.20/arch/um/include/skas_ptrace.h Sun Mar 16 00:30:46 2003
271 #ifndef __SKAS_PTRACE_H
272 #define __SKAS_PTRACE_H
274 +#ifndef PTRACE_FAULTINFO
276 struct ptrace_faultinfo {
280 #define PTRACE_SIGPENDING 53
281 #define PTRACE_LDT 54
282 #define PTRACE_SWITCH_MM 55
288 --- linux-2.4.21/arch/ppc/kernel/syscalls.c.orig Mon Jun 30 18:15:41 2003
289 +++ linux-2.4.21/arch/ppc/kernel/syscalls.c Mon Jun 30 18:15:47 2003
293 down_write(¤t->mm->mmap_sem);
294 - ret = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
295 + ret = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, pgoff);
296 up_write(¤t->mm->mmap_sem);
299 --- linux-2.4.21/arch/ia64/kernel/sys_ia64.c.orig Mon Jun 30 18:19:24 2003
300 +++ linux-2.4.21/arch/ia64/kernel/sys_ia64.c Mon Jun 30 18:19:48 2003
304 down_write(¤t->mm->mmap_sem);
305 - addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
306 + addr = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, pgoff);
307 up_write(¤t->mm->mmap_sem);
310 --- linux-2.4.21/arch/sparc/kernel/sys_sparc.c~ Tue Jul 1 14:29:46 2003
311 +++ linux-2.4.21/arch/sparc/kernel/sys_sparc.c Tue Jul 1 20:26:26 2003
313 flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
315 down_write(¤t->mm->mmap_sem);
316 - retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
317 + retval = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, pgoff);
318 up_write(¤t->mm->mmap_sem);