diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/kernel/process.c | 5 | ||||
-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.c | 88 | ||||
-rw-r--r-- | arch/mips/kernel/signal32.c | 8 | ||||
-rw-r--r-- | arch/mips/kernel/signal_n32.c | 4 | ||||
-rw-r--r-- | arch/mips/kernel/syscall.c | 48 |
9 files changed, 153 insertions, 68 deletions
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/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.c b/arch/mips/kernel/signal.c index aaec4785e9a6..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 |
@@ -315,11 +305,11 @@ 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 | ||
@@ -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 136260c8f756..da3271e1fdac 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
@@ -694,11 +694,11 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | |||
694 | current->comm, current->pid, | 694 | current->comm, current->pid, |
695 | frame, regs->cp0_epc, frame->sf_code); | 695 | frame, regs->cp0_epc, frame->sf_code); |
696 | #endif | 696 | #endif |
697 | return 1; | 697 | return 0; |
698 | 698 | ||
699 | give_sigsegv: | 699 | give_sigsegv: |
700 | force_sigsegv(signr, current); | 700 | force_sigsegv(signr, current); |
701 | return 0; | 701 | return -EFAULT; |
702 | } | 702 | } |
703 | 703 | ||
704 | 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, |
@@ -765,11 +765,11 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, | |||
765 | current->comm, current->pid, | 765 | current->comm, current->pid, |
766 | frame, regs->cp0_epc, frame->rs_code); | 766 | frame, regs->cp0_epc, frame->rs_code); |
767 | #endif | 767 | #endif |
768 | return 1; | 768 | return 0; |
769 | 769 | ||
770 | give_sigsegv: | 770 | give_sigsegv: |
771 | force_sigsegv(signr, current); | 771 | force_sigsegv(signr, current); |
772 | return 0; | 772 | return -EFAULT; |
773 | } | 773 | } |
774 | 774 | ||
775 | static inline int handle_signal(unsigned long sig, siginfo_t *info, | 775 | static inline int handle_signal(unsigned long sig, siginfo_t *info, |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 9156863c1a5d..384fc4a639a4 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
@@ -186,9 +186,9 @@ int setup_rt_frame_n32(struct k_sigaction * ka, | |||
186 | current->comm, current->pid, | 186 | current->comm, current->pid, |
187 | frame, regs->cp0_epc, regs->regs[31]); | 187 | frame, regs->cp0_epc, regs->regs[31]); |
188 | #endif | 188 | #endif |
189 | return 1; | 189 | return 0; |
190 | 190 | ||
191 | give_sigsegv: | 191 | give_sigsegv: |
192 | force_sigsegv(signr, current); | 192 | force_sigsegv(signr, current); |
193 | return 0; | 193 | return -EFAULT; |
194 | } | 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 | } |