Module: wine Branch: master Commit: 3027c266fc02b650378cb083a18e82fb9c7cba19 URL: https://source.winehq.org/git/wine.git/?a=commit;h=3027c266fc02b650378cb083a...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Aug 13 15:41:25 2019 +0200
ntdll: Don't run exception handlers on the signal stack on ARM64.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/signal_arm64.c | 95 ++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 64 deletions(-)
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 1531a0e..4ebccd2 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -470,6 +470,7 @@ static EXCEPTION_RECORD *setup_exception( ucontext_t *sigcontext, raise_func fun stack->rec.NumberParameters = 0;
save_context( &stack->context, sigcontext ); + save_fpu( &stack->context, sigcontext );
/* now modify the sigcontext to return to the raise function */ SP_sig(sigcontext) = (ULONG_PTR)stack; @@ -499,12 +500,21 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context break; } status = NtRaiseException( rec, context, TRUE ); - if (status) raise_status( status, rec ); + raise_status( status, rec ); done: set_cpu_context( context ); }
/********************************************************************** + * raise_generic_exception + */ +static void WINAPI raise_generic_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) +{ + NTSTATUS status = NtRaiseException( rec, context, TRUE ); + raise_status( status, rec ); +} + +/********************************************************************** * call_stack_handlers * * Call the stack handlers chain. @@ -693,29 +703,19 @@ static void segv_handler( int signal, siginfo_t *info, void *ucontext ) */ static void trap_handler( int signal, siginfo_t *info, void *ucontext ) { - EXCEPTION_RECORD rec; - CONTEXT context; - NTSTATUS status; + ucontext_t *context = ucontext; + EXCEPTION_RECORD *rec = setup_exception( context, raise_generic_exception );
- switch ( info->si_code ) + switch (info->si_code) { case TRAP_TRACE: - rec.ExceptionCode = EXCEPTION_SINGLE_STEP; + rec->ExceptionCode = EXCEPTION_SINGLE_STEP; break; case TRAP_BRKPT: default: - rec.ExceptionCode = EXCEPTION_BREAKPOINT; + rec->ExceptionCode = EXCEPTION_BREAKPOINT; break; } - - save_context( &context, ucontext ); - rec.ExceptionFlags = EXCEPTION_CONTINUABLE; - rec.ExceptionRecord = NULL; - rec.ExceptionAddress = (LPVOID)context.Pc; - rec.NumberParameters = 0; - status = raise_exception( &rec, &context, TRUE ); - if (status) raise_status( status, &rec ); - restore_context( &context, ucontext ); }
/********************************************************************** @@ -725,66 +725,52 @@ static void trap_handler( int signal, siginfo_t *info, void *ucontext ) */ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { - EXCEPTION_RECORD rec; - CONTEXT context; - NTSTATUS status; - - save_fpu( &context, sigcontext ); - save_context( &context, sigcontext ); + EXCEPTION_RECORD *rec = setup_exception( sigcontext, raise_generic_exception );
switch (siginfo->si_code & 0xffff ) { #ifdef FPE_FLTSUB case FPE_FLTSUB: - rec.ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED; + rec->ExceptionCode = EXCEPTION_ARRAY_BOUNDS_EXCEEDED; break; #endif #ifdef FPE_INTDIV case FPE_INTDIV: - rec.ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO; + rec->ExceptionCode = EXCEPTION_INT_DIVIDE_BY_ZERO; break; #endif #ifdef FPE_INTOVF case FPE_INTOVF: - rec.ExceptionCode = EXCEPTION_INT_OVERFLOW; + rec->ExceptionCode = EXCEPTION_INT_OVERFLOW; break; #endif #ifdef FPE_FLTDIV case FPE_FLTDIV: - rec.ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO; + rec->ExceptionCode = EXCEPTION_FLT_DIVIDE_BY_ZERO; break; #endif #ifdef FPE_FLTOVF case FPE_FLTOVF: - rec.ExceptionCode = EXCEPTION_FLT_OVERFLOW; + rec->ExceptionCode = EXCEPTION_FLT_OVERFLOW; break; #endif #ifdef FPE_FLTUND case FPE_FLTUND: - rec.ExceptionCode = EXCEPTION_FLT_UNDERFLOW; + rec->ExceptionCode = EXCEPTION_FLT_UNDERFLOW; break; #endif #ifdef FPE_FLTRES case FPE_FLTRES: - rec.ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT; + rec->ExceptionCode = EXCEPTION_FLT_INEXACT_RESULT; break; #endif #ifdef FPE_FLTINV case FPE_FLTINV: #endif default: - rec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION; + rec->ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION; break; } - rec.ExceptionFlags = EXCEPTION_CONTINUABLE; - rec.ExceptionRecord = NULL; - rec.ExceptionAddress = (LPVOID)context.Pc; - rec.NumberParameters = 0; - status = raise_exception( &rec, &context, TRUE ); - if (status) raise_status( status, &rec ); - - restore_context( &context, sigcontext ); - restore_fpu( &context, sigcontext ); }
/********************************************************************** @@ -796,19 +782,9 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { if (!dispatch_signal(SIGINT)) { - EXCEPTION_RECORD rec; - CONTEXT context; - NTSTATUS status; - - save_context( &context, sigcontext ); - rec.ExceptionCode = CONTROL_C_EXIT; - rec.ExceptionFlags = EXCEPTION_CONTINUABLE; - rec.ExceptionRecord = NULL; - rec.ExceptionAddress = (LPVOID)context.Pc; - rec.NumberParameters = 0; - status = raise_exception( &rec, &context, TRUE ); - if (status) raise_status( status, &rec ); - restore_context( &context, sigcontext ); + EXCEPTION_RECORD *rec = setup_exception( sigcontext, raise_generic_exception ); + + rec->ExceptionCode = CONTROL_C_EXIT; } }
@@ -820,19 +796,10 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext ) */ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { - EXCEPTION_RECORD rec; - CONTEXT context; - NTSTATUS status; + EXCEPTION_RECORD *rec = setup_exception( sigcontext, raise_generic_exception );
- save_context( &context, sigcontext ); - rec.ExceptionCode = EXCEPTION_WINE_ASSERTION; - rec.ExceptionFlags = EH_NONCONTINUABLE; - rec.ExceptionRecord = NULL; - rec.ExceptionAddress = (LPVOID)context.Pc; - rec.NumberParameters = 0; - status = raise_exception( &rec, &context, TRUE ); - if (status) raise_status( status, &rec ); - restore_context( &context, sigcontext ); + rec->ExceptionCode = EXCEPTION_WINE_ASSERTION; + rec->ExceptionFlags = EH_NONCONTINUABLE; }