1 /* $Id: signal32.c,v 1.66 2000/07/27 01:05:15 davem Exp $
2 * arch/sparc64/kernel/signal32.c
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)
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>
19 #include <linux/smp_lock.h>
21 #include <asm/uaccess.h>
22 #include <asm/bitops.h>
23 #include <asm/ptrace.h>
25 #include <asm/pgtable.h>
26 #include <asm/psrcompat.h>
27 #include <asm/fpumacro.h>
28 #include <asm/visasm.h>
30 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
32 asmlinkage
int sys_wait4(pid_t pid
, unsigned long *stat_addr
,
33 int options
, unsigned long *ru
);
35 asmlinkage
int do_signal32(sigset_t
*oldset
, struct pt_regs
*regs
,
36 unsigned long orig_o0
, int ret_from_syscall
);
38 /* This turned off for production... */
39 /* #define DEBUG_SIGNALS 1 */
40 /* #define DEBUG_SIGNALS_TRACE 1 */
41 /* #define DEBUG_SIGNALS_MAPS 1 */
42 /* #define DEBUG_SIGNALS_TLB 1 */
44 /* Signal frames: the original one (compatible with SunOS):
46 * Set up a signal frame... Make the stack look the way SunOS
47 * expects it to look which is basically:
49 * ---------------------------------- <-- %sp at signal time
52 * Ptr to sigcontext area above
54 * The signal number itself
56 * ---------------------------------- <-- New %sp
58 struct signal_sframe32
{
59 struct reg_window32 sig_window
;
62 /* struct sigcontext32 * */ u32 sig_scptr
;
64 struct sigcontext32 sig_context
;
65 unsigned extramask
[_NSIG_WORDS32
- 1];
69 * And the new one, intended to be used for Linux applications only
70 * (we have enough in there to work with clone).
71 * All the interesting bits are in the info field.
73 struct new_signal_frame32
{
74 struct sparc_stackf32 ss
;
76 /* __siginfo_fpu32_t * */ u32 fpu_save
;
77 unsigned int insns
[2];
78 unsigned extramask
[_NSIG_WORDS32
- 1];
79 unsigned extra_size
; /* Should be sizeof(siginfo_extra_v8plus_t) */
80 /* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
81 siginfo_extra_v8plus_t v8plus
;
82 __siginfo_fpu_t fpu_state
;
85 struct rt_signal_frame32
{
86 struct sparc_stackf32 ss
;
88 struct pt_regs32 regs
;
90 /* __siginfo_fpu32_t * */ u32 fpu_save
;
91 unsigned int insns
[2];
93 unsigned extra_size
; /* Should be sizeof(siginfo_extra_v8plus_t) */
94 /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
95 siginfo_extra_v8plus_t v8plus
;
96 __siginfo_fpu_t fpu_state
;
100 #define SF_ALIGNEDSZ (((sizeof(struct signal_sframe32) + 7) & (~7)))
101 #define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame32) + 7) & (~7)))
102 #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 7) & (~7)))
104 int copy_siginfo_to_user32(siginfo_t32
*to
, siginfo_t
*from
)
108 if (!access_ok (VERIFY_WRITE
, to
, sizeof(siginfo_t32
)))
111 /* If you change siginfo_t structure, please be sure
112 this code is fixed accordingly.
113 It should never copy any pad contained in the structure
114 to avoid security leaks, but must copy the generic
115 3 ints plus the relevant union member.
116 This routine must convert siginfo from 64bit to 32bit as well
118 err
= __put_user(from
->si_signo
, &to
->si_signo
);
119 err
|= __put_user(from
->si_errno
, &to
->si_errno
);
120 err
|= __put_user((short)from
->si_code
, &to
->si_code
);
121 if (from
->si_code
< 0)
122 err
|= __copy_to_user(&to
->_sifields
._pad
, &from
->_sifields
._pad
, SI_PAD_SIZE
);
124 switch (from
->si_code
>> 16) {
125 case __SI_CHLD
>> 16:
126 err
|= __put_user(from
->si_utime
, &to
->si_utime
);
127 err
|= __put_user(from
->si_stime
, &to
->si_stime
);
128 err
|= __put_user(from
->si_status
, &to
->si_status
);
130 err
|= __put_user(from
->si_pid
, &to
->si_pid
);
131 err
|= __put_user(from
->si_uid
, &to
->si_uid
);
133 case __SI_FAULT
>> 16:
134 case __SI_POLL
>> 16:
135 err
|= __put_user(from
->si_trapno
, &to
->si_trapno
);
136 err
|= __put_user((long)from
->si_addr
, &to
->si_addr
);
138 /* case __SI_RT: This is not generated by the kernel as of now. */
145 * atomically swap in the new signal mask, and wait for a signal.
146 * This is really tricky on the Sparc, watch out...
148 asmlinkage
void _sigpause32_common(old_sigset_t32 set
, struct pt_regs
*regs
)
153 spin_lock_irq(¤t
->sigmask_lock
);
154 saveset
= current
->blocked
;
155 siginitset(¤t
->blocked
, set
);
156 recalc_sigpending(current
);
157 spin_unlock_irq(¤t
->sigmask_lock
);
159 regs
->tpc
= regs
->tnpc
;
162 /* Condition codes and return value where set here for sigpause,
163 * and so got used by setup_frame, which again causes sigreturn()
167 current
->state
= TASK_INTERRUPTIBLE
;
170 * Return -EINTR and set condition code here,
171 * so the interrupted system call actually returns
174 regs
->tstate
|= TSTATE_ICARRY
;
175 regs
->u_regs
[UREG_I0
] = EINTR
;
176 if (do_signal32(&saveset
, regs
, 0, 0))
181 asmlinkage
void do_rt_sigsuspend32(u32 uset
, size_t sigsetsize
, struct pt_regs
*regs
)
183 sigset_t oldset
, set
;
186 /* XXX: Don't preclude handling different sized sigset_t's. */
187 if (((__kernel_size_t32
)sigsetsize
) != sizeof(sigset_t
)) {
188 regs
->tstate
|= TSTATE_ICARRY
;
189 regs
->u_regs
[UREG_I0
] = EINVAL
;
192 if (copy_from_user(&set32
, (void *)(long)uset
, sizeof(set32
))) {
193 regs
->tstate
|= TSTATE_ICARRY
;
194 regs
->u_regs
[UREG_I0
] = EFAULT
;
197 switch (_NSIG_WORDS
) {
198 case 4: set
.sig
[3] = set32
.sig
[6] + (((long)set32
.sig
[7]) << 32);
199 case 3: set
.sig
[2] = set32
.sig
[4] + (((long)set32
.sig
[5]) << 32);
200 case 2: set
.sig
[1] = set32
.sig
[2] + (((long)set32
.sig
[3]) << 32);
201 case 1: set
.sig
[0] = set32
.sig
[0] + (((long)set32
.sig
[1]) << 32);
203 sigdelsetmask(&set
, ~_BLOCKABLE
);
204 spin_lock_irq(¤t
->sigmask_lock
);
205 oldset
= current
->blocked
;
206 current
->blocked
= set
;
207 recalc_sigpending(current
);
208 spin_unlock_irq(¤t
->sigmask_lock
);
210 regs
->tpc
= regs
->tnpc
;
213 /* Condition codes and return value where set here for sigpause,
214 * and so got used by setup_frame, which again causes sigreturn()
218 current
->state
= TASK_INTERRUPTIBLE
;
221 * Return -EINTR and set condition code here,
222 * so the interrupted system call actually returns
225 regs
->tstate
|= TSTATE_ICARRY
;
226 regs
->u_regs
[UREG_I0
] = EINTR
;
227 if (do_signal32(&oldset
, regs
, 0, 0))
232 static inline int restore_fpu_state32(struct pt_regs
*regs
, __siginfo_fpu_t
*fpu
)
234 unsigned long *fpregs
= (unsigned long *)(((char *)current
) + AOFF_task_fpregs
);
238 err
= __get_user(fprs
, &fpu
->si_fprs
);
240 regs
->tstate
&= ~TSTATE_PEF
;
242 err
|= copy_from_user(fpregs
, &fpu
->si_float_regs
[0], (sizeof(unsigned int) * 32));
244 err
|= copy_from_user(fpregs
+16, &fpu
->si_float_regs
[32], (sizeof(unsigned int) * 32));
245 err
|= __get_user(current
->thread
.xfsr
[0], &fpu
->si_fsr
);
246 err
|= __get_user(current
->thread
.gsr
[0], &fpu
->si_gsr
);
247 current
->thread
.fpsaved
[0] |= fprs
;
251 void do_new_sigreturn32(struct pt_regs
*regs
)
253 struct new_signal_frame32
*sf
;
255 unsigned pc
, npc
, fpu_save
;
257 unsigned seta
[_NSIG_WORDS32
];
260 regs
->u_regs
[UREG_FP
] &= 0x00000000ffffffffUL
;
261 sf
= (struct new_signal_frame32
*) regs
->u_regs
[UREG_FP
];
263 /* 1. Make sure we are not getting garbage from the user */
264 if (verify_area (VERIFY_READ
, sf
, sizeof (*sf
)) ||
265 (((unsigned long) sf
) & 3))
268 get_user(pc
, &sf
->info
.si_regs
.pc
);
269 __get_user(npc
, &sf
->info
.si_regs
.npc
);
277 /* 2. Restore the state */
278 err
= __get_user(regs
->y
, &sf
->info
.si_regs
.y
);
279 err
|= __get_user(psr
, &sf
->info
.si_regs
.psr
);
281 for (i
= UREG_G1
; i
<= UREG_I7
; i
++)
282 err
|= __get_user(regs
->u_regs
[i
], &sf
->info
.si_regs
.u_regs
[i
]);
283 if ((psr
& (PSR_VERS
|PSR_IMPL
)) == PSR_V8PLUS
) {
284 err
|= __get_user(i
, &sf
->v8plus
.g_upper
[0]);
285 if (i
== SIGINFO_EXTRA_V8PLUS_MAGIC
) {
286 for (i
= UREG_G1
; i
<= UREG_I7
; i
++)
287 err
|= __get_user(((u32
*)regs
->u_regs
)[2*i
], &sf
->v8plus
.g_upper
[i
]);
291 /* User can only change condition codes in %tstate. */
292 regs
->tstate
&= ~(TSTATE_ICC
|TSTATE_XCC
);
293 regs
->tstate
|= psr_to_tstate_icc(psr
);
295 err
|= __get_user(fpu_save
, &sf
->fpu_save
);
297 err
|= restore_fpu_state32(regs
, &sf
->fpu_state
);
298 err
|= __get_user(seta
[0], &sf
->info
.si_mask
);
299 err
|= copy_from_user(seta
+1, &sf
->extramask
, (_NSIG_WORDS32
- 1) * sizeof(unsigned));
302 switch (_NSIG_WORDS
) {
303 case 4: set
.sig
[3] = seta
[6] + (((long)seta
[7]) << 32);
304 case 3: set
.sig
[2] = seta
[4] + (((long)seta
[5]) << 32);
305 case 2: set
.sig
[1] = seta
[2] + (((long)seta
[3]) << 32);
306 case 1: set
.sig
[0] = seta
[0] + (((long)seta
[1]) << 32);
308 sigdelsetmask(&set
, ~_BLOCKABLE
);
309 spin_lock_irq(¤t
->sigmask_lock
);
310 current
->blocked
= set
;
311 recalc_sigpending(current
);
312 spin_unlock_irq(¤t
->sigmask_lock
);
319 asmlinkage
void do_sigreturn32(struct pt_regs
*regs
)
321 struct sigcontext32
*scptr
;
322 unsigned pc
, npc
, psr
;
324 unsigned seta
[_NSIG_WORDS32
];
327 synchronize_user_stack();
328 if (current
->thread
.flags
& SPARC_FLAG_NEWSIGNALS
)
329 return do_new_sigreturn32(regs
);
331 scptr
= (struct sigcontext32
*)
332 (regs
->u_regs
[UREG_I0
] & 0x00000000ffffffffUL
);
333 /* Check sanity of the user arg. */
334 if(verify_area(VERIFY_READ
, scptr
, sizeof(struct sigcontext32
)) ||
335 (((unsigned long) scptr
) & 3))
338 err
= __get_user(pc
, &scptr
->sigc_pc
);
339 err
|= __get_user(npc
, &scptr
->sigc_npc
);
342 goto segv
; /* Nice try. */
344 err
|= __get_user(seta
[0], &scptr
->sigc_mask
);
345 /* Note that scptr + 1 points to extramask */
346 err
|= copy_from_user(seta
+1, scptr
+ 1, (_NSIG_WORDS32
- 1) * sizeof(unsigned));
349 switch (_NSIG_WORDS
) {
350 case 4: set
.sig
[3] = seta
[6] + (((long)seta
[7]) << 32);
351 case 3: set
.sig
[2] = seta
[4] + (((long)seta
[5]) << 32);
352 case 2: set
.sig
[1] = seta
[2] + (((long)seta
[3]) << 32);
353 case 1: set
.sig
[0] = seta
[0] + (((long)seta
[1]) << 32);
355 sigdelsetmask(&set
, ~_BLOCKABLE
);
356 spin_lock_irq(¤t
->sigmask_lock
);
357 current
->blocked
= set
;
358 recalc_sigpending(current
);
359 spin_unlock_irq(¤t
->sigmask_lock
);
363 err
= __get_user(regs
->u_regs
[UREG_FP
], &scptr
->sigc_sp
);
364 err
|= __get_user(regs
->u_regs
[UREG_I0
], &scptr
->sigc_o0
);
365 err
|= __get_user(regs
->u_regs
[UREG_G1
], &scptr
->sigc_g1
);
367 /* User can only change condition codes in %tstate. */
368 err
|= __get_user(psr
, &scptr
->sigc_psr
);
371 regs
->tstate
&= ~(TSTATE_ICC
|TSTATE_XCC
);
372 regs
->tstate
|= psr_to_tstate_icc(psr
);
379 asmlinkage
void do_rt_sigreturn32(struct pt_regs
*regs
)
381 struct rt_signal_frame32
*sf
;
383 unsigned pc
, npc
, fpu_save
;
389 synchronize_user_stack();
390 regs
->u_regs
[UREG_FP
] &= 0x00000000ffffffffUL
;
391 sf
= (struct rt_signal_frame32
*) regs
->u_regs
[UREG_FP
];
393 /* 1. Make sure we are not getting garbage from the user */
394 if (verify_area (VERIFY_READ
, sf
, sizeof (*sf
)) ||
395 (((unsigned long) sf
) & 3))
398 get_user(pc
, &sf
->regs
.pc
);
399 __get_user(npc
, &sf
->regs
.npc
);
407 /* 2. Restore the state */
408 err
= __get_user(regs
->y
, &sf
->regs
.y
);
409 err
|= __get_user(psr
, &sf
->regs
.psr
);
411 for (i
= UREG_G1
; i
<= UREG_I7
; i
++)
412 err
|= __get_user(regs
->u_regs
[i
], &sf
->regs
.u_regs
[i
]);
413 if ((psr
& (PSR_VERS
|PSR_IMPL
)) == PSR_V8PLUS
) {
414 err
|= __get_user(i
, &sf
->v8plus
.g_upper
[0]);
415 if (i
== SIGINFO_EXTRA_V8PLUS_MAGIC
) {
416 for (i
= UREG_G1
; i
<= UREG_I7
; i
++)
417 err
|= __get_user(((u32
*)regs
->u_regs
)[2*i
], &sf
->v8plus
.g_upper
[i
]);
421 /* User can only change condition codes in %tstate. */
422 regs
->tstate
&= ~(TSTATE_ICC
|TSTATE_XCC
);
423 regs
->tstate
|= psr_to_tstate_icc(psr
);
425 err
|= __get_user(fpu_save
, &sf
->fpu_save
);
427 err
|= restore_fpu_state32(regs
, &sf
->fpu_state
);
428 err
|= copy_from_user(&seta
, &sf
->mask
, sizeof(sigset_t32
));
429 err
|= __get_user((long)st
.ss_sp
, &sf
->stack
.ss_sp
);
430 err
|= __get_user(st
.ss_flags
, &sf
->stack
.ss_flags
);
431 err
|= __get_user(st
.ss_size
, &sf
->stack
.ss_size
);
435 /* It is more difficult to avoid calling this function than to
436 call it and ignore errors. */
437 do_sigaltstack(&st
, NULL
, (unsigned long)sf
);
439 switch (_NSIG_WORDS
) {
440 case 4: set
.sig
[3] = seta
.sig
[6] + (((long)seta
.sig
[7]) << 32);
441 case 3: set
.sig
[2] = seta
.sig
[4] + (((long)seta
.sig
[5]) << 32);
442 case 2: set
.sig
[1] = seta
.sig
[2] + (((long)seta
.sig
[3]) << 32);
443 case 1: set
.sig
[0] = seta
.sig
[0] + (((long)seta
.sig
[1]) << 32);
445 sigdelsetmask(&set
, ~_BLOCKABLE
);
446 spin_lock_irq(¤t
->sigmask_lock
);
447 current
->blocked
= set
;
448 recalc_sigpending(current
);
449 spin_unlock_irq(¤t
->sigmask_lock
);
455 /* Checks if the fp is valid */
456 static int invalid_frame_pointer(void *fp
, int fplen
)
458 if ((((unsigned long) fp
) & 7) || ((unsigned long)fp
) > 0x100000000ULL
- fplen
)
463 static inline void *get_sigframe(struct sigaction
*sa
, struct pt_regs
*regs
, unsigned long framesize
)
467 regs
->u_regs
[UREG_FP
] &= 0x00000000ffffffffUL
;
468 sp
= regs
->u_regs
[UREG_FP
];
470 /* This is the X/Open sanctioned signal stack switching. */
471 if (sa
->sa_flags
& SA_ONSTACK
) {
472 if (!on_sig_stack(sp
) && !((current
->sas_ss_sp
+ current
->sas_ss_size
) & 7))
473 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
475 return (void *)(sp
- framesize
);
479 setup_frame32(struct sigaction
*sa
, struct pt_regs
*regs
, int signr
, sigset_t
*oldset
, siginfo_t
*info
)
481 struct signal_sframe32
*sframep
;
482 struct sigcontext32
*sc
;
483 unsigned seta
[_NSIG_WORDS32
];
487 unsigned long pc
= regs
->tpc
;
488 unsigned long npc
= regs
->tnpc
;
495 synchronize_user_stack();
496 save_and_clear_fpu();
498 sframep
= (struct signal_sframe32
*)get_sigframe(sa
, regs
, SF_ALIGNEDSZ
);
499 if (invalid_frame_pointer (sframep
, sizeof(*sframep
))){
500 #ifdef DEBUG_SIGNALS /* fills up the console logs during crashme runs, yuck... */
501 printk("%s [%d]: User has trashed signal stack\n",
502 current
->comm
, current
->pid
);
503 printk("Sigstack ptr %p handler at pc<%016lx> for sig<%d>\n",
506 /* Don't change signal code and address, so that
507 * post mortem debuggers can have a look.
512 sc
= &sframep
->sig_context
;
514 /* We've already made sure frame pointer isn't in kernel space... */
515 err
= __put_user((sas_ss_flags(regs
->u_regs
[UREG_FP
]) == SS_ONSTACK
),
518 switch (_NSIG_WORDS
) {
519 case 4: seta
[7] = (oldset
->sig
[3] >> 32);
520 seta
[6] = oldset
->sig
[3];
521 case 3: seta
[5] = (oldset
->sig
[2] >> 32);
522 seta
[4] = oldset
->sig
[2];
523 case 2: seta
[3] = (oldset
->sig
[1] >> 32);
524 seta
[2] = oldset
->sig
[1];
525 case 1: seta
[1] = (oldset
->sig
[0] >> 32);
526 seta
[0] = oldset
->sig
[0];
528 err
|= __put_user(seta
[0], &sc
->sigc_mask
);
529 err
|= __copy_to_user(sframep
->extramask
, seta
+ 1,
530 (_NSIG_WORDS32
- 1) * sizeof(unsigned));
531 err
|= __put_user(regs
->u_regs
[UREG_FP
], &sc
->sigc_sp
);
532 err
|= __put_user(pc
, &sc
->sigc_pc
);
533 err
|= __put_user(npc
, &sc
->sigc_npc
);
534 psr
= tstate_to_psr (regs
->tstate
);
535 if(current
->thread
.fpsaved
[0] & FPRS_FEF
)
537 err
|= __put_user(psr
, &sc
->sigc_psr
);
538 err
|= __put_user(regs
->u_regs
[UREG_G1
], &sc
->sigc_g1
);
539 err
|= __put_user(regs
->u_regs
[UREG_I0
], &sc
->sigc_o0
);
540 err
|= __put_user(current
->thread
.w_saved
, &sc
->sigc_oswins
);
542 /* w_saved is not currently used... */
543 if(current
->thread
.w_saved
)
544 for(window
= 0; window
< current
->thread
.w_saved
; window
++) {
545 sc
->sigc_spbuf
[window
] =
546 (char *)current
->thread
.rwbuf_stkptrs
[window
];
547 err
|= copy_to_user(&sc
->sigc_wbuf
[window
],
548 ¤t
->thread
.reg_window
[window
],
549 sizeof(struct reg_window
));
553 err
|= copy_in_user((u32
*)sframep
,
554 (u32
*)(regs
->u_regs
[UREG_FP
]),
555 sizeof(struct reg_window32
));
557 current
->thread
.w_saved
= 0; /* So process is allowed to execute. */
558 err
|= __put_user(signr
, &sframep
->sig_num
);
561 if (SI_FROMKERNEL (info
) && (info
->si_code
& __SI_MASK
) == __SI_FAULT
) {
562 sig_address
= info
->si_addr
;
565 switch (info
->si_code
) {
566 case SEGV_MAPERR
: sig_code
= SUBSIG_NOMAPPING
; break;
567 default: sig_code
= SUBSIG_PROTECTION
; break;
571 switch (info
->si_code
) {
572 case ILL_ILLOPC
: sig_code
= SUBSIG_ILLINST
; break;
573 case ILL_PRVOPC
: sig_code
= SUBSIG_PRIVINST
; break;
574 case ILL_ILLTRP
: sig_code
= SUBSIG_BADTRAP (info
->si_trapno
); break;
575 default: sig_code
= SUBSIG_STACK
; break;
579 switch (info
->si_code
) {
580 case FPE_INTDIV
: sig_code
= SUBSIG_IDIVZERO
; break;
581 case FPE_INTOVF
: sig_code
= SUBSIG_FPINTOVFL
; break;
582 case FPE_FLTDIV
: sig_code
= SUBSIG_FPDIVZERO
; break;
583 case FPE_FLTOVF
: sig_code
= SUBSIG_FPOVFLOW
; break;
584 case FPE_FLTUND
: sig_code
= SUBSIG_FPUNFLOW
; break;
585 case FPE_FLTRES
: sig_code
= SUBSIG_FPINEXACT
; break;
586 case FPE_FLTINV
: sig_code
= SUBSIG_FPOPERROR
; break;
587 default: sig_code
= SUBSIG_FPERROR
; break;
591 switch (info
->si_code
) {
592 case BUS_ADRALN
: sig_code
= SUBSIG_ALIGNMENT
; break;
593 case BUS_ADRERR
: sig_code
= SUBSIG_MISCERROR
; break;
594 default: sig_code
= SUBSIG_BUSTIMEOUT
; break;
598 switch (info
->si_code
) {
599 case EMT_TAGOVF
: sig_code
= SUBSIG_TAG
; break;
603 if (info
->si_code
== (__SI_FAULT
|0x100)) {
604 /* See sys_sunos32.c */
605 sig_code
= info
->si_trapno
;
612 err
|= __put_user((long)sig_address
, &sframep
->sig_address
);
613 err
|= __put_user(sig_code
, &sframep
->sig_code
);
614 err
|= __put_user((u64
)sc
, &sframep
->sig_scptr
);
618 regs
->u_regs
[UREG_FP
] = (unsigned long) sframep
;
619 regs
->tpc
= (unsigned long) sa
->sa_handler
;
620 regs
->tnpc
= (regs
->tpc
+ 4);
628 static inline int save_fpu_state32(struct pt_regs
*regs
, __siginfo_fpu_t
*fpu
)
630 unsigned long *fpregs
= (unsigned long *)(((char *)current
) + AOFF_task_fpregs
);
634 fprs
= current
->thread
.fpsaved
[0];
636 err
|= copy_to_user(&fpu
->si_float_regs
[0], fpregs
,
637 (sizeof(unsigned int) * 32));
639 err
|= copy_to_user(&fpu
->si_float_regs
[32], fpregs
+16,
640 (sizeof(unsigned int) * 32));
641 err
|= __put_user(current
->thread
.xfsr
[0], &fpu
->si_fsr
);
642 err
|= __put_user(current
->thread
.gsr
[0], &fpu
->si_gsr
);
643 err
|= __put_user(fprs
, &fpu
->si_fprs
);
648 static inline void new_setup_frame32(struct k_sigaction
*ka
, struct pt_regs
*regs
,
649 int signo
, sigset_t
*oldset
)
651 struct new_signal_frame32
*sf
;
655 unsigned seta
[_NSIG_WORDS32
];
657 /* 1. Make sure everything is clean */
658 synchronize_user_stack();
659 save_and_clear_fpu();
661 sigframe_size
= NF_ALIGNEDSZ
;
662 if (!(current
->thread
.fpsaved
[0] & FPRS_FEF
))
663 sigframe_size
-= sizeof(__siginfo_fpu_t
);
665 sf
= (struct new_signal_frame32
*)get_sigframe(&ka
->sa
, regs
, sigframe_size
);
667 if (invalid_frame_pointer (sf
, sigframe_size
)) {
669 printk("new_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)\n",
670 current
->comm
, current
->pid
, sf
, sigframe_size
);
675 if (current
->thread
.w_saved
!= 0) {
677 printk ("%s[%d]: Invalid user stack frame for "
678 "signal delivery.\n", current
->comm
, current
->pid
);
683 /* 2. Save the current process state */
684 err
= put_user(regs
->tpc
, &sf
->info
.si_regs
.pc
);
685 err
|= __put_user(regs
->tnpc
, &sf
->info
.si_regs
.npc
);
686 err
|= __put_user(regs
->y
, &sf
->info
.si_regs
.y
);
687 psr
= tstate_to_psr (regs
->tstate
);
688 if(current
->thread
.fpsaved
[0] & FPRS_FEF
)
690 err
|= __put_user(psr
, &sf
->info
.si_regs
.psr
);
691 for (i
= 0; i
< 16; i
++)
692 err
|= __put_user(regs
->u_regs
[i
], &sf
->info
.si_regs
.u_regs
[i
]);
693 err
|= __put_user(sizeof(siginfo_extra_v8plus_t
), &sf
->extra_size
);
694 err
|= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC
, &sf
->v8plus
.g_upper
[0]);
695 for (i
= 1; i
< 16; i
++)
696 err
|= __put_user(((u32
*)regs
->u_regs
)[2*i
], &sf
->v8plus
.g_upper
[i
]);
699 err
|= save_fpu_state32(regs
, &sf
->fpu_state
);
700 err
|= __put_user((u64
)&sf
->fpu_state
, &sf
->fpu_save
);
702 err
|= __put_user(0, &sf
->fpu_save
);
705 switch (_NSIG_WORDS
) {
706 case 4: seta
[7] = (oldset
->sig
[3] >> 32);
707 seta
[6] = oldset
->sig
[3];
708 case 3: seta
[5] = (oldset
->sig
[2] >> 32);
709 seta
[4] = oldset
->sig
[2];
710 case 2: seta
[3] = (oldset
->sig
[1] >> 32);
711 seta
[2] = oldset
->sig
[1];
712 case 1: seta
[1] = (oldset
->sig
[0] >> 32);
713 seta
[0] = oldset
->sig
[0];
715 err
|= __put_user(seta
[0], &sf
->info
.si_mask
);
716 err
|= __copy_to_user(sf
->extramask
, seta
+ 1,
717 (_NSIG_WORDS32
- 1) * sizeof(unsigned));
719 err
|= copy_in_user((u32
*)sf
,
720 (u32
*)(regs
->u_regs
[UREG_FP
]),
721 sizeof(struct reg_window32
));
726 /* 3. signal handler back-trampoline and parameters */
727 regs
->u_regs
[UREG_FP
] = (unsigned long) sf
;
728 regs
->u_regs
[UREG_I0
] = signo
;
729 regs
->u_regs
[UREG_I1
] = (unsigned long) &sf
->info
;
731 /* 4. signal handler */
732 regs
->tpc
= (unsigned long) ka
->sa
.sa_handler
;
733 regs
->tnpc
= (regs
->tpc
+ 4);
735 /* 5. return to kernel instructions */
737 regs
->u_regs
[UREG_I7
] = (unsigned long)ka
->ka_restorer
;
739 /* Flush instruction space. */
740 unsigned long address
= ((unsigned long)&(sf
->insns
[0]));
741 pgd_t
*pgdp
= pgd_offset(current
->mm
, address
);
742 pmd_t
*pmdp
= pmd_offset(pgdp
, address
);
743 pte_t
*ptep
= pte_offset(pmdp
, address
);
745 regs
->u_regs
[UREG_I7
] = (unsigned long) (&(sf
->insns
[0]) - 2);
747 err
= __put_user(0x821020d8, &sf
->insns
[0]); /*mov __NR_sigreturn, %g1*/
748 err
|= __put_user(0x91d02010, &sf
->insns
[1]); /*t 0x10*/
752 if(pte_present(*ptep
)) {
753 unsigned long page
= (unsigned long) page_address(pte_page(*ptep
));
755 __asm__
__volatile__("
758 : : "r" (page
), "r" (address
& (PAGE_SIZE
- 1))
770 /* Setup a Solaris stack frame */
772 setup_svr4_frame32(struct sigaction
*sa
, unsigned long pc
, unsigned long npc
,
773 struct pt_regs
*regs
, int signr
, sigset_t
*oldset
)
775 svr4_signal_frame_t
*sfp
;
788 synchronize_user_stack();
789 save_and_clear_fpu();
791 regs
->u_regs
[UREG_FP
] &= 0x00000000ffffffffUL
;
792 sfp
= (svr4_signal_frame_t
*) get_sigframe(sa
, regs
, REGWIN_SZ
+ SVR4_SF_ALIGNED
);
794 if (invalid_frame_pointer (sfp
, sizeof (*sfp
))){
796 printk ("Invalid stack frame\n");
801 /* Start with a clean frame pointer and fill it */
802 err
= clear_user(sfp
, sizeof (*sfp
));
804 /* Setup convenience variables */
811 /* FIXME: where am I supposed to put this?
812 * sc->sigc_onstack = old_status;
813 * anyways, it does not look like it is used for anything at all.
815 setv
.sigbits
[0] = oldset
->sig
[0];
816 setv
.sigbits
[1] = (oldset
->sig
[0] >> 32);
817 if (_NSIG_WORDS
>= 2) {
818 setv
.sigbits
[2] = oldset
->sig
[1];
819 setv
.sigbits
[3] = (oldset
->sig
[1] >> 32);
820 err
|= __copy_to_user(&uc
->sigmask
, &setv
, sizeof(svr4_sigset_t
));
822 err
|= __copy_to_user(&uc
->sigmask
, &setv
, 2 * sizeof(unsigned));
824 /* Store registers */
825 err
|= __put_user(regs
->tpc
, &((*gr
) [SVR4_PC
]));
826 err
|= __put_user(regs
->tnpc
, &((*gr
) [SVR4_NPC
]));
827 psr
= tstate_to_psr (regs
->tstate
);
828 if(current
->thread
.fpsaved
[0] & FPRS_FEF
)
830 err
|= __put_user(psr
, &((*gr
) [SVR4_PSR
]));
831 err
|= __put_user(regs
->y
, &((*gr
) [SVR4_Y
]));
833 /* Copy g [1..7] and o [0..7] registers */
834 for (i
= 0; i
< 7; i
++)
835 err
|= __put_user(regs
->u_regs
[UREG_G1
+i
], (&(*gr
)[SVR4_G1
])+i
);
836 for (i
= 0; i
< 8; i
++)
837 err
|= __put_user(regs
->u_regs
[UREG_I0
+i
], (&(*gr
)[SVR4_O0
])+i
);
839 /* Setup sigaltstack */
840 err
|= __put_user(current
->sas_ss_sp
, &uc
->stack
.sp
);
841 err
|= __put_user(sas_ss_flags(regs
->u_regs
[UREG_FP
]), &uc
->stack
.flags
);
842 err
|= __put_user(current
->sas_ss_size
, &uc
->stack
.size
);
844 /* Save the currently window file: */
846 /* 1. Link sfp->uc->gwins to our windows */
847 err
|= __put_user((u32
)(long)gw
, &mc
->gwin
);
849 /* 2. Number of windows to restore at setcontext (): */
850 err
|= __put_user(current
->thread
.w_saved
, &gw
->count
);
852 /* 3. Save each valid window
853 * Currently, it makes a copy of the windows from the kernel copy.
854 * David's code for SunOS, makes the copy but keeps the pointer to
855 * the kernel. My version makes the pointer point to a userland
856 * copy of those. Mhm, I wonder if I shouldn't just ignore those
857 * on setcontext and use those that are on the kernel, the signal
858 * handler should not be modyfing those, mhm.
860 * These windows are just used in case synchronize_user_stack failed
861 * to flush the user windows.
864 for(window
= 0; window
< current
->thread
.w_saved
; window
++) {
865 err
|= __put_user((int *) &(gw
->win
[window
]),
866 (int **)gw
->winptr
+window
);
867 err
|= copy_to_user(&gw
->win
[window
],
868 ¤t
->thread
.reg_window
[window
],
869 sizeof (svr4_rwindow_t
));
870 err
|= __put_user(0, (int *)gw
->winptr
+ window
);
874 /* 4. We just pay attention to the gw->count field on setcontext */
875 current
->thread
.w_saved
= 0; /* So process is allowed to execute. */
877 /* Setup the signal information. Solaris expects a bunch of
878 * information to be passed to the signal handler, we don't provide
879 * that much currently, should use siginfo.
881 err
|= __put_user(signr
, &si
->siginfo
.signo
);
882 err
|= __put_user(SVR4_SINOINFO
, &si
->siginfo
.code
);
886 regs
->u_regs
[UREG_FP
] = (unsigned long) sfp
;
887 regs
->tpc
= (unsigned long) sa
->sa_handler
;
888 regs
->tnpc
= (regs
->tpc
+ 4);
891 printk ("Solaris-frame: %x %x\n", (int) regs
->tpc
, (int) regs
->tnpc
);
893 /* Arguments passed to signal handler */
894 if (regs
->u_regs
[14]){
895 struct reg_window32
*rw
= (struct reg_window32
*)
896 (regs
->u_regs
[14] & 0x00000000ffffffffUL
);
898 err
|= __put_user(signr
, &rw
->ins
[0]);
899 err
|= __put_user((u64
)si
, &rw
->ins
[1]);
900 err
|= __put_user((u64
)uc
, &rw
->ins
[2]);
901 err
|= __put_user((u64
)sfp
, &rw
->ins
[6]); /* frame pointer */
905 regs
->u_regs
[UREG_I0
] = signr
;
906 regs
->u_regs
[UREG_I1
] = (u32
)(u64
) si
;
907 regs
->u_regs
[UREG_I2
] = (u32
)(u64
) uc
;
916 svr4_getcontext(svr4_ucontext_t
*uc
, struct pt_regs
*regs
)
923 synchronize_user_stack();
924 save_and_clear_fpu();
926 if (current
->thread
.w_saved
){
927 printk ("Uh oh, w_saved is not zero (%d)\n", (int) current
->thread
.w_saved
);
930 err
= clear_user(uc
, sizeof (*uc
));
932 /* Setup convenience variables */
936 setv
.sigbits
[0] = current
->blocked
.sig
[0];
937 setv
.sigbits
[1] = (current
->blocked
.sig
[0] >> 32);
938 if (_NSIG_WORDS
>= 2) {
939 setv
.sigbits
[2] = current
->blocked
.sig
[1];
940 setv
.sigbits
[3] = (current
->blocked
.sig
[1] >> 32);
941 err
|= __copy_to_user(&uc
->sigmask
, &setv
, sizeof(svr4_sigset_t
));
943 err
|= __copy_to_user(&uc
->sigmask
, &setv
, 2 * sizeof(unsigned));
945 /* Store registers */
946 err
|= __put_user(regs
->tpc
, &uc
->mcontext
.greg
[SVR4_PC
]);
947 err
|= __put_user(regs
->tnpc
, &uc
->mcontext
.greg
[SVR4_NPC
]);
949 err
|= __put_user(0, &uc
->mcontext
.greg
[SVR4_PSR
]);
951 i
= tstate_to_psr(regs
->tstate
) & ~PSR_EF
;
952 if (current
->thread
.fpsaved
[0] & FPRS_FEF
)
954 err
|= __put_user(i
, &uc
->mcontext
.greg
[SVR4_PSR
]);
956 err
|= __put_user(regs
->y
, &uc
->mcontext
.greg
[SVR4_Y
]);
958 /* Copy g [1..7] and o [0..7] registers */
959 for (i
= 0; i
< 7; i
++)
960 err
|= __put_user(regs
->u_regs
[UREG_G1
+i
], (&(*gr
)[SVR4_G1
])+i
);
961 for (i
= 0; i
< 8; i
++)
962 err
|= __put_user(regs
->u_regs
[UREG_I0
+i
], (&(*gr
)[SVR4_O0
])+i
);
964 /* Setup sigaltstack */
965 err
|= __put_user(current
->sas_ss_sp
, &uc
->stack
.sp
);
966 err
|= __put_user(sas_ss_flags(regs
->u_regs
[UREG_FP
]), &uc
->stack
.flags
);
967 err
|= __put_user(current
->sas_ss_size
, &uc
->stack
.size
);
969 /* The register file is not saved
970 * we have already stuffed all of it with sync_user_stack
972 return (err
? -EFAULT
: 0);
976 /* Set the context for a svr4 application, this is Solaris way to sigreturn */
977 asmlinkage
int svr4_setcontext(svr4_ucontext_t
*c
, struct pt_regs
*regs
)
979 struct thread_struct
*tp
= ¤t
->thread
;
987 /* Fixme: restore windows, or is this already taken care of in
988 * svr4_setup_frame when sync_user_windows is done?
990 flush_user_windows();
993 printk ("Uh oh, w_saved is: 0x%x\n", tp
->w_saved
);
996 if (((unsigned long) c
) & 3){
997 printk ("Unaligned structure passed\n");
1001 if(!__access_ok((unsigned long)c
, sizeof(*c
))) {
1002 /* Miguel, add nice debugging msg _here_. ;-) */
1006 /* Check for valid PC and nPC */
1007 gr
= &c
->mcontext
.greg
;
1008 err
= __get_user(pc
, &((*gr
)[SVR4_PC
]));
1009 err
|= __get_user(npc
, &((*gr
)[SVR4_NPC
]));
1010 if((pc
| npc
) & 3) {
1011 #ifdef DEBUG_SIGNALS
1012 printk ("setcontext, PC or nPC were bogus\n");
1017 /* Retrieve information from passed ucontext */
1018 /* note that nPC is ored a 1, this is used to inform entry.S */
1019 /* that we don't want it to mess with our PC and nPC */
1021 err
|= copy_from_user (&setv
, &c
->sigmask
, sizeof(svr4_sigset_t
));
1022 set
.sig
[0] = setv
.sigbits
[0] | (((long)setv
.sigbits
[1]) << 32);
1023 if (_NSIG_WORDS
>= 2)
1024 set
.sig
[1] = setv
.sigbits
[2] | (((long)setv
.sigbits
[3]) << 32);
1026 err
|= __get_user((long)st
.ss_sp
, &c
->stack
.sp
);
1027 err
|= __get_user(st
.ss_flags
, &c
->stack
.flags
);
1028 err
|= __get_user(st
.ss_size
, &c
->stack
.size
);
1032 /* It is more difficult to avoid calling this function than to
1033 call it and ignore errors. */
1034 do_sigaltstack(&st
, NULL
, regs
->u_regs
[UREG_I6
]);
1036 sigdelsetmask(&set
, ~_BLOCKABLE
);
1037 spin_lock_irq(¤t
->sigmask_lock
);
1038 current
->blocked
= set
;
1039 recalc_sigpending(current
);
1040 spin_unlock_irq(¤t
->sigmask_lock
);
1042 regs
->tnpc
= npc
| 1;
1043 err
|= __get_user(regs
->y
, &((*gr
) [SVR4_Y
]));
1044 err
|= __get_user(psr
, &((*gr
) [SVR4_PSR
]));
1045 regs
->tstate
&= ~(TSTATE_ICC
|TSTATE_XCC
);
1046 regs
->tstate
|= psr_to_tstate_icc(psr
);
1049 regs
->tstate
|= TSTATE_PEF
;
1051 /* Restore g[1..7] and o[0..7] registers */
1052 for (i
= 0; i
< 7; i
++)
1053 err
|= __get_user(regs
->u_regs
[UREG_G1
+i
], (&(*gr
)[SVR4_G1
])+i
);
1054 for (i
= 0; i
< 8; i
++)
1055 err
|= __get_user(regs
->u_regs
[UREG_I0
+i
], (&(*gr
)[SVR4_O0
])+i
);
1064 static inline void setup_rt_frame32(struct k_sigaction
*ka
, struct pt_regs
*regs
,
1065 unsigned long signr
, sigset_t
*oldset
,
1068 struct rt_signal_frame32
*sf
;
1074 /* 1. Make sure everything is clean */
1075 synchronize_user_stack();
1076 save_and_clear_fpu();
1078 sigframe_size
= RT_ALIGNEDSZ
;
1079 if (!(current
->thread
.fpsaved
[0] & FPRS_FEF
))
1080 sigframe_size
-= sizeof(__siginfo_fpu_t
);
1082 sf
= (struct rt_signal_frame32
*)get_sigframe(&ka
->sa
, regs
, sigframe_size
);
1084 if (invalid_frame_pointer (sf
, sigframe_size
)) {
1085 #ifdef DEBUG_SIGNALS
1086 printk("rt_setup_frame32(%s:%d): invalid_frame_pointer(%p, %d)\n",
1087 current
->comm
, current
->pid
, sf
, sigframe_size
);
1092 if (current
->thread
.w_saved
!= 0) {
1093 #ifdef DEBUG_SIGNALS
1094 printk ("%s[%d]: Invalid user stack frame for "
1095 "signal delivery.\n", current
->comm
, current
->pid
);
1100 /* 2. Save the current process state */
1101 err
= put_user(regs
->tpc
, &sf
->regs
.pc
);
1102 err
|= __put_user(regs
->tnpc
, &sf
->regs
.npc
);
1103 err
|= __put_user(regs
->y
, &sf
->regs
.y
);
1104 psr
= tstate_to_psr (regs
->tstate
);
1105 if(current
->thread
.fpsaved
[0] & FPRS_FEF
)
1107 err
|= __put_user(psr
, &sf
->regs
.psr
);
1108 for (i
= 0; i
< 16; i
++)
1109 err
|= __put_user(regs
->u_regs
[i
], &sf
->regs
.u_regs
[i
]);
1110 err
|= __put_user(sizeof(siginfo_extra_v8plus_t
), &sf
->extra_size
);
1111 err
|= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC
, &sf
->v8plus
.g_upper
[0]);
1112 for (i
= 1; i
< 16; i
++)
1113 err
|= __put_user(((u32
*)regs
->u_regs
)[2*i
], &sf
->v8plus
.g_upper
[i
]);
1116 err
|= save_fpu_state32(regs
, &sf
->fpu_state
);
1117 err
|= __put_user((u64
)&sf
->fpu_state
, &sf
->fpu_save
);
1119 err
|= __put_user(0, &sf
->fpu_save
);
1122 /* Update the siginfo structure. */
1123 err
|= copy_siginfo_to_user32(&sf
->info
, info
);
1125 /* Setup sigaltstack */
1126 err
|= __put_user(current
->sas_ss_sp
, &sf
->stack
.ss_sp
);
1127 err
|= __put_user(sas_ss_flags(regs
->u_regs
[UREG_FP
]), &sf
->stack
.ss_flags
);
1128 err
|= __put_user(current
->sas_ss_size
, &sf
->stack
.ss_size
);
1130 switch (_NSIG_WORDS
) {
1131 case 4: seta
.sig
[7] = (oldset
->sig
[3] >> 32);
1132 seta
.sig
[6] = oldset
->sig
[3];
1133 case 3: seta
.sig
[5] = (oldset
->sig
[2] >> 32);
1134 seta
.sig
[4] = oldset
->sig
[2];
1135 case 2: seta
.sig
[3] = (oldset
->sig
[1] >> 32);
1136 seta
.sig
[2] = oldset
->sig
[1];
1137 case 1: seta
.sig
[1] = (oldset
->sig
[0] >> 32);
1138 seta
.sig
[0] = oldset
->sig
[0];
1140 err
|= __copy_to_user(&sf
->mask
, &seta
, sizeof(sigset_t32
));
1142 err
|= copy_in_user((u32
*)sf
,
1143 (u32
*)(regs
->u_regs
[UREG_FP
]),
1144 sizeof(struct reg_window32
));
1148 /* 3. signal handler back-trampoline and parameters */
1149 regs
->u_regs
[UREG_FP
] = (unsigned long) sf
;
1150 regs
->u_regs
[UREG_I0
] = signr
;
1151 regs
->u_regs
[UREG_I1
] = (unsigned long) &sf
->info
;
1153 /* 4. signal handler */
1154 regs
->tpc
= (unsigned long) ka
->sa
.sa_handler
;
1155 regs
->tnpc
= (regs
->tpc
+ 4);
1157 /* 5. return to kernel instructions */
1158 if (ka
->ka_restorer
)
1159 regs
->u_regs
[UREG_I7
] = (unsigned long)ka
->ka_restorer
;
1161 /* Flush instruction space. */
1162 unsigned long address
= ((unsigned long)&(sf
->insns
[0]));
1163 pgd_t
*pgdp
= pgd_offset(current
->mm
, address
);
1164 pmd_t
*pmdp
= pmd_offset(pgdp
, address
);
1165 pte_t
*ptep
= pte_offset(pmdp
, address
);
1167 regs
->u_regs
[UREG_I7
] = (unsigned long) (&(sf
->insns
[0]) - 2);
1169 /* mov __NR_rt_sigreturn, %g1 */
1170 err
|= __put_user(0x82102065, &sf
->insns
[0]);
1173 err
|= __put_user(0x91d02010, &sf
->insns
[1]);
1177 if(pte_present(*ptep
)) {
1178 unsigned long page
= (unsigned long) page_address(pte_page(*ptep
));
1180 __asm__
__volatile__("
1183 : : "r" (page
), "r" (address
& (PAGE_SIZE
- 1))
1195 static inline void handle_signal32(unsigned long signr
, struct k_sigaction
*ka
,
1197 sigset_t
*oldset
, struct pt_regs
*regs
,
1201 setup_svr4_frame32(&ka
->sa
, regs
->tpc
, regs
->tnpc
, regs
, signr
, oldset
);
1203 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
1204 setup_rt_frame32(ka
, regs
, signr
, oldset
, info
);
1205 else if (current
->thread
.flags
& SPARC_FLAG_NEWSIGNALS
)
1206 new_setup_frame32(ka
, regs
, signr
, oldset
);
1208 setup_frame32(&ka
->sa
, regs
, signr
, oldset
, info
);
1210 if(ka
->sa
.sa_flags
& SA_ONESHOT
)
1211 ka
->sa
.sa_handler
= SIG_DFL
;
1212 if(!(ka
->sa
.sa_flags
& SA_NOMASK
)) {
1213 spin_lock_irq(¤t
->sigmask_lock
);
1214 sigorsets(¤t
->blocked
,¤t
->blocked
,&ka
->sa
.sa_mask
);
1215 sigaddset(¤t
->blocked
,signr
);
1216 recalc_sigpending(current
);
1217 spin_unlock_irq(¤t
->sigmask_lock
);
1221 static inline void syscall_restart32(unsigned long orig_i0
, struct pt_regs
*regs
,
1222 struct sigaction
*sa
)
1224 switch(regs
->u_regs
[UREG_I0
]) {
1225 case ERESTARTNOHAND
:
1226 no_system_call_restart
:
1227 regs
->u_regs
[UREG_I0
] = EINTR
;
1228 regs
->tstate
|= TSTATE_ICARRY
;
1231 if(!(sa
->sa_flags
& SA_RESTART
))
1232 goto no_system_call_restart
;
1234 case ERESTARTNOINTR
:
1235 regs
->u_regs
[UREG_I0
] = orig_i0
;
1241 #ifdef DEBUG_SIGNALS_MAPS
1243 #define MAPS_LINE_FORMAT "%016lx-%016lx %s %016lx %s %lu "
1245 static inline void read_maps (void)
1247 struct vm_area_struct
* map
, * next
;
1251 buffer
= (char*)__get_free_page(GFP_KERNEL
);
1255 for (map
= current
->mm
->mmap
; map
; map
= next
) {
1256 /* produce the next line */
1258 char str
[5], *cp
= str
;
1264 * Get the next vma now (but it won't be used if we sleep).
1266 next
= map
->vm_next
;
1267 flags
= map
->vm_flags
;
1269 *cp
++ = flags
& VM_READ
? 'r' : '-';
1270 *cp
++ = flags
& VM_WRITE
? 'w' : '-';
1271 *cp
++ = flags
& VM_EXEC
? 'x' : '-';
1272 *cp
++ = flags
& VM_MAYSHARE
? 's' : 'p';
1277 if (map
->vm_file
!= NULL
) {
1278 dev
= map
->vm_file
->f_dentry
->d_inode
->i_dev
;
1279 ino
= map
->vm_file
->f_dentry
->d_inode
->i_ino
;
1280 line
= d_path(map
->vm_file
->f_dentry
,
1281 map
->vm_file
->f_vfsmnt
,
1284 printk(MAPS_LINE_FORMAT
, map
->vm_start
, map
->vm_end
, str
, map
->vm_pgoff
<< PAGE_SHIFT
,
1285 kdevname(dev
), ino
);
1286 if (map
->vm_file
!= NULL
)
1287 printk("%s\n", line
);
1291 free_page((unsigned long)buffer
);
1297 /* Note that 'init' is a special process: it doesn't get signals it doesn't
1298 * want to handle. Thus you cannot kill init even with a SIGKILL even by
1301 asmlinkage
int do_signal32(sigset_t
*oldset
, struct pt_regs
* regs
,
1302 unsigned long orig_i0
, int restart_syscall
)
1304 unsigned long signr
;
1305 struct k_sigaction
*ka
;
1308 int svr4_signal
= current
->personality
== PER_SVR4
;
1311 spin_lock_irq(¤t
->sigmask_lock
);
1312 signr
= dequeue_signal(¤t
->blocked
, &info
);
1313 spin_unlock_irq(¤t
->sigmask_lock
);
1317 if ((current
->ptrace
& PT_PTRACED
) && signr
!= SIGKILL
) {
1318 current
->exit_code
= signr
;
1319 current
->state
= TASK_STOPPED
;
1320 notify_parent(current
, SIGCHLD
);
1322 if (!(signr
= current
->exit_code
))
1324 current
->exit_code
= 0;
1325 if (signr
== SIGSTOP
)
1328 /* Update the siginfo structure. Is this good? */
1329 if (signr
!= info
.si_signo
) {
1330 info
.si_signo
= signr
;
1332 info
.si_code
= SI_USER
;
1333 info
.si_pid
= current
->p_pptr
->pid
;
1334 info
.si_uid
= current
->p_pptr
->uid
;
1337 /* If the (new) signal is now blocked, requeue it. */
1338 if (sigismember(¤t
->blocked
, signr
)) {
1339 send_sig_info(signr
, &info
, current
);
1344 ka
= ¤t
->sig
->action
[signr
-1];
1346 if(ka
->sa
.sa_handler
== SIG_IGN
) {
1347 if(signr
!= SIGCHLD
)
1350 /* sys_wait4() grabs the master kernel lock, so
1351 * we need not do so, that sucker should be
1352 * threaded and would not be that difficult to
1355 while(sys_wait4(-1, NULL
, WNOHANG
, NULL
) > 0)
1359 if(ka
->sa
.sa_handler
== SIG_DFL
) {
1360 unsigned long exit_code
= signr
;
1362 if(current
->pid
== 1)
1365 case SIGCONT
: case SIGCHLD
: case SIGWINCH
:
1368 case SIGTSTP
: case SIGTTIN
: case SIGTTOU
:
1369 if (is_orphaned_pgrp(current
->pgrp
))
1373 if (current
->ptrace
& PT_PTRACED
)
1375 current
->state
= TASK_STOPPED
;
1376 current
->exit_code
= signr
;
1377 if(!(current
->p_pptr
->sig
->action
[SIGCHLD
-1].sa
.sa_flags
&
1379 notify_parent(current
, SIGCHLD
);
1383 case SIGQUIT
: case SIGILL
: case SIGTRAP
:
1384 case SIGABRT
: case SIGFPE
: case SIGSEGV
:
1385 case SIGBUS
: case SIGSYS
: case SIGXCPU
: case SIGXFSZ
:
1386 if (do_coredump(signr
, regs
))
1388 #ifdef DEBUG_SIGNALS
1389 /* Very useful to debug dynamic linker problems */
1390 printk ("Sig %ld going for %s[%d]...\n", signr
, current
->comm
, current
->pid
);
1391 /* On SMP we are only interested in the current
1395 #ifdef DEBUG_SIGNALS_TLB
1397 extern void sparc_ultra_dump_itlb(void);
1398 extern void sparc_ultra_dump_dtlb(void);
1399 sparc_ultra_dump_dtlb();
1400 sparc_ultra_dump_itlb();
1403 #ifdef DEBUG_SIGNALS_TRACE
1405 struct reg_window32
*rw
= (struct reg_window32
*)(regs
->u_regs
[UREG_FP
] & 0xffffffff);
1406 unsigned int ins
[8];
1409 !(((unsigned long) rw
) & 0x3)) {
1410 copy_from_user(ins
, &rw
->ins
[0], sizeof(ins
));
1411 printk("Caller[%08x](%08x,%08x,%08x,%08x,%08x,%08x)\n", ins
[7], ins
[0], ins
[1], ins
[2], ins
[3], ins
[4], ins
[5]);
1412 rw
= (struct reg_window32
*)(unsigned long)ins
[6];
1416 #ifdef DEBUG_SIGNALS_MAPS
1423 sigaddset(¤t
->pending
.signal
, signr
);
1424 recalc_sigpending(current
);
1425 current
->flags
|= PF_SIGNALED
;
1431 syscall_restart32(orig_i0
, regs
, &ka
->sa
);
1432 handle_signal32(signr
, ka
, &info
, oldset
, regs
, svr4_signal
);
1435 if(restart_syscall
&&
1436 (regs
->u_regs
[UREG_I0
] == ERESTARTNOHAND
||
1437 regs
->u_regs
[UREG_I0
] == ERESTARTSYS
||
1438 regs
->u_regs
[UREG_I0
] == ERESTARTNOINTR
)) {
1439 /* replay the system call when we are done */
1440 regs
->u_regs
[UREG_I0
] = orig_i0
;
1452 asmlinkage
int do_sys32_sigstack(u32 u_ssptr
, u32 u_ossptr
, unsigned long sp
)
1454 struct sigstack32
*ssptr
= (struct sigstack32
*)((unsigned long)(u_ssptr
));
1455 struct sigstack32
*ossptr
= (struct sigstack32
*)((unsigned long)(u_ossptr
));
1458 /* First see if old state is wanted. */
1460 if (put_user(current
->sas_ss_sp
+ current
->sas_ss_size
, &ossptr
->the_stack
) ||
1461 __put_user(on_sig_stack(sp
), &ossptr
->cur_status
))
1465 /* Now see if we want to update the new state. */
1469 if (get_user((long)ss_sp
, &ssptr
->the_stack
))
1471 /* If the current stack was set with sigaltstack, don't
1472 swap stacks while we are on it. */
1474 if (current
->sas_ss_sp
&& on_sig_stack(sp
))
1477 /* Since we don't know the extent of the stack, and we don't
1478 track onstack-ness, but rather calculate it, we must
1479 presume a size. Ho hum this interface is lossy. */
1480 current
->sas_ss_sp
= (unsigned long)ss_sp
- SIGSTKSZ
;
1481 current
->sas_ss_size
= SIGSTKSZ
;
1489 asmlinkage
int do_sys32_sigaltstack(u32 ussa
, u32 uossa
, unsigned long sp
)
1493 mm_segment_t old_fs
;
1495 if (ussa
&& (get_user((long)uss
.ss_sp
, &((stack_t32
*)(long)ussa
)->ss_sp
) ||
1496 __get_user(uss
.ss_flags
, &((stack_t32
*)(long)ussa
)->ss_flags
) ||
1497 __get_user(uss
.ss_size
, &((stack_t32
*)(long)ussa
)->ss_size
)))
1501 ret
= do_sigaltstack(ussa
? &uss
: NULL
, uossa
? &uoss
: NULL
, sp
);
1503 if (!ret
&& uossa
&& (put_user((long)uoss
.ss_sp
, &((stack_t32
*)(long)uossa
)->ss_sp
) ||
1504 __put_user(uoss
.ss_flags
, &((stack_t32
*)(long)uossa
)->ss_flags
) ||
1505 __put_user(uoss
.ss_size
, &((stack_t32
*)(long)uossa
)->ss_size
)))