sparc64: Kill bogus RT_ALIGNEDSZ macro from signal.c
[deliverable/linux.git] / arch / sparc / kernel / signal.c
CommitLineData
1da177e4
LT
1/* $Id: signal.c,v 1.110 2002/02/08 03:57:14 davem Exp $
2 * linux/arch/sparc/kernel/signal.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 */
9
1da177e4
LT
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/smp.h>
1da177e4
LT
20#include <linux/binfmts.h> /* do_coredum */
21#include <linux/bitops.h>
22
23#include <asm/uaccess.h>
24#include <asm/ptrace.h>
1da177e4
LT
25#include <asm/pgalloc.h>
26#include <asm/pgtable.h>
27#include <asm/cacheflush.h> /* flush_sig_insns */
28
29#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
30
31extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
32 void *fpqueue, unsigned long *fpqdepth);
33extern void fpload(unsigned long *fpregs, unsigned long *fsr);
34
1da177e4
LT
35/* Signal frames: the original one (compatible with SunOS):
36 *
37 * Set up a signal frame... Make the stack look the way SunOS
38 * expects it to look which is basically:
39 *
40 * ---------------------------------- <-- %sp at signal time
41 * Struct sigcontext
42 * Signal address
43 * Ptr to sigcontext area above
44 * Signal code
45 * The signal number itself
46 * One register window
47 * ---------------------------------- <-- New %sp
48 */
49struct signal_sframe {
50 struct reg_window sig_window;
51 int sig_num;
52 int sig_code;
53 struct sigcontext __user *sig_scptr;
54 int sig_address;
55 struct sigcontext sig_context;
56 unsigned int extramask[_NSIG_WORDS - 1];
57};
58
59/*
60 * And the new one, intended to be used for Linux applications only
61 * (we have enough in there to work with clone).
62 * All the interesting bits are in the info field.
63 */
64
65struct new_signal_frame {
66 struct sparc_stackf ss;
67 __siginfo_t info;
68 __siginfo_fpu_t __user *fpu_save;
69 unsigned long insns[2] __attribute__ ((aligned (8)));
70 unsigned int extramask[_NSIG_WORDS - 1];
71 unsigned int extra_size; /* Should be 0 */
72 __siginfo_fpu_t fpu_state;
73};
74
75struct rt_signal_frame {
76 struct sparc_stackf ss;
77 siginfo_t info;
78 struct pt_regs regs;
79 sigset_t mask;
80 __siginfo_fpu_t __user *fpu_save;
81 unsigned int insns[2];
82 stack_t stack;
83 unsigned int extra_size; /* Should be 0 */
84 __siginfo_fpu_t fpu_state;
85};
86
87/* Align macros */
88#define SF_ALIGNEDSZ (((sizeof(struct signal_sframe) + 7) & (~7)))
89#define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7)))
90#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
91
2d7d5f05 92static int _sigpause_common(old_sigset_t set)
1da177e4 93{
1da177e4
LT
94 set &= _BLOCKABLE;
95 spin_lock_irq(&current->sighand->siglock);
2d7d5f05 96 current->saved_sigmask = current->blocked;
1da177e4
LT
97 siginitset(&current->blocked, set);
98 recalc_sigpending();
99 spin_unlock_irq(&current->sighand->siglock);
100
2d7d5f05
DM
101 current->state = TASK_INTERRUPTIBLE;
102 schedule();
103 set_thread_flag(TIF_RESTORE_SIGMASK);
1da177e4 104
2d7d5f05 105 return -ERESTARTNOHAND;
1da177e4
LT
106}
107
2d7d5f05 108asmlinkage int sys_sigsuspend(old_sigset_t set)
1da177e4 109{
2d7d5f05 110 return _sigpause_common(set);
1da177e4
LT
111}
112
113static inline int
114restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
115{
116 int err;
117#ifdef CONFIG_SMP
118 if (test_tsk_thread_flag(current, TIF_USEDFPU))
119 regs->psr &= ~PSR_EF;
120#else
121 if (current == last_task_used_math) {
122 last_task_used_math = NULL;
123 regs->psr &= ~PSR_EF;
124 }
125#endif
126 set_used_math();
127 clear_tsk_thread_flag(current, TIF_USEDFPU);
128
129 if (!access_ok(VERIFY_READ, fpu, sizeof(*fpu)))
130 return -EFAULT;
131
132 err = __copy_from_user(&current->thread.float_regs[0], &fpu->si_float_regs[0],
133 (sizeof(unsigned long) * 32));
134 err |= __get_user(current->thread.fsr, &fpu->si_fsr);
135 err |= __get_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
136 if (current->thread.fpqdepth != 0)
137 err |= __copy_from_user(&current->thread.fpqueue[0],
138 &fpu->si_fpqueue[0],
139 ((sizeof(unsigned long) +
140 (sizeof(unsigned long *)))*16));
141 return err;
142}
143
144static inline void do_new_sigreturn (struct pt_regs *regs)
145{
146 struct new_signal_frame __user *sf;
147 unsigned long up_psr, pc, npc;
148 sigset_t set;
149 __siginfo_fpu_t __user *fpu_save;
150 int err;
151
152 sf = (struct new_signal_frame __user *) regs->u_regs[UREG_FP];
153
154 /* 1. Make sure we are not getting garbage from the user */
155 if (!access_ok(VERIFY_READ, sf, sizeof(*sf)))
156 goto segv_and_exit;
157
158 if (((unsigned long) sf) & 3)
159 goto segv_and_exit;
160
161 err = __get_user(pc, &sf->info.si_regs.pc);
162 err |= __get_user(npc, &sf->info.si_regs.npc);
163
164 if ((pc | npc) & 3)
165 goto segv_and_exit;
166
167 /* 2. Restore the state */
168 up_psr = regs->psr;
169 err |= __copy_from_user(regs, &sf->info.si_regs, sizeof(struct pt_regs));
170
171 /* User can only change condition codes and FPU enabling in %psr. */
172 regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
173 | (regs->psr & (PSR_ICC | PSR_EF));
174
175 err |= __get_user(fpu_save, &sf->fpu_save);
176
177 if (fpu_save)
178 err |= restore_fpu_state(regs, fpu_save);
179
180 /* This is pretty much atomic, no amount locking would prevent
181 * the races which exist anyways.
182 */
183 err |= __get_user(set.sig[0], &sf->info.si_mask);
184 err |= __copy_from_user(&set.sig[1], &sf->extramask,
185 (_NSIG_WORDS-1) * sizeof(unsigned int));
186
187 if (err)
188 goto segv_and_exit;
189
190 sigdelsetmask(&set, ~_BLOCKABLE);
191 spin_lock_irq(&current->sighand->siglock);
192 current->blocked = set;
193 recalc_sigpending();
194 spin_unlock_irq(&current->sighand->siglock);
195 return;
196
197segv_and_exit:
198 force_sig(SIGSEGV, current);
199}
200
201asmlinkage void do_sigreturn(struct pt_regs *regs)
202{
203 struct sigcontext __user *scptr;
204 unsigned long pc, npc, psr;
205 sigset_t set;
206 int err;
207
208 /* Always make any pending restarted system calls return -EINTR */
209 current_thread_info()->restart_block.fn = do_no_restart_syscall;
210
211 synchronize_user_stack();
212
213 if (current->thread.new_signal) {
214 do_new_sigreturn(regs);
215 return;
216 }
217
218 scptr = (struct sigcontext __user *) regs->u_regs[UREG_I0];
219
220 /* Check sanity of the user arg. */
221 if (!access_ok(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
222 (((unsigned long) scptr) & 3))
223 goto segv_and_exit;
224
225 err = __get_user(pc, &scptr->sigc_pc);
226 err |= __get_user(npc, &scptr->sigc_npc);
227
228 if ((pc | npc) & 3)
229 goto segv_and_exit;
230
231 /* This is pretty much atomic, no amount locking would prevent
232 * the races which exist anyways.
233 */
234 err |= __get_user(set.sig[0], &scptr->sigc_mask);
235 /* Note that scptr + 1 points to extramask */
236 err |= __copy_from_user(&set.sig[1], scptr + 1,
237 (_NSIG_WORDS - 1) * sizeof(unsigned int));
238
239 if (err)
240 goto segv_and_exit;
241
242 sigdelsetmask(&set, ~_BLOCKABLE);
243 spin_lock_irq(&current->sighand->siglock);
244 current->blocked = set;
245 recalc_sigpending();
246 spin_unlock_irq(&current->sighand->siglock);
247
248 regs->pc = pc;
249 regs->npc = npc;
250
251 err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
252 err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
253 err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
254
255 /* User can only change condition codes in %psr. */
256 err |= __get_user(psr, &scptr->sigc_psr);
257 if (err)
258 goto segv_and_exit;
259
260 regs->psr &= ~(PSR_ICC);
261 regs->psr |= (psr & PSR_ICC);
262 return;
263
264segv_and_exit:
265 force_sig(SIGSEGV, current);
266}
267
268asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
269{
270 struct rt_signal_frame __user *sf;
271 unsigned int psr, pc, npc;
272 __siginfo_fpu_t __user *fpu_save;
273 mm_segment_t old_fs;
274 sigset_t set;
275 stack_t st;
276 int err;
277
278 synchronize_user_stack();
279 sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
280 if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
281 (((unsigned long) sf) & 0x03))
282 goto segv;
283
284 err = __get_user(pc, &sf->regs.pc);
285 err |= __get_user(npc, &sf->regs.npc);
286 err |= ((pc | npc) & 0x03);
287
288 err |= __get_user(regs->y, &sf->regs.y);
289 err |= __get_user(psr, &sf->regs.psr);
290
291 err |= __copy_from_user(&regs->u_regs[UREG_G1],
292 &sf->regs.u_regs[UREG_G1], 15 * sizeof(u32));
293
294 regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
295
296 err |= __get_user(fpu_save, &sf->fpu_save);
297
298 if (fpu_save)
299 err |= restore_fpu_state(regs, fpu_save);
300 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
301
302 err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t));
303
304 if (err)
305 goto segv;
306
307 regs->pc = pc;
308 regs->npc = npc;
309
310 /* It is more difficult to avoid calling this function than to
311 * call it and ignore errors.
312 */
313 old_fs = get_fs();
314 set_fs(KERNEL_DS);
315 do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf);
316 set_fs(old_fs);
317
318 sigdelsetmask(&set, ~_BLOCKABLE);
319 spin_lock_irq(&current->sighand->siglock);
320 current->blocked = set;
321 recalc_sigpending();
322 spin_unlock_irq(&current->sighand->siglock);
323 return;
324segv:
325 force_sig(SIGSEGV, current);
326}
327
328/* Checks if the fp is valid */
329static inline int invalid_frame_pointer(void __user *fp, int fplen)
330{
331 if ((((unsigned long) fp) & 7) ||
332 !__access_ok((unsigned long)fp, fplen) ||
333 ((sparc_cpu_model == sun4 || sparc_cpu_model == sun4c) &&
334 ((unsigned long) fp < 0xe0000000 && (unsigned long) fp >= 0x20000000)))
335 return 1;
336
337 return 0;
338}
339
340static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
341{
342 unsigned long sp;
343
344 sp = regs->u_regs[UREG_FP];
345
346 /* This is the X/Open sanctioned signal stack switching. */
347 if (sa->sa_flags & SA_ONSTACK) {
348 if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
349 sp = current->sas_ss_sp + current->sas_ss_size;
350 }
351 return (void __user *)(sp - framesize);
352}
353
354static inline void
355setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
356{
357 struct signal_sframe __user *sframep;
358 struct sigcontext __user *sc;
359 int window = 0, err;
360 unsigned long pc = regs->pc;
361 unsigned long npc = regs->npc;
362 struct thread_info *tp = current_thread_info();
363 void __user *sig_address;
364 int sig_code;
365
366 synchronize_user_stack();
367 sframep = (struct signal_sframe __user *)
368 get_sigframe(sa, regs, SF_ALIGNEDSZ);
369 if (invalid_frame_pointer(sframep, sizeof(*sframep))){
370 /* Don't change signal code and address, so that
371 * post mortem debuggers can have a look.
372 */
373 goto sigill_and_return;
374 }
375
376 sc = &sframep->sig_context;
377
378 /* We've already made sure frame pointer isn't in kernel space... */
379 err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
380 &sc->sigc_onstack);
381 err |= __put_user(oldset->sig[0], &sc->sigc_mask);
382 err |= __copy_to_user(sframep->extramask, &oldset->sig[1],
383 (_NSIG_WORDS - 1) * sizeof(unsigned int));
384 err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
385 err |= __put_user(pc, &sc->sigc_pc);
386 err |= __put_user(npc, &sc->sigc_npc);
387 err |= __put_user(regs->psr, &sc->sigc_psr);
388 err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
389 err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
390 err |= __put_user(tp->w_saved, &sc->sigc_oswins);
391 if (tp->w_saved)
392 for (window = 0; window < tp->w_saved; window++) {
393 put_user((char *)tp->rwbuf_stkptrs[window],
394 &sc->sigc_spbuf[window]);
395 err |= __copy_to_user(&sc->sigc_wbuf[window],
396 &tp->reg_window[window],
397 sizeof(struct reg_window));
398 }
399 else
400 err |= __copy_to_user(sframep, (char *) regs->u_regs[UREG_FP],
401 sizeof(struct reg_window));
402
403 tp->w_saved = 0; /* So process is allowed to execute. */
404
405 err |= __put_user(signr, &sframep->sig_num);
406 sig_address = NULL;
407 sig_code = 0;
408 if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
409 sig_address = info->si_addr;
410 switch (signr) {
411 case SIGSEGV:
412 switch (info->si_code) {
413 case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
414 default: sig_code = SUBSIG_PROTECTION; break;
415 }
416 break;
417 case SIGILL:
418 switch (info->si_code) {
419 case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
420 case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
421 case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
422 default: sig_code = SUBSIG_STACK; break;
423 }
424 break;
425 case SIGFPE:
426 switch (info->si_code) {
427 case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
428 case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
429 case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
430 case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
431 case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
432 case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
433 case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
434 default: sig_code = SUBSIG_FPERROR; break;
435 }
436 break;
437 case SIGBUS:
438 switch (info->si_code) {
439 case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
440 case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
441 default: sig_code = SUBSIG_BUSTIMEOUT; break;
442 }
443 break;
444 case SIGEMT:
445 switch (info->si_code) {
446 case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
447 }
448 break;
449 case SIGSYS:
450 if (info->si_code == (__SI_FAULT|0x100)) {
1da177e4
LT
451 sig_code = info->si_trapno;
452 break;
453 }
454 default:
455 sig_address = NULL;
456 }
457 }
458 err |= __put_user((unsigned long)sig_address, &sframep->sig_address);
459 err |= __put_user(sig_code, &sframep->sig_code);
460 err |= __put_user(sc, &sframep->sig_scptr);
461 if (err)
462 goto sigsegv;
463
464 regs->u_regs[UREG_FP] = (unsigned long) sframep;
465 regs->pc = (unsigned long) sa->sa_handler;
466 regs->npc = (regs->pc + 4);
467 return;
468
469sigill_and_return:
470 do_exit(SIGILL);
471sigsegv:
472 force_sigsegv(signr, current);
473}
474
475
476static inline int
477save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
478{
479 int err = 0;
480#ifdef CONFIG_SMP
481 if (test_tsk_thread_flag(current, TIF_USEDFPU)) {
482 put_psr(get_psr() | PSR_EF);
483 fpsave(&current->thread.float_regs[0], &current->thread.fsr,
484 &current->thread.fpqueue[0], &current->thread.fpqdepth);
485 regs->psr &= ~(PSR_EF);
486 clear_tsk_thread_flag(current, TIF_USEDFPU);
487 }
488#else
489 if (current == last_task_used_math) {
490 put_psr(get_psr() | PSR_EF);
491 fpsave(&current->thread.float_regs[0], &current->thread.fsr,
492 &current->thread.fpqueue[0], &current->thread.fpqdepth);
493 last_task_used_math = NULL;
494 regs->psr &= ~(PSR_EF);
495 }
496#endif
497 err |= __copy_to_user(&fpu->si_float_regs[0],
498 &current->thread.float_regs[0],
499 (sizeof(unsigned long) * 32));
500 err |= __put_user(current->thread.fsr, &fpu->si_fsr);
501 err |= __put_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
502 if (current->thread.fpqdepth != 0)
503 err |= __copy_to_user(&fpu->si_fpqueue[0],
504 &current->thread.fpqueue[0],
505 ((sizeof(unsigned long) +
506 (sizeof(unsigned long *)))*16));
507 clear_used_math();
508 return err;
509}
510
511static inline void
512new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
513 int signo, sigset_t *oldset)
514{
515 struct new_signal_frame __user *sf;
516 int sigframe_size, err;
517
518 /* 1. Make sure everything is clean */
519 synchronize_user_stack();
520
521 sigframe_size = NF_ALIGNEDSZ;
522 if (!used_math())
523 sigframe_size -= sizeof(__siginfo_fpu_t);
524
525 sf = (struct new_signal_frame __user *)
526 get_sigframe(&ka->sa, regs, sigframe_size);
527
528 if (invalid_frame_pointer(sf, sigframe_size))
529 goto sigill_and_return;
530
531 if (current_thread_info()->w_saved != 0)
532 goto sigill_and_return;
533
534 /* 2. Save the current process state */
535 err = __copy_to_user(&sf->info.si_regs, regs, sizeof(struct pt_regs));
536
537 err |= __put_user(0, &sf->extra_size);
538
539 if (used_math()) {
540 err |= save_fpu_state(regs, &sf->fpu_state);
541 err |= __put_user(&sf->fpu_state, &sf->fpu_save);
542 } else {
543 err |= __put_user(0, &sf->fpu_save);
544 }
545
546 err |= __put_user(oldset->sig[0], &sf->info.si_mask);
547 err |= __copy_to_user(sf->extramask, &oldset->sig[1],
548 (_NSIG_WORDS - 1) * sizeof(unsigned int));
549 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
550 sizeof(struct reg_window));
551 if (err)
552 goto sigsegv;
553
554 /* 3. signal handler back-trampoline and parameters */
555 regs->u_regs[UREG_FP] = (unsigned long) sf;
556 regs->u_regs[UREG_I0] = signo;
557 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
558 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
559
560 /* 4. signal handler */
561 regs->pc = (unsigned long) ka->sa.sa_handler;
562 regs->npc = (regs->pc + 4);
563
564 /* 5. return to kernel instructions */
565 if (ka->ka_restorer)
566 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
567 else {
568 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
569
570 /* mov __NR_sigreturn, %g1 */
571 err |= __put_user(0x821020d8, &sf->insns[0]);
572
573 /* t 0x10 */
574 err |= __put_user(0x91d02010, &sf->insns[1]);
575 if (err)
576 goto sigsegv;
577
578 /* Flush instruction space. */
579 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
580 }
581 return;
582
583sigill_and_return:
584 do_exit(SIGILL);
585sigsegv:
586 force_sigsegv(signo, current);
587}
588
589static inline void
590new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
591 int signo, sigset_t *oldset, siginfo_t *info)
592{
593 struct rt_signal_frame __user *sf;
594 int sigframe_size;
595 unsigned int psr;
596 int err;
597
598 synchronize_user_stack();
599 sigframe_size = RT_ALIGNEDSZ;
600 if (!used_math())
601 sigframe_size -= sizeof(__siginfo_fpu_t);
602 sf = (struct rt_signal_frame __user *)
603 get_sigframe(&ka->sa, regs, sigframe_size);
604 if (invalid_frame_pointer(sf, sigframe_size))
605 goto sigill;
606 if (current_thread_info()->w_saved != 0)
607 goto sigill;
608
609 err = __put_user(regs->pc, &sf->regs.pc);
610 err |= __put_user(regs->npc, &sf->regs.npc);
611 err |= __put_user(regs->y, &sf->regs.y);
612 psr = regs->psr;
613 if (used_math())
614 psr |= PSR_EF;
615 err |= __put_user(psr, &sf->regs.psr);
616 err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
617 err |= __put_user(0, &sf->extra_size);
618
619 if (psr & PSR_EF) {
620 err |= save_fpu_state(regs, &sf->fpu_state);
621 err |= __put_user(&sf->fpu_state, &sf->fpu_save);
622 } else {
623 err |= __put_user(0, &sf->fpu_save);
624 }
625 err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
626
627 /* Setup sigaltstack */
628 err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
629 err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
630 err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
631
632 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
633 sizeof(struct reg_window));
634
635 err |= copy_siginfo_to_user(&sf->info, info);
636
637 if (err)
638 goto sigsegv;
639
640 regs->u_regs[UREG_FP] = (unsigned long) sf;
641 regs->u_regs[UREG_I0] = signo;
642 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
643 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
644
645 regs->pc = (unsigned long) ka->sa.sa_handler;
646 regs->npc = (regs->pc + 4);
647
648 if (ka->ka_restorer)
649 regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
650 else {
651 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
652
653 /* mov __NR_sigreturn, %g1 */
654 err |= __put_user(0x821020d8, &sf->insns[0]);
655
656 /* t 0x10 */
657 err |= __put_user(0x91d02010, &sf->insns[1]);
658 if (err)
659 goto sigsegv;
660
661 /* Flush instruction space. */
662 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
663 }
664 return;
665
666sigill:
667 do_exit(SIGILL);
668sigsegv:
669 force_sigsegv(signo, current);
670}
671
1da177e4
LT
672static inline void
673handle_signal(unsigned long signr, struct k_sigaction *ka,
ec98c6b9 674 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
1da177e4 675{
ec98c6b9
DM
676 if (ka->sa.sa_flags & SA_SIGINFO)
677 new_setup_rt_frame(ka, regs, signr, oldset, info);
678 else if (current->thread.new_signal)
679 new_setup_frame(ka, regs, signr, oldset);
680 else
681 setup_frame(&ka->sa, regs, signr, oldset, info);
682
69be8f18
SR
683 spin_lock_irq(&current->sighand->siglock);
684 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
685 if (!(ka->sa.sa_flags & SA_NOMASK))
1da177e4 686 sigaddset(&current->blocked, signr);
69be8f18
SR
687 recalc_sigpending();
688 spin_unlock_irq(&current->sighand->siglock);
1da177e4
LT
689}
690
691static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
692 struct sigaction *sa)
693{
694 switch(regs->u_regs[UREG_I0]) {
695 case ERESTART_RESTARTBLOCK:
696 case ERESTARTNOHAND:
697 no_system_call_restart:
698 regs->u_regs[UREG_I0] = EINTR;
699 regs->psr |= PSR_C;
700 break;
701 case ERESTARTSYS:
702 if (!(sa->sa_flags & SA_RESTART))
703 goto no_system_call_restart;
704 /* fallthrough */
705 case ERESTARTNOINTR:
706 regs->u_regs[UREG_I0] = orig_i0;
707 regs->pc -= 4;
708 regs->npc -= 4;
709 }
710}
711
712/* Note that 'init' is a special process: it doesn't get signals it doesn't
713 * want to handle. Thus you cannot kill init even with a SIGKILL even by
714 * mistake.
715 */
2d7d5f05 716asmlinkage void do_signal(struct pt_regs * regs, unsigned long orig_i0, int restart_syscall)
1da177e4
LT
717{
718 siginfo_t info;
719 struct sparc_deliver_cookie cookie;
720 struct k_sigaction ka;
721 int signr;
2d7d5f05 722 sigset_t *oldset;
1da177e4 723
1da177e4
LT
724 cookie.restart_syscall = restart_syscall;
725 cookie.orig_i0 = orig_i0;
726
2d7d5f05
DM
727 if (test_thread_flag(TIF_RESTORE_SIGMASK))
728 oldset = &current->saved_sigmask;
729 else
1da177e4
LT
730 oldset = &current->blocked;
731
732 signr = get_signal_to_deliver(&info, &ka, regs, &cookie);
733 if (signr > 0) {
734 if (cookie.restart_syscall)
735 syscall_restart(cookie.orig_i0, regs, &ka.sa);
ec98c6b9
DM
736 handle_signal(signr, &ka, &info, oldset, regs);
737
2d7d5f05
DM
738 /* a signal was successfully delivered; the saved
739 * sigmask will have been stored in the signal frame,
740 * and will be restored by sigreturn, so we can simply
741 * clear the TIF_RESTORE_SIGMASK flag.
742 */
743 if (test_thread_flag(TIF_RESTORE_SIGMASK))
744 clear_thread_flag(TIF_RESTORE_SIGMASK);
745 return;
1da177e4
LT
746 }
747 if (cookie.restart_syscall &&
748 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
749 regs->u_regs[UREG_I0] == ERESTARTSYS ||
750 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
751 /* replay the system call when we are done */
752 regs->u_regs[UREG_I0] = cookie.orig_i0;
753 regs->pc -= 4;
754 regs->npc -= 4;
755 }
756 if (cookie.restart_syscall &&
757 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
758 regs->u_regs[UREG_G1] = __NR_restart_syscall;
759 regs->pc -= 4;
760 regs->npc -= 4;
761 }
2d7d5f05
DM
762
763 /* if there's no signal to deliver, we just put the saved sigmask
764 * back
765 */
766 if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
767 clear_thread_flag(TIF_RESTORE_SIGMASK);
768 sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
769 }
1da177e4
LT
770}
771
772asmlinkage int
773do_sys_sigstack(struct sigstack __user *ssptr, struct sigstack __user *ossptr,
774 unsigned long sp)
775{
776 int ret = -EFAULT;
777
778 /* First see if old state is wanted. */
779 if (ossptr) {
780 if (put_user(current->sas_ss_sp + current->sas_ss_size,
781 &ossptr->the_stack) ||
782 __put_user(on_sig_stack(sp), &ossptr->cur_status))
783 goto out;
784 }
785
786 /* Now see if we want to update the new state. */
787 if (ssptr) {
788 char *ss_sp;
789
790 if (get_user(ss_sp, &ssptr->the_stack))
791 goto out;
792 /* If the current stack was set with sigaltstack, don't
793 swap stacks while we are on it. */
794 ret = -EPERM;
795 if (current->sas_ss_sp && on_sig_stack(sp))
796 goto out;
797
798 /* Since we don't know the extent of the stack, and we don't
799 track onstack-ness, but rather calculate it, we must
800 presume a size. Ho hum this interface is lossy. */
801 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
802 current->sas_ss_size = SIGSTKSZ;
803 }
804 ret = 0;
805out:
806 return ret;
807}
808
809void ptrace_signal_deliver(struct pt_regs *regs, void *cookie)
810{
811 struct sparc_deliver_cookie *cp = cookie;
812
813 if (cp->restart_syscall &&
814 (regs->u_regs[UREG_I0] == ERESTARTNOHAND ||
815 regs->u_regs[UREG_I0] == ERESTARTSYS ||
816 regs->u_regs[UREG_I0] == ERESTARTNOINTR)) {
817 /* replay the system call when we are done */
818 regs->u_regs[UREG_I0] = cp->orig_i0;
819 regs->pc -= 4;
820 regs->npc -= 4;
821 cp->restart_syscall = 0;
822 }
823
824 if (cp->restart_syscall &&
825 regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) {
826 regs->u_regs[UREG_G1] = __NR_restart_syscall;
827 regs->pc -= 4;
828 regs->npc -= 4;
829 cp->restart_syscall = 0;
830 }
831}
This page took 0.304661 seconds and 5 git commands to generate.