diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/cpu-probe.c | 7 | ||||
-rw-r--r-- | arch/mips/kernel/gdb-stub.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/genex.S | 2 | ||||
-rw-r--r-- | arch/mips/kernel/process.c | 5 | ||||
-rw-r--r-- | arch/mips/kernel/ptrace32.c | 22 | ||||
-rw-r--r-- | arch/mips/kernel/reset.c | 18 | ||||
-rw-r--r-- | arch/mips/kernel/rtlx.c | 4 | ||||
-rw-r--r-- | arch/mips/kernel/scall32-o32.S | 17 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-64.S | 17 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-n32.S | 17 | ||||
-rw-r--r-- | arch/mips/kernel/scall64-o32.S | 17 | ||||
-rw-r--r-- | arch/mips/kernel/signal-common.h | 8 | ||||
-rw-r--r-- | arch/mips/kernel/signal.c | 104 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 67 | ||||
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 14 | ||||
-rw-r--r-- | arch/mips/kernel/syscall.c | 48 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/vmlinux.lds.S | 11 |
18 files changed, 241 insertions, 141 deletions
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index fac48ad27b34..292f8b243a5e 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -2,8 +2,8 @@ | |||
2 | * Processor capabilities determination functions. | 2 | * Processor capabilities determination functions. |
3 | * | 3 | * |
4 | * Copyright (C) xxxx the Anonymous | 4 | * Copyright (C) xxxx the Anonymous |
5 | * Copyright (C) 1994 - 2006 Ralf Baechle | ||
5 | * Copyright (C) 2003, 2004 Maciej W. Rozycki | 6 | * Copyright (C) 2003, 2004 Maciej W. Rozycki |
6 | * Copyright (C) 1994 - 2003 Ralf Baechle | ||
7 | * Copyright (C) 2001, 2004 MIPS Inc. | 7 | * Copyright (C) 2001, 2004 MIPS Inc. |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
@@ -641,10 +641,9 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c) | |||
641 | switch (c->processor_id & 0xff00) { | 641 | switch (c->processor_id & 0xff00) { |
642 | case PRID_IMP_SB1: | 642 | case PRID_IMP_SB1: |
643 | c->cputype = CPU_SB1; | 643 | c->cputype = CPU_SB1; |
644 | #ifdef CONFIG_SB1_PASS_1_WORKAROUNDS | ||
645 | /* FPU in pass1 is known to have issues. */ | 644 | /* FPU in pass1 is known to have issues. */ |
646 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); | 645 | if ((c->processor_id & 0xff) < 0x20) |
647 | #endif | 646 | c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); |
648 | break; | 647 | break; |
649 | case PRID_IMP_SB1A: | 648 | case PRID_IMP_SB1A: |
650 | c->cputype = CPU_SB1A; | 649 | c->cputype = CPU_SB1A; |
diff --git a/arch/mips/kernel/gdb-stub.c b/arch/mips/kernel/gdb-stub.c index 96d18c43dca0..d4f88e0af24c 100644 --- a/arch/mips/kernel/gdb-stub.c +++ b/arch/mips/kernel/gdb-stub.c | |||
@@ -178,7 +178,7 @@ int kgdb_enabled; | |||
178 | */ | 178 | */ |
179 | static DEFINE_SPINLOCK(kgdb_lock); | 179 | static DEFINE_SPINLOCK(kgdb_lock); |
180 | static raw_spinlock_t kgdb_cpulock[NR_CPUS] = { | 180 | static raw_spinlock_t kgdb_cpulock[NR_CPUS] = { |
181 | [0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED; | 181 | [0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED, |
182 | }; | 182 | }; |
183 | 183 | ||
184 | /* | 184 | /* |
diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index aa18a8b7b380..13f22d1d0e8b 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
@@ -233,11 +233,11 @@ NESTED(except_vec_nmi, 0, sp) | |||
233 | NESTED(nmi_handler, PT_SIZE, sp) | 233 | NESTED(nmi_handler, PT_SIZE, sp) |
234 | .set push | 234 | .set push |
235 | .set noat | 235 | .set noat |
236 | .set mips3 | ||
237 | SAVE_ALL | 236 | SAVE_ALL |
238 | move a0, sp | 237 | move a0, sp |
239 | jal nmi_exception_handler | 238 | jal nmi_exception_handler |
240 | RESTORE_ALL | 239 | RESTORE_ALL |
240 | .set mips3 | ||
241 | eret | 241 | eret |
242 | .set pop | 242 | .set pop |
243 | END(nmi_handler) | 243 | END(nmi_handler) |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index fa98f10d0132..5232fc752935 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others. | 6 | * Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others. |
7 | * Copyright (C) 2005, 2006 by Ralf Baechle (ralf@linux-mips.org) | ||
7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. | 8 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. |
8 | * Copyright (C) 2004 Thiemo Seufer | 9 | * Copyright (C) 2004 Thiemo Seufer |
9 | */ | 10 | */ |
@@ -58,8 +59,8 @@ ATTRIB_NORET void cpu_idle(void) | |||
58 | } | 59 | } |
59 | } | 60 | } |
60 | 61 | ||
61 | extern int do_signal(sigset_t *oldset, struct pt_regs *regs); | 62 | extern void do_signal(struct pt_regs *regs); |
62 | extern int do_signal32(sigset_t *oldset, struct pt_regs *regs); | 63 | extern void do_signal32(struct pt_regs *regs); |
63 | 64 | ||
64 | /* | 65 | /* |
65 | * Native o32 and N64 ABI without DSP ASE | 66 | * Native o32 and N64 ABI without DSP ASE |
diff --git a/arch/mips/kernel/ptrace32.c b/arch/mips/kernel/ptrace32.c index 0c82b25d8c6d..0d5cf97af727 100644 --- a/arch/mips/kernel/ptrace32.c +++ b/arch/mips/kernel/ptrace32.c | |||
@@ -88,7 +88,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
88 | ret = -EIO; | 88 | ret = -EIO; |
89 | if (copied != sizeof(tmp)) | 89 | if (copied != sizeof(tmp)) |
90 | break; | 90 | break; |
91 | ret = put_user(tmp, (unsigned int *) (unsigned long) data); | 91 | ret = put_user(tmp, (unsigned int __user *) (unsigned long) data); |
92 | break; | 92 | break; |
93 | } | 93 | } |
94 | 94 | ||
@@ -174,8 +174,10 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
174 | case FPC_EIR: { /* implementation / version register */ | 174 | case FPC_EIR: { /* implementation / version register */ |
175 | unsigned int flags; | 175 | unsigned int flags; |
176 | 176 | ||
177 | if (!cpu_has_fpu) | 177 | if (!cpu_has_fpu) { |
178 | tmp = 0; | ||
178 | break; | 179 | break; |
180 | } | ||
179 | 181 | ||
180 | preempt_disable(); | 182 | preempt_disable(); |
181 | if (cpu_has_mipsmt) { | 183 | if (cpu_has_mipsmt) { |
@@ -194,15 +196,18 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
194 | preempt_enable(); | 196 | preempt_enable(); |
195 | break; | 197 | break; |
196 | } | 198 | } |
197 | case DSP_BASE ... DSP_BASE + 5: | 199 | case DSP_BASE ... DSP_BASE + 5: { |
200 | dspreg_t *dregs; | ||
201 | |||
198 | if (!cpu_has_dsp) { | 202 | if (!cpu_has_dsp) { |
199 | tmp = 0; | 203 | tmp = 0; |
200 | ret = -EIO; | 204 | ret = -EIO; |
201 | goto out_tsk; | 205 | goto out_tsk; |
202 | } | 206 | } |
203 | dspreg_t *dregs = __get_dsp_regs(child); | 207 | dregs = __get_dsp_regs(child); |
204 | tmp = (unsigned long) (dregs[addr - DSP_BASE]); | 208 | tmp = (unsigned long) (dregs[addr - DSP_BASE]); |
205 | break; | 209 | break; |
210 | } | ||
206 | case DSP_CONTROL: | 211 | case DSP_CONTROL: |
207 | if (!cpu_has_dsp) { | 212 | if (!cpu_has_dsp) { |
208 | tmp = 0; | 213 | tmp = 0; |
@@ -216,7 +221,7 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
216 | ret = -EIO; | 221 | ret = -EIO; |
217 | goto out_tsk; | 222 | goto out_tsk; |
218 | } | 223 | } |
219 | ret = put_user(tmp, (unsigned *) (unsigned long) data); | 224 | ret = put_user(tmp, (unsigned __user *) (unsigned long) data); |
220 | break; | 225 | break; |
221 | } | 226 | } |
222 | 227 | ||
@@ -304,15 +309,18 @@ asmlinkage int sys32_ptrace(int request, int pid, int addr, int data) | |||
304 | else | 309 | else |
305 | child->thread.fpu.soft.fcr31 = data; | 310 | child->thread.fpu.soft.fcr31 = data; |
306 | break; | 311 | break; |
307 | case DSP_BASE ... DSP_BASE + 5: | 312 | case DSP_BASE ... DSP_BASE + 5: { |
313 | dspreg_t *dregs; | ||
314 | |||
308 | if (!cpu_has_dsp) { | 315 | if (!cpu_has_dsp) { |
309 | ret = -EIO; | 316 | ret = -EIO; |
310 | break; | 317 | break; |
311 | } | 318 | } |
312 | 319 | ||
313 | dspreg_t *dregs = __get_dsp_regs(child); | 320 | dregs = __get_dsp_regs(child); |
314 | dregs[addr - DSP_BASE] = data; | 321 | dregs[addr - DSP_BASE] = data; |
315 | break; | 322 | break; |
323 | } | ||
316 | case DSP_CONTROL: | 324 | case DSP_CONTROL: |
317 | if (!cpu_has_dsp) { | 325 | if (!cpu_has_dsp) { |
318 | ret = -EIO; | 326 | ret = -EIO; |
diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c index 5e37df3111ad..621037db2290 100644 --- a/arch/mips/kernel/reset.c +++ b/arch/mips/kernel/reset.c | |||
@@ -3,17 +3,16 @@ | |||
3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * Copyright (C) 2001 by Ralf Baechle | 6 | * Copyright (C) 2001, 06 by Ralf Baechle (ralf@linux-mips.org) |
7 | * Copyright (C) 2001 MIPS Technologies, Inc. | 7 | * Copyright (C) 2001 MIPS Technologies, Inc. |
8 | */ | 8 | */ |
9 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/pm.h> | ||
11 | #include <linux/types.h> | 12 | #include <linux/types.h> |
12 | #include <linux/reboot.h> | 13 | #include <linux/reboot.h> |
13 | #include <asm/reboot.h> | ||
14 | 14 | ||
15 | void (*pm_power_off)(void); | 15 | #include <asm/reboot.h> |
16 | EXPORT_SYMBOL(pm_power_off); | ||
17 | 16 | ||
18 | /* | 17 | /* |
19 | * Urgs ... Too many MIPS machines to handle this in a generic way. | 18 | * Urgs ... Too many MIPS machines to handle this in a generic way. |
@@ -22,23 +21,22 @@ EXPORT_SYMBOL(pm_power_off); | |||
22 | */ | 21 | */ |
23 | void (*_machine_restart)(char *command); | 22 | void (*_machine_restart)(char *command); |
24 | void (*_machine_halt)(void); | 23 | void (*_machine_halt)(void); |
25 | void (*_machine_power_off)(void); | 24 | void (*pm_power_off)(void); |
26 | 25 | ||
27 | void machine_restart(char *command) | 26 | void machine_restart(char *command) |
28 | { | 27 | { |
29 | _machine_restart(command); | 28 | if (_machine_restart) |
29 | _machine_restart(command); | ||
30 | } | 30 | } |
31 | 31 | ||
32 | void machine_halt(void) | 32 | void machine_halt(void) |
33 | { | 33 | { |
34 | _machine_halt(); | 34 | if (_machine_halt) |
35 | _machine_halt(); | ||
35 | } | 36 | } |
36 | 37 | ||
37 | void machine_power_off(void) | 38 | void machine_power_off(void) |
38 | { | 39 | { |
39 | if (pm_power_off) | 40 | if (pm_power_off) |
40 | pm_power_off(); | 41 | pm_power_off(); |
41 | |||
42 | _machine_power_off(); | ||
43 | } | 42 | } |
44 | |||
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index 1d855112bac2..986a9cf23067 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | 2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. |
3 | * Copyright (C) 2005, 06 Ralf Baechle (ralf@linux-mips.org) | ||
3 | * | 4 | * |
4 | * This program is free software; you can distribute it and/or modify it | 5 | * This program is free software; you can distribute it and/or modify it |
5 | * under the terms of the GNU General Public License (Version 2) as | 6 | * under the terms of the GNU General Public License (Version 2) as |
@@ -20,9 +21,12 @@ | |||
20 | #include <linux/module.h> | 21 | #include <linux/module.h> |
21 | #include <linux/fs.h> | 22 | #include <linux/fs.h> |
22 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/irq.h> | ||
23 | #include <linux/poll.h> | 26 | #include <linux/poll.h> |
24 | #include <linux/sched.h> | 27 | #include <linux/sched.h> |
25 | #include <linux/wait.h> | 28 | #include <linux/wait.h> |
29 | |||
26 | #include <asm/mipsmtregs.h> | 30 | #include <asm/mipsmtregs.h> |
27 | #include <asm/bitops.h> | 31 | #include <asm/bitops.h> |
28 | #include <asm/cpu.h> | 32 | #include <asm/cpu.h> |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index a42e0e8caa7b..d7c4a38ed5ae 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
@@ -617,6 +617,23 @@ einval: li v0, -EINVAL | |||
617 | sys sys_inotify_init 0 | 617 | sys sys_inotify_init 0 |
618 | sys sys_inotify_add_watch 3 /* 4285 */ | 618 | sys sys_inotify_add_watch 3 /* 4285 */ |
619 | sys sys_inotify_rm_watch 2 | 619 | sys sys_inotify_rm_watch 2 |
620 | sys sys_migrate_pages 4 | ||
621 | sys sys_openat 4 | ||
622 | sys sys_mkdirat 3 | ||
623 | sys sys_mknodat 4 /* 4290 */ | ||
624 | sys sys_fchownat 5 | ||
625 | sys sys_futimesat 3 | ||
626 | sys sys_newfstatat 4 | ||
627 | sys sys_unlinkat 3 | ||
628 | sys sys_renameat 4 /* 4295 */ | ||
629 | sys sys_linkat 4 | ||
630 | sys sys_symlinkat 3 | ||
631 | sys sys_readlinkat 4 | ||
632 | sys sys_fchmodat 3 | ||
633 | sys sys_faccessat 3 /* 4300 */ | ||
634 | sys sys_pselect6 6 | ||
635 | sys sys_ppoll 5 | ||
636 | sys sys_unshare 1 | ||
620 | .endm | 637 | .endm |
621 | 638 | ||
622 | /* We pre-compute the number of _instruction_ bytes needed to | 639 | /* We pre-compute the number of _instruction_ bytes needed to |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 47bfbd416709..98bf25df56f3 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -443,3 +443,20 @@ sys_call_table: | |||
443 | PTR sys_inotify_init | 443 | PTR sys_inotify_init |
444 | PTR sys_inotify_add_watch | 444 | PTR sys_inotify_add_watch |
445 | PTR sys_inotify_rm_watch /* 5245 */ | 445 | PTR sys_inotify_rm_watch /* 5245 */ |
446 | PTR sys_migrate_pages | ||
447 | PTR sys_openat | ||
448 | PTR sys_mkdirat | ||
449 | PTR sys_mknodat | ||
450 | PTR sys_fchownat /* 5250 */ | ||
451 | PTR sys_futimesat | ||
452 | PTR sys_newfstatat | ||
453 | PTR sys_unlinkat | ||
454 | PTR sys_renameat | ||
455 | PTR sys_linkat /* 5255 */ | ||
456 | PTR sys_symlinkat | ||
457 | PTR sys_readlinkat | ||
458 | PTR sys_fchmodat | ||
459 | PTR sys_faccessat | ||
460 | PTR sys_pselect6 /* 5260 */ | ||
461 | PTR sys_ppoll | ||
462 | PTR sys_unshare | ||
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index b465ced1758f..bc4980cefc8b 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -369,3 +369,20 @@ EXPORT(sysn32_call_table) | |||
369 | PTR sys_inotify_init | 369 | PTR sys_inotify_init |
370 | PTR sys_inotify_add_watch | 370 | PTR sys_inotify_add_watch |
371 | PTR sys_inotify_rm_watch | 371 | PTR sys_inotify_rm_watch |
372 | PTR sys_migrate_pages /* 6250 */ | ||
373 | PTR sys_openat | ||
374 | PTR sys_mkdirat | ||
375 | PTR sys_mknodat | ||
376 | PTR sys_fchownat | ||
377 | PTR sys_futimesat /* 6255 */ | ||
378 | PTR sys_newfstatat | ||
379 | PTR sys_unlinkat | ||
380 | PTR sys_renameat | ||
381 | PTR sys_linkat | ||
382 | PTR sys_symlinkat /* 6260 */ | ||
383 | PTR sys_readlinkat | ||
384 | PTR sys_fchmodat | ||
385 | PTR sys_faccessat | ||
386 | PTR sys_pselect6 | ||
387 | PTR sys_ppoll /* 6265 */ | ||
388 | PTR sys_unshare | ||
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 3d338ca7eeeb..5b0414018c9a 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -491,4 +491,21 @@ sys_call_table: | |||
491 | PTR sys_inotify_init | 491 | PTR sys_inotify_init |
492 | PTR sys_inotify_add_watch /* 4285 */ | 492 | PTR sys_inotify_add_watch /* 4285 */ |
493 | PTR sys_inotify_rm_watch | 493 | PTR sys_inotify_rm_watch |
494 | PTR sys_migrate_pages | ||
495 | PTR compat_sys_openat | ||
496 | PTR sys_mkdirat | ||
497 | PTR sys_mknodat /* 4290 */ | ||
498 | PTR sys_fchownat | ||
499 | PTR compat_sys_futimesat | ||
500 | PTR compat_sys_newfstatat | ||
501 | PTR sys_unlinkat | ||
502 | PTR sys_renameat /* 4295 */ | ||
503 | PTR sys_linkat | ||
504 | PTR sys_symlinkat | ||
505 | PTR sys_readlinkat | ||
506 | PTR sys_fchmodat | ||
507 | PTR sys_faccessat /* 4300 */ | ||
508 | PTR sys_pselect6 | ||
509 | PTR sys_ppoll | ||
510 | PTR sys_unshare | ||
494 | .size sys_call_table,.-sys_call_table | 511 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/signal-common.h b/arch/mips/kernel/signal-common.h index 0f66ae5838b9..0fbc492d24b4 100644 --- a/arch/mips/kernel/signal-common.h +++ b/arch/mips/kernel/signal-common.h | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/config.h> | 11 | #include <linux/config.h> |
12 | 12 | ||
13 | static inline int | 13 | static inline int |
14 | setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc) | 14 | setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) |
15 | { | 15 | { |
16 | int err = 0; | 16 | int err = 0; |
17 | 17 | ||
@@ -82,7 +82,7 @@ out: | |||
82 | } | 82 | } |
83 | 83 | ||
84 | static inline int | 84 | static inline int |
85 | restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) | 85 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) |
86 | { | 86 | { |
87 | unsigned int used_math; | 87 | unsigned int used_math; |
88 | unsigned long treg; | 88 | unsigned long treg; |
@@ -157,7 +157,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) | |||
157 | /* | 157 | /* |
158 | * Determine which stack to use.. | 158 | * Determine which stack to use.. |
159 | */ | 159 | */ |
160 | static inline void * | 160 | static inline void __user * |
161 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) | 161 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) |
162 | { | 162 | { |
163 | unsigned long sp; | 163 | unsigned long sp; |
@@ -176,7 +176,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size) | |||
176 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) | 176 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) |
177 | sp = current->sas_ss_sp + current->sas_ss_size; | 177 | sp = current->sas_ss_sp + current->sas_ss_size; |
178 | 178 | ||
179 | return (void *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK)); | 179 | return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? 32 : ALMASK)); |
180 | } | 180 | } |
181 | 181 | ||
182 | static inline int install_sigtramp(unsigned int __user *tramp, | 182 | static inline int install_sigtramp(unsigned int __user *tramp, |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 7d1800fe7038..c974cc9b30eb 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
@@ -39,8 +39,6 @@ | |||
39 | 39 | ||
40 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 40 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
41 | 41 | ||
42 | int do_signal(sigset_t *oldset, struct pt_regs *regs); | ||
43 | |||
44 | /* | 42 | /* |
45 | * Atomically swap in the new signal mask, and wait for a signal. | 43 | * Atomically swap in the new signal mask, and wait for a signal. |
46 | */ | 44 | */ |
@@ -50,7 +48,7 @@ save_static_function(sys_sigsuspend); | |||
50 | __attribute_used__ noinline static int | 48 | __attribute_used__ noinline static int |
51 | _sys_sigsuspend(nabi_no_regargs struct pt_regs regs) | 49 | _sys_sigsuspend(nabi_no_regargs struct pt_regs regs) |
52 | { | 50 | { |
53 | sigset_t saveset, newset; | 51 | sigset_t newset; |
54 | sigset_t __user *uset; | 52 | sigset_t __user *uset; |
55 | 53 | ||
56 | uset = (sigset_t __user *) regs.regs[4]; | 54 | uset = (sigset_t __user *) regs.regs[4]; |
@@ -59,19 +57,15 @@ _sys_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
59 | sigdelsetmask(&newset, ~_BLOCKABLE); | 57 | sigdelsetmask(&newset, ~_BLOCKABLE); |
60 | 58 | ||
61 | spin_lock_irq(¤t->sighand->siglock); | 59 | spin_lock_irq(¤t->sighand->siglock); |
62 | saveset = current->blocked; | 60 | current->saved_sigmask = current->blocked; |
63 | current->blocked = newset; | 61 | current->blocked = newset; |
64 | recalc_sigpending(); | 62 | recalc_sigpending(); |
65 | spin_unlock_irq(¤t->sighand->siglock); | 63 | spin_unlock_irq(¤t->sighand->siglock); |
66 | 64 | ||
67 | regs.regs[2] = EINTR; | 65 | current->state = TASK_INTERRUPTIBLE; |
68 | regs.regs[7] = 1; | 66 | schedule(); |
69 | while (1) { | 67 | set_thread_flag(TIF_RESTORE_SIGMASK); |
70 | current->state = TASK_INTERRUPTIBLE; | 68 | return -ERESTARTNOHAND; |
71 | schedule(); | ||
72 | if (do_signal(&saveset, ®s)) | ||
73 | return -EINTR; | ||
74 | } | ||
75 | } | 69 | } |
76 | #endif | 70 | #endif |
77 | 71 | ||
@@ -79,7 +73,7 @@ save_static_function(sys_rt_sigsuspend); | |||
79 | __attribute_used__ noinline static int | 73 | __attribute_used__ noinline static int |
80 | _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | 74 | _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) |
81 | { | 75 | { |
82 | sigset_t saveset, newset; | 76 | sigset_t newset; |
83 | sigset_t __user *unewset; | 77 | sigset_t __user *unewset; |
84 | size_t sigsetsize; | 78 | size_t sigsetsize; |
85 | 79 | ||
@@ -94,19 +88,15 @@ _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | |||
94 | sigdelsetmask(&newset, ~_BLOCKABLE); | 88 | sigdelsetmask(&newset, ~_BLOCKABLE); |
95 | 89 | ||
96 | spin_lock_irq(¤t->sighand->siglock); | 90 | spin_lock_irq(¤t->sighand->siglock); |
97 | saveset = current->blocked; | 91 | current->saved_sigmask = current->blocked; |
98 | current->blocked = newset; | 92 | current->blocked = newset; |
99 | recalc_sigpending(); | 93 | recalc_sigpending(); |
100 | spin_unlock_irq(¤t->sighand->siglock); | 94 | spin_unlock_irq(¤t->sighand->siglock); |
101 | 95 | ||
102 | regs.regs[2] = EINTR; | 96 | current->state = TASK_INTERRUPTIBLE; |
103 | regs.regs[7] = 1; | 97 | schedule(); |
104 | while (1) { | 98 | set_thread_flag(TIF_RESTORE_SIGMASK); |
105 | current->state = TASK_INTERRUPTIBLE; | 99 | return -ERESTARTNOHAND; |
106 | schedule(); | ||
107 | if (do_signal(&saveset, ®s)) | ||
108 | return -EINTR; | ||
109 | } | ||
110 | } | 100 | } |
111 | 101 | ||
112 | #ifdef CONFIG_TRAD_SIGNALS | 102 | #ifdef CONFIG_TRAD_SIGNALS |
@@ -199,10 +189,10 @@ save_static_function(sys_sigreturn); | |||
199 | __attribute_used__ noinline static void | 189 | __attribute_used__ noinline static void |
200 | _sys_sigreturn(nabi_no_regargs struct pt_regs regs) | 190 | _sys_sigreturn(nabi_no_regargs struct pt_regs regs) |
201 | { | 191 | { |
202 | struct sigframe *frame; | 192 | struct sigframe __user *frame; |
203 | sigset_t blocked; | 193 | sigset_t blocked; |
204 | 194 | ||
205 | frame = (struct sigframe *) regs.regs[29]; | 195 | frame = (struct sigframe __user *) regs.regs[29]; |
206 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 196 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
207 | goto badframe; | 197 | goto badframe; |
208 | if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) | 198 | if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) |
@@ -236,11 +226,11 @@ save_static_function(sys_rt_sigreturn); | |||
236 | __attribute_used__ noinline static void | 226 | __attribute_used__ noinline static void |
237 | _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 227 | _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
238 | { | 228 | { |
239 | struct rt_sigframe *frame; | 229 | struct rt_sigframe __user *frame; |
240 | sigset_t set; | 230 | sigset_t set; |
241 | stack_t st; | 231 | stack_t st; |
242 | 232 | ||
243 | frame = (struct rt_sigframe *) regs.regs[29]; | 233 | frame = (struct rt_sigframe __user *) regs.regs[29]; |
244 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 234 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
245 | goto badframe; | 235 | goto badframe; |
246 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) | 236 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) |
@@ -259,7 +249,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
259 | goto badframe; | 249 | goto badframe; |
260 | /* It is more difficult to avoid calling this function than to | 250 | /* It is more difficult to avoid calling this function than to |
261 | call it and ignore errors. */ | 251 | call it and ignore errors. */ |
262 | do_sigaltstack(&st, NULL, regs.regs[29]); | 252 | do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); |
263 | 253 | ||
264 | /* | 254 | /* |
265 | * Don't let your children do this ... | 255 | * Don't let your children do this ... |
@@ -279,7 +269,7 @@ badframe: | |||
279 | int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, | 269 | int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, |
280 | int signr, sigset_t *set) | 270 | int signr, sigset_t *set) |
281 | { | 271 | { |
282 | struct sigframe *frame; | 272 | struct sigframe __user *frame; |
283 | int err = 0; | 273 | int err = 0; |
284 | 274 | ||
285 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 275 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
@@ -315,18 +305,18 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, | |||
315 | current->comm, current->pid, | 305 | current->comm, current->pid, |
316 | frame, regs->cp0_epc, frame->regs[31]); | 306 | frame, regs->cp0_epc, frame->regs[31]); |
317 | #endif | 307 | #endif |
318 | return 1; | 308 | return 0; |
319 | 309 | ||
320 | give_sigsegv: | 310 | give_sigsegv: |
321 | force_sigsegv(signr, current); | 311 | force_sigsegv(signr, current); |
322 | return 0; | 312 | return -EFAULT; |
323 | } | 313 | } |
324 | #endif | 314 | #endif |
325 | 315 | ||
326 | int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | 316 | int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, |
327 | int signr, sigset_t *set, siginfo_t *info) | 317 | int signr, sigset_t *set, siginfo_t *info) |
328 | { | 318 | { |
329 | struct rt_sigframe *frame; | 319 | struct rt_sigframe __user *frame; |
330 | int err = 0; | 320 | int err = 0; |
331 | 321 | ||
332 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 322 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
@@ -340,7 +330,7 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | |||
340 | 330 | ||
341 | /* Create the ucontext. */ | 331 | /* Create the ucontext. */ |
342 | err |= __put_user(0, &frame->rs_uc.uc_flags); | 332 | err |= __put_user(0, &frame->rs_uc.uc_flags); |
343 | err |= __put_user(0, &frame->rs_uc.uc_link); | 333 | err |= __put_user(NULL, &frame->rs_uc.uc_link); |
344 | err |= __put_user((void *)current->sas_ss_sp, | 334 | err |= __put_user((void *)current->sas_ss_sp, |
345 | &frame->rs_uc.uc_stack.ss_sp); | 335 | &frame->rs_uc.uc_stack.ss_sp); |
346 | err |= __put_user(sas_ss_flags(regs->regs[29]), | 336 | err |= __put_user(sas_ss_flags(regs->regs[29]), |
@@ -375,11 +365,11 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | |||
375 | current->comm, current->pid, | 365 | current->comm, current->pid, |
376 | frame, regs->cp0_epc, regs->regs[31]); | 366 | frame, regs->cp0_epc, regs->regs[31]); |
377 | #endif | 367 | #endif |
378 | return 1; | 368 | return 0; |
379 | 369 | ||
380 | give_sigsegv: | 370 | give_sigsegv: |
381 | force_sigsegv(signr, current); | 371 | force_sigsegv(signr, current); |
382 | return 0; | 372 | return -EFAULT; |
383 | } | 373 | } |
384 | 374 | ||
385 | static inline int handle_signal(unsigned long sig, siginfo_t *info, | 375 | static inline int handle_signal(unsigned long sig, siginfo_t *info, |
@@ -393,7 +383,7 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info, | |||
393 | regs->regs[2] = EINTR; | 383 | regs->regs[2] = EINTR; |
394 | break; | 384 | break; |
395 | case ERESTARTSYS: | 385 | case ERESTARTSYS: |
396 | if(!(ka->sa.sa_flags & SA_RESTART)) { | 386 | if (!(ka->sa.sa_flags & SA_RESTART)) { |
397 | regs->regs[2] = EINTR; | 387 | regs->regs[2] = EINTR; |
398 | break; | 388 | break; |
399 | } | 389 | } |
@@ -420,9 +410,10 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info, | |||
420 | return ret; | 410 | return ret; |
421 | } | 411 | } |
422 | 412 | ||
423 | int do_signal(sigset_t *oldset, struct pt_regs *regs) | 413 | void do_signal(struct pt_regs *regs) |
424 | { | 414 | { |
425 | struct k_sigaction ka; | 415 | struct k_sigaction ka; |
416 | sigset_t *oldset; | ||
426 | siginfo_t info; | 417 | siginfo_t info; |
427 | int signr; | 418 | int signr; |
428 | 419 | ||
@@ -432,17 +423,31 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) | |||
432 | * if so. | 423 | * if so. |
433 | */ | 424 | */ |
434 | if (!user_mode(regs)) | 425 | if (!user_mode(regs)) |
435 | return 1; | 426 | return; |
436 | 427 | ||
437 | if (try_to_freeze()) | 428 | if (try_to_freeze()) |
438 | goto no_signal; | 429 | goto no_signal; |
439 | 430 | ||
440 | if (!oldset) | 431 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) |
432 | oldset = ¤t->saved_sigmask; | ||
433 | else | ||
441 | oldset = ¤t->blocked; | 434 | oldset = ¤t->blocked; |
442 | 435 | ||
436 | |||
443 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 437 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); |
444 | if (signr > 0) | 438 | if (signr > 0) { |
445 | return handle_signal(signr, &info, &ka, oldset, regs); | 439 | /* Whee! Actually deliver the signal. */ |
440 | if (handle_signal(signr, &info, &ka, oldset, regs) == 0) { | ||
441 | /* | ||
442 | * A signal was successfully delivered; the saved | ||
443 | * sigmask will have been stored in the signal frame, | ||
444 | * and will be restored by sigreturn, so we can simply | ||
445 | * clear the TIF_RESTORE_SIGMASK flag. | ||
446 | */ | ||
447 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) | ||
448 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
449 | } | ||
450 | } | ||
446 | 451 | ||
447 | no_signal: | 452 | no_signal: |
448 | /* | 453 | /* |
@@ -463,18 +468,25 @@ no_signal: | |||
463 | regs->cp0_epc -= 4; | 468 | regs->cp0_epc -= 4; |
464 | } | 469 | } |
465 | } | 470 | } |
466 | return 0; | 471 | |
472 | /* | ||
473 | * If there's no signal to deliver, we just put the saved sigmask | ||
474 | * back | ||
475 | */ | ||
476 | if (test_thread_flag(TIF_RESTORE_SIGMASK)) { | ||
477 | clear_thread_flag(TIF_RESTORE_SIGMASK); | ||
478 | sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); | ||
479 | } | ||
467 | } | 480 | } |
468 | 481 | ||
469 | /* | 482 | /* |
470 | * notification of userspace execution resumption | 483 | * notification of userspace execution resumption |
471 | * - triggered by current->work.notify_resume | 484 | * - triggered by the TIF_WORK_MASK flags |
472 | */ | 485 | */ |
473 | asmlinkage void do_notify_resume(struct pt_regs *regs, sigset_t *oldset, | 486 | asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused, |
474 | __u32 thread_info_flags) | 487 | __u32 thread_info_flags) |
475 | { | 488 | { |
476 | /* deal with pending signal delivery */ | 489 | /* deal with pending signal delivery */ |
477 | if (thread_info_flags & _TIF_SIGPENDING) { | 490 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
478 | current->thread.abi->do_signal(oldset, regs); | 491 | current->thread.abi->do_signal(regs); |
479 | } | ||
480 | } | 492 | } |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 98b185bbc947..da3271e1fdac 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -144,7 +144,7 @@ struct ucontext32 { | |||
144 | extern void __put_sigset_unknown_nsig(void); | 144 | extern void __put_sigset_unknown_nsig(void); |
145 | extern void __get_sigset_unknown_nsig(void); | 145 | extern void __get_sigset_unknown_nsig(void); |
146 | 146 | ||
147 | static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf) | 147 | static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf) |
148 | { | 148 | { |
149 | int err = 0; | 149 | int err = 0; |
150 | 150 | ||
@@ -269,7 +269,7 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, | |||
269 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) | 269 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) |
270 | return -EFAULT; | 270 | return -EFAULT; |
271 | err |= __get_user(handler, &act->sa_handler); | 271 | err |= __get_user(handler, &act->sa_handler); |
272 | new_ka.sa.sa_handler = (void*)(s64)handler; | 272 | new_ka.sa.sa_handler = (void __user *)(s64)handler; |
273 | err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | 273 | err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); |
274 | err |= __get_user(mask, &act->sa_mask.sig[0]); | 274 | err |= __get_user(mask, &act->sa_mask.sig[0]); |
275 | if (err) | 275 | if (err) |
@@ -299,8 +299,8 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, | |||
299 | 299 | ||
300 | asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) | 300 | asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) |
301 | { | 301 | { |
302 | const stack32_t *uss = (const stack32_t *) regs.regs[4]; | 302 | const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4]; |
303 | stack32_t *uoss = (stack32_t *) regs.regs[5]; | 303 | stack32_t __user *uoss = (stack32_t __user *) regs.regs[5]; |
304 | unsigned long usp = regs.regs[29]; | 304 | unsigned long usp = regs.regs[29]; |
305 | stack_t kss, koss; | 305 | stack_t kss, koss; |
306 | int ret, err = 0; | 306 | int ret, err = 0; |
@@ -319,7 +319,8 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) | |||
319 | } | 319 | } |
320 | 320 | ||
321 | set_fs (KERNEL_DS); | 321 | set_fs (KERNEL_DS); |
322 | ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp); | 322 | ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL, |
323 | uoss ? (stack_t __user *)&koss : NULL, usp); | ||
323 | set_fs (old_fs); | 324 | set_fs (old_fs); |
324 | 325 | ||
325 | if (!ret && uoss) { | 326 | if (!ret && uoss) { |
@@ -335,7 +336,7 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) | |||
335 | return ret; | 336 | return ret; |
336 | } | 337 | } |
337 | 338 | ||
338 | static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 *sc) | 339 | static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 __user *sc) |
339 | { | 340 | { |
340 | u32 used_math; | 341 | u32 used_math; |
341 | int err = 0; | 342 | int err = 0; |
@@ -420,7 +421,7 @@ struct rt_sigframe32 { | |||
420 | #endif | 421 | #endif |
421 | }; | 422 | }; |
422 | 423 | ||
423 | int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from) | 424 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) |
424 | { | 425 | { |
425 | int err; | 426 | int err; |
426 | 427 | ||
@@ -455,7 +456,7 @@ int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from) | |||
455 | err |= __put_user(from->si_uid, &to->si_uid); | 456 | err |= __put_user(from->si_uid, &to->si_uid); |
456 | break; | 457 | break; |
457 | case __SI_FAULT >> 16: | 458 | case __SI_FAULT >> 16: |
458 | err |= __put_user((long)from->si_addr, &to->si_addr); | 459 | err |= __put_user((unsigned long)from->si_addr, &to->si_addr); |
459 | break; | 460 | break; |
460 | case __SI_POLL >> 16: | 461 | case __SI_POLL >> 16: |
461 | err |= __put_user(from->si_band, &to->si_band); | 462 | err |= __put_user(from->si_band, &to->si_band); |
@@ -476,10 +477,10 @@ save_static_function(sys32_sigreturn); | |||
476 | __attribute_used__ noinline static void | 477 | __attribute_used__ noinline static void |
477 | _sys32_sigreturn(nabi_no_regargs struct pt_regs regs) | 478 | _sys32_sigreturn(nabi_no_regargs struct pt_regs regs) |
478 | { | 479 | { |
479 | struct sigframe *frame; | 480 | struct sigframe __user *frame; |
480 | sigset_t blocked; | 481 | sigset_t blocked; |
481 | 482 | ||
482 | frame = (struct sigframe *) regs.regs[29]; | 483 | frame = (struct sigframe __user *) regs.regs[29]; |
483 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 484 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
484 | goto badframe; | 485 | goto badframe; |
485 | if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) | 486 | if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) |
@@ -512,13 +513,13 @@ save_static_function(sys32_rt_sigreturn); | |||
512 | __attribute_used__ noinline static void | 513 | __attribute_used__ noinline static void |
513 | _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 514 | _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
514 | { | 515 | { |
515 | struct rt_sigframe32 *frame; | 516 | struct rt_sigframe32 __user *frame; |
516 | mm_segment_t old_fs; | 517 | mm_segment_t old_fs; |
517 | sigset_t set; | 518 | sigset_t set; |
518 | stack_t st; | 519 | stack_t st; |
519 | s32 sp; | 520 | s32 sp; |
520 | 521 | ||
521 | frame = (struct rt_sigframe32 *) regs.regs[29]; | 522 | frame = (struct rt_sigframe32 __user *) regs.regs[29]; |
522 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 523 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
523 | goto badframe; | 524 | goto badframe; |
524 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) | 525 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) |
@@ -546,7 +547,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
546 | call it and ignore errors. */ | 547 | call it and ignore errors. */ |
547 | old_fs = get_fs(); | 548 | old_fs = get_fs(); |
548 | set_fs (KERNEL_DS); | 549 | set_fs (KERNEL_DS); |
549 | do_sigaltstack(&st, NULL, regs.regs[29]); | 550 | do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); |
550 | set_fs (old_fs); | 551 | set_fs (old_fs); |
551 | 552 | ||
552 | /* | 553 | /* |
@@ -564,7 +565,7 @@ badframe: | |||
564 | } | 565 | } |
565 | 566 | ||
566 | static inline int setup_sigcontext32(struct pt_regs *regs, | 567 | static inline int setup_sigcontext32(struct pt_regs *regs, |
567 | struct sigcontext32 *sc) | 568 | struct sigcontext32 __user *sc) |
568 | { | 569 | { |
569 | int err = 0; | 570 | int err = 0; |
570 | 571 | ||
@@ -623,8 +624,9 @@ out: | |||
623 | /* | 624 | /* |
624 | * Determine which stack to use.. | 625 | * Determine which stack to use.. |
625 | */ | 626 | */ |
626 | static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | 627 | static inline void __user *get_sigframe(struct k_sigaction *ka, |
627 | size_t frame_size) | 628 | struct pt_regs *regs, |
629 | size_t frame_size) | ||
628 | { | 630 | { |
629 | unsigned long sp; | 631 | unsigned long sp; |
630 | 632 | ||
@@ -642,13 +644,13 @@ static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
642 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) | 644 | if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0)) |
643 | sp = current->sas_ss_sp + current->sas_ss_size; | 645 | sp = current->sas_ss_sp + current->sas_ss_size; |
644 | 646 | ||
645 | return (void *)((sp - frame_size) & ALMASK); | 647 | return (void __user *)((sp - frame_size) & ALMASK); |
646 | } | 648 | } |
647 | 649 | ||
648 | int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | 650 | int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, |
649 | int signr, sigset_t *set) | 651 | int signr, sigset_t *set) |
650 | { | 652 | { |
651 | struct sigframe *frame; | 653 | struct sigframe __user *frame; |
652 | int err = 0; | 654 | int err = 0; |
653 | 655 | ||
654 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 656 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
@@ -692,17 +694,17 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | |||
692 | current->comm, current->pid, | 694 | current->comm, current->pid, |
693 | frame, regs->cp0_epc, frame->sf_code); | 695 | frame, regs->cp0_epc, frame->sf_code); |
694 | #endif | 696 | #endif |
695 | return 1; | 697 | return 0; |
696 | 698 | ||
697 | give_sigsegv: | 699 | give_sigsegv: |
698 | force_sigsegv(signr, current); | 700 | force_sigsegv(signr, current); |
699 | return 0; | 701 | return -EFAULT; |
700 | } | 702 | } |
701 | 703 | ||
702 | int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | 704 | int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, |
703 | int signr, sigset_t *set, siginfo_t *info) | 705 | int signr, sigset_t *set, siginfo_t *info) |
704 | { | 706 | { |
705 | struct rt_sigframe32 *frame; | 707 | struct rt_sigframe32 __user *frame; |
706 | int err = 0; | 708 | int err = 0; |
707 | s32 sp; | 709 | s32 sp; |
708 | 710 | ||
@@ -763,11 +765,11 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | |||
763 | current->comm, current->pid, | 765 | current->comm, current->pid, |
764 | frame, regs->cp0_epc, frame->rs_code); | 766 | frame, regs->cp0_epc, frame->rs_code); |
765 | #endif | 767 | #endif |
766 | return 1; | 768 | return 0; |
767 | 769 | ||
768 | give_sigsegv: | 770 | give_sigsegv: |
769 | force_sigsegv(signr, current); | 771 | force_sigsegv(signr, current); |
770 | return 0; | 772 | return -EFAULT; |
771 | } | 773 | } |
772 | 774 | ||
773 | static inline int handle_signal(unsigned long sig, siginfo_t *info, | 775 | static inline int handle_signal(unsigned long sig, siginfo_t *info, |
@@ -855,7 +857,7 @@ no_signal: | |||
855 | } | 857 | } |
856 | 858 | ||
857 | asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, | 859 | asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, |
858 | struct sigaction32 *oact, | 860 | struct sigaction32 __user *oact, |
859 | unsigned int sigsetsize) | 861 | unsigned int sigsetsize) |
860 | { | 862 | { |
861 | struct k_sigaction new_sa, old_sa; | 863 | struct k_sigaction new_sa, old_sa; |
@@ -872,7 +874,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, | |||
872 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) | 874 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) |
873 | return -EFAULT; | 875 | return -EFAULT; |
874 | err |= __get_user(handler, &act->sa_handler); | 876 | err |= __get_user(handler, &act->sa_handler); |
875 | new_sa.sa.sa_handler = (void*)(s64)handler; | 877 | new_sa.sa.sa_handler = (void __user *)(s64)handler; |
876 | err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags); | 878 | err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags); |
877 | err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask); | 879 | err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask); |
878 | if (err) | 880 | if (err) |
@@ -899,7 +901,7 @@ out: | |||
899 | } | 901 | } |
900 | 902 | ||
901 | asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, | 903 | asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, |
902 | compat_sigset_t *oset, unsigned int sigsetsize) | 904 | compat_sigset_t __user *oset, unsigned int sigsetsize) |
903 | { | 905 | { |
904 | sigset_t old_set, new_set; | 906 | sigset_t old_set, new_set; |
905 | int ret; | 907 | int ret; |
@@ -909,8 +911,9 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, | |||
909 | return -EFAULT; | 911 | return -EFAULT; |
910 | 912 | ||
911 | set_fs (KERNEL_DS); | 913 | set_fs (KERNEL_DS); |
912 | ret = sys_rt_sigprocmask(how, set ? &new_set : NULL, | 914 | ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL, |
913 | oset ? &old_set : NULL, sigsetsize); | 915 | oset ? (sigset_t __user *)&old_set : NULL, |
916 | sigsetsize); | ||
914 | set_fs (old_fs); | 917 | set_fs (old_fs); |
915 | 918 | ||
916 | if (!ret && oset && put_sigset(&old_set, oset)) | 919 | if (!ret && oset && put_sigset(&old_set, oset)) |
@@ -919,7 +922,7 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, | |||
919 | return ret; | 922 | return ret; |
920 | } | 923 | } |
921 | 924 | ||
922 | asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, | 925 | asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset, |
923 | unsigned int sigsetsize) | 926 | unsigned int sigsetsize) |
924 | { | 927 | { |
925 | int ret; | 928 | int ret; |
@@ -927,7 +930,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, | |||
927 | mm_segment_t old_fs = get_fs(); | 930 | mm_segment_t old_fs = get_fs(); |
928 | 931 | ||
929 | set_fs (KERNEL_DS); | 932 | set_fs (KERNEL_DS); |
930 | ret = sys_rt_sigpending(&set, sigsetsize); | 933 | ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize); |
931 | set_fs (old_fs); | 934 | set_fs (old_fs); |
932 | 935 | ||
933 | if (!ret && put_sigset(&set, uset)) | 936 | if (!ret && put_sigset(&set, uset)) |
@@ -936,7 +939,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, | |||
936 | return ret; | 939 | return ret; |
937 | } | 940 | } |
938 | 941 | ||
939 | asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo) | 942 | asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo) |
940 | { | 943 | { |
941 | siginfo_t info; | 944 | siginfo_t info; |
942 | int ret; | 945 | int ret; |
@@ -946,7 +949,7 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo) | |||
946 | copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE)) | 949 | copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE)) |
947 | return -EFAULT; | 950 | return -EFAULT; |
948 | set_fs (KERNEL_DS); | 951 | set_fs (KERNEL_DS); |
949 | ret = sys_rt_sigqueueinfo(pid, sig, &info); | 952 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info); |
950 | set_fs (old_fs); | 953 | set_fs (old_fs); |
951 | return ret; | 954 | return ret; |
952 | } | 955 | } |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index ec61b2670ba6..384fc4a639a4 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -48,6 +48,8 @@ | |||
48 | #define __NR_N32_rt_sigreturn 6211 | 48 | #define __NR_N32_rt_sigreturn 6211 |
49 | #define __NR_N32_restart_syscall 6214 | 49 | #define __NR_N32_restart_syscall 6214 |
50 | 50 | ||
51 | #define DEBUG_SIG 0 | ||
52 | |||
51 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 53 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) |
52 | 54 | ||
53 | /* IRIX compatible stack_t */ | 55 | /* IRIX compatible stack_t */ |
@@ -83,12 +85,12 @@ save_static_function(sysn32_rt_sigreturn); | |||
83 | __attribute_used__ noinline static void | 85 | __attribute_used__ noinline static void |
84 | _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 86 | _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
85 | { | 87 | { |
86 | struct rt_sigframe_n32 *frame; | 88 | struct rt_sigframe_n32 __user *frame; |
87 | sigset_t set; | 89 | sigset_t set; |
88 | stack_t st; | 90 | stack_t st; |
89 | s32 sp; | 91 | s32 sp; |
90 | 92 | ||
91 | frame = (struct rt_sigframe_n32 *) regs.regs[29]; | 93 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; |
92 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 94 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
93 | goto badframe; | 95 | goto badframe; |
94 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) | 96 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) |
@@ -114,7 +116,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
114 | 116 | ||
115 | /* It is more difficult to avoid calling this function than to | 117 | /* It is more difficult to avoid calling this function than to |
116 | call it and ignore errors. */ | 118 | call it and ignore errors. */ |
117 | do_sigaltstack(&st, NULL, regs.regs[29]); | 119 | do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); |
118 | 120 | ||
119 | /* | 121 | /* |
120 | * Don't let your children do this ... | 122 | * Don't let your children do this ... |
@@ -133,7 +135,7 @@ badframe: | |||
133 | int setup_rt_frame_n32(struct k_sigaction * ka, | 135 | int setup_rt_frame_n32(struct k_sigaction * ka, |
134 | struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info) | 136 | struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info) |
135 | { | 137 | { |
136 | struct rt_sigframe_n32 *frame; | 138 | struct rt_sigframe_n32 __user *frame; |
137 | int err = 0; | 139 | int err = 0; |
138 | s32 sp; | 140 | s32 sp; |
139 | 141 | ||
@@ -184,9 +186,9 @@ int setup_rt_frame_n32(struct k_sigaction * ka, | |||
184 | current->comm, current->pid, | 186 | current->comm, current->pid, |
185 | frame, regs->cp0_epc, regs->regs[31]); | 187 | frame, regs->cp0_epc, regs->regs[31]); |
186 | #endif | 188 | #endif |
187 | return 1; | 189 | return 0; |
188 | 190 | ||
189 | give_sigsegv: | 191 | give_sigsegv: |
190 | force_sigsegv(signr, current); | 192 | force_sigsegv(signr, current); |
191 | return 0; | 193 | return -EFAULT; |
192 | } | 194 | } |
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 332358430ff5..1da2eeb3ef9e 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c | |||
@@ -212,12 +212,12 @@ asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs) | |||
212 | int error; | 212 | int error; |
213 | char * filename; | 213 | char * filename; |
214 | 214 | ||
215 | filename = getname((char *) (long)regs.regs[4]); | 215 | filename = getname((char __user *) (long)regs.regs[4]); |
216 | error = PTR_ERR(filename); | 216 | error = PTR_ERR(filename); |
217 | if (IS_ERR(filename)) | 217 | if (IS_ERR(filename)) |
218 | goto out; | 218 | goto out; |
219 | error = do_execve(filename, (char **) (long)regs.regs[5], | 219 | error = do_execve(filename, (char __user *__user *) (long)regs.regs[5], |
220 | (char **) (long)regs.regs[6], ®s); | 220 | (char __user *__user *) (long)regs.regs[6], ®s); |
221 | putname(filename); | 221 | putname(filename); |
222 | 222 | ||
223 | out: | 223 | out: |
@@ -227,7 +227,7 @@ out: | |||
227 | /* | 227 | /* |
228 | * Compacrapability ... | 228 | * Compacrapability ... |
229 | */ | 229 | */ |
230 | asmlinkage int sys_uname(struct old_utsname * name) | 230 | asmlinkage int sys_uname(struct old_utsname __user * name) |
231 | { | 231 | { |
232 | if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) | 232 | if (name && !copy_to_user(name, &system_utsname, sizeof (*name))) |
233 | return 0; | 233 | return 0; |
@@ -237,7 +237,7 @@ asmlinkage int sys_uname(struct old_utsname * name) | |||
237 | /* | 237 | /* |
238 | * Compacrapability ... | 238 | * Compacrapability ... |
239 | */ | 239 | */ |
240 | asmlinkage int sys_olduname(struct oldold_utsname * name) | 240 | asmlinkage int sys_olduname(struct oldold_utsname __user * name) |
241 | { | 241 | { |
242 | int error; | 242 | int error; |
243 | 243 | ||
@@ -274,7 +274,7 @@ void sys_set_thread_area(unsigned long addr) | |||
274 | asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) | 274 | asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) |
275 | { | 275 | { |
276 | int tmp, len; | 276 | int tmp, len; |
277 | char *name; | 277 | char __user *name; |
278 | 278 | ||
279 | switch(cmd) { | 279 | switch(cmd) { |
280 | case SETNAME: { | 280 | case SETNAME: { |
@@ -283,7 +283,7 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) | |||
283 | if (!capable(CAP_SYS_ADMIN)) | 283 | if (!capable(CAP_SYS_ADMIN)) |
284 | return -EPERM; | 284 | return -EPERM; |
285 | 285 | ||
286 | name = (char *) arg1; | 286 | name = (char __user *) arg1; |
287 | 287 | ||
288 | len = strncpy_from_user(nodename, name, __NEW_UTS_LEN); | 288 | len = strncpy_from_user(nodename, name, __NEW_UTS_LEN); |
289 | if (len < 0) | 289 | if (len < 0) |
@@ -324,7 +324,7 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) | |||
324 | * This is really horribly ugly. | 324 | * This is really horribly ugly. |
325 | */ | 325 | */ |
326 | asmlinkage int sys_ipc (uint call, int first, int second, | 326 | asmlinkage int sys_ipc (uint call, int first, int second, |
327 | unsigned long third, void *ptr, long fifth) | 327 | unsigned long third, void __user *ptr, long fifth) |
328 | { | 328 | { |
329 | int version, ret; | 329 | int version, ret; |
330 | 330 | ||
@@ -333,24 +333,25 @@ asmlinkage int sys_ipc (uint call, int first, int second, | |||
333 | 333 | ||
334 | switch (call) { | 334 | switch (call) { |
335 | case SEMOP: | 335 | case SEMOP: |
336 | return sys_semtimedop (first, (struct sembuf *)ptr, second, | 336 | return sys_semtimedop (first, (struct sembuf __user *)ptr, |
337 | NULL); | 337 | second, NULL); |
338 | case SEMTIMEDOP: | 338 | case SEMTIMEDOP: |
339 | return sys_semtimedop (first, (struct sembuf *)ptr, second, | 339 | return sys_semtimedop (first, (struct sembuf __user *)ptr, |
340 | (const struct timespec __user *)fifth); | 340 | second, |
341 | (const struct timespec __user *)fifth); | ||
341 | case SEMGET: | 342 | case SEMGET: |
342 | return sys_semget (first, second, third); | 343 | return sys_semget (first, second, third); |
343 | case SEMCTL: { | 344 | case SEMCTL: { |
344 | union semun fourth; | 345 | union semun fourth; |
345 | if (!ptr) | 346 | if (!ptr) |
346 | return -EINVAL; | 347 | return -EINVAL; |
347 | if (get_user(fourth.__pad, (void **) ptr)) | 348 | if (get_user(fourth.__pad, (void *__user *) ptr)) |
348 | return -EFAULT; | 349 | return -EFAULT; |
349 | return sys_semctl (first, second, third, fourth); | 350 | return sys_semctl (first, second, third, fourth); |
350 | } | 351 | } |
351 | 352 | ||
352 | case MSGSND: | 353 | case MSGSND: |
353 | return sys_msgsnd (first, (struct msgbuf *) ptr, | 354 | return sys_msgsnd (first, (struct msgbuf __user *) ptr, |
354 | second, third); | 355 | second, third); |
355 | case MSGRCV: | 356 | case MSGRCV: |
356 | switch (version) { | 357 | switch (version) { |
@@ -360,7 +361,7 @@ asmlinkage int sys_ipc (uint call, int first, int second, | |||
360 | return -EINVAL; | 361 | return -EINVAL; |
361 | 362 | ||
362 | if (copy_from_user(&tmp, | 363 | if (copy_from_user(&tmp, |
363 | (struct ipc_kludge *) ptr, | 364 | (struct ipc_kludge __user *) ptr, |
364 | sizeof (tmp))) | 365 | sizeof (tmp))) |
365 | return -EFAULT; | 366 | return -EFAULT; |
366 | return sys_msgrcv (first, tmp.msgp, second, | 367 | return sys_msgrcv (first, tmp.msgp, second, |
@@ -368,35 +369,38 @@ asmlinkage int sys_ipc (uint call, int first, int second, | |||
368 | } | 369 | } |
369 | default: | 370 | default: |
370 | return sys_msgrcv (first, | 371 | return sys_msgrcv (first, |
371 | (struct msgbuf *) ptr, | 372 | (struct msgbuf __user *) ptr, |
372 | second, fifth, third); | 373 | second, fifth, third); |
373 | } | 374 | } |
374 | case MSGGET: | 375 | case MSGGET: |
375 | return sys_msgget ((key_t) first, second); | 376 | return sys_msgget ((key_t) first, second); |
376 | case MSGCTL: | 377 | case MSGCTL: |
377 | return sys_msgctl (first, second, (struct msqid_ds *) ptr); | 378 | return sys_msgctl (first, second, |
379 | (struct msqid_ds __user *) ptr); | ||
378 | 380 | ||
379 | case SHMAT: | 381 | case SHMAT: |
380 | switch (version) { | 382 | switch (version) { |
381 | default: { | 383 | default: { |
382 | ulong raddr; | 384 | ulong raddr; |
383 | ret = do_shmat (first, (char *) ptr, second, &raddr); | 385 | ret = do_shmat (first, (char __user *) ptr, second, |
386 | &raddr); | ||
384 | if (ret) | 387 | if (ret) |
385 | return ret; | 388 | return ret; |
386 | return put_user (raddr, (ulong *) third); | 389 | return put_user (raddr, (ulong __user *) third); |
387 | } | 390 | } |
388 | case 1: /* iBCS2 emulator entry point */ | 391 | case 1: /* iBCS2 emulator entry point */ |
389 | if (!segment_eq(get_fs(), get_ds())) | 392 | if (!segment_eq(get_fs(), get_ds())) |
390 | return -EINVAL; | 393 | return -EINVAL; |
391 | return do_shmat (first, (char *) ptr, second, (ulong *) third); | 394 | return do_shmat (first, (char __user *) ptr, second, |
395 | (ulong *) third); | ||
392 | } | 396 | } |
393 | case SHMDT: | 397 | case SHMDT: |
394 | return sys_shmdt ((char *)ptr); | 398 | return sys_shmdt ((char __user *)ptr); |
395 | case SHMGET: | 399 | case SHMGET: |
396 | return sys_shmget (first, second, third); | 400 | return sys_shmget (first, second, third); |
397 | case SHMCTL: | 401 | case SHMCTL: |
398 | return sys_shmctl (first, second, | 402 | return sys_shmctl (first, second, |
399 | (struct shmid_ds *) ptr); | 403 | (struct shmid_ds __user *) ptr); |
400 | default: | 404 | default: |
401 | return -ENOSYS; | 405 | return -ENOSYS; |
402 | } | 406 | } |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 59a187956de0..c9d2b5147ca3 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1168,7 +1168,7 @@ void __init per_cpu_trap_init(void) | |||
1168 | #endif | 1168 | #endif |
1169 | if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV) | 1169 | if (current_cpu_data.isa_level == MIPS_CPU_ISA_IV) |
1170 | status_set |= ST0_XX; | 1170 | status_set |= ST0_XX; |
1171 | change_c0_status(ST0_CU|ST0_MX|ST0_FR|ST0_BEV|ST0_TS|ST0_KX|ST0_SX|ST0_UX, | 1171 | change_c0_status(ST0_CU|ST0_MX|ST0_RE|ST0_FR|ST0_BEV|ST0_TS|ST0_KX|ST0_SX|ST0_UX, |
1172 | status_set); | 1172 | status_set); |
1173 | 1173 | ||
1174 | if (cpu_has_dsp) | 1174 | if (cpu_has_dsp) |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 25cc856d8e7e..ff699dbb99f7 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/config.h> | 1 | #include <linux/config.h> |
2 | #include <asm/asm-offsets.h> | ||
2 | #include <asm-generic/vmlinux.lds.h> | 3 | #include <asm-generic/vmlinux.lds.h> |
3 | 4 | ||
4 | #undef mips /* CPP really sucks for this job */ | 5 | #undef mips /* CPP really sucks for this job */ |
@@ -64,10 +65,10 @@ SECTIONS | |||
64 | we can shorten the on-disk segment size. */ | 65 | we can shorten the on-disk segment size. */ |
65 | .sdata : { *(.sdata) } | 66 | .sdata : { *(.sdata) } |
66 | 67 | ||
67 | . = ALIGN(4096); | 68 | . = ALIGN(_PAGE_SIZE); |
68 | __nosave_begin = .; | 69 | __nosave_begin = .; |
69 | .data_nosave : { *(.data.nosave) } | 70 | .data_nosave : { *(.data.nosave) } |
70 | . = ALIGN(4096); | 71 | . = ALIGN(_PAGE_SIZE); |
71 | __nosave_end = .; | 72 | __nosave_end = .; |
72 | 73 | ||
73 | . = ALIGN(32); | 74 | . = ALIGN(32); |
@@ -76,7 +77,7 @@ SECTIONS | |||
76 | _edata = .; /* End of data section */ | 77 | _edata = .; /* End of data section */ |
77 | 78 | ||
78 | /* will be freed after init */ | 79 | /* will be freed after init */ |
79 | . = ALIGN(4096); /* Init code and data */ | 80 | . = ALIGN(_PAGE_SIZE); /* Init code and data */ |
80 | __init_begin = .; | 81 | __init_begin = .; |
81 | .init.text : { | 82 | .init.text : { |
82 | _sinittext = .; | 83 | _sinittext = .; |
@@ -105,7 +106,7 @@ SECTIONS | |||
105 | .con_initcall.init : { *(.con_initcall.init) } | 106 | .con_initcall.init : { *(.con_initcall.init) } |
106 | __con_initcall_end = .; | 107 | __con_initcall_end = .; |
107 | SECURITY_INIT | 108 | SECURITY_INIT |
108 | . = ALIGN(4096); | 109 | . = ALIGN(_PAGE_SIZE); |
109 | __initramfs_start = .; | 110 | __initramfs_start = .; |
110 | .init.ramfs : { *(.init.ramfs) } | 111 | .init.ramfs : { *(.init.ramfs) } |
111 | __initramfs_end = .; | 112 | __initramfs_end = .; |
@@ -113,7 +114,7 @@ SECTIONS | |||
113 | __per_cpu_start = .; | 114 | __per_cpu_start = .; |
114 | .data.percpu : { *(.data.percpu) } | 115 | .data.percpu : { *(.data.percpu) } |
115 | __per_cpu_end = .; | 116 | __per_cpu_end = .; |
116 | . = ALIGN(4096); | 117 | . = ALIGN(_PAGE_SIZE); |
117 | __init_end = .; | 118 | __init_end = .; |
118 | /* freed after init ends here */ | 119 | /* freed after init ends here */ |
119 | 120 | ||