$NetBSD: patch-af,v 1.21 2007/01/30 13:11:04 adam Exp $ --- dlls/ntdll/signal_i386.c.orig 2007-01-25 16:53:50.000000000 +0100 +++ dlls/ntdll/signal_i386.c @@ -163,7 +163,7 @@ typedef struct trapframe SIGCONTEXT; #endif /* bsdi */ -#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) +#if (defined(__NetBSD__) && (__NetBSD_Version__ < 200000000)) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) typedef struct sigcontext SIGCONTEXT; @@ -268,6 +268,43 @@ typedef ucontext_t SIGCONTEXT; #endif /* __APPLE__ */ +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 200000000) +# include +# include +# include + +typedef ucontext_t SIGCONTEXT; + +#define EAX_sig(context) ((context)->uc_mcontext.__gregs[_REG_EAX]) +#define EBX_sig(context) ((context)->uc_mcontext.__gregs[_REG_EBX]) +#define ECX_sig(context) ((context)->uc_mcontext.__gregs[_REG_ECX]) +#define EDX_sig(context) ((context)->uc_mcontext.__gregs[_REG_EDX]) +#define ESI_sig(context) ((context)->uc_mcontext.__gregs[_REG_ESI]) +#define EDI_sig(context) ((context)->uc_mcontext.__gregs[_REG_EDI]) +#define EBP_sig(context) ((context)->uc_mcontext.__gregs[_REG_EBP]) + +#define CS_sig(context) ((context)->uc_mcontext.__gregs[_REG_CS]) +#define DS_sig(context) ((context)->uc_mcontext.__gregs[_REG_DS]) +#define ES_sig(context) ((context)->uc_mcontext.__gregs[_REG_ES]) +#define FS_sig(context) ((context)->uc_mcontext.__gregs[_REG_FS]) +#define GS_sig(context) ((context)->uc_mcontext.__gregs[_REG_GS]) +#define SS_sig(context) ((context)->uc_mcontext.__gregs[_REG_SS]) + +#define EFL_sig(context) ((context)->uc_mcontext.__gregs[_REG_EFL]) + +#define EIP_sig(context) (*((unsigned long*)&(context)->uc_mcontext.__gregs[_REG_EIP])) +#define ESP_sig(context) (*((unsigned long*)&(context)->uc_mcontext.__gregs[_REG_ESP])) + +#define TRAP_sig(context) ((context)->uc_mcontext.__gregs[_REG_TRAPNO]) +#define ERROR_sig(context) ((context)->uc_mcontext.__gregs[_REG_ERR]) + +#define FAULT_ADDRESS (__siginfo->si_addr) + +#define HANDLER_DEF(name) void name( int __signal, siginfo_t *__siginfo, SIGCONTEXT *__context ) +#define HANDLER_CONTEXT (__context) + +#endif /* __NetBSD__ */ + #include "wine/exception.h" #include "wine/debug.h" @@ -303,8 +340,10 @@ enum i386_trap_code TRAP_x86_PAGEFLT = T_PAGEFLT, /* Page fault */ TRAP_x86_ARITHTRAP = T_ARITHTRAP, /* Floating point exception */ TRAP_x86_ALIGNFLT = T_ALIGNFLT, /* Alignment check exception */ +#if !defined(__NetBSD__) TRAP_x86_MCHK = T_MCHK, /* Machine check exception */ TRAP_x86_CACHEFLT = T_XMMFLT /* Cache flush exception */ +#endif #else TRAP_x86_DIVIDE = 0, /* Division by zero exception */ TRAP_x86_TRCTRAP = 1, /* Single-step exception */ @@ -1152,8 +1191,10 @@ static void segv_handler( int signal, si case TRAP_x86_DNA: /* Device not available exception */ case TRAP_x86_DOUBLEFLT: /* Double fault exception */ case TRAP_x86_TSSFLT: /* Invalid TSS exception */ +#if !defined(__NetBSD__) case TRAP_x86_MCHK: /* Machine check exception */ case TRAP_x86_CACHEFLT: /* Cache flush exception */ +#endif rec->ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION; break; } @@ -1342,7 +1383,11 @@ BOOL SIGNAL_Init(void) #endif /* HAVE_SIGALTSTACK */ sig_act.sa_mask = server_block_set; +#if defined(__NetBSD__) && (__NetBSD_Version__ < 200000000) + sig_act.sa_flags = SA_RESTART; +#else sig_act.sa_flags = SA_SIGINFO | SA_RESTART; +#endif #ifdef SA_ONSTACK sig_act.sa_flags |= SA_ONSTACK; #endif