aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/signal32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel/signal32.c')
-rw-r--r--arch/mips/kernel/signal32.c143
1 files changed, 79 insertions, 64 deletions
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
index 98b185bbc947..237cd8a2cd32 100644
--- a/arch/mips/kernel/signal32.c
+++ b/arch/mips/kernel/signal32.c
@@ -4,7 +4,7 @@
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 1991, 1992 Linus Torvalds 6 * Copyright (C) 1991, 1992 Linus Torvalds
7 * Copyright (C) 1994 - 2000 Ralf Baechle 7 * Copyright (C) 1994 - 2000, 2006 Ralf Baechle
8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc. 8 * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9 */ 9 */
10#include <linux/cache.h> 10#include <linux/cache.h>
@@ -106,8 +106,6 @@ typedef struct compat_siginfo {
106 106
107#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) 107#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
108 108
109extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
110
111/* 32-bit compatibility types */ 109/* 32-bit compatibility types */
112 110
113#define _NSIG_BPW32 32 111#define _NSIG_BPW32 32
@@ -144,7 +142,7 @@ struct ucontext32 {
144extern void __put_sigset_unknown_nsig(void); 142extern void __put_sigset_unknown_nsig(void);
145extern void __get_sigset_unknown_nsig(void); 143extern void __get_sigset_unknown_nsig(void);
146 144
147static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t *ubuf) 145static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
148{ 146{
149 int err = 0; 147 int err = 0;
150 148
@@ -198,7 +196,7 @@ __attribute_used__ noinline static int
198_sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) 196_sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
199{ 197{
200 compat_sigset_t *uset; 198 compat_sigset_t *uset;
201 sigset_t newset, saveset; 199 sigset_t newset;
202 200
203 uset = (compat_sigset_t *) regs.regs[4]; 201 uset = (compat_sigset_t *) regs.regs[4];
204 if (get_sigset(&newset, uset)) 202 if (get_sigset(&newset, uset))
@@ -206,19 +204,15 @@ _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
206 sigdelsetmask(&newset, ~_BLOCKABLE); 204 sigdelsetmask(&newset, ~_BLOCKABLE);
207 205
208 spin_lock_irq(&current->sighand->siglock); 206 spin_lock_irq(&current->sighand->siglock);
209 saveset = current->blocked; 207 current->saved_sigmask = current->blocked;
210 current->blocked = newset; 208 current->blocked = newset;
211 recalc_sigpending(); 209 recalc_sigpending();
212 spin_unlock_irq(&current->sighand->siglock); 210 spin_unlock_irq(&current->sighand->siglock);
213 211
214 regs.regs[2] = EINTR; 212 current->state = TASK_INTERRUPTIBLE;
215 regs.regs[7] = 1; 213 schedule();
216 while (1) { 214 set_thread_flag(TIF_RESTORE_SIGMASK);
217 current->state = TASK_INTERRUPTIBLE; 215 return -ERESTARTNOHAND;
218 schedule();
219 if (do_signal32(&saveset, &regs))
220 return -EINTR;
221 }
222} 216}
223 217
224save_static_function(sys32_rt_sigsuspend); 218save_static_function(sys32_rt_sigsuspend);
@@ -226,8 +220,8 @@ __attribute_used__ noinline static int
226_sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) 220_sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
227{ 221{
228 compat_sigset_t *uset; 222 compat_sigset_t *uset;
229 sigset_t newset, saveset; 223 sigset_t newset;
230 size_t sigsetsize; 224 size_t sigsetsize;
231 225
232 /* XXX Don't preclude handling different sized sigset_t's. */ 226 /* XXX Don't preclude handling different sized sigset_t's. */
233 sigsetsize = regs.regs[5]; 227 sigsetsize = regs.regs[5];
@@ -240,19 +234,15 @@ _sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
240 sigdelsetmask(&newset, ~_BLOCKABLE); 234 sigdelsetmask(&newset, ~_BLOCKABLE);
241 235
242 spin_lock_irq(&current->sighand->siglock); 236 spin_lock_irq(&current->sighand->siglock);
243 saveset = current->blocked; 237 current->saved_sigmask = current->blocked;
244 current->blocked = newset; 238 current->blocked = newset;
245 recalc_sigpending(); 239 recalc_sigpending();
246 spin_unlock_irq(&current->sighand->siglock); 240 spin_unlock_irq(&current->sighand->siglock);
247 241
248 regs.regs[2] = EINTR; 242 current->state = TASK_INTERRUPTIBLE;
249 regs.regs[7] = 1; 243 schedule();
250 while (1) { 244 set_thread_flag(TIF_RESTORE_SIGMASK);
251 current->state = TASK_INTERRUPTIBLE; 245 return -ERESTARTNOHAND;
252 schedule();
253 if (do_signal32(&saveset, &regs))
254 return -EINTR;
255 }
256} 246}
257 247
258asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act, 248asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
@@ -269,7 +259,7 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
269 if (!access_ok(VERIFY_READ, act, sizeof(*act))) 259 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
270 return -EFAULT; 260 return -EFAULT;
271 err |= __get_user(handler, &act->sa_handler); 261 err |= __get_user(handler, &act->sa_handler);
272 new_ka.sa.sa_handler = (void*)(s64)handler; 262 new_ka.sa.sa_handler = (void __user *)(s64)handler;
273 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); 263 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
274 err |= __get_user(mask, &act->sa_mask.sig[0]); 264 err |= __get_user(mask, &act->sa_mask.sig[0]);
275 if (err) 265 if (err)
@@ -299,8 +289,8 @@ asmlinkage int sys32_sigaction(int sig, const struct sigaction32 *act,
299 289
300asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) 290asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
301{ 291{
302 const stack32_t *uss = (const stack32_t *) regs.regs[4]; 292 const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4];
303 stack32_t *uoss = (stack32_t *) regs.regs[5]; 293 stack32_t __user *uoss = (stack32_t __user *) regs.regs[5];
304 unsigned long usp = regs.regs[29]; 294 unsigned long usp = regs.regs[29];
305 stack_t kss, koss; 295 stack_t kss, koss;
306 int ret, err = 0; 296 int ret, err = 0;
@@ -319,7 +309,8 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
319 } 309 }
320 310
321 set_fs (KERNEL_DS); 311 set_fs (KERNEL_DS);
322 ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, usp); 312 ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL,
313 uoss ? (stack_t __user *)&koss : NULL, usp);
323 set_fs (old_fs); 314 set_fs (old_fs);
324 315
325 if (!ret && uoss) { 316 if (!ret && uoss) {
@@ -335,7 +326,7 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
335 return ret; 326 return ret;
336} 327}
337 328
338static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 *sc) 329static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 __user *sc)
339{ 330{
340 u32 used_math; 331 u32 used_math;
341 int err = 0; 332 int err = 0;
@@ -420,7 +411,7 @@ struct rt_sigframe32 {
420#endif 411#endif
421}; 412};
422 413
423int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from) 414int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
424{ 415{
425 int err; 416 int err;
426 417
@@ -455,7 +446,7 @@ int copy_siginfo_to_user32(compat_siginfo_t *to, siginfo_t *from)
455 err |= __put_user(from->si_uid, &to->si_uid); 446 err |= __put_user(from->si_uid, &to->si_uid);
456 break; 447 break;
457 case __SI_FAULT >> 16: 448 case __SI_FAULT >> 16:
458 err |= __put_user((long)from->si_addr, &to->si_addr); 449 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
459 break; 450 break;
460 case __SI_POLL >> 16: 451 case __SI_POLL >> 16:
461 err |= __put_user(from->si_band, &to->si_band); 452 err |= __put_user(from->si_band, &to->si_band);
@@ -476,10 +467,10 @@ save_static_function(sys32_sigreturn);
476__attribute_used__ noinline static void 467__attribute_used__ noinline static void
477_sys32_sigreturn(nabi_no_regargs struct pt_regs regs) 468_sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
478{ 469{
479 struct sigframe *frame; 470 struct sigframe __user *frame;
480 sigset_t blocked; 471 sigset_t blocked;
481 472
482 frame = (struct sigframe *) regs.regs[29]; 473 frame = (struct sigframe __user *) regs.regs[29];
483 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 474 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
484 goto badframe; 475 goto badframe;
485 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked))) 476 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
@@ -512,13 +503,13 @@ save_static_function(sys32_rt_sigreturn);
512__attribute_used__ noinline static void 503__attribute_used__ noinline static void
513_sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) 504_sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
514{ 505{
515 struct rt_sigframe32 *frame; 506 struct rt_sigframe32 __user *frame;
516 mm_segment_t old_fs; 507 mm_segment_t old_fs;
517 sigset_t set; 508 sigset_t set;
518 stack_t st; 509 stack_t st;
519 s32 sp; 510 s32 sp;
520 511
521 frame = (struct rt_sigframe32 *) regs.regs[29]; 512 frame = (struct rt_sigframe32 __user *) regs.regs[29];
522 if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) 513 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
523 goto badframe; 514 goto badframe;
524 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set))) 515 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
@@ -536,7 +527,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
536 /* The ucontext contains a stack32_t, so we must convert! */ 527 /* The ucontext contains a stack32_t, so we must convert! */
537 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) 528 if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp))
538 goto badframe; 529 goto badframe;
539 st.ss_size = (long) sp; 530 st.ss_sp = (void *)(long) sp;
540 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size)) 531 if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size))
541 goto badframe; 532 goto badframe;
542 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags)) 533 if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags))
@@ -546,7 +537,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
546 call it and ignore errors. */ 537 call it and ignore errors. */
547 old_fs = get_fs(); 538 old_fs = get_fs();
548 set_fs (KERNEL_DS); 539 set_fs (KERNEL_DS);
549 do_sigaltstack(&st, NULL, regs.regs[29]); 540 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
550 set_fs (old_fs); 541 set_fs (old_fs);
551 542
552 /* 543 /*
@@ -564,7 +555,7 @@ badframe:
564} 555}
565 556
566static inline int setup_sigcontext32(struct pt_regs *regs, 557static inline int setup_sigcontext32(struct pt_regs *regs,
567 struct sigcontext32 *sc) 558 struct sigcontext32 __user *sc)
568{ 559{
569 int err = 0; 560 int err = 0;
570 561
@@ -623,8 +614,9 @@ out:
623/* 614/*
624 * Determine which stack to use.. 615 * Determine which stack to use..
625 */ 616 */
626static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, 617static inline void __user *get_sigframe(struct k_sigaction *ka,
627 size_t frame_size) 618 struct pt_regs *regs,
619 size_t frame_size)
628{ 620{
629 unsigned long sp; 621 unsigned long sp;
630 622
@@ -642,13 +634,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)) 634 if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
643 sp = current->sas_ss_sp + current->sas_ss_size; 635 sp = current->sas_ss_sp + current->sas_ss_size;
644 636
645 return (void *)((sp - frame_size) & ALMASK); 637 return (void __user *)((sp - frame_size) & ALMASK);
646} 638}
647 639
648int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs, 640int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
649 int signr, sigset_t *set) 641 int signr, sigset_t *set)
650{ 642{
651 struct sigframe *frame; 643 struct sigframe __user *frame;
652 int err = 0; 644 int err = 0;
653 645
654 frame = get_sigframe(ka, regs, sizeof(*frame)); 646 frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -692,17 +684,17 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
692 current->comm, current->pid, 684 current->comm, current->pid,
693 frame, regs->cp0_epc, frame->sf_code); 685 frame, regs->cp0_epc, frame->sf_code);
694#endif 686#endif
695 return 1; 687 return 0;
696 688
697give_sigsegv: 689give_sigsegv:
698 force_sigsegv(signr, current); 690 force_sigsegv(signr, current);
699 return 0; 691 return -EFAULT;
700} 692}
701 693
702int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs, 694int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
703 int signr, sigset_t *set, siginfo_t *info) 695 int signr, sigset_t *set, siginfo_t *info)
704{ 696{
705 struct rt_sigframe32 *frame; 697 struct rt_sigframe32 __user *frame;
706 int err = 0; 698 int err = 0;
707 s32 sp; 699 s32 sp;
708 700
@@ -763,11 +755,11 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
763 current->comm, current->pid, 755 current->comm, current->pid,
764 frame, regs->cp0_epc, frame->rs_code); 756 frame, regs->cp0_epc, frame->rs_code);
765#endif 757#endif
766 return 1; 758 return 0;
767 759
768give_sigsegv: 760give_sigsegv:
769 force_sigsegv(signr, current); 761 force_sigsegv(signr, current);
770 return 0; 762 return -EFAULT;
771} 763}
772 764
773static inline int handle_signal(unsigned long sig, siginfo_t *info, 765static inline int handle_signal(unsigned long sig, siginfo_t *info,
@@ -781,7 +773,7 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
781 regs->regs[2] = EINTR; 773 regs->regs[2] = EINTR;
782 break; 774 break;
783 case ERESTARTSYS: 775 case ERESTARTSYS:
784 if(!(ka->sa.sa_flags & SA_RESTART)) { 776 if (!(ka->sa.sa_flags & SA_RESTART)) {
785 regs->regs[2] = EINTR; 777 regs->regs[2] = EINTR;
786 break; 778 break;
787 } 779 }
@@ -808,9 +800,10 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
808 return ret; 800 return ret;
809} 801}
810 802
811int do_signal32(sigset_t *oldset, struct pt_regs *regs) 803void do_signal32(struct pt_regs *regs)
812{ 804{
813 struct k_sigaction ka; 805 struct k_sigaction ka;
806 sigset_t *oldset;
814 siginfo_t info; 807 siginfo_t info;
815 int signr; 808 int signr;
816 809
@@ -820,17 +813,30 @@ int do_signal32(sigset_t *oldset, struct pt_regs *regs)
820 * if so. 813 * if so.
821 */ 814 */
822 if (!user_mode(regs)) 815 if (!user_mode(regs))
823 return 1; 816 return;
824 817
825 if (try_to_freeze()) 818 if (try_to_freeze())
826 goto no_signal; 819 goto no_signal;
827 820
828 if (!oldset) 821 if (test_thread_flag(TIF_RESTORE_SIGMASK))
822 oldset = &current->saved_sigmask;
823 else
829 oldset = &current->blocked; 824 oldset = &current->blocked;
830 825
831 signr = get_signal_to_deliver(&info, &ka, regs, NULL); 826 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
832 if (signr > 0) 827 if (signr > 0) {
833 return handle_signal(signr, &info, &ka, oldset, regs); 828 /* Whee! Actually deliver the signal. */
829 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
830 /*
831 * A signal was successfully delivered; the saved
832 * sigmask will have been stored in the signal frame,
833 * and will be restored by sigreturn, so we can simply
834 * clear the TIF_RESTORE_SIGMASK flag.
835 */
836 if (test_thread_flag(TIF_RESTORE_SIGMASK))
837 clear_thread_flag(TIF_RESTORE_SIGMASK);
838 }
839 }
834 840
835no_signal: 841no_signal:
836 /* 842 /*
@@ -851,11 +857,19 @@ no_signal:
851 regs->cp0_epc -= 4; 857 regs->cp0_epc -= 4;
852 } 858 }
853 } 859 }
854 return 0; 860
861 /*
862 * If there's no signal to deliver, we just put the saved sigmask
863 * back
864 */
865 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
866 clear_thread_flag(TIF_RESTORE_SIGMASK);
867 sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
868 }
855} 869}
856 870
857asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act, 871asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
858 struct sigaction32 *oact, 872 struct sigaction32 __user *oact,
859 unsigned int sigsetsize) 873 unsigned int sigsetsize)
860{ 874{
861 struct k_sigaction new_sa, old_sa; 875 struct k_sigaction new_sa, old_sa;
@@ -872,7 +886,7 @@ asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 *act,
872 if (!access_ok(VERIFY_READ, act, sizeof(*act))) 886 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
873 return -EFAULT; 887 return -EFAULT;
874 err |= __get_user(handler, &act->sa_handler); 888 err |= __get_user(handler, &act->sa_handler);
875 new_sa.sa.sa_handler = (void*)(s64)handler; 889 new_sa.sa.sa_handler = (void __user *)(s64)handler;
876 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags); 890 err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags);
877 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask); 891 err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask);
878 if (err) 892 if (err)
@@ -899,7 +913,7 @@ out:
899} 913}
900 914
901asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, 915asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
902 compat_sigset_t *oset, unsigned int sigsetsize) 916 compat_sigset_t __user *oset, unsigned int sigsetsize)
903{ 917{
904 sigset_t old_set, new_set; 918 sigset_t old_set, new_set;
905 int ret; 919 int ret;
@@ -909,8 +923,9 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
909 return -EFAULT; 923 return -EFAULT;
910 924
911 set_fs (KERNEL_DS); 925 set_fs (KERNEL_DS);
912 ret = sys_rt_sigprocmask(how, set ? &new_set : NULL, 926 ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL,
913 oset ? &old_set : NULL, sigsetsize); 927 oset ? (sigset_t __user *)&old_set : NULL,
928 sigsetsize);
914 set_fs (old_fs); 929 set_fs (old_fs);
915 930
916 if (!ret && oset && put_sigset(&old_set, oset)) 931 if (!ret && oset && put_sigset(&old_set, oset))
@@ -919,7 +934,7 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set,
919 return ret; 934 return ret;
920} 935}
921 936
922asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset, 937asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
923 unsigned int sigsetsize) 938 unsigned int sigsetsize)
924{ 939{
925 int ret; 940 int ret;
@@ -927,7 +942,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
927 mm_segment_t old_fs = get_fs(); 942 mm_segment_t old_fs = get_fs();
928 943
929 set_fs (KERNEL_DS); 944 set_fs (KERNEL_DS);
930 ret = sys_rt_sigpending(&set, sigsetsize); 945 ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize);
931 set_fs (old_fs); 946 set_fs (old_fs);
932 947
933 if (!ret && put_sigset(&set, uset)) 948 if (!ret && put_sigset(&set, uset))
@@ -936,7 +951,7 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t *uset,
936 return ret; 951 return ret;
937} 952}
938 953
939asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t *uinfo) 954asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
940{ 955{
941 siginfo_t info; 956 siginfo_t info;
942 int ret; 957 int ret;
@@ -946,7 +961,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)) 961 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
947 return -EFAULT; 962 return -EFAULT;
948 set_fs (KERNEL_DS); 963 set_fs (KERNEL_DS);
949 ret = sys_rt_sigqueueinfo(pid, sig, &info); 964 ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
950 set_fs (old_fs); 965 set_fs (old_fs);
951 return ret; 966 return ret;
952} 967}