Mac OS X Support : Signals support
Pierre d'Herbemont
stegefin at free.fr
Sat May 3 14:59:04 CDT 2003
Hi,
This patch add in signal_powerpc.c of ntdll support for darwin signal.
Cheers,
Pierre
Modified files:
dlls/ntdll/signal_powerpc.c
ChangeLog:
Add support for Darwin's signals.
-------------- next part --------------
Index: dlls/ntdll/signal_powerpc.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/signal_powerpc.c,v
retrieving revision 1.12
diff -u -r1.12 signal_powerpc.c
--- dlls/ntdll/signal_powerpc.c 3 Apr 2003 23:57:11 -0000 1.12
+++ dlls/ntdll/signal_powerpc.c 3 May 2003 19:19:40 -0000
@@ -31,6 +31,15 @@
# include <unistd.h>
#endif
+#ifdef __darwin__
+// FIXME : should probably use HAVE_SYS_UCONTEXT_H
+# include <sys/ucontext.h>
+// FIXME : should probbably use HAVE_SIGNAL_H
+# include <signal.h>
+#include <sys/types.h>
+typedef siginfo_t siginfo;
+#endif
+
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
@@ -69,7 +78,12 @@
typedef struct ucontext SIGCONTEXT;
-#define HANDLER_DEF(name) void name( int __signal, struct siginfo *__siginfo, SIGCONTEXT *__context )
+#ifdef __darwin__
+# define HANDLER_DEF(name) void name( int __signal, siginfo *__siginfo, SIGCONTEXT *__context )
+#else
+# define HANDLER_DEF(name) void name( int __signal, struct siginfo *__siginfo, SIGCONTEXT *__context )
+#endif
+
#define HANDLER_CONTEXT (__context)
typedef int (*wine_signal_handler)(unsigned int sig);
@@ -94,16 +108,27 @@
*/
static void save_context( CONTEXT *context, const SIGCONTEXT *sigcontext )
{
-#define CX(x,y) context->x = sigcontext->uc_mcontext.regs->y
-#define C(x) CX(Gpr##x,gpr[x])
+#ifdef __darwin__
+// Handle context using darwin way
+# define CX(x,y) context->x = sigcontext->uc_mcontext->ss.y
+# define C(x) CX(Gpr##x,r##x)
+#else
+# define CX(x,y) context->x = sigcontext->uc_mcontext.regs->y
+# define C(x) CX(Gpr##x,gpr[x])
+#endif
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9); C(10);
C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19); C(20);
C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28); C(29); C(30);
C(31);
-
+#ifdef __darwin__
+ CX(Iar,srr0); /* Program Counter */
+ CX(Msr,srr1); /* Machine State Reister (Supervisor) */
+ CX(Ctr,ctr);
+#else
CX(Iar,nip);
CX(Msr,msr);
CX(Ctr,ctr);
+#endif /* __darwin__ */
#undef CX
/* FIXME: fp regs? */
@@ -128,15 +153,26 @@
*/
static void restore_context( const CONTEXT *context, SIGCONTEXT *sigcontext )
{
-#define CX(x,y) sigcontext->uc_mcontext.regs->y = context->x
+#ifdef __darwin__
+# define CX(x,y) sigcontext->uc_mcontext->ss.y = context->x
+#else
+# define CX(x,y) sigcontext->uc_mcontext.regs->y = context->x
+#endif /* __darwin__ */
C(0); C(1); C(2); C(3); C(4); C(5); C(6); C(7); C(8); C(9); C(10);
C(11); C(12); C(13); C(14); C(15); C(16); C(17); C(18); C(19); C(20);
C(21); C(22); C(23); C(24); C(25); C(26); C(27); C(28); C(29); C(30);
C(31);
+#ifdef __darwin__
+ CX(Iar,srr0); /* Program Counter */
+ CX(Msr,srr1); /* Machine State Reister (Supervisor) */
+ CX(Ctr,ctr);
+#else /* __darwin__ */
CX(Iar,nip);
CX(Msr,msr);
CX(Ctr,ctr);
+#endif /* __darwin__ */
+
#undef CX
}
@@ -187,6 +223,67 @@
return EXCEPTION_FLT_INVALID_OPERATION; /* generic error */
}
+#ifdef __darwin__
+/**********************************************************************
+ * segv_handler
+ *
+ * Handler for SIGSEGV and related errors.
+ */
+static HANDLER_DEF(segv_handler)
+{
+ CONTEXT context;
+ EXCEPTION_RECORD rec;
+ DWORD page_fault_code = EXCEPTION_ACCESS_VIOLATION;
+
+ save_context( &context, HANDLER_CONTEXT );
+
+ rec.ExceptionRecord = NULL;
+ rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
+ rec.ExceptionAddress = (LPVOID)HANDLER_CONTEXT->uc_mcontext->ss.srr0;
+ rec.NumberParameters = 0;
+ switch (__siginfo->si_signo) {
+ case SIGSEGV:
+ switch ( __siginfo->si_code & 0xffff ) {
+ case SEGV_MAPERR:
+ case SEGV_ACCERR:
+ rec.NumberParameters = 2;
+ rec.ExceptionInformation[0] = 0; /* FIXME ? */
+ rec.ExceptionInformation[1] = (DWORD)__siginfo->si_addr;
+ if (!(page_fault_code=VIRTUAL_HandleFault(__siginfo->si_addr)))
+ return;
+ rec.ExceptionCode = page_fault_code;
+ break;
+ default:FIXME("Unhandled SIGSEGV/%x\n",__siginfo->si_code);
+ break;
+ }
+ break;
+ case SIGBUS:
+ switch ( __siginfo->si_code & 0xffff ) {
+ case BUS_ADRALN:
+ rec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT;
+ break;
+ default:FIXME("Unhandled SIGBUS/%x\n",__siginfo->si_code);
+ break;
+ }
+ break;
+ case SIGILL:
+ switch ( __siginfo->si_code & 0xffff ) {
+ case ILL_ILLOPC: /* illegal opcode */
+ case ILL_ILLTRP: /* illegal trap */
+ rec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
+ break;
+ case ILL_PRVOPC: /* privileged opcode */
+ rec.ExceptionCode = EXCEPTION_PRIV_INSTRUCTION;
+ break;
+ default:FIXME("Unhandled SIGILL/%x\n",__siginfo->si_code);
+ break;
+ }
+ break;
+ }
+ EXC_RtlRaiseException( &rec, &context );
+ restore_context( &context, HANDLER_CONTEXT );
+}
+#else /* __darwin__ */
/**********************************************************************
* segv_handler
@@ -264,7 +361,35 @@
EXC_RtlRaiseException( &rec, &context );
restore_context( &context, HANDLER_CONTEXT );
}
+#endif /* __darwin__ */
+#ifdef __darwin__
+/**********************************************************************
+ * trap_handler for darwin
+ *
+ * Handler for SIGTRAP.
+ */
+static HANDLER_DEF(trap_handler)
+{
+ CONTEXT context;
+ EXCEPTION_RECORD rec;
+
+ save_context( &context, HANDLER_CONTEXT );
+
+ rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
+ rec.ExceptionRecord = NULL;
+ rec.ExceptionAddress = (LPVOID)__context->uc_mcontext->ss.srr0;
+ rec.NumberParameters = 0;
+
+ /* FIXME: check if we might need to modify PC */
+ switch (__siginfo->si_code & 0xffff) {
+ default:FIXME("Unhandled SIGTRAP/%x\n",__siginfo->si_code);
+ break;
+ }
+ EXC_RtlRaiseException( &rec, &context );
+ restore_context( &context, HANDLER_CONTEXT );
+}
+#else /* __darwin__ */
/**********************************************************************
* trap_handler
*
@@ -294,8 +419,49 @@
EXC_RtlRaiseException( &rec, &context );
restore_context( &context, HANDLER_CONTEXT );
}
+#endif /* __darwin__ */
+#ifdef __darwin__
+/**********************************************************************
+ * fpe_handler
+ *
+ * Handler for SIGFPE.
+ */
+static HANDLER_DEF(fpe_handler)
+{
+ CONTEXT context;
+ EXCEPTION_RECORD rec;
+
+ /*save_fpu( &context, HANDLER_CONTEXT );*/
+ save_context( &context, HANDLER_CONTEXT );
+ switch ( __siginfo->si_code & 0xffff ) {
+ case FPE_FLTDIV:
+ rec.ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO;
+ break;
+ case FPE_FLTOVF:
+ rec.ExceptionCode = EXCEPTION_FLT_OVERFLOW;
+ break;
+ case FPE_FLTUND:
+ rec.ExceptionCode = EXCEPTION_FLT_UNDERFLOW;
+ break;
+ case FPE_FLTRES:
+ rec.ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT;
+ break;
+ case FPE_FLTINV:
+ default:
+ rec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION;
+ break;
+ }
+ rec.ExceptionFlags = EXCEPTION_CONTINUABLE;
+ rec.ExceptionRecord = NULL;
+ rec.ExceptionAddress = (LPVOID)__context->uc_mcontext->ss.srr0;
+ rec.NumberParameters = 0;
+ EXC_RtlRaiseException( &rec, &context );
+ restore_context( &context, HANDLER_CONTEXT );
+ /*restore_fpu( &context, HANDLER_CONTEXT );*/
+}
+#else /* __darwin__ */
/**********************************************************************
* fpe_handler
*
@@ -344,7 +510,7 @@
restore_context( &context, HANDLER_CONTEXT );
/*restore_fpu( &context, HANDLER_CONTEXT );*/
}
-
+#endif /* __darwin__ */
/**********************************************************************
* int_handler
@@ -469,7 +635,7 @@
}
#endif /* HAVE_SIGALTSTACK */
- sigfillset( &all_sigs );
+ /* sigfillset( &all_sigs ); Do not use it*/
if (set_handler( SIGINT, have_sigaltstack, (void (*)())int_handler ) == -1) goto error;
if (set_handler( SIGFPE, have_sigaltstack, (void (*)())fpe_handler ) == -1) goto error;
More information about the wine-patches
mailing list