|
@@ -15,7 +15,6 @@
|
|
#include "user.h"
|
|
#include "user.h"
|
|
#include "signal_kern.h"
|
|
#include "signal_kern.h"
|
|
#include "sysdep/sigcontext.h"
|
|
#include "sysdep/sigcontext.h"
|
|
-#include "sysdep/signal.h"
|
|
|
|
#include "sigcontext.h"
|
|
#include "sigcontext.h"
|
|
#include "mode.h"
|
|
#include "mode.h"
|
|
#include "os.h"
|
|
#include "os.h"
|
|
@@ -38,18 +37,10 @@
|
|
static int signals_enabled = 1;
|
|
static int signals_enabled = 1;
|
|
static int pending = 0;
|
|
static int pending = 0;
|
|
|
|
|
|
-void sig_handler(ARCH_SIGHDLR_PARAM)
|
|
|
|
|
|
+void sig_handler(int sig, struct sigcontext *sc)
|
|
{
|
|
{
|
|
- struct sigcontext *sc;
|
|
|
|
int enabled;
|
|
int enabled;
|
|
|
|
|
|
- /* Must be the first thing that this handler does - x86_64 stores
|
|
|
|
- * the sigcontext in %rdx, and we need to save it before it has a
|
|
|
|
- * chance to get trashed.
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- ARCH_GET_SIGCONTEXT(sc, sig);
|
|
|
|
-
|
|
|
|
enabled = signals_enabled;
|
|
enabled = signals_enabled;
|
|
if(!enabled && (sig == SIGIO)){
|
|
if(!enabled && (sig == SIGIO)){
|
|
pending |= SIGIO_MASK;
|
|
pending |= SIGIO_MASK;
|
|
@@ -84,13 +75,10 @@ static void real_alarm_handler(int sig, struct sigcontext *sc)
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void alarm_handler(ARCH_SIGHDLR_PARAM)
|
|
|
|
|
|
+void alarm_handler(int sig, struct sigcontext *sc)
|
|
{
|
|
{
|
|
- struct sigcontext *sc;
|
|
|
|
int enabled;
|
|
int enabled;
|
|
|
|
|
|
- ARCH_GET_SIGCONTEXT(sc, sig);
|
|
|
|
-
|
|
|
|
enabled = signals_enabled;
|
|
enabled = signals_enabled;
|
|
if(!signals_enabled){
|
|
if(!signals_enabled){
|
|
if(sig == SIGVTALRM)
|
|
if(sig == SIGVTALRM)
|
|
@@ -126,6 +114,10 @@ void remove_sigstack(void)
|
|
panic("disabling signal stack failed, errno = %d\n", errno);
|
|
panic("disabling signal stack failed, errno = %d\n", errno);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void (*handlers[_NSIG])(int sig, struct sigcontext *sc);
|
|
|
|
+
|
|
|
|
+extern void hard_handler(int sig);
|
|
|
|
+
|
|
void set_handler(int sig, void (*handler)(int), int flags, ...)
|
|
void set_handler(int sig, void (*handler)(int), int flags, ...)
|
|
{
|
|
{
|
|
struct sigaction action;
|
|
struct sigaction action;
|
|
@@ -133,13 +125,16 @@ void set_handler(int sig, void (*handler)(int), int flags, ...)
|
|
sigset_t sig_mask;
|
|
sigset_t sig_mask;
|
|
int mask;
|
|
int mask;
|
|
|
|
|
|
- va_start(ap, flags);
|
|
|
|
- action.sa_handler = handler;
|
|
|
|
|
|
+ handlers[sig] = (void (*)(int, struct sigcontext *)) handler;
|
|
|
|
+ action.sa_handler = hard_handler;
|
|
|
|
+
|
|
sigemptyset(&action.sa_mask);
|
|
sigemptyset(&action.sa_mask);
|
|
- while((mask = va_arg(ap, int)) != -1){
|
|
|
|
|
|
+
|
|
|
|
+ va_start(ap, flags);
|
|
|
|
+ while((mask = va_arg(ap, int)) != -1)
|
|
sigaddset(&action.sa_mask, mask);
|
|
sigaddset(&action.sa_mask, mask);
|
|
- }
|
|
|
|
va_end(ap);
|
|
va_end(ap);
|
|
|
|
+
|
|
action.sa_flags = flags;
|
|
action.sa_flags = flags;
|
|
action.sa_restorer = NULL;
|
|
action.sa_restorer = NULL;
|
|
if(sigaction(sig, &action, NULL) < 0)
|
|
if(sigaction(sig, &action, NULL) < 0)
|