2 * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com)
3 * Licensed under the GPL
8 #include "signal_user.h"
10 #include "kern_util.h"
12 #include "sigcontext.h"
14 #include "ptrace_user.h"
15 #include "sysdep/ptrace.h"
16 #include "sysdep/ptrace_user.h"
18 void sig_handler_common_skas(int sig
, void *sc_ptr
)
20 struct sigcontext
*sc
= sc_ptr
;
22 struct signal_info
*info
;
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);
44 info
= &sig_info
[sig
];
45 if(!info
->is_irq
) unblock_signals();
47 (*info
->handler
)(sig
, (union uml_pt_regs
*) r
);
50 r
->is_user
= save_user
;
53 extern int ptrace_faultinfo
;
55 void user_signal(int sig
, union uml_pt_regs
*regs
, int pid
)
57 struct signal_info
*info
;
58 int segv
= ((sig
== SIGFPE
) || (sig
== SIGSEGV
) || (sig
== SIGBUS
) ||
59 (sig
== SIGILL
) || (sig
== SIGTRAP
));
61 regs
->skas
.is_user
= 1;
63 get_skas_faultinfo(pid
, ®s
->skas
.faultinfo
);
64 info
= &sig_info
[sig
];
65 (*info
->handler
)(sig
, regs
);
71 * Overrides for Emacs so that we follow Linus's tabbing style.
72 * Emacs will notice this stuff at the end of the file and automatically
73 * adjust the settings for this buffer only. This must remain at the end
75 * ---------------------------------------------------------------------------
77 * c-file-style: "linux"