[S390] sysinfo: display capacity adjustment indicator
[pandora-kernel.git] / arch / s390 / kernel / compat_signal.c
1 /*
2  *  arch/s390/kernel/compat_signal.c
3  *
4  *    Copyright (C) IBM Corp. 2000,2006
5  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6  *               Gerhard Tonn (ton@de.ibm.com)                  
7  *
8  *  Copyright (C) 1991, 1992  Linus Torvalds
9  *
10  *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
11  */
12
13 #include <linux/compat.h>
14 #include <linux/sched.h>
15 #include <linux/mm.h>
16 #include <linux/smp.h>
17 #include <linux/kernel.h>
18 #include <linux/signal.h>
19 #include <linux/errno.h>
20 #include <linux/wait.h>
21 #include <linux/ptrace.h>
22 #include <linux/unistd.h>
23 #include <linux/stddef.h>
24 #include <linux/tty.h>
25 #include <linux/personality.h>
26 #include <linux/binfmts.h>
27 #include <asm/ucontext.h>
28 #include <asm/uaccess.h>
29 #include <asm/lowcore.h>
30 #include "compat_linux.h"
31 #include "compat_ptrace.h"
32 #include "entry.h"
33
34 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
35
36 typedef struct 
37 {
38         __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
39         struct sigcontext32 sc;
40         _sigregs32 sregs;
41         int signo;
42         __u32 gprs_high[NUM_GPRS];
43         __u8 retcode[S390_SYSCALL_SIZE];
44 } sigframe32;
45
46 typedef struct 
47 {
48         __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
49         __u8 retcode[S390_SYSCALL_SIZE];
50         compat_siginfo_t info;
51         struct ucontext32 uc;
52         __u32 gprs_high[NUM_GPRS];
53 } rt_sigframe32;
54
55 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
56 {
57         int err;
58
59         if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
60                 return -EFAULT;
61
62         /* If you change siginfo_t structure, please be sure
63            this code is fixed accordingly.
64            It should never copy any pad contained in the structure
65            to avoid security leaks, but must copy the generic
66            3 ints plus the relevant union member.  
67            This routine must convert siginfo from 64bit to 32bit as well
68            at the same time.  */
69         err = __put_user(from->si_signo, &to->si_signo);
70         err |= __put_user(from->si_errno, &to->si_errno);
71         err |= __put_user((short)from->si_code, &to->si_code);
72         if (from->si_code < 0)
73                 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
74         else {
75                 switch (from->si_code >> 16) {
76                 case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
77                 case __SI_MESGQ >> 16:
78                         err |= __put_user(from->si_int, &to->si_int);
79                         /* fallthrough */
80                 case __SI_KILL >> 16:
81                         err |= __put_user(from->si_pid, &to->si_pid);
82                         err |= __put_user(from->si_uid, &to->si_uid);
83                         break;
84                 case __SI_CHLD >> 16:
85                         err |= __put_user(from->si_pid, &to->si_pid);
86                         err |= __put_user(from->si_uid, &to->si_uid);
87                         err |= __put_user(from->si_utime, &to->si_utime);
88                         err |= __put_user(from->si_stime, &to->si_stime);
89                         err |= __put_user(from->si_status, &to->si_status);
90                         break;
91                 case __SI_FAULT >> 16:
92                         err |= __put_user((unsigned long) from->si_addr,
93                                           &to->si_addr);
94                         break;
95                 case __SI_POLL >> 16:
96                         err |= __put_user(from->si_band, &to->si_band);
97                         err |= __put_user(from->si_fd, &to->si_fd);
98                         break;
99                 case __SI_TIMER >> 16:
100                         err |= __put_user(from->si_tid, &to->si_tid);
101                         err |= __put_user(from->si_overrun, &to->si_overrun);
102                         err |= __put_user(from->si_int, &to->si_int);
103                         break;
104                 default:
105                         break;
106                 }
107         }
108         return err;
109 }
110
111 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
112 {
113         int err;
114         u32 tmp;
115
116         if (!access_ok (VERIFY_READ, from, sizeof(compat_siginfo_t)))
117                 return -EFAULT;
118
119         err = __get_user(to->si_signo, &from->si_signo);
120         err |= __get_user(to->si_errno, &from->si_errno);
121         err |= __get_user(to->si_code, &from->si_code);
122
123         if (to->si_code < 0)
124                 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
125         else {
126                 switch (to->si_code >> 16) {
127                 case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
128                 case __SI_MESGQ >> 16:
129                         err |= __get_user(to->si_int, &from->si_int);
130                         /* fallthrough */
131                 case __SI_KILL >> 16:
132                         err |= __get_user(to->si_pid, &from->si_pid);
133                         err |= __get_user(to->si_uid, &from->si_uid);
134                         break;
135                 case __SI_CHLD >> 16:
136                         err |= __get_user(to->si_pid, &from->si_pid);
137                         err |= __get_user(to->si_uid, &from->si_uid);
138                         err |= __get_user(to->si_utime, &from->si_utime);
139                         err |= __get_user(to->si_stime, &from->si_stime);
140                         err |= __get_user(to->si_status, &from->si_status);
141                         break;
142                 case __SI_FAULT >> 16:
143                         err |= __get_user(tmp, &from->si_addr);
144                         to->si_addr = (void __user *)(u64) (tmp & PSW32_ADDR_INSN);
145                         break;
146                 case __SI_POLL >> 16:
147                         err |= __get_user(to->si_band, &from->si_band);
148                         err |= __get_user(to->si_fd, &from->si_fd);
149                         break;
150                 case __SI_TIMER >> 16:
151                         err |= __get_user(to->si_tid, &from->si_tid);
152                         err |= __get_user(to->si_overrun, &from->si_overrun);
153                         err |= __get_user(to->si_int, &from->si_int);
154                         break;
155                 default:
156                         break;
157                 }
158         }
159         return err;
160 }
161
162 asmlinkage long
163 sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
164                  struct old_sigaction32 __user *oact)
165 {
166         struct k_sigaction new_ka, old_ka;
167         unsigned long sa_handler, sa_restorer;
168         int ret;
169
170         if (act) {
171                 compat_old_sigset_t mask;
172                 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
173                     __get_user(sa_handler, &act->sa_handler) ||
174                     __get_user(sa_restorer, &act->sa_restorer) ||
175                     __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
176                     __get_user(mask, &act->sa_mask))
177                         return -EFAULT;
178                 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
179                 new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
180                 siginitset(&new_ka.sa.sa_mask, mask);
181         }
182
183         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
184
185         if (!ret && oact) {
186                 sa_handler = (unsigned long) old_ka.sa.sa_handler;
187                 sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
188                 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
189                     __put_user(sa_handler, &oact->sa_handler) ||
190                     __put_user(sa_restorer, &oact->sa_restorer) ||
191                     __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
192                     __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
193                         return -EFAULT;
194         }
195
196         return ret;
197 }
198
199 asmlinkage long
200 sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
201            struct sigaction32 __user *oact,  size_t sigsetsize)
202 {
203         struct k_sigaction new_ka, old_ka;
204         unsigned long sa_handler;
205         int ret;
206         compat_sigset_t set32;
207
208         /* XXX: Don't preclude handling different sized sigset_t's.  */
209         if (sigsetsize != sizeof(compat_sigset_t))
210                 return -EINVAL;
211
212         if (act) {
213                 ret = get_user(sa_handler, &act->sa_handler);
214                 ret |= __copy_from_user(&set32, &act->sa_mask,
215                                         sizeof(compat_sigset_t));
216                 switch (_NSIG_WORDS) {
217                 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
218                                 | (((long)set32.sig[7]) << 32);
219                 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
220                                 | (((long)set32.sig[5]) << 32);
221                 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
222                                 | (((long)set32.sig[3]) << 32);
223                 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
224                                 | (((long)set32.sig[1]) << 32);
225                 }
226                 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
227                 
228                 if (ret)
229                         return -EFAULT;
230                 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
231         }
232
233         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
234
235         if (!ret && oact) {
236                 switch (_NSIG_WORDS) {
237                 case 4:
238                         set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
239                         set32.sig[6] = old_ka.sa.sa_mask.sig[3];
240                 case 3:
241                         set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
242                         set32.sig[4] = old_ka.sa.sa_mask.sig[2];
243                 case 2:
244                         set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
245                         set32.sig[2] = old_ka.sa.sa_mask.sig[1];
246                 case 1:
247                         set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
248                         set32.sig[0] = old_ka.sa.sa_mask.sig[0];
249                 }
250                 ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
251                 ret |= __copy_to_user(&oact->sa_mask, &set32,
252                                       sizeof(compat_sigset_t));
253                 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
254         }
255
256         return ret;
257 }
258
259 asmlinkage long
260 sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss)
261 {
262         struct pt_regs *regs = task_pt_regs(current);
263         stack_t kss, koss;
264         unsigned long ss_sp;
265         int ret, err = 0;
266         mm_segment_t old_fs = get_fs();
267
268         if (uss) {
269                 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
270                         return -EFAULT;
271                 err |= __get_user(ss_sp, &uss->ss_sp);
272                 err |= __get_user(kss.ss_size, &uss->ss_size);
273                 err |= __get_user(kss.ss_flags, &uss->ss_flags);
274                 if (err)
275                         return -EFAULT;
276                 kss.ss_sp = (void __user *) ss_sp;
277         }
278
279         set_fs (KERNEL_DS);
280         ret = do_sigaltstack((stack_t __force __user *) (uss ? &kss : NULL),
281                              (stack_t __force __user *) (uoss ? &koss : NULL),
282                              regs->gprs[15]);
283         set_fs (old_fs);
284
285         if (!ret && uoss) {
286                 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
287                         return -EFAULT;
288                 ss_sp = (unsigned long) koss.ss_sp;
289                 err |= __put_user(ss_sp, &uoss->ss_sp);
290                 err |= __put_user(koss.ss_size, &uoss->ss_size);
291                 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
292                 if (err)
293                         return -EFAULT;
294         }
295         return ret;
296 }
297
298 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
299 {
300         _s390_regs_common32 regs32;
301         int err, i;
302
303         regs32.psw.mask = PSW32_MASK_MERGE(psw32_user_bits,
304                                            (__u32)(regs->psw.mask >> 32));
305         regs32.psw.addr = PSW32_ADDR_AMODE31 | (__u32) regs->psw.addr;
306         for (i = 0; i < NUM_GPRS; i++)
307                 regs32.gprs[i] = (__u32) regs->gprs[i];
308         save_access_regs(current->thread.acrs);
309         memcpy(regs32.acrs, current->thread.acrs, sizeof(regs32.acrs));
310         err = __copy_to_user(&sregs->regs, &regs32, sizeof(regs32));
311         if (err)
312                 return err;
313         save_fp_regs(&current->thread.fp_regs);
314         /* s390_fp_regs and _s390_fp_regs32 are the same ! */
315         return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
316                               sizeof(_s390_fp_regs32));
317 }
318
319 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
320 {
321         _s390_regs_common32 regs32;
322         int err, i;
323
324         /* Alwys make any pending restarted system call return -EINTR */
325         current_thread_info()->restart_block.fn = do_no_restart_syscall;
326
327         err = __copy_from_user(&regs32, &sregs->regs, sizeof(regs32));
328         if (err)
329                 return err;
330         regs->psw.mask = PSW_MASK_MERGE(regs->psw.mask,
331                                         (__u64)regs32.psw.mask << 32);
332         regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
333         for (i = 0; i < NUM_GPRS; i++)
334                 regs->gprs[i] = (__u64) regs32.gprs[i];
335         memcpy(current->thread.acrs, regs32.acrs, sizeof(current->thread.acrs));
336         restore_access_regs(current->thread.acrs);
337
338         err = __copy_from_user(&current->thread.fp_regs, &sregs->fpregs,
339                                sizeof(_s390_fp_regs32));
340         current->thread.fp_regs.fpc &= FPC_VALID_MASK;
341         if (err)
342                 return err;
343
344         restore_fp_regs(&current->thread.fp_regs);
345         regs->svcnr = 0;        /* disable syscall checks */
346         return 0;
347 }
348
349 static int save_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
350 {
351         __u32 gprs_high[NUM_GPRS];
352         int i;
353
354         for (i = 0; i < NUM_GPRS; i++)
355                 gprs_high[i] = regs->gprs[i] >> 32;
356
357         return __copy_to_user(uregs, &gprs_high, sizeof(gprs_high));
358 }
359
360 static int restore_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
361 {
362         __u32 gprs_high[NUM_GPRS];
363         int err, i;
364
365         err = __copy_from_user(&gprs_high, uregs, sizeof(gprs_high));
366         if (err)
367                 return err;
368         for (i = 0; i < NUM_GPRS; i++)
369                 *(__u32 *)&regs->gprs[i] = gprs_high[i];
370         return 0;
371 }
372
373 asmlinkage long sys32_sigreturn(void)
374 {
375         struct pt_regs *regs = task_pt_regs(current);
376         sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
377         sigset_t set;
378
379         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
380                 goto badframe;
381         if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
382                 goto badframe;
383
384         sigdelsetmask(&set, ~_BLOCKABLE);
385         spin_lock_irq(&current->sighand->siglock);
386         current->blocked = set;
387         recalc_sigpending();
388         spin_unlock_irq(&current->sighand->siglock);
389
390         if (restore_sigregs32(regs, &frame->sregs))
391                 goto badframe;
392         if (restore_sigregs_gprs_high(regs, frame->gprs_high))
393                 goto badframe;
394
395         return regs->gprs[2];
396
397 badframe:
398         force_sig(SIGSEGV, current);
399         return 0;
400 }
401
402 asmlinkage long sys32_rt_sigreturn(void)
403 {
404         struct pt_regs *regs = task_pt_regs(current);
405         rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
406         sigset_t set;
407         stack_t st;
408         __u32 ss_sp;
409         int err;
410         mm_segment_t old_fs = get_fs();
411
412         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
413                 goto badframe;
414         if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
415                 goto badframe;
416
417         sigdelsetmask(&set, ~_BLOCKABLE);
418         spin_lock_irq(&current->sighand->siglock);
419         current->blocked = set;
420         recalc_sigpending();
421         spin_unlock_irq(&current->sighand->siglock);
422
423         if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
424                 goto badframe;
425         if (restore_sigregs_gprs_high(regs, frame->gprs_high))
426                 goto badframe;
427
428         err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
429         st.ss_sp = compat_ptr(ss_sp);
430         err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
431         err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
432         if (err)
433                 goto badframe; 
434
435         set_fs (KERNEL_DS);
436         do_sigaltstack((stack_t __force __user *)&st, NULL, regs->gprs[15]);
437         set_fs (old_fs);
438
439         return regs->gprs[2];
440
441 badframe:
442         force_sig(SIGSEGV, current);
443         return 0;
444 }       
445
446 /*
447  * Set up a signal frame.
448  */
449
450
451 /*
452  * Determine which stack to use..
453  */
454 static inline void __user *
455 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
456 {
457         unsigned long sp;
458
459         /* Default to using normal stack */
460         sp = (unsigned long) A(regs->gprs[15]);
461
462         /* Overflow on alternate signal stack gives SIGSEGV. */
463         if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
464                 return (void __user *) -1UL;
465
466         /* This is the X/Open sanctioned signal stack switching.  */
467         if (ka->sa.sa_flags & SA_ONSTACK) {
468                 if (! sas_ss_flags(sp))
469                         sp = current->sas_ss_sp + current->sas_ss_size;
470         }
471
472         /* This is the legacy signal stack switching. */
473         else if (!user_mode(regs) &&
474                  !(ka->sa.sa_flags & SA_RESTORER) &&
475                  ka->sa.sa_restorer) {
476                 sp = (unsigned long) ka->sa.sa_restorer;
477         }
478
479         return (void __user *)((sp - frame_size) & -8ul);
480 }
481
482 static inline int map_signal(int sig)
483 {
484         if (current_thread_info()->exec_domain
485             && current_thread_info()->exec_domain->signal_invmap
486             && sig < 32)
487                 return current_thread_info()->exec_domain->signal_invmap[sig];
488         else
489                 return sig;
490 }
491
492 static int setup_frame32(int sig, struct k_sigaction *ka,
493                         sigset_t *set, struct pt_regs * regs)
494 {
495         sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
496         if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
497                 goto give_sigsegv;
498
499         if (frame == (void __user *) -1UL)
500                 goto give_sigsegv;
501
502         if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
503                 goto give_sigsegv;
504
505         if (save_sigregs32(regs, &frame->sregs))
506                 goto give_sigsegv;
507         if (save_sigregs_gprs_high(regs, frame->gprs_high))
508                 goto give_sigsegv;
509         if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
510                 goto give_sigsegv;
511
512         /* Set up to return from userspace.  If provided, use a stub
513            already in userspace.  */
514         if (ka->sa.sa_flags & SA_RESTORER) {
515                 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
516         } else {
517                 regs->gprs[14] = (__u64) frame->retcode;
518                 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
519                                (u16 __user *)(frame->retcode)))
520                         goto give_sigsegv;
521         }
522
523         /* Set up backchain. */
524         if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
525                 goto give_sigsegv;
526
527         /* Set up registers for signal handler */
528         regs->gprs[15] = (__u64) frame;
529         regs->psw.addr = (__u64) ka->sa.sa_handler;
530
531         regs->gprs[2] = map_signal(sig);
532         regs->gprs[3] = (__u64) &frame->sc;
533
534         /* We forgot to include these in the sigcontext.
535            To avoid breaking binary compatibility, they are passed as args. */
536         regs->gprs[4] = current->thread.trap_no;
537         regs->gprs[5] = current->thread.prot_addr;
538
539         /* Place signal number on stack to allow backtrace from handler.  */
540         if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
541                 goto give_sigsegv;
542         return 0;
543
544 give_sigsegv:
545         force_sigsegv(sig, current);
546         return -EFAULT;
547 }
548
549 static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
550                            sigset_t *set, struct pt_regs * regs)
551 {
552         int err = 0;
553         rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
554         if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
555                 goto give_sigsegv;
556
557         if (frame == (void __user *) -1UL)
558                 goto give_sigsegv;
559
560         if (copy_siginfo_to_user32(&frame->info, info))
561                 goto give_sigsegv;
562
563         /* Create the ucontext.  */
564         err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags);
565         err |= __put_user(0, &frame->uc.uc_link);
566         err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
567         err |= __put_user(sas_ss_flags(regs->gprs[15]),
568                           &frame->uc.uc_stack.ss_flags);
569         err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
570         err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
571         err |= save_sigregs_gprs_high(regs, frame->gprs_high);
572         err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
573         if (err)
574                 goto give_sigsegv;
575
576         /* Set up to return from userspace.  If provided, use a stub
577            already in userspace.  */
578         if (ka->sa.sa_flags & SA_RESTORER) {
579                 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
580         } else {
581                 regs->gprs[14] = (__u64) frame->retcode;
582                 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
583                                   (u16 __user *)(frame->retcode));
584         }
585
586         /* Set up backchain. */
587         if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
588                 goto give_sigsegv;
589
590         /* Set up registers for signal handler */
591         regs->gprs[15] = (__u64) frame;
592         regs->psw.addr = (__u64) ka->sa.sa_handler;
593
594         regs->gprs[2] = map_signal(sig);
595         regs->gprs[3] = (__u64) &frame->info;
596         regs->gprs[4] = (__u64) &frame->uc;
597         return 0;
598
599 give_sigsegv:
600         force_sigsegv(sig, current);
601         return -EFAULT;
602 }
603
604 /*
605  * OK, we're invoking a handler
606  */     
607
608 int
609 handle_signal32(unsigned long sig, struct k_sigaction *ka,
610                 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
611 {
612         int ret;
613
614         /* Set up the stack frame */
615         if (ka->sa.sa_flags & SA_SIGINFO)
616                 ret = setup_rt_frame32(sig, ka, info, oldset, regs);
617         else
618                 ret = setup_frame32(sig, ka, oldset, regs);
619
620         if (ret == 0) {
621                 spin_lock_irq(&current->sighand->siglock);
622                 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
623                 if (!(ka->sa.sa_flags & SA_NODEFER))
624                         sigaddset(&current->blocked,sig);
625                 recalc_sigpending();
626                 spin_unlock_irq(&current->sighand->siglock);
627         }
628         return ret;
629 }
630