]> git.pld-linux.org Git - packages/kernel.git/blob - linux-2.4.20-uml-host-skas3.patch
- obsolete
[packages/kernel.git] / linux-2.4.20-uml-host-skas3.patch
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
4 @@ -291,6 +291,8 @@
5     bool '    Use real mode APM BIOS call to power off' CONFIG_APM_REAL_MODE_POWER_OFF
6  fi
7  
8 +bool '/proc/mm' CONFIG_PROC_MM
9 +
10  endmenu
11  
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
16 @@ -24,11 +24,12 @@
17   * assured by user-space anyway. Writes are atomic, to protect
18   * the security checks done on new descriptors.
19   */
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)
23  {
24         int err;
25         unsigned long size;
26 -       struct mm_struct * mm = current->mm;
27 +       struct mm_struct * mm = task->mm;
28  
29         err = 0;
30         if (!mm->context.segments)
31 @@ -64,9 +65,10 @@
32         return err;
33  }
34  
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)
38  {
39 -       struct mm_struct * mm = current->mm;
40 +       struct mm_struct * mm = task->mm;
41         __u32 entry_1, entry_2, *lp;
42         int error;
43         struct modify_ldt_ldt_s ldt_info;
44 @@ -148,23 +150,29 @@
45         return error;
46  }
47  
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)
51  {
52         int ret = -ENOSYS;
53  
54         switch (func) {
55         case 0:
56 -               ret = read_ldt(ptr, bytecount);
57 +               ret = read_ldt(task, ptr, bytecount);
58                 break;
59         case 1:
60 -               ret = write_ldt(ptr, bytecount, 1);
61 +               ret = write_ldt(task, ptr, bytecount, 1);
62                 break;
63         case 2:
64                 ret = read_default_ldt(ptr, bytecount);
65                 break;
66         case 0x11:
67 -               ret = write_ldt(ptr, bytecount, 0);
68 +               ret = write_ldt(task, ptr, bytecount, 0);
69                 break;
70         }
71         return ret;
72 +}
73 +
74 +asmlinkage int sys_modify_ldt(int func, void *ptr, unsigned long bytecount)
75 +{
76 +       return(modify_ldt(current, func, ptr, bytecount));
77  }
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
81 @@ -551,13 +551,11 @@
82   * we do not have to muck with descriptors here, that is
83   * done in switch_mm() as needed.
84   */
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)
87  {
88 -       struct mm_struct * old_mm;
89         void *old_ldt, *ldt;
90  
91         ldt = NULL;
92 -       old_mm = current->mm;
93         if (old_mm && (old_ldt = old_mm->context.segments) != NULL) {
94                 /*
95                  * Completely new LDT, we initialize it from the parent:
96 @@ -570,6 +568,16 @@
97         }
98         new_mm->context.segments = ldt;
99         new_mm->context.cpuvalid = ~0UL;        /* valid on all CPU's - they can't have stale data */
100 +}
101 +
102 +void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
103 +{
104 +       mm_copy_segments(current->mm, new_mm);
105 +}
106 +
107 +void copy_task_segments(struct task_struct *from, struct mm_struct *new_mm)
108 +{
109 +       mm_copy_segments(from->mm, new_mm);
110  }
111  
112  /*
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
116 @@ -147,6 +147,11 @@
117         put_stack_long(child, EFL_OFFSET, tmp);
118  }
119  
120 +extern int modify_ldt(struct task_struct *task, int func, void *ptr, 
121 +                     unsigned long bytecount);
122 +
123 +extern struct mm_struct *proc_mm_get_mm(int fd);
124 +
125  asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
126  {
127         struct task_struct *child;
128 @@ -415,10 +420,57 @@
129                         child->ptrace |= PT_TRACESYSGOOD;
130                 else
131                         child->ptrace &= ~PT_TRACESYSGOOD;
132 +               ret = 0;
133 +               break;
134 +       }
135 +
136 +       case PTRACE_FAULTINFO: {
137 +               struct ptrace_faultinfo fault;
138 +
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, 
143 +                                  sizeof(fault));
144 +               if(ret)
145 +                       break;
146 +               break;
147 +       }
148 +       case PTRACE_SIGPENDING:
149 +               ret = copy_to_user((unsigned long *) data, 
150 +                                  &child->pending.signal,
151 +                                  sizeof(child->pending.signal));
152 +               break;
153 +
154 +       case PTRACE_LDT: {
155 +               struct ptrace_ldt ldt;
156 +
157 +               if(copy_from_user(&ldt, (unsigned long *) data, 
158 +                                 sizeof(ldt))){
159 +                       ret = -EIO;
160 +                       break;
161 +               }
162 +               ret = modify_ldt(child, ldt.func, ldt.ptr, ldt.bytecount);
163 +               break;
164 +       }
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);
169 +
170 +               if(IS_ERR(new)){
171 +                       ret = PTR_ERR(new);
172 +                       break;
173 +               }
174 +
175 +               atomic_inc(&new->mm_users);
176 +               child->mm = new;
177 +               child->active_mm = new;
178 +               mmput(old);
179                 ret = 0;
180                 break;
181         }
182 -
183 +#endif
184         default:
185                 ret = -EIO;
186                 break;
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
190 @@ -40,7 +40,7 @@
191  }
192  
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)
199 @@ -55,9 +55,9 @@
200                         goto out;
201         }
202  
203 -       down_write(&current->mm->mmap_sem);
204 -       error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
205 -       up_write(&current->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);
209  
210         if (file)
211                 fput(file);
212 @@ -69,7 +69,7 @@
213         unsigned long prot, unsigned long flags,
214         unsigned long fd, unsigned long pgoff)
215  {
216 -       return do_mmap2(addr, len, prot, flags, fd, pgoff);
217 +       return do_mmap2(current->mm, addr, len, prot, flags, fd, pgoff);
218  }
219  
220  /*
221 @@ -100,7 +100,7 @@
222         if (a.offset & ~PAGE_MASK)
223                 goto out;
224  
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);
227  out:
228         return err;
229  }
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
233 @@ -436,6 +436,8 @@
234  extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
235  
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);
241  
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
245 @@ -51,6 +51,22 @@
246  
247  #define PTRACE_SETOPTIONS         21
248  
249 +struct ptrace_faultinfo {
250 +       int is_write;
251 +       unsigned long addr;
252 +};
253 +
254 +struct ptrace_ldt {
255 +       int func;
256 +       void *ptr;
257 +       unsigned long bytecount;
258 +};
259 +
260 +#define PTRACE_FAULTINFO 52
261 +#define PTRACE_SIGPENDING 53
262 +#define PTRACE_LDT 54
263 +#define PTRACE_SWITCH_MM 55
264 +
265  /* options set using PTRACE_SETOPTIONS */
266  #define PTRACE_O_TRACESYSGOOD     0x00000001
267  
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
270 @@ -6,6 +6,8 @@
271  #ifndef __SKAS_PTRACE_H
272  #define __SKAS_PTRACE_H
273  
274 +#ifndef PTRACE_FAULTINFO
275 +
276  struct ptrace_faultinfo {
277         int is_write;
278         unsigned long addr;
279 @@ -21,6 +23,8 @@
280  #define PTRACE_SIGPENDING 53
281  #define PTRACE_LDT 54
282  #define PTRACE_SWITCH_MM 55
283 +
284 +#endif
285  
286  #endif
287  
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
290 @@ -189,7 +189,7 @@
291         }
292  
293         down_write(&current->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(&current->mm->mmap_sem);
297         if (file)
298                 fput(file);
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
301 @@ -219,7 +219,7 @@
302         }
303  
304         down_write(&current->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(&current->mm->mmap_sem);
308  
309  out:   if (file)
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
312 @@ -250,7 +250,7 @@
313         flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
314  
315         down_write(&current->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(&current->mm->mmap_sem);
319  
320  out_putf:
This page took 0.049081 seconds and 3 git commands to generate.