diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 7a00360fc5d..c83aecc270d 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -1040,6 +1040,26 @@ static HANDLER_DEF(int_handler) } } +/********************************************************************** + * abrt_handler + * + * Handler for SIGABRT. + */ +static HANDLER_DEF(abrt_handler) +{ + EXCEPTION_RECORD rec; + CONTEXT context; + + save_context( &context, HANDLER_CONTEXT ); + rec.ExceptionCode = EXCEPTION_WINE_ASSERTION; + rec.ExceptionFlags = EH_NONCONTINUABLE; + rec.ExceptionRecord = NULL; + rec.ExceptionAddress = (LPVOID)context.Eip; + rec.NumberParameters = 0; + EXC_RtlRaiseException( &rec, &context ); /* Should never return.. */ + restore_context( &context, HANDLER_CONTEXT ); +} + /*********************************************************************** * set_handler @@ -1124,6 +1144,7 @@ BOOL SIGNAL_Init(void) if (set_handler( SIGFPE, have_sigaltstack, (void (*)())fpe_handler ) == -1) goto error; if (set_handler( SIGSEGV, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error; if (set_handler( SIGILL, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error; + if (set_handler( SIGABRT, have_sigaltstack, (void (*)())abrt_handler ) == -1) goto error; #ifdef SIGBUS if (set_handler( SIGBUS, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error; #endif diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c index 2c0dc683d49..30acb6238f7 100644 --- a/dlls/ntdll/signal_powerpc.c +++ b/dlls/ntdll/signal_powerpc.c @@ -381,6 +381,26 @@ static HANDLER_DEF(int_handler) } } +/********************************************************************** + * abrt_handler + * + * Handler for SIGABRT. + */ +static HANDLER_DEF(abrt_handler) +{ + EXCEPTION_RECORD rec; + CONTEXT context; + + save_context( &context, HANDLER_CONTEXT ); + rec.ExceptionCode = EXCEPTION_WINE_ASSERTION; + rec.ExceptionFlags = EH_NONCONTINUABLE; + rec.ExceptionRecord = NULL; + rec.ExceptionAddress = (LPVOID)context.Eip; + rec.NumberParameters = 0; + EXC_RtlRaiseException( &rec, &context ); /* Should never return.. */ + restore_context( &context, HANDLER_CONTEXT ); +} + /*********************************************************************** * set_handler @@ -440,6 +460,7 @@ BOOL SIGNAL_Init(void) if (set_handler( SIGFPE, have_sigaltstack, (void (*)())fpe_handler ) == -1) goto error; if (set_handler( SIGSEGV, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error; if (set_handler( SIGILL, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error; + if (set_handler( SIGABRT, have_sigaltstack, (void (*)())abrt_handler ) == -1) goto error; #ifdef SIGBUS if (set_handler( SIGBUS, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error; #endif diff --git a/dlls/ntdll/signal_sparc.c b/dlls/ntdll/signal_sparc.c index 024c4c2bc03..5d8d211ead0 100644 --- a/dlls/ntdll/signal_sparc.c +++ b/dlls/ntdll/signal_sparc.c @@ -343,6 +343,25 @@ static void int_handler( int signal, siginfo_t *info, ucontext_t *ucontext ) } } +/********************************************************************** + * abrt_handler + * + * Handler for SIGABRT. + */ +static HANDLER_DEF(abrt_handler) +{ + EXCEPTION_RECORD rec; + CONTEXT context; + + save_context( &context, HANDLER_CONTEXT ); + rec.ExceptionCode = EXCEPTION_WINE_ASSERTION; + rec.ExceptionFlags = EH_NONCONTINUABLE; + rec.ExceptionRecord = NULL; + rec.ExceptionAddress = (LPVOID)context.Eip; + rec.NumberParameters = 0; + EXC_RtlRaiseException( &rec, &context ); /* Should never return.. */ + restore_context( &context, HANDLER_CONTEXT ); +} /*********************************************************************** * set_handler @@ -398,7 +417,8 @@ BOOL SIGNAL_Init(void) if (set_handler( SIGILL, (void (*)())ill_handler ) == -1) goto error; if (set_handler( SIGBUS, (void (*)())bus_handler ) == -1) goto error; if (set_handler( SIGTRAP, (void (*)())trap_handler ) == -1) goto error; - return TRUE; + if (set_handler( SIGABRT, (void (*)())abrt_handler ) == -1) goto error; + return TRUE; error: perror("sigaction"); diff --git a/include/wine/exception.h b/include/wine/exception.h index 207a817bba0..8d1421a2f89 100644 --- a/include/wine/exception.h +++ b/include/wine/exception.h @@ -183,11 +183,12 @@ static inline EXCEPTION_FRAME * WINE_UNUSED __wine_pop_frame( EXCEPTION_FRAME *f /* Wine-specific exceptions codes */ #define EXCEPTION_WINE_STUB 0x80000100 /* stub entry point called */ +#define EXCEPTION_WINE_ASSERTION 0x80000101 /* assertion failed */ /* unhandled return status from vm86 mode */ -#define EXCEPTION_VM86_INTx 0x80000101 -#define EXCEPTION_VM86_STI 0x80000102 -#define EXCEPTION_VM86_PICRETURN 0x80000103 +#define EXCEPTION_VM86_INTx 0x80000110 +#define EXCEPTION_VM86_STI 0x80000111 +#define EXCEPTION_VM86_PICRETURN 0x80000112 extern void __wine_enter_vm86( CONTEXT *context ); diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c index 7a310c254b7..9a5db3b7978 100644 --- a/programs/winedbg/winedbg.c +++ b/programs/winedbg/winedbg.c @@ -556,6 +556,9 @@ static BOOL DEBUG_HandleException(EXCEPTION_RECORD *rec, BOOL first_chance, BOOL DEBUG_Printf(DBG_CHN_MESG, "unimplemented function %s.%s called", dll, name ); } break; + case EXCEPTION_WINE_ASSERTION: + DEBUG_Printf(DBG_CHN_MESG, "assertion failed"); + break; case EXCEPTION_VM86_INTx: DEBUG_Printf(DBG_CHN_MESG, "interrupt %02lx in vm86 mode", rec->ExceptionInformation[0]); diff --git a/win32/except.c b/win32/except.c index d952a0d88bf..b8763423c10 100644 --- a/win32/except.c +++ b/win32/except.c @@ -135,6 +135,9 @@ static int format_exception_msg( const EXCEPTION_POINTERS *ptr, char *buffer, in len = snprintf( buffer, size, "Unimplemented function %s.%s called", (char *)rec->ExceptionInformation[0], (char *)rec->ExceptionInformation[1] ); break; + case EXCEPTION_WINE_ASSERTION: + len = snprintf( buffer, size, "Assertion failed" ); + break; case EXCEPTION_VM86_INTx: len = snprintf( buffer, size, "Unhandled interrupt %02lx in vm86 mode", rec->ExceptionInformation[0]);