]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - arch/sparc/kernel/signal32.c
Merge tag 'writeback' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg/linux
[karo-tx-linux.git] / arch / sparc / kernel / signal32.c
1 /*  arch/sparc64/kernel/signal32.c
2  *
3  *  Copyright (C) 1991, 1992  Linus Torvalds
4  *  Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
5  *  Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
6  *  Copyright (C) 1997 Eddie C. Dost   (ecd@skynet.be)
7  *  Copyright (C) 1997,1998 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
8  */
9
10 #include <linux/sched.h>
11 #include <linux/kernel.h>
12 #include <linux/signal.h>
13 #include <linux/errno.h>
14 #include <linux/wait.h>
15 #include <linux/ptrace.h>
16 #include <linux/unistd.h>
17 #include <linux/mm.h>
18 #include <linux/tty.h>
19 #include <linux/binfmts.h>
20 #include <linux/compat.h>
21 #include <linux/bitops.h>
22 #include <linux/tracehook.h>
23
24 #include <asm/uaccess.h>
25 #include <asm/ptrace.h>
26 #include <asm/pgtable.h>
27 #include <asm/psrcompat.h>
28 #include <asm/fpumacro.h>
29 #include <asm/visasm.h>
30 #include <asm/compat_signal.h>
31 #include <asm/switch_to.h>
32
33 #include "sigutil.h"
34
35 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
36
37 /* This magic should be in g_upper[0] for all upper parts
38  * to be valid.
39  */
40 #define SIGINFO_EXTRA_V8PLUS_MAGIC      0x130e269
41 typedef struct {
42         unsigned int g_upper[8];
43         unsigned int o_upper[8];
44         unsigned int asi;
45 } siginfo_extra_v8plus_t;
46
47 struct signal_frame32 {
48         struct sparc_stackf32   ss;
49         __siginfo32_t           info;
50         /* __siginfo_fpu_t * */ u32 fpu_save;
51         unsigned int            insns[2];
52         unsigned int            extramask[_COMPAT_NSIG_WORDS - 1];
53         unsigned int            extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
54         /* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
55         siginfo_extra_v8plus_t  v8plus;
56         /* __siginfo_rwin_t * */u32 rwin_save;
57 } __attribute__((aligned(8)));
58
59 typedef struct compat_siginfo{
60         int si_signo;
61         int si_errno;
62         int si_code;
63
64         union {
65                 int _pad[SI_PAD_SIZE32];
66
67                 /* kill() */
68                 struct {
69                         compat_pid_t _pid;              /* sender's pid */
70                         unsigned int _uid;              /* sender's uid */
71                 } _kill;
72
73                 /* POSIX.1b timers */
74                 struct {
75                         compat_timer_t _tid;                    /* timer id */
76                         int _overrun;                   /* overrun count */
77                         compat_sigval_t _sigval;                /* same as below */
78                         int _sys_private;               /* not to be passed to user */
79                 } _timer;
80
81                 /* POSIX.1b signals */
82                 struct {
83                         compat_pid_t _pid;              /* sender's pid */
84                         unsigned int _uid;              /* sender's uid */
85                         compat_sigval_t _sigval;
86                 } _rt;
87
88                 /* SIGCHLD */
89                 struct {
90                         compat_pid_t _pid;              /* which child */
91                         unsigned int _uid;              /* sender's uid */
92                         int _status;                    /* exit code */
93                         compat_clock_t _utime;
94                         compat_clock_t _stime;
95                 } _sigchld;
96
97                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGEMT */
98                 struct {
99                         u32 _addr; /* faulting insn/memory ref. */
100                         int _trapno;
101                 } _sigfault;
102
103                 /* SIGPOLL */
104                 struct {
105                         int _band;      /* POLL_IN, POLL_OUT, POLL_MSG */
106                         int _fd;
107                 } _sigpoll;
108         } _sifields;
109 }compat_siginfo_t;
110
111 struct rt_signal_frame32 {
112         struct sparc_stackf32   ss;
113         compat_siginfo_t        info;
114         struct pt_regs32        regs;
115         compat_sigset_t         mask;
116         /* __siginfo_fpu_t * */ u32 fpu_save;
117         unsigned int            insns[2];
118         stack_t32               stack;
119         unsigned int            extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
120         /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
121         siginfo_extra_v8plus_t  v8plus;
122         /* __siginfo_rwin_t * */u32 rwin_save;
123 } __attribute__((aligned(8)));
124
125 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
126 {
127         int err;
128
129         if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
130                 return -EFAULT;
131
132         /* If you change siginfo_t structure, please be sure
133            this code is fixed accordingly.
134            It should never copy any pad contained in the structure
135            to avoid security leaks, but must copy the generic
136            3 ints plus the relevant union member.
137            This routine must convert siginfo from 64bit to 32bit as well
138            at the same time.  */
139         err = __put_user(from->si_signo, &to->si_signo);
140         err |= __put_user(from->si_errno, &to->si_errno);
141         err |= __put_user((short)from->si_code, &to->si_code);
142         if (from->si_code < 0)
143                 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
144         else {
145                 switch (from->si_code >> 16) {
146                 case __SI_TIMER >> 16:
147                         err |= __put_user(from->si_tid, &to->si_tid);
148                         err |= __put_user(from->si_overrun, &to->si_overrun);
149                         err |= __put_user(from->si_int, &to->si_int);
150                         break;
151                 case __SI_CHLD >> 16:
152                         err |= __put_user(from->si_utime, &to->si_utime);
153                         err |= __put_user(from->si_stime, &to->si_stime);
154                         err |= __put_user(from->si_status, &to->si_status);
155                 default:
156                         err |= __put_user(from->si_pid, &to->si_pid);
157                         err |= __put_user(from->si_uid, &to->si_uid);
158                         break;
159                 case __SI_FAULT >> 16:
160                         err |= __put_user(from->si_trapno, &to->si_trapno);
161                         err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
162                         break;
163                 case __SI_POLL >> 16:
164                         err |= __put_user(from->si_band, &to->si_band);
165                         err |= __put_user(from->si_fd, &to->si_fd);
166                         break;
167                 case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
168                 case __SI_MESGQ >> 16:
169                         err |= __put_user(from->si_pid, &to->si_pid);
170                         err |= __put_user(from->si_uid, &to->si_uid);
171                         err |= __put_user(from->si_int, &to->si_int);
172                         break;
173                 }
174         }
175         return err;
176 }
177
178 /* CAUTION: This is just a very minimalist implementation for the
179  *          sake of compat_sys_rt_sigqueueinfo()
180  */
181 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
182 {
183         if (!access_ok(VERIFY_WRITE, from, sizeof(compat_siginfo_t)))
184                 return -EFAULT;
185
186         if (copy_from_user(to, from, 3*sizeof(int)) ||
187             copy_from_user(to->_sifields._pad, from->_sifields._pad,
188                            SI_PAD_SIZE))
189                 return -EFAULT;
190
191         return 0;
192 }
193
194 void do_sigreturn32(struct pt_regs *regs)
195 {
196         struct signal_frame32 __user *sf;
197         compat_uptr_t fpu_save;
198         compat_uptr_t rwin_save;
199         unsigned int psr;
200         unsigned pc, npc;
201         sigset_t set;
202         unsigned seta[_COMPAT_NSIG_WORDS];
203         int err, i;
204         
205         /* Always make any pending restarted system calls return -EINTR */
206         current_thread_info()->restart_block.fn = do_no_restart_syscall;
207
208         synchronize_user_stack();
209
210         regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
211         sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
212
213         /* 1. Make sure we are not getting garbage from the user */
214         if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
215             (((unsigned long) sf) & 3))
216                 goto segv;
217
218         if (get_user(pc, &sf->info.si_regs.pc) ||
219             __get_user(npc, &sf->info.si_regs.npc))
220                 goto segv;
221
222         if ((pc | npc) & 3)
223                 goto segv;
224
225         if (test_thread_flag(TIF_32BIT)) {
226                 pc &= 0xffffffff;
227                 npc &= 0xffffffff;
228         }
229         regs->tpc = pc;
230         regs->tnpc = npc;
231
232         /* 2. Restore the state */
233         err = __get_user(regs->y, &sf->info.si_regs.y);
234         err |= __get_user(psr, &sf->info.si_regs.psr);
235
236         for (i = UREG_G1; i <= UREG_I7; i++)
237                 err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
238         if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
239                 err |= __get_user(i, &sf->v8plus.g_upper[0]);
240                 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
241                         unsigned long asi;
242
243                         for (i = UREG_G1; i <= UREG_I7; i++)
244                                 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
245                         err |= __get_user(asi, &sf->v8plus.asi);
246                         regs->tstate &= ~TSTATE_ASI;
247                         regs->tstate |= ((asi & 0xffUL) << 24UL);
248                 }
249         }
250
251         /* User can only change condition codes in %tstate. */
252         regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
253         regs->tstate |= psr_to_tstate_icc(psr);
254
255         /* Prevent syscall restart.  */
256         pt_regs_clear_syscall(regs);
257
258         err |= __get_user(fpu_save, &sf->fpu_save);
259         if (!err && fpu_save)
260                 err |= restore_fpu_state(regs, compat_ptr(fpu_save));
261         err |= __get_user(rwin_save, &sf->rwin_save);
262         if (!err && rwin_save) {
263                 if (restore_rwin_state(compat_ptr(rwin_save)))
264                         goto segv;
265         }
266         err |= __get_user(seta[0], &sf->info.si_mask);
267         err |= copy_from_user(seta+1, &sf->extramask,
268                               (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
269         if (err)
270                 goto segv;
271         switch (_NSIG_WORDS) {
272                 case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
273                 case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
274                 case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
275                 case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
276         }
277         sigdelsetmask(&set, ~_BLOCKABLE);
278         set_current_blocked(&set);
279         return;
280
281 segv:
282         force_sig(SIGSEGV, current);
283 }
284
285 asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
286 {
287         struct rt_signal_frame32 __user *sf;
288         unsigned int psr, pc, npc, u_ss_sp;
289         compat_uptr_t fpu_save;
290         compat_uptr_t rwin_save;
291         mm_segment_t old_fs;
292         sigset_t set;
293         compat_sigset_t seta;
294         stack_t st;
295         int err, i;
296         
297         /* Always make any pending restarted system calls return -EINTR */
298         current_thread_info()->restart_block.fn = do_no_restart_syscall;
299
300         synchronize_user_stack();
301         regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
302         sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
303
304         /* 1. Make sure we are not getting garbage from the user */
305         if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
306             (((unsigned long) sf) & 3))
307                 goto segv;
308
309         if (get_user(pc, &sf->regs.pc) || 
310             __get_user(npc, &sf->regs.npc))
311                 goto segv;
312
313         if ((pc | npc) & 3)
314                 goto segv;
315
316         if (test_thread_flag(TIF_32BIT)) {
317                 pc &= 0xffffffff;
318                 npc &= 0xffffffff;
319         }
320         regs->tpc = pc;
321         regs->tnpc = npc;
322
323         /* 2. Restore the state */
324         err = __get_user(regs->y, &sf->regs.y);
325         err |= __get_user(psr, &sf->regs.psr);
326         
327         for (i = UREG_G1; i <= UREG_I7; i++)
328                 err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]);
329         if ((psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS) {
330                 err |= __get_user(i, &sf->v8plus.g_upper[0]);
331                 if (i == SIGINFO_EXTRA_V8PLUS_MAGIC) {
332                         unsigned long asi;
333
334                         for (i = UREG_G1; i <= UREG_I7; i++)
335                                 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
336                         err |= __get_user(asi, &sf->v8plus.asi);
337                         regs->tstate &= ~TSTATE_ASI;
338                         regs->tstate |= ((asi & 0xffUL) << 24UL);
339                 }
340         }
341
342         /* User can only change condition codes in %tstate. */
343         regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
344         regs->tstate |= psr_to_tstate_icc(psr);
345
346         /* Prevent syscall restart.  */
347         pt_regs_clear_syscall(regs);
348
349         err |= __get_user(fpu_save, &sf->fpu_save);
350         if (!err && fpu_save)
351                 err |= restore_fpu_state(regs, compat_ptr(fpu_save));
352         err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t));
353         err |= __get_user(u_ss_sp, &sf->stack.ss_sp);
354         st.ss_sp = compat_ptr(u_ss_sp);
355         err |= __get_user(st.ss_flags, &sf->stack.ss_flags);
356         err |= __get_user(st.ss_size, &sf->stack.ss_size);
357         if (err)
358                 goto segv;
359                 
360         /* It is more difficult to avoid calling this function than to
361            call it and ignore errors.  */
362         old_fs = get_fs();
363         set_fs(KERNEL_DS);
364         do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf);
365         set_fs(old_fs);
366         
367         err |= __get_user(rwin_save, &sf->rwin_save);
368         if (!err && rwin_save) {
369                 if (restore_rwin_state(compat_ptr(rwin_save)))
370                         goto segv;
371         }
372
373         switch (_NSIG_WORDS) {
374                 case 4: set.sig[3] = seta.sig[6] + (((long)seta.sig[7]) << 32);
375                 case 3: set.sig[2] = seta.sig[4] + (((long)seta.sig[5]) << 32);
376                 case 2: set.sig[1] = seta.sig[2] + (((long)seta.sig[3]) << 32);
377                 case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32);
378         }
379         sigdelsetmask(&set, ~_BLOCKABLE);
380         set_current_blocked(&set);
381         return;
382 segv:
383         force_sig(SIGSEGV, current);
384 }
385
386 /* Checks if the fp is valid */
387 static int invalid_frame_pointer(void __user *fp, int fplen)
388 {
389         if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
390                 return 1;
391         return 0;
392 }
393
394 static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
395 {
396         unsigned long sp;
397         
398         regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
399         sp = regs->u_regs[UREG_FP];
400         
401         /*
402          * If we are on the alternate signal stack and would overflow it, don't.
403          * Return an always-bogus address instead so we will die with SIGSEGV.
404          */
405         if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
406                 return (void __user *) -1L;
407
408         /* This is the X/Open sanctioned signal stack switching.  */
409         if (sa->sa_flags & SA_ONSTACK) {
410                 if (sas_ss_flags(sp) == 0)
411                         sp = current->sas_ss_sp + current->sas_ss_size;
412         }
413
414         sp -= framesize;
415
416         /* Always align the stack frame.  This handles two cases.  First,
417          * sigaltstack need not be mindful of platform specific stack
418          * alignment.  Second, if we took this signal because the stack
419          * is not aligned properly, we'd like to take the signal cleanly
420          * and report that.
421          */
422         sp &= ~15UL;
423
424         return (void __user *) sp;
425 }
426
427 /* The I-cache flush instruction only works in the primary ASI, which
428  * right now is the nucleus, aka. kernel space.
429  *
430  * Therefore we have to kick the instructions out using the kernel
431  * side linear mapping of the physical address backing the user
432  * instructions.
433  */
434 static void flush_signal_insns(unsigned long address)
435 {
436         unsigned long pstate, paddr;
437         pte_t *ptep, pte;
438         pgd_t *pgdp;
439         pud_t *pudp;
440         pmd_t *pmdp;
441
442         /* Commit all stores of the instructions we are about to flush.  */
443         wmb();
444
445         /* Disable cross-call reception.  In this way even a very wide
446          * munmap() on another cpu can't tear down the page table
447          * hierarchy from underneath us, since that can't complete
448          * until the IPI tlb flush returns.
449          */
450
451         __asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
452         __asm__ __volatile__("wrpr %0, %1, %%pstate"
453                                 : : "r" (pstate), "i" (PSTATE_IE));
454
455         pgdp = pgd_offset(current->mm, address);
456         if (pgd_none(*pgdp))
457                 goto out_irqs_on;
458         pudp = pud_offset(pgdp, address);
459         if (pud_none(*pudp))
460                 goto out_irqs_on;
461         pmdp = pmd_offset(pudp, address);
462         if (pmd_none(*pmdp))
463                 goto out_irqs_on;
464
465         ptep = pte_offset_map(pmdp, address);
466         pte = *ptep;
467         if (!pte_present(pte))
468                 goto out_unmap;
469
470         paddr = (unsigned long) page_address(pte_page(pte));
471
472         __asm__ __volatile__("flush     %0 + %1"
473                              : /* no outputs */
474                              : "r" (paddr),
475                                "r" (address & (PAGE_SIZE - 1))
476                              : "memory");
477
478 out_unmap:
479         pte_unmap(ptep);
480 out_irqs_on:
481         __asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
482
483 }
484
485 static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
486                          int signo, sigset_t *oldset)
487 {
488         struct signal_frame32 __user *sf;
489         int i, err, wsaved;
490         void __user *tail;
491         int sigframe_size;
492         u32 psr;
493         unsigned int seta[_COMPAT_NSIG_WORDS];
494
495         /* 1. Make sure everything is clean */
496         synchronize_user_stack();
497         save_and_clear_fpu();
498         
499         wsaved = get_thread_wsaved();
500
501         sigframe_size = sizeof(*sf);
502         if (current_thread_info()->fpsaved[0] & FPRS_FEF)
503                 sigframe_size += sizeof(__siginfo_fpu_t);
504         if (wsaved)
505                 sigframe_size += sizeof(__siginfo_rwin_t);
506
507         sf = (struct signal_frame32 __user *)
508                 get_sigframe(&ka->sa, regs, sigframe_size);
509         
510         if (invalid_frame_pointer(sf, sigframe_size))
511                 goto sigill;
512
513         tail = (sf + 1);
514
515         /* 2. Save the current process state */
516         if (test_thread_flag(TIF_32BIT)) {
517                 regs->tpc &= 0xffffffff;
518                 regs->tnpc &= 0xffffffff;
519         }
520         err  = put_user(regs->tpc, &sf->info.si_regs.pc);
521         err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
522         err |= __put_user(regs->y, &sf->info.si_regs.y);
523         psr = tstate_to_psr(regs->tstate);
524         if (current_thread_info()->fpsaved[0] & FPRS_FEF)
525                 psr |= PSR_EF;
526         err |= __put_user(psr, &sf->info.si_regs.psr);
527         for (i = 0; i < 16; i++)
528                 err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]);
529         err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
530         err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
531         for (i = 1; i < 16; i++)
532                 err |= __put_user(((u32 *)regs->u_regs)[2*i],
533                                   &sf->v8plus.g_upper[i]);
534         err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
535                           &sf->v8plus.asi);
536
537         if (psr & PSR_EF) {
538                 __siginfo_fpu_t __user *fp = tail;
539                 tail += sizeof(*fp);
540                 err |= save_fpu_state(regs, fp);
541                 err |= __put_user((u64)fp, &sf->fpu_save);
542         } else {
543                 err |= __put_user(0, &sf->fpu_save);
544         }
545         if (wsaved) {
546                 __siginfo_rwin_t __user *rwp = tail;
547                 tail += sizeof(*rwp);
548                 err |= save_rwin_state(wsaved, rwp);
549                 err |= __put_user((u64)rwp, &sf->rwin_save);
550                 set_thread_wsaved(0);
551         } else {
552                 err |= __put_user(0, &sf->rwin_save);
553         }
554
555         switch (_NSIG_WORDS) {
556         case 4: seta[7] = (oldset->sig[3] >> 32);
557                 seta[6] = oldset->sig[3];
558         case 3: seta[5] = (oldset->sig[2] >> 32);
559                 seta[4] = oldset->sig[2];
560         case 2: seta[3] = (oldset->sig[1] >> 32);
561                 seta[2] = oldset->sig[1];
562         case 1: seta[1] = (oldset->sig[0] >> 32);
563                 seta[0] = oldset->sig[0];
564         }
565         err |= __put_user(seta[0], &sf->info.si_mask);
566         err |= __copy_to_user(sf->extramask, seta + 1,
567                               (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
568
569         if (!wsaved) {
570                 err |= copy_in_user((u32 __user *)sf,
571                                     (u32 __user *)(regs->u_regs[UREG_FP]),
572                                     sizeof(struct reg_window32));
573         } else {
574                 struct reg_window *rp;
575
576                 rp = &current_thread_info()->reg_window[wsaved - 1];
577                 for (i = 0; i < 8; i++)
578                         err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
579                 for (i = 0; i < 6; i++)
580                         err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
581                 err |= __put_user(rp->ins[6], &sf->ss.fp);
582                 err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
583         }       
584         if (err)
585                 goto sigsegv;
586
587         /* 3. signal handler back-trampoline and parameters */
588         regs->u_regs[UREG_FP] = (unsigned long) sf;
589         regs->u_regs[UREG_I0] = signo;
590         regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
591         regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
592
593         /* 4. signal handler */
594         regs->tpc = (unsigned long) ka->sa.sa_handler;
595         regs->tnpc = (regs->tpc + 4);
596         if (test_thread_flag(TIF_32BIT)) {
597                 regs->tpc &= 0xffffffff;
598                 regs->tnpc &= 0xffffffff;
599         }
600
601         /* 5. return to kernel instructions */
602         if (ka->ka_restorer) {
603                 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
604         } else {
605                 unsigned long address = ((unsigned long)&(sf->insns[0]));
606
607                 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
608         
609                 err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/
610                 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/
611                 if (err)
612                         goto sigsegv;
613                 flush_signal_insns(address);
614         }
615         return 0;
616
617 sigill:
618         do_exit(SIGILL);
619         return -EINVAL;
620
621 sigsegv:
622         force_sigsegv(signo, current);
623         return -EFAULT;
624 }
625
626 static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,
627                             unsigned long signr, sigset_t *oldset,
628                             siginfo_t *info)
629 {
630         struct rt_signal_frame32 __user *sf;
631         int i, err, wsaved;
632         void __user *tail;
633         int sigframe_size;
634         u32 psr;
635         compat_sigset_t seta;
636
637         /* 1. Make sure everything is clean */
638         synchronize_user_stack();
639         save_and_clear_fpu();
640         
641         wsaved = get_thread_wsaved();
642
643         sigframe_size = sizeof(*sf);
644         if (current_thread_info()->fpsaved[0] & FPRS_FEF)
645                 sigframe_size += sizeof(__siginfo_fpu_t);
646         if (wsaved)
647                 sigframe_size += sizeof(__siginfo_rwin_t);
648
649         sf = (struct rt_signal_frame32 __user *)
650                 get_sigframe(&ka->sa, regs, sigframe_size);
651         
652         if (invalid_frame_pointer(sf, sigframe_size))
653                 goto sigill;
654
655         tail = (sf + 1);
656
657         /* 2. Save the current process state */
658         if (test_thread_flag(TIF_32BIT)) {
659                 regs->tpc &= 0xffffffff;
660                 regs->tnpc &= 0xffffffff;
661         }
662         err  = put_user(regs->tpc, &sf->regs.pc);
663         err |= __put_user(regs->tnpc, &sf->regs.npc);
664         err |= __put_user(regs->y, &sf->regs.y);
665         psr = tstate_to_psr(regs->tstate);
666         if (current_thread_info()->fpsaved[0] & FPRS_FEF)
667                 psr |= PSR_EF;
668         err |= __put_user(psr, &sf->regs.psr);
669         for (i = 0; i < 16; i++)
670                 err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]);
671         err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
672         err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
673         for (i = 1; i < 16; i++)
674                 err |= __put_user(((u32 *)regs->u_regs)[2*i],
675                                   &sf->v8plus.g_upper[i]);
676         err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL,
677                           &sf->v8plus.asi);
678
679         if (psr & PSR_EF) {
680                 __siginfo_fpu_t __user *fp = tail;
681                 tail += sizeof(*fp);
682                 err |= save_fpu_state(regs, fp);
683                 err |= __put_user((u64)fp, &sf->fpu_save);
684         } else {
685                 err |= __put_user(0, &sf->fpu_save);
686         }
687         if (wsaved) {
688                 __siginfo_rwin_t __user *rwp = tail;
689                 tail += sizeof(*rwp);
690                 err |= save_rwin_state(wsaved, rwp);
691                 err |= __put_user((u64)rwp, &sf->rwin_save);
692                 set_thread_wsaved(0);
693         } else {
694                 err |= __put_user(0, &sf->rwin_save);
695         }
696
697         /* Update the siginfo structure.  */
698         err |= copy_siginfo_to_user32(&sf->info, info);
699         
700         /* Setup sigaltstack */
701         err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
702         err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
703         err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
704
705         switch (_NSIG_WORDS) {
706         case 4: seta.sig[7] = (oldset->sig[3] >> 32);
707                 seta.sig[6] = oldset->sig[3];
708         case 3: seta.sig[5] = (oldset->sig[2] >> 32);
709                 seta.sig[4] = oldset->sig[2];
710         case 2: seta.sig[3] = (oldset->sig[1] >> 32);
711                 seta.sig[2] = oldset->sig[1];
712         case 1: seta.sig[1] = (oldset->sig[0] >> 32);
713                 seta.sig[0] = oldset->sig[0];
714         }
715         err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t));
716
717         if (!wsaved) {
718                 err |= copy_in_user((u32 __user *)sf,
719                                     (u32 __user *)(regs->u_regs[UREG_FP]),
720                                     sizeof(struct reg_window32));
721         } else {
722                 struct reg_window *rp;
723
724                 rp = &current_thread_info()->reg_window[wsaved - 1];
725                 for (i = 0; i < 8; i++)
726                         err |= __put_user(rp->locals[i], &sf->ss.locals[i]);
727                 for (i = 0; i < 6; i++)
728                         err |= __put_user(rp->ins[i], &sf->ss.ins[i]);
729                 err |= __put_user(rp->ins[6], &sf->ss.fp);
730                 err |= __put_user(rp->ins[7], &sf->ss.callers_pc);
731         }
732         if (err)
733                 goto sigsegv;
734         
735         /* 3. signal handler back-trampoline and parameters */
736         regs->u_regs[UREG_FP] = (unsigned long) sf;
737         regs->u_regs[UREG_I0] = signr;
738         regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
739         regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
740
741         /* 4. signal handler */
742         regs->tpc = (unsigned long) ka->sa.sa_handler;
743         regs->tnpc = (regs->tpc + 4);
744         if (test_thread_flag(TIF_32BIT)) {
745                 regs->tpc &= 0xffffffff;
746                 regs->tnpc &= 0xffffffff;
747         }
748
749         /* 5. return to kernel instructions */
750         if (ka->ka_restorer)
751                 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
752         else {
753                 unsigned long address = ((unsigned long)&(sf->insns[0]));
754
755                 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2);
756         
757                 /* mov __NR_rt_sigreturn, %g1 */
758                 err |= __put_user(0x82102065, &sf->insns[0]);
759
760                 /* t 0x10 */
761                 err |= __put_user(0x91d02010, &sf->insns[1]);
762                 if (err)
763                         goto sigsegv;
764
765                 flush_signal_insns(address);
766         }
767         return 0;
768
769 sigill:
770         do_exit(SIGILL);
771         return -EINVAL;
772
773 sigsegv:
774         force_sigsegv(signr, current);
775         return -EFAULT;
776 }
777
778 static inline int handle_signal32(unsigned long signr, struct k_sigaction *ka,
779                                   siginfo_t *info,
780                                   sigset_t *oldset, struct pt_regs *regs)
781 {
782         int err;
783
784         if (ka->sa.sa_flags & SA_SIGINFO)
785                 err = setup_rt_frame32(ka, regs, signr, oldset, info);
786         else
787                 err = setup_frame32(ka, regs, signr, oldset);
788
789         if (err)
790                 return err;
791
792         block_sigmask(ka, signr);
793         tracehook_signal_handler(signr, info, ka, regs, 0);
794
795         return 0;
796 }
797
798 static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs,
799                                      struct sigaction *sa)
800 {
801         switch (regs->u_regs[UREG_I0]) {
802         case ERESTART_RESTARTBLOCK:
803         case ERESTARTNOHAND:
804         no_system_call_restart:
805                 regs->u_regs[UREG_I0] = EINTR;
806                 regs->tstate |= TSTATE_ICARRY;
807                 break;
808         case ERESTARTSYS:
809                 if (!(sa->sa_flags & SA_RESTART))
810                         goto no_system_call_restart;
811                 /* fallthrough */
812         case ERESTARTNOINTR:
813                 regs->u_regs[UREG_I0] = orig_i0;
814                 regs->tpc -= 4;
815                 regs->tnpc -= 4;
816         }
817 }
818
819 /* Note that 'init' is a special process: it doesn't get signals it doesn't
820  * want to handle. Thus you cannot kill init even with a SIGKILL even by
821  * mistake.
822  */
823 void do_signal32(sigset_t *oldset, struct pt_regs * regs)
824 {
825         struct k_sigaction ka;
826         unsigned long orig_i0;
827         int restart_syscall;
828         siginfo_t info;
829         int signr;
830         
831         signr = get_signal_to_deliver(&info, &ka, regs, NULL);
832
833         restart_syscall = 0;
834         orig_i0 = 0;
835         if (pt_regs_is_syscall(regs) &&
836             (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {
837                 restart_syscall = 1;
838                 orig_i0 = regs->u_regs[UREG_G6];
839         }
840
841         if (signr > 0) {
842                 if (restart_syscall)
843                         syscall_restart32(orig_i0, regs, &ka.sa);
844                 if (handle_signal32(signr, &ka, &info, oldset, regs) == 0) {
845                         /* A signal was successfully delivered; the saved
846                          * sigmask will have been stored in the signal frame,
847                          * and will be restored by sigreturn, so we can simply
848                          * clear the TS_RESTORE_SIGMASK flag.
849                          */
850                         current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
851                 }
852                 return;
853         }
854         if (restart_syscall &&
855             (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
856              regs->u_regs[UREG_I0] == ERESTARTSYS ||
857              regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
858                 /* replay the system call when we are done */
859                 regs->u_regs[UREG_I0] = orig_i0;
860                 regs->tpc -= 4;
861                 regs->tnpc -= 4;
862                 pt_regs_clear_syscall(regs);
863         }
864         if (restart_syscall &&
865             regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
866                 regs->u_regs[UREG_G1] = __NR_restart_syscall;
867                 regs->tpc -= 4;
868                 regs->tnpc -= 4;
869                 pt_regs_clear_syscall(regs);
870         }
871
872         /* If there's no signal to deliver, we just put the saved sigmask
873          * back
874          */
875         if (current_thread_info()->status & TS_RESTORE_SIGMASK) {
876                 current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
877                 set_current_blocked(&current->saved_sigmask);
878         }
879 }
880
881 struct sigstack32 {
882         u32 the_stack;
883         int cur_status;
884 };
885
886 asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
887 {
888         struct sigstack32 __user *ssptr =
889                 (struct sigstack32 __user *)((unsigned long)(u_ssptr));
890         struct sigstack32 __user *ossptr =
891                 (struct sigstack32 __user *)((unsigned long)(u_ossptr));
892         int ret = -EFAULT;
893
894         /* First see if old state is wanted. */
895         if (ossptr) {
896                 if (put_user(current->sas_ss_sp + current->sas_ss_size,
897                              &ossptr->the_stack) ||
898                     __put_user(on_sig_stack(sp), &ossptr->cur_status))
899                         goto out;
900         }
901         
902         /* Now see if we want to update the new state. */
903         if (ssptr) {
904                 u32 ss_sp;
905
906                 if (get_user(ss_sp, &ssptr->the_stack))
907                         goto out;
908
909                 /* If the current stack was set with sigaltstack, don't
910                  * swap stacks while we are on it.
911                  */
912                 ret = -EPERM;
913                 if (current->sas_ss_sp && on_sig_stack(sp))
914                         goto out;
915                         
916                 /* Since we don't know the extent of the stack, and we don't
917                  * track onstack-ness, but rather calculate it, we must
918                  * presume a size.  Ho hum this interface is lossy.
919                  */
920                 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
921                 current->sas_ss_size = SIGSTKSZ;
922         }
923         
924         ret = 0;
925 out:
926         return ret;
927 }
928
929 asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp)
930 {
931         stack_t uss, uoss;
932         u32 u_ss_sp = 0;
933         int ret;
934         mm_segment_t old_fs;
935         stack_t32 __user *uss32 = compat_ptr(ussa);
936         stack_t32 __user *uoss32 = compat_ptr(uossa);
937         
938         if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) ||
939                     __get_user(uss.ss_flags, &uss32->ss_flags) ||
940                     __get_user(uss.ss_size, &uss32->ss_size)))
941                 return -EFAULT;
942         uss.ss_sp = compat_ptr(u_ss_sp);
943         old_fs = get_fs();
944         set_fs(KERNEL_DS);
945         ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL,
946                              uossa ? (stack_t __user *) &uoss : NULL, sp);
947         set_fs(old_fs);
948         if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) ||
949                     __put_user(uoss.ss_flags, &uoss32->ss_flags) ||
950                     __put_user(uoss.ss_size, &uoss32->ss_size)))
951                 return -EFAULT;
952         return ret;
953 }