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