]> git.pld-linux.org Git - packages/kernel.git/blame - linux-2.4.21-uml-o1.patch
- CAN-2003-0985 fix from Linux 2.4.24 (apply before grsec)
[packages/kernel.git] / linux-2.4.21-uml-o1.patch
CommitLineData
b084f1df
JR
1diff -urN linux-2.4.20-uml/arch/um/include/2_5compat.h linux-2.4.20-uml-o1/arch/um/include/2_5compat.h
2--- linux-2.4.20-uml/arch/um/include/2_5compat.h Sat Mar 15 18:34:03 2003
3+++ linux-2.4.20-uml-o1/arch/um/include/2_5compat.h Sat Mar 15 20:46:24 2003
4@@ -32,8 +31,7 @@
5
6 #define IS_WRITE(req) ((req)->cmd == WRITE)
7
8-#define SET_PRI(task) \
9- do { (task)->nice = 20; (task)->counter = -100; } while(0);
10+#define SET_PRI(task) do { } while(0)
11
12 #else
13
14diff -u um/arch/um/include/kern_util.h um/arch/um/include/kern_util.h
15--- um/arch/um/include/kern_util.h
16+++ um/arch/um/include/kern_util.h
17@@ -106,7 +106,7 @@
18 extern void arch_switch(void);
19 extern void free_irq(unsigned int, void *);
20 extern int um_in_interrupt(void);
21-extern int cpu(void);
22+extern int um_cpu(void);
23 #endif
24
25 /*
26diff -urN linux-2.4.20-uml/arch/um/include/user_util.h linux-2.4.20-uml-o1/arch/um/include/user_util.h
27--- linux-2.4.20-uml/arch/um/include/user_util.h Sat Mar 15 18:34:03 2003
28+++ linux-2.4.20-uml-o1/arch/um/include/user_util.h Sat Mar 15 19:58:20 2003
29@@ -89,6 +89,7 @@
30 extern int arch_fixup(unsigned long address, void *sc_ptr);
31 extern int can_do_skas(void);
32 extern void arch_init_thread(void);
33+extern void forward_pending_sigio(int target);
34
35 #endif
36
37diff -urN linux-2.4.20-uml/arch/um/kernel/irq.c linux-2.4.20-uml-o1/arch/um/kernel/irq.c
38--- linux-2.4.20-uml/arch/um/kernel/irq.c Sat Mar 15 18:34:03 2003
39+++ linux-2.4.20-uml-o1/arch/um/kernel/irq.c Sat Mar 15 20:30:22 2003
40@@ -151,10 +151,12 @@
41
42 status = 1; /* Force the "do bottom halves" bit */
43
44- if (!(action->flags & SA_INTERRUPT))
45- __sti();
46-
47 do {
48+ if (!(action->flags & SA_INTERRUPT))
49+ __sti();
50+ else
51+ __cli();
52+
53 status |= action->flags;
54 action->handler(irq, action->dev_id, regs);
55 action = action->next;
56diff -urN linux-2.4.20-uml/arch/um/kernel/process.c linux-2.4.20-uml-o1/arch/um/kernel/process.c
57--- linux-2.4.20-uml/arch/um/kernel/process.c Sat Mar 15 18:34:03 2003
58+++ linux-2.4.20-uml-o1/arch/um/kernel/process.c Sat Mar 15 19:59:12 2003
59@@ -275,6 +275,16 @@
60 #endif
61 }
62
63+void forward_pending_sigio(int target)
64+{
65+ sigset_t sigs;
66+
67+ if(sigpending(&sigs))
68+ panic("forward_pending_sigio : sigpending failed");
69+ if(sigismember(&sigs, SIGIO))
70+ kill(target, SIGIO);
71+}
72+
73 /*
74 * Overrides for Emacs so that we follow Linus's tabbing style.
75 * Emacs will notice this stuff at the end of the file and automatically
76diff -u um/arch/um/kernel/process_kern.c um/arch/um/kernel/process_kern.c
77--- um/arch/um/kernel/process_kern.c
78+++ um/arch/um/kernel/process_kern.c
79@@ -124,7 +124,7 @@
80 {
81 struct task_struct *task = t;
82
83- cpu_tasks[task->processor] = ((struct cpu_task)
84+ cpu_tasks[task->cpu] = ((struct cpu_task)
85 { external_pid(task), task });
86 }
87
88@@ -360,7 +360,7 @@
89 int smp_sigio_handler(void)
90 {
91 #ifdef CONFIG_SMP
92- int cpu = current->processor;
93+ int cpu = current->cpu;
94
95 IPI_handler(cpu);
96 if(cpu != 0)
97@@ -374,9 +374,9 @@
98 return(in_interrupt());
99 }
100
101-int cpu(void)
102+int um_cpu(void)
103 {
104- return(current->processor);
105+ return(current->cpu);
106 }
107
108 /*
109--- linux-2.4.20/arch/um/kernel/reboot.c~ Sun Mar 16 01:41:54 2003
110+++ linux-2.4.20/arch/um/kernel/reboot.c Sun Mar 16 03:05:25 2003
111@@ -14,15 +14,9 @@
112 #ifdef CONFIG_SMP
113 static void kill_idlers(int me)
114 {
115- struct task_struct *p;
116- int i;
117-
118- for(i = 0; i < sizeof(init_tasks)/sizeof(init_tasks[0]); i++){
119- p = init_tasks[i];
120- if((p != NULL) && (p->thread.mode.tt.extern_pid != me) &&
121- (p->thread.mode.tt.extern_pid != -1))
122- os_kill_process(p->thread.mode.tt.extern_pid, 0);
123- }
124+ if((init_task.thread.mode.tt.extern_pid != me) &&
125+ (init_task.thread.mode.tt.extern_pid != -1))
126+ os_kill_process(init_task.thread.mode.tt.extern_pid, 0);
127 }
128 #endif
129
130diff -urN linux-2.4.20-uml/arch/um/kernel/skas/process_kern.c linux-2.4.20-uml-o1/arch/um/kernel/skas/process_kern.c
131--- linux-2.4.20-uml/arch/um/kernel/skas/process_kern.c Sat Mar 15 18:34:03 2003
132+++ linux-2.4.20-uml-o1/arch/um/kernel/skas/process_kern.c Sat Mar 15 20:03:07 2003
133@@ -47,7 +47,7 @@
134 return(current->thread.prev_sched);
135 }
136
137-extern void schedule_tail(struct task_struct *prev);
138+asmlinkage void schedule_tail(task_t *prev);
139
140 void new_thread_handler(int sig)
141 {
142@@ -60,8 +60,10 @@
143 thread_wait(&current->thread.mode.skas.switch_buf,
144 current->thread.mode.skas.fork_buf);
145
146+#ifdef CONFIG_SMP
147 if(current->thread.prev_sched != NULL)
148 schedule_tail(current->thread.prev_sched);
149+#endif
150 current->thread.prev_sched = NULL;
151
152 n = run_kernel_thread(fn, arg, &current->thread.exec_buf);
153@@ -91,8 +93,10 @@
154 current->thread.mode.skas.fork_buf);
155
156 force_flush_all();
157+#ifdef CONFIG_SMP
158 if(current->thread.prev_sched != NULL)
159 schedule_tail(current->thread.prev_sched);
160+#endif
161 current->thread.prev_sched = NULL;
162 unblock_signals();
163
164@@ -137,7 +137,7 @@
165
166 void init_idle_skas(void)
167 {
168- cpu_tasks[current->processor].pid = os_getpid();
169+ cpu_tasks[current->cpu].pid = os_getpid();
170 }
171
172 extern void start_kernel(void);
173diff -u um/arch/um/kernel/skas/trap_user.c um/arch/um/kernel/skas/trap_user.c
174--- um/arch/um/kernel/skas/trap_user.c
175+++ um/arch/um/kernel/skas/trap_user.c
176@@ -42,7 +42,7 @@
177 struct signal_info *info;
178
179 if(sig == SIGVTALRM)
180- missed_ticks[cpu()]++;
181+ missed_ticks[um_cpu()]++;
182 regs->skas.is_user = 1;
183 regs->skas.fault_addr = 0;
184 regs->skas.fault_type = 0;
185--- linux-2.4.20/arch/um/kernel/smp.c~ Sat Mar 15 23:38:50 2003
186+++ linux-2.4.20/arch/um/kernel/smp.c Sun Mar 16 01:27:45 2003
187@@ -30,6 +30,8 @@
188
189 /* Per CPU bogomips and other parameters */
190
191+unsigned long cache_decay_ticks = HZ/100;
192+
193 /* The only piece used here is the ipi pipe, which is set before SMP is
194 * started and never changed.
195 */
196@@ -97,7 +97,7 @@
197
198 printk(KERN_INFO "Stopping all CPUs...");
199 for(i = 0; i < ncpus; i++){
200- if(i == current->processor)
201+ if(i == current->cpu)
202 continue;
203 write(cpu_data[i].ipi_pipe[1], "S", 1);
204 }
205@@ -121,10 +121,9 @@
206 int cpu, err;
207
208 set_current(current);
209- del_from_runqueue(current);
210 unhash_process(current);
211
212- cpu = current->processor;
213+ cpu = current->cpu;
214 err = os_pipe(cpu_data[cpu].ipi_pipe, 1, 1);
215 if(err)
216 panic("CPU#%d failed to create IPI pipe, errno = %d", cpu,
217@@ -134,8 +134,8 @@
218 current->thread.mode.tt.extern_pid);
219
220 wmb();
221- if (test_and_set_bit(current->processor, &smp_callin_map)) {
222- printk("huh, CPU#%d already present??\n", current->processor);
223+ if (test_and_set_bit(current->cpu, &smp_callin_map)) {
224+ printk("huh, CPU#%d already present??\n", current->cpu);
225 BUG();
226 }
227
228@@ -142,7 +142,6 @@
229 while (!atomic_read(&smp_commenced))
230 cpu_relax();
231
232- init_idle();
233 cpu_idle();
234 return(0);
235 }
236@@ -161,10 +160,8 @@
237
238 cpu_tasks[cpu].pid = new_task->thread.mode.tt.extern_pid;
239 cpu_tasks[cpu].task = new_task;
240- init_tasks[cpu] = new_task;
241- new_task->processor = cpu;
242+ init_idle(new_task, cpu);
243 new_task->cpus_allowed = 1 << cpu;
244- new_task->cpus_runnable = new_task->cpus_allowed;
245 CHOOSE_MODE(write(new_task->thread.mode.tt.switch_pipe[1], &c,
246 sizeof(c)),
247 ({ panic("skas mode doesn't support SMP"); }));
248@@ -296,7 +296,7 @@
249 info = _info;
250
251 for (i=0;i<NR_CPUS;i++)
252- if (i != current->processor && test_bit(i, &cpu_online_map))
253+ if (i != current->cpu && test_bit(i, &cpu_online_map))
254 write(cpu_data[i].ipi_pipe[1], "C", 1);
255
256 while (atomic_read(&scf_started) != cpus)
257diff -urN linux-2.4.20-uml/arch/um/kernel/sys_call_table.c linux-2.4.20-uml-o1/arch/um/kernel/sys_call_table.c
258--- linux-2.4.20-uml/arch/um/kernel/sys_call_table.c Sat Mar 15 18:34:03 2003
259+++ linux-2.4.20-uml-o1/arch/um/kernel/sys_call_table.c Sat Mar 15 19:41:51 2003
260@@ -153,6 +153,7 @@
261 extern syscall_handler_t sys_sched_getparam;
262 extern syscall_handler_t sys_sched_setscheduler;
263 extern syscall_handler_t sys_sched_getscheduler;
264+extern syscall_handler_t sys_sched_yield;
265 extern syscall_handler_t sys_sched_get_priority_max;
266 extern syscall_handler_t sys_sched_get_priority_min;
267 extern syscall_handler_t sys_sched_rr_get_interval;
268@@ -261,7 +262,7 @@
269
270 /* declared differently in kern_util.h */
271 [ __NR_execve ] = (syscall_handler_t *) sys_execve,
272- [ __NR_chdir ] = sys_chdir,
273+ [ __NR_chdir ] = (syscall_handler_t *) sys_chdir,
274 [ __NR_time ] = um_time,
275 [ __NR_mknod ] = sys_mknod,
276 [ __NR_chmod ] = sys_chmod,
277@@ -306,15 +307,15 @@
278 [ __NR_umount2 ] = sys_umount,
279 [ __NR_lock ] = sys_ni_syscall,
280 [ __NR_ioctl ] = sys_ioctl,
281- [ __NR_fcntl ] = sys_fcntl,
282+ [ __NR_fcntl ] = (syscall_handler_t *) sys_fcntl,
283 [ __NR_mpx ] = sys_ni_syscall,
284 [ __NR_setpgid ] = sys_setpgid,
285 [ __NR_ulimit ] = sys_ni_syscall,
286 [ __NR_oldolduname ] = sys_olduname,
287 [ __NR_umask ] = sys_umask,
288- [ __NR_chroot ] = sys_chroot,
289+ [ __NR_chroot ] = (syscall_handler_t *) sys_chroot,
290 [ __NR_ustat ] = sys_ustat,
291- [ __NR_dup2 ] = sys_dup2,
292+ [ __NR_dup2 ] = (syscall_handler_t *) sys_dup2,
293 [ __NR_getppid ] = sys_getppid,
294 [ __NR_getpgrp ] = sys_getpgrp,
295 [ __NR_setsid ] = (syscall_handler_t *) sys_setsid,
296--- linux-2.4.20/arch/um/kernel/time_kern.c~ Sat Mar 15 23:38:50 2003
297+++ linux-2.4.20/arch/um/kernel/time_kern.c Sun Mar 16 01:20:23 2003
298@@ -37,7 +37,7 @@
299
300 void timer_irq(union uml_pt_regs *regs)
301 {
302- int cpu = current->processor, ticks = missed_ticks[cpu];
303+ int cpu = current->cpu, ticks = missed_ticks[cpu];
304
305 if(!timer_irq_inited) return;
306 missed_ticks[cpu] = 0;
307@@ -123,7 +123,7 @@
308 #ifdef CONFIG_SMP
309 update_process_times(user_context(UPT_SP(regs)));
310 #endif
311- if(current->processor == 0)
312+ if(current->cpu == 0)
313 timer_irq(regs);
314 }
315
316diff -u um/arch/um/kernel/trap_user.c um/arch/um/kernel/trap_user.c
317--- um/arch/um/kernel/trap_user.c
318+++ um/arch/um/kernel/trap_user.c
319@@ -107,7 +107,7 @@
320 void alarm_handler(int sig, struct sigcontext sc)
321 {
322 if(!timer_irq_inited) return;
323- missed_ticks[cpu()]++;
324+ missed_ticks[um_cpu()]++;
325
326 if(sig == SIGALRM)
327 switch_timers(0);
328--- linux-2.4.20/arch/um/kernel/tt/exec_kern.c~ Sat Mar 15 23:38:50 2003
329+++ linux-2.4.20/arch/um/kernel/tt/exec_kern.c Sun Mar 16 01:12:57 2003
330@@ -46,7 +46,7 @@
331 do_exit(SIGKILL);
332 }
333
334- if(current->processor == 0)
335+ if(current->cpu == 0)
336 forward_interrupts(new_pid);
337 current->thread.request.op = OP_EXEC;
338 current->thread.request.u.exec.pid = new_pid;
339diff -urN linux-2.4.20-uml/arch/um/kernel/tt/process_kern.c linux-2.4.20-uml-o1/arch/um/kernel/tt/process_kern.c
340--- linux-2.4.20-uml/arch/um/kernel/tt/process_kern.c Sat Mar 15 18:34:04 2003
341+++ linux-2.4.20-uml-o1/arch/um/kernel/tt/process_kern.c Sat Mar 15 20:06:05 2003
342@@ -29,10 +29,6 @@
343 unsigned long flags;
344 int err, vtalrm, alrm, prof, cpu;
345 char c;
346- /* jailing and SMP are incompatible, so this doesn't need to be
347- * made per-cpu
348- */
349- static int reading;
350
351 from = prev;
352 to = next;
353@@ -35,7 +35,7 @@
354
355 to->thread.prev_sched = from;
356
357- cpu = from->processor;
358+ cpu = from->cpu;
359 if(cpu == 0)
360 forward_interrupts(to->thread.mode.tt.extern_pid);
361 #ifdef CONFIG_SMP
362@@ -51,15 +47,15 @@
363 alrm = change_sig(SIGALRM, 0);
364 prof = change_sig(SIGPROF, 0);
365
366+ forward_pending_sigio(to->thread.mode.tt.extern_pid);
367+
368 c = 0;
369 set_current(to);
370
371- reading = 0;
372 err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c));
373 if(err != sizeof(c))
374 panic("write of switch_pipe failed, errno = %d", -err);
375
376- reading = 1;
377 if(from->state == TASK_ZOMBIE)
378 os_kill_process(os_getpid(), 0);
379
380@@ -67,24 +63,6 @@
381 if(err != sizeof(c))
382 panic("read of switch_pipe failed, errno = %d", -err);
383
384- /* This works around a nasty race with 'jail'. If we are switching
385- * between two threads of a threaded app and the incoming process
386- * runs before the outgoing process reaches the read, and it makes
387- * it all the way out to userspace, then it will have write-protected
388- * the outgoing process stack. Then, when the outgoing process
389- * returns from the write, it will segfault because it can no longer
390- * write its own stack. So, in order to avoid that, the incoming
391- * thread sits in a loop yielding until 'reading' is set. This
392- * isn't entirely safe, since there may be a reschedule from a timer
393- * happening between setting 'reading' and sleeping in read. But,
394- * it should get a whole quantum in which to reach the read and sleep,
395- * which should be enough.
396- */
397-
398- if(jail){
399- while(!reading) sched_yield();
400- }
401-
402 change_sig(SIGVTALRM, vtalrm);
403 change_sig(SIGALRM, alrm);
404 change_sig(SIGPROF, prof);
405@@ -108,7 +86,7 @@
406 close(current->thread.mode.tt.switch_pipe[1]);
407 }
408
409-extern void schedule_tail(struct task_struct *prev);
410+asmlinkage void schedule_tail(task_t *prev);
411
412 static void new_thread_handler(int sig)
413 {
414@@ -126,8 +104,10 @@
415 set_cmdline("(kernel thread)");
416 force_flush_all();
417
418+#ifdef CONFIG_SMP
419 if(current->thread.prev_sched != NULL)
420 schedule_tail(current->thread.prev_sched);
421+#endif
422 current->thread.prev_sched = NULL;
423
424 change_sig(SIGUSR1, 1);
425@@ -169,8 +149,10 @@
426 1, 0, 1);
427 task_protections((unsigned long) current);
428
429+#ifdef CONFIG_SMP
430 if(current->thread.prev_sched != NULL)
431 schedule_tail(current->thread.prev_sched);
432+#endif
433 current->thread.prev_sched = NULL;
434
435 free_page(current->thread.temp_stack);
436@@ -281,7 +281,7 @@
437 pid = thread->request.u.exec.pid;
438 do_exec(thread->mode.tt.extern_pid, pid);
439 thread->mode.tt.extern_pid = pid;
440- cpu_tasks[task->processor].pid = pid;
441+ cpu_tasks[task->cpu].pid = pid;
442 break;
443 case OP_FORK:
444 attach_process(thread->request.u.fork.pid);
445diff -urN linux-2.4.20-uml/include/asm-um/cache.h linux-2.4.20-uml-o1/include/asm-um/cache.h
446--- linux-2.4.20-uml/include/asm-um/cache.h Sat Mar 15 18:34:04 2003
447+++ linux-2.4.20-uml-o1/include/asm-um/cache.h Sat Mar 15 20:23:30 2003
448@@ -1,6 +1,7 @@
449 #ifndef __UM_CACHE_H
450 #define __UM_CACHE_H
451
452-#define L1_CACHE_BYTES 32
453+#define L1_CACHE_SHIFT (5)
454+#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
455
456 #endif
457diff -urN linux-2.4.20-uml/include/asm-um/fixmap.h linux-2.4.20-uml-o1/include/asm-um/fixmap.h
458--- linux-2.4.20-uml/include/asm-um/fixmap.h Sat Mar 15 18:34:04 2003
459+++ linux-2.4.20-uml-o1/include/asm-um/fixmap.h Sat Mar 15 20:44:39 2003
460@@ -2,7 +2,9 @@
461 #define __UM_FIXMAP_H
462
463 #include <linux/config.h>
464+#ifdef CONFIG_HIGHMEM
465 #include <asm/kmap_types.h>
466+#endif
467
468 /*
469 * Here we define all the compile-time 'special' virtual
470diff -urN linux-2.4.20-uml/include/asm-um/page.h linux-2.4.20-uml-o1/include/asm-um/page.h
471--- linux-2.4.20-uml/include/asm-um/page.h Sat Mar 15 18:34:04 2003
472+++ linux-2.4.20-uml-o1/include/asm-um/page.h Sat Mar 15 19:47:48 2003
473@@ -50,4 +50,7 @@
474 extern struct page *arch_validate(struct page *page, int mask, int order);
475 #define HAVE_ARCH_VALIDATE
476
477+#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
478+ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
479+
480 #endif
481diff -urN linux-2.4.20-uml/include/asm-um/smp.h linux-2.4.20-uml-o1/include/asm-um/smp.h
482--- linux-2.4.20-uml/include/asm-um/smp.h Sat Mar 15 18:34:04 2003
483+++ linux-2.4.20-uml-o1/include/asm-um/smp.h Sat Mar 15 19:50:18 2003
484@@ -6,7 +6,7 @@
485 #include "linux/config.h"
486 #include "asm/current.h"
487
488-#define smp_processor_id() (current->processor)
489+#define smp_processor_id() (current->cpu)
490 #define cpu_logical_map(n) (n)
491 #define cpu_number_map(n) (n)
492 #define PROC_CHANGE_PENALTY 15 /* Pick a number, any number */
This page took 0.16189 seconds and 4 git commands to generate.