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