2 * Emulator signal handling
4 * Copyright 1995 Alexandre Julliard
16 #include <sys/timeb.h>
17 #include <sys/types.h>
20 #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__svr4__) || defined(_SCO_DS) || defined(__EMX__)
21 # if !defined(_SCO_DS) && !defined(__EMX__)
22 # include <sys/syscall.h>
24 # include <sys/param.h>
31 #include "sigcontext.h"
35 /* Signal handler declaration */
38 #define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context_struct)
39 #define HANDLER_PROLOG SIGCONTEXT *context = &context_struct; {
40 #define HANDLER_EPILOG }
41 #elif defined(__svr4__) || defined(_SCO_DS)
42 #define HANDLER_DEF(name) void name (int signal, void *siginfo, SIGCONTEXT *context)
43 #define HANDLER_PROLOG /* nothing */
44 #define HANDLER_EPILOG /* nothing */
46 #define HANDLER_DEF(name) void name (int signal, int code, SIGCONTEXT *context)
47 #define HANDLER_PROLOG /* nothing */
48 #define HANDLER_EPILOG /* nothing */
51 extern void SIGNAL_SetHandler( int sig
, void (*func
)(), int flags
);
52 extern BOOL32
INSTR_EmulateInstruction( SIGCONTEXT
*context
);
55 /**********************************************************************
58 * Handle Ctrl-C and such
60 static HANDLER_DEF(SIGNAL_break
)
63 if (Options
.debug
) wine_debug( signal
, context
); /* Enter our debugger */
69 /**********************************************************************
74 static HANDLER_DEF(SIGNAL_trap
)
77 wine_debug( signal
, context
); /* Enter our debugger */
82 /**********************************************************************
87 static HANDLER_DEF(SIGNAL_fault
)
90 if (CS_sig(context
) == WINE_CODE_SELECTOR
)
92 fprintf( stderr
, "Segmentation fault in Wine program (%04x:%08lx)."
94 (unsigned short) CS_sig(context
), EIP_sig(context
));
98 if (INSTR_EmulateInstruction( context
)) return;
99 fprintf( stderr
, "Segmentation fault in Windows program %04x:%08lx.\n",
100 (unsigned short) CS_sig(context
), EIP_sig(context
) );
102 wine_debug( signal
, context
);
107 /**********************************************************************
108 * SIGNAL_InitEmulator
110 * Initialize emulator signals.
112 BOOL32
SIGNAL_InitEmulator(void)
114 SIGNAL_SetHandler( SIGINT
, (void (*)())SIGNAL_break
, 1);
115 SIGNAL_SetHandler( SIGSEGV
, (void (*)())SIGNAL_fault
, 1);
116 SIGNAL_SetHandler( SIGILL
, (void (*)())SIGNAL_fault
, 1);
117 SIGNAL_SetHandler( SIGFPE
, (void (*)())SIGNAL_fault
, 1);
118 SIGNAL_SetHandler( SIGTRAP
, (void (*)())SIGNAL_trap
, 1); /* debugger */
119 SIGNAL_SetHandler( SIGHUP
, (void (*)())SIGNAL_trap
, 1); /* forced break*/
121 SIGNAL_SetHandler( SIGBUS
, (void (*)())SIGNAL_fault
, 1);