2 * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com)
3 * Licensed under the GPL
11 #include "sigcontext.h"
13 #include "ptrace_user.h"
14 #include "sysdep/ptrace.h"
15 #include "sysdep/ptrace_user.h"
18 void sig_handler_common_skas(int sig
, void *sc_ptr
)
20 struct sigcontext
*sc
= sc_ptr
;
22 void (*handler
)(int, union uml_pt_regs
*);
23 int save_errno
= errno
;
26 /* This is done because to allow SIGSEGV to be delivered inside a SEGV
27 * handler. This can happen in copy_user, and if SEGV is disabled,
28 * the process will die.
29 * XXX Figure out why this is better than SA_NODEFER
32 change_sig(SIGSEGV
, 1);
34 r
= &TASK_REGS(get_current())->skas
;
35 save_user
= r
->is_user
;
37 if ( sig
== SIGFPE
|| sig
== SIGSEGV
||
38 sig
== SIGBUS
|| sig
== SIGILL
||
40 GET_FAULTINFO_FROM_SC(r
->faultinfo
, sc
);
43 change_sig(SIGUSR1
, 1);
45 handler
= sig_info
[sig
];
47 /* unblock SIGALRM, SIGVTALRM, SIGIO if sig isn't IRQ signal */
48 if (sig
!= SIGIO
&& sig
!= SIGWINCH
&&
49 sig
!= SIGVTALRM
&& sig
!= SIGALRM
)
52 handler(sig
, (union uml_pt_regs
*) r
);
55 r
->is_user
= save_user
;
58 extern int ptrace_faultinfo
;
60 void user_signal(int sig
, union uml_pt_regs
*regs
, int pid
)
62 void (*handler
)(int, union uml_pt_regs
*);
63 int segv
= ((sig
== SIGFPE
) || (sig
== SIGSEGV
) || (sig
== SIGBUS
) ||
64 (sig
== SIGILL
) || (sig
== SIGTRAP
));
67 get_skas_faultinfo(pid
, ®s
->skas
.faultinfo
);
69 handler
= sig_info
[sig
];
70 handler(sig
, (union uml_pt_regs
*) regs
);