Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / arch / sparc / kernel / signal_32.c
1 /*  linux/arch/sparc/kernel/signal.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  */
8
9 #include <linux/sched.h>
10 #include <linux/kernel.h>
11 #include <linux/signal.h>
12 #include <linux/errno.h>
13 #include <linux/wait.h>
14 #include <linux/ptrace.h>
15 #include <linux/unistd.h>
16 #include <linux/mm.h>
17 #include <linux/tty.h>
18 #include <linux/smp.h>
19 #include <linux/binfmts.h>      /* do_coredum */
20 #include <linux/bitops.h>
21 #include <linux/tracehook.h>
22
23 #include <asm/uaccess.h>
24 #include <asm/ptrace.h>
25 #include <asm/pgalloc.h>
26 #include <asm/pgtable.h>
27 #include <asm/cacheflush.h>     /* flush_sig_insns */
28 #include <asm/switch_to.h>
29
30 #include "sigutil.h"
31 #include "kernel.h"
32
33 extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
34                    void *fpqueue, unsigned long *fpqdepth);
35 extern void fpload(unsigned long *fpregs, unsigned long *fsr);
36
37 struct signal_frame {
38         struct sparc_stackf     ss;
39         __siginfo32_t           info;
40         __siginfo_fpu_t __user  *fpu_save;
41         unsigned long           insns[2] __attribute__ ((aligned (8)));
42         unsigned int            extramask[_NSIG_WORDS - 1];
43         unsigned int            extra_size; /* Should be 0 */
44         __siginfo_rwin_t __user *rwin_save;
45 } __attribute__((aligned(8)));
46
47 struct rt_signal_frame {
48         struct sparc_stackf     ss;
49         siginfo_t               info;
50         struct pt_regs          regs;
51         sigset_t                mask;
52         __siginfo_fpu_t __user  *fpu_save;
53         unsigned int            insns[2];
54         stack_t                 stack;
55         unsigned int            extra_size; /* Should be 0 */
56         __siginfo_rwin_t __user *rwin_save;
57 } __attribute__((aligned(8)));
58
59 /* Align macros */
60 #define SF_ALIGNEDSZ  (((sizeof(struct signal_frame) + 7) & (~7)))
61 #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame) + 7) & (~7)))
62
63 asmlinkage void do_sigreturn(struct pt_regs *regs)
64 {
65         struct signal_frame __user *sf;
66         unsigned long up_psr, pc, npc;
67         sigset_t set;
68         __siginfo_fpu_t __user *fpu_save;
69         __siginfo_rwin_t __user *rwin_save;
70         int err;
71
72         /* Always make any pending restarted system calls return -EINTR */
73         current->restart_block.fn = do_no_restart_syscall;
74
75         synchronize_user_stack();
76
77         sf = (struct signal_frame __user *) regs->u_regs[UREG_FP];
78
79         /* 1. Make sure we are not getting garbage from the user */
80         if (!access_ok(VERIFY_READ, sf, sizeof(*sf)))
81                 goto segv_and_exit;
82
83         if (((unsigned long) sf) & 3)
84                 goto segv_and_exit;
85
86         err = __get_user(pc,  &sf->info.si_regs.pc);
87         err |= __get_user(npc, &sf->info.si_regs.npc);
88
89         if ((pc | npc) & 3)
90                 goto segv_and_exit;
91
92         /* 2. Restore the state */
93         up_psr = regs->psr;
94         err |= __copy_from_user(regs, &sf->info.si_regs, sizeof(struct pt_regs));
95
96         /* User can only change condition codes and FPU enabling in %psr. */
97         regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
98                   | (regs->psr & (PSR_ICC | PSR_EF));
99
100         /* Prevent syscall restart.  */
101         pt_regs_clear_syscall(regs);
102
103         err |= __get_user(fpu_save, &sf->fpu_save);
104         if (fpu_save)
105                 err |= restore_fpu_state(regs, fpu_save);
106         err |= __get_user(rwin_save, &sf->rwin_save);
107         if (rwin_save)
108                 err |= restore_rwin_state(rwin_save);
109
110         /* This is pretty much atomic, no amount locking would prevent
111          * the races which exist anyways.
112          */
113         err |= __get_user(set.sig[0], &sf->info.si_mask);
114         err |= __copy_from_user(&set.sig[1], &sf->extramask,
115                                 (_NSIG_WORDS-1) * sizeof(unsigned int));
116                            
117         if (err)
118                 goto segv_and_exit;
119
120         set_current_blocked(&set);
121         return;
122
123 segv_and_exit:
124         force_sig(SIGSEGV, current);
125 }
126
127 asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
128 {
129         struct rt_signal_frame __user *sf;
130         unsigned int psr, pc, npc;
131         __siginfo_fpu_t __user *fpu_save;
132         __siginfo_rwin_t __user *rwin_save;
133         sigset_t set;
134         int err;
135
136         synchronize_user_stack();
137         sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
138         if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
139             (((unsigned long) sf) & 0x03))
140                 goto segv;
141
142         err = __get_user(pc, &sf->regs.pc);
143         err |= __get_user(npc, &sf->regs.npc);
144         err |= ((pc | npc) & 0x03);
145
146         err |= __get_user(regs->y, &sf->regs.y);
147         err |= __get_user(psr, &sf->regs.psr);
148
149         err |= __copy_from_user(&regs->u_regs[UREG_G1],
150                                 &sf->regs.u_regs[UREG_G1], 15 * sizeof(u32));
151
152         regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
153
154         /* Prevent syscall restart.  */
155         pt_regs_clear_syscall(regs);
156
157         err |= __get_user(fpu_save, &sf->fpu_save);
158         if (!err && fpu_save)
159                 err |= restore_fpu_state(regs, fpu_save);
160         err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
161         err |= restore_altstack(&sf->stack);
162         
163         if (err)
164                 goto segv;
165                 
166         regs->pc = pc;
167         regs->npc = npc;
168         
169         err |= __get_user(rwin_save, &sf->rwin_save);
170         if (!err && rwin_save) {
171                 if (restore_rwin_state(rwin_save))
172                         goto segv;
173         }
174
175         set_current_blocked(&set);
176         return;
177 segv:
178         force_sig(SIGSEGV, current);
179 }
180
181 /* Checks if the fp is valid */
182 static inline int invalid_frame_pointer(void __user *fp, int fplen)
183 {
184         if ((((unsigned long) fp) & 7) || !__access_ok((unsigned long)fp, fplen))
185                 return 1;
186
187         return 0;
188 }
189
190 static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
191 {
192         unsigned long sp = regs->u_regs[UREG_FP];
193
194         /*
195          * If we are on the alternate signal stack and would overflow it, don't.
196          * Return an always-bogus address instead so we will die with SIGSEGV.
197          */
198         if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
199                 return (void __user *) -1L;
200
201         /* This is the X/Open sanctioned signal stack switching.  */
202         sp = sigsp(sp, ksig) - framesize;
203
204         /* Always align the stack frame.  This handles two cases.  First,
205          * sigaltstack need not be mindful of platform specific stack
206          * alignment.  Second, if we took this signal because the stack
207          * is not aligned properly, we'd like to take the signal cleanly
208          * and report that.
209          */
210         sp &= ~15UL;
211
212         return (void __user *) sp;
213 }
214
215 static int setup_frame(struct ksignal *ksig, struct pt_regs *regs,
216                        sigset_t *oldset)
217 {
218         struct signal_frame __user *sf;
219         int sigframe_size, err, wsaved;
220         void __user *tail;
221
222         /* 1. Make sure everything is clean */
223         synchronize_user_stack();
224
225         wsaved = current_thread_info()->w_saved;
226
227         sigframe_size = sizeof(*sf);
228         if (used_math())
229                 sigframe_size += sizeof(__siginfo_fpu_t);
230         if (wsaved)
231                 sigframe_size += sizeof(__siginfo_rwin_t);
232
233         sf = (struct signal_frame __user *)
234                 get_sigframe(ksig, regs, sigframe_size);
235
236         if (invalid_frame_pointer(sf, sigframe_size)) {
237                 do_exit(SIGILL);
238                 return -EINVAL;
239         }
240
241         tail = sf + 1;
242
243         /* 2. Save the current process state */
244         err = __copy_to_user(&sf->info.si_regs, regs, sizeof(struct pt_regs));
245         
246         err |= __put_user(0, &sf->extra_size);
247
248         if (used_math()) {
249                 __siginfo_fpu_t __user *fp = tail;
250                 tail += sizeof(*fp);
251                 err |= save_fpu_state(regs, fp);
252                 err |= __put_user(fp, &sf->fpu_save);
253         } else {
254                 err |= __put_user(0, &sf->fpu_save);
255         }
256         if (wsaved) {
257                 __siginfo_rwin_t __user *rwp = tail;
258                 tail += sizeof(*rwp);
259                 err |= save_rwin_state(wsaved, rwp);
260                 err |= __put_user(rwp, &sf->rwin_save);
261         } else {
262                 err |= __put_user(0, &sf->rwin_save);
263         }
264
265         err |= __put_user(oldset->sig[0], &sf->info.si_mask);
266         err |= __copy_to_user(sf->extramask, &oldset->sig[1],
267                               (_NSIG_WORDS - 1) * sizeof(unsigned int));
268         if (!wsaved) {
269                 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
270                                       sizeof(struct reg_window32));
271         } else {
272                 struct reg_window32 *rp;
273
274                 rp = &current_thread_info()->reg_window[wsaved - 1];
275                 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
276         }
277         if (err)
278                 return err;
279         
280         /* 3. signal handler back-trampoline and parameters */
281         regs->u_regs[UREG_FP] = (unsigned long) sf;
282         regs->u_regs[UREG_I0] = ksig->sig;
283         regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
284         regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
285
286         /* 4. signal handler */
287         regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
288         regs->npc = (regs->pc + 4);
289
290         /* 5. return to kernel instructions */
291         if (ksig->ka.ka_restorer)
292                 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
293         else {
294                 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
295
296                 /* mov __NR_sigreturn, %g1 */
297                 err |= __put_user(0x821020d8, &sf->insns[0]);
298
299                 /* t 0x10 */
300                 err |= __put_user(0x91d02010, &sf->insns[1]);
301                 if (err)
302                         return err;
303
304                 /* Flush instruction space. */
305                 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
306         }
307         return 0;
308 }
309
310 static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
311                           sigset_t *oldset)
312 {
313         struct rt_signal_frame __user *sf;
314         int sigframe_size, wsaved;
315         void __user *tail;
316         unsigned int psr;
317         int err;
318
319         synchronize_user_stack();
320         wsaved = current_thread_info()->w_saved;
321         sigframe_size = sizeof(*sf);
322         if (used_math())
323                 sigframe_size += sizeof(__siginfo_fpu_t);
324         if (wsaved)
325                 sigframe_size += sizeof(__siginfo_rwin_t);
326         sf = (struct rt_signal_frame __user *)
327                 get_sigframe(ksig, regs, sigframe_size);
328         if (invalid_frame_pointer(sf, sigframe_size)) {
329                 do_exit(SIGILL);
330                 return -EINVAL;
331         }
332
333         tail = sf + 1;
334         err  = __put_user(regs->pc, &sf->regs.pc);
335         err |= __put_user(regs->npc, &sf->regs.npc);
336         err |= __put_user(regs->y, &sf->regs.y);
337         psr = regs->psr;
338         if (used_math())
339                 psr |= PSR_EF;
340         err |= __put_user(psr, &sf->regs.psr);
341         err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
342         err |= __put_user(0, &sf->extra_size);
343
344         if (psr & PSR_EF) {
345                 __siginfo_fpu_t __user *fp = tail;
346                 tail += sizeof(*fp);
347                 err |= save_fpu_state(regs, fp);
348                 err |= __put_user(fp, &sf->fpu_save);
349         } else {
350                 err |= __put_user(0, &sf->fpu_save);
351         }
352         if (wsaved) {
353                 __siginfo_rwin_t __user *rwp = tail;
354                 tail += sizeof(*rwp);
355                 err |= save_rwin_state(wsaved, rwp);
356                 err |= __put_user(rwp, &sf->rwin_save);
357         } else {
358                 err |= __put_user(0, &sf->rwin_save);
359         }
360         err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
361         
362         /* Setup sigaltstack */
363         err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
364         
365         if (!wsaved) {
366                 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
367                                       sizeof(struct reg_window32));
368         } else {
369                 struct reg_window32 *rp;
370
371                 rp = &current_thread_info()->reg_window[wsaved - 1];
372                 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
373         }
374
375         err |= copy_siginfo_to_user(&sf->info, &ksig->info);
376
377         if (err)
378                 return err;
379
380         regs->u_regs[UREG_FP] = (unsigned long) sf;
381         regs->u_regs[UREG_I0] = ksig->sig;
382         regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
383         regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
384
385         regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
386         regs->npc = (regs->pc + 4);
387
388         if (ksig->ka.ka_restorer)
389                 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
390         else {
391                 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
392
393                 /* mov __NR_sigreturn, %g1 */
394                 err |= __put_user(0x821020d8, &sf->insns[0]);
395
396                 /* t 0x10 */
397                 err |= __put_user(0x91d02010, &sf->insns[1]);
398                 if (err)
399                         return err;
400
401                 /* Flush instruction space. */
402                 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
403         }
404         return 0;
405 }
406
407 static inline void
408 handle_signal(struct ksignal *ksig, struct pt_regs *regs)
409 {
410         sigset_t *oldset = sigmask_to_save();
411         int err;
412
413         if (ksig->ka.sa.sa_flags & SA_SIGINFO)
414                 err = setup_rt_frame(ksig, regs, oldset);
415         else
416                 err = setup_frame(ksig, regs, oldset);
417         signal_setup_done(err, ksig, 0);
418 }
419
420 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
421                                    struct sigaction *sa)
422 {
423         switch(regs->u_regs[UREG_I0]) {
424         case ERESTART_RESTARTBLOCK:
425         case ERESTARTNOHAND:
426         no_system_call_restart:
427                 regs->u_regs[UREG_I0] = EINTR;
428                 regs->psr |= PSR_C;
429                 break;
430         case ERESTARTSYS:
431                 if (!(sa->sa_flags & SA_RESTART))
432                         goto no_system_call_restart;
433                 /* fallthrough */
434         case ERESTARTNOINTR:
435                 regs->u_regs[UREG_I0] = orig_i0;
436                 regs->pc -= 4;
437                 regs->npc -= 4;
438         }
439 }
440
441 /* Note that 'init' is a special process: it doesn't get signals it doesn't
442  * want to handle. Thus you cannot kill init even with a SIGKILL even by
443  * mistake.
444  */
445 static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
446 {
447         struct ksignal ksig;
448         int restart_syscall;
449         bool has_handler;
450
451         /* It's a lot of work and synchronization to add a new ptrace
452          * register for GDB to save and restore in order to get
453          * orig_i0 correct for syscall restarts when debugging.
454          *
455          * Although it should be the case that most of the global
456          * registers are volatile across a system call, glibc already
457          * depends upon that fact that we preserve them.  So we can't
458          * just use any global register to save away the orig_i0 value.
459          *
460          * In particular %g2, %g3, %g4, and %g5 are all assumed to be
461          * preserved across a system call trap by various pieces of
462          * code in glibc.
463          *
464          * %g7 is used as the "thread register".   %g6 is not used in
465          * any fixed manner.  %g6 is used as a scratch register and
466          * a compiler temporary, but it's value is never used across
467          * a system call.  Therefore %g6 is usable for orig_i0 storage.
468          */
469         if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
470                 regs->u_regs[UREG_G6] = orig_i0;
471
472         has_handler = get_signal(&ksig);
473
474         /* If the debugger messes with the program counter, it clears
475          * the software "in syscall" bit, directing us to not perform
476          * a syscall restart.
477          */
478         restart_syscall = 0;
479         if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) {
480                 restart_syscall = 1;
481                 orig_i0 = regs->u_regs[UREG_G6];
482         }
483
484         if (has_handler) {
485                 if (restart_syscall)
486                         syscall_restart(orig_i0, regs, &ksig.ka.sa);
487                 handle_signal(&ksig, regs);
488         } else {
489                 if (restart_syscall) {
490                         switch (regs->u_regs[UREG_I0]) {
491                         case ERESTARTNOHAND:
492                         case ERESTARTSYS:
493                         case ERESTARTNOINTR:
494                                 /* replay the system call when we are done */
495                                 regs->u_regs[UREG_I0] = orig_i0;
496                                 regs->pc -= 4;
497                                 regs->npc -= 4;
498                                 pt_regs_clear_syscall(regs);
499                         case ERESTART_RESTARTBLOCK:
500                                 regs->u_regs[UREG_G1] = __NR_restart_syscall;
501                                 regs->pc -= 4;
502                                 regs->npc -= 4;
503                                 pt_regs_clear_syscall(regs);
504                         }
505                 }
506                 restore_saved_sigmask();
507         }
508 }
509
510 void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0,
511                       unsigned long thread_info_flags)
512 {
513         if (thread_info_flags & _TIF_SIGPENDING)
514                 do_signal(regs, orig_i0);
515         if (thread_info_flags & _TIF_NOTIFY_RESUME) {
516                 clear_thread_flag(TIF_NOTIFY_RESUME);
517                 tracehook_notify_resume(regs);
518         }
519 }
520
521 asmlinkage int do_sys_sigstack(struct sigstack __user *ssptr,
522                                struct sigstack __user *ossptr,
523                                unsigned long sp)
524 {
525         int ret = -EFAULT;
526
527         /* First see if old state is wanted. */
528         if (ossptr) {
529                 if (put_user(current->sas_ss_sp + current->sas_ss_size,
530                              &ossptr->the_stack) ||
531                     __put_user(on_sig_stack(sp), &ossptr->cur_status))
532                         goto out;
533         }
534
535         /* Now see if we want to update the new state. */
536         if (ssptr) {
537                 char *ss_sp;
538
539                 if (get_user(ss_sp, &ssptr->the_stack))
540                         goto out;
541                 /* If the current stack was set with sigaltstack, don't
542                    swap stacks while we are on it.  */
543                 ret = -EPERM;
544                 if (current->sas_ss_sp && on_sig_stack(sp))
545                         goto out;
546
547                 /* Since we don't know the extent of the stack, and we don't
548                    track onstack-ness, but rather calculate it, we must
549                    presume a size.  Ho hum this interface is lossy.  */
550                 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
551                 current->sas_ss_size = SIGSTKSZ;
552         }
553         ret = 0;
554 out:
555         return ret;
556 }