diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/cpu-probe.c | 7 | ||||
-rw-r--r-- | arch/mips/kernel/genex.S | 2 | ||||
-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/signal-common.h | 8 | ||||
-rw-r--r-- | arch/mips/kernel/signal.c | 16 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 59 | ||||
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 10 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/vmlinux.lds.S | 11 |
11 files changed, 87 insertions, 72 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/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/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/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..aaec4785e9a6 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
@@ -199,10 +199,10 @@ save_static_function(sys_sigreturn); | |||
199 | __attribute_used__ noinline static void | 199 | __attribute_used__ noinline static void |
200 | _sys_sigreturn(nabi_no_regargs struct pt_regs regs) | 200 | _sys_sigreturn(nabi_no_regargs struct pt_regs regs) |
201 | { | 201 | { |
202 | struct sigframe *frame; | 202 | struct sigframe __user *frame; |
203 | sigset_t blocked; | 203 | sigset_t blocked; |
204 | 204 | ||
205 | frame = (struct sigframe *) regs.regs[29]; | 205 | frame = (struct sigframe __user *) regs.regs[29]; |
206 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 206 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
207 | goto badframe; | 207 | goto badframe; |
208 | if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) | 208 | if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) |
@@ -236,11 +236,11 @@ save_static_function(sys_rt_sigreturn); | |||
236 | __attribute_used__ noinline static void | 236 | __attribute_used__ noinline static void |
237 | _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 237 | _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
238 | { | 238 | { |
239 | struct rt_sigframe *frame; | 239 | struct rt_sigframe __user *frame; |
240 | sigset_t set; | 240 | sigset_t set; |
241 | stack_t st; | 241 | stack_t st; |
242 | 242 | ||
243 | frame = (struct rt_sigframe *) regs.regs[29]; | 243 | frame = (struct rt_sigframe __user *) regs.regs[29]; |
244 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 244 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
245 | goto badframe; | 245 | goto badframe; |
246 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) | 246 | if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) |
@@ -259,7 +259,7 @@ _sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
259 | goto badframe; | 259 | goto badframe; |
260 | /* It is more difficult to avoid calling this function than to | 260 | /* It is more difficult to avoid calling this function than to |
261 | call it and ignore errors. */ | 261 | call it and ignore errors. */ |
262 | do_sigaltstack(&st, NULL, regs.regs[29]); | 262 | do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); |
263 | 263 | ||
264 | /* | 264 | /* |
265 | * Don't let your children do this ... | 265 | * Don't let your children do this ... |
@@ -279,7 +279,7 @@ badframe: | |||
279 | int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, | 279 | int setup_frame(struct k_sigaction * ka, struct pt_regs *regs, |
280 | int signr, sigset_t *set) | 280 | int signr, sigset_t *set) |
281 | { | 281 | { |
282 | struct sigframe *frame; | 282 | struct sigframe __user *frame; |
283 | int err = 0; | 283 | int err = 0; |
284 | 284 | ||
285 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 285 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
@@ -326,7 +326,7 @@ give_sigsegv: | |||
326 | int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | 326 | int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, |
327 | int signr, sigset_t *set, siginfo_t *info) | 327 | int signr, sigset_t *set, siginfo_t *info) |
328 | { | 328 | { |
329 | struct rt_sigframe *frame; | 329 | struct rt_sigframe __user *frame; |
330 | int err = 0; | 330 | int err = 0; |
331 | 331 | ||
332 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 332 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
@@ -340,7 +340,7 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs, | |||
340 | 340 | ||
341 | /* Create the ucontext. */ | 341 | /* Create the ucontext. */ |
342 | err |= __put_user(0, &frame->rs_uc.uc_flags); | 342 | err |= __put_user(0, &frame->rs_uc.uc_flags); |
343 | err |= __put_user(0, &frame->rs_uc.uc_link); | 343 | err |= __put_user(NULL, &frame->rs_uc.uc_link); |
344 | err |= __put_user((void *)current->sas_ss_sp, | 344 | err |= __put_user((void *)current->sas_ss_sp, |
345 | &frame->rs_uc.uc_stack.ss_sp); | 345 | &frame->rs_uc.uc_stack.ss_sp); |
346 | err |= __put_user(sas_ss_flags(regs->regs[29]), | 346 | err |= __put_user(sas_ss_flags(regs->regs[29]), |
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index 98b185bbc947..136260c8f756 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)); |
@@ -702,7 +704,7 @@ give_sigsegv: | |||
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 | ||
@@ -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..9156863c1a5d 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 | ||
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 | ||