On Saturday, May 3, 2003, at 09:59 PM, Pierre d'Herbemont wrote:
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.
Hi,
New patch without cpp style comments.
Index: dlls/ntdll/signal_powerpc.c =================================================================== RCS file: /home/wine/wine/dlls/ntdll/signal_powerpc.c,v retrieving revision 1.13 diff -u -r1.13 signal_powerpc.c --- dlls/ntdll/signal_powerpc.c 4 May 2003 02:25:07 -0000 1.13 +++ dlls/ntdll/signal_powerpc.c 5 May 2003 20:39:00 -0000 @@ -30,6 +30,15 @@ # include <unistd.h> #endif +#ifdef __darwin__ +/* FIXME : should use HAVE_SYS_UCONTEXT_H */ +# include <sys/ucontext.h> +/* FIXME : should 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 @@ -68,7 +77,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); @@ -93,16 +107,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? */ @@ -127,15 +152,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 } @@ -186,6 +222,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 @@ -263,7 +360,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 * @@ -293,8 +418,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 * @@ -343,7 +509,7 @@ restore_context( &context, HANDLER_CONTEXT ); /*restore_fpu( &context, HANDLER_CONTEXT );*/ } - +#endif /* __darwin__ */ /********************************************************************** * int_handler
Thanks, Pierre