Alexandre Julliard : ntdll: Factor out setup_raise_exception() on ARM64.
Alexandre Julliard
julliard at winehq.org
Thu Sep 12 16:28:57 CDT 2019
Module: wine
Branch: master
Commit: 769c333c6c67721d9f78edc7c7efd70d8700de22
URL: https://source.winehq.org/git/wine.git/?a=commit;h=769c333c6c67721d9f78edc7c7efd70d8700de22
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Sep 12 21:15:49 2019 +0200
ntdll: Factor out setup_raise_exception() on ARM64.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/signal_arm64.c | 36 ++++++++++++++++++++++++------------
1 file changed, 24 insertions(+), 12 deletions(-)
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 3194cc82b6..a029960ba4 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -484,7 +484,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
*
* Setup the exception record and context on the thread stack.
*/
-static struct stack_layout *setup_exception( ucontext_t *sigcontext, raise_func func )
+static struct stack_layout *setup_exception( ucontext_t *sigcontext )
{
struct stack_layout *stack;
DWORD exception_code = 0;
@@ -500,14 +500,20 @@ static struct stack_layout *setup_exception( ucontext_t *sigcontext, raise_func
save_context( &stack->context, sigcontext );
save_fpu( &stack->context, sigcontext );
+ return stack;
+}
- /* now modify the sigcontext to return to the raise function */
+/***********************************************************************
+ * setup_raise_exception
+ *
+ * Modify the signal context to call the exception raise function.
+ */
+static void setup_raise_exception( ucontext_t *sigcontext, struct stack_layout *stack, raise_func func )
+{
SP_sig(sigcontext) = (ULONG_PTR)stack;
PC_sig(sigcontext) = (ULONG_PTR)func;
REGn_sig(0, sigcontext) = (ULONG_PTR)&stack->rec; /* first arg for raise_func */
REGn_sig(1, sigcontext) = (ULONG_PTR)&stack->context; /* second arg for raise_func */
-
- return stack;
}
/**********************************************************************
@@ -1054,14 +1060,14 @@ static void segv_handler( int signal, siginfo_t *info, void *ucontext )
case 1: /* handled */
return;
case -1: /* overflow */
- stack = setup_exception( context, raise_segv_exception );
+ stack = setup_exception( context );
stack->rec.ExceptionCode = EXCEPTION_STACK_OVERFLOW;
- return;
+ goto done;
}
}
- stack = setup_exception( context, raise_segv_exception );
- if (stack->rec.ExceptionCode == EXCEPTION_STACK_OVERFLOW) return;
+ stack = setup_exception( context );
+ if (stack->rec.ExceptionCode == EXCEPTION_STACK_OVERFLOW) goto done;
switch(signal)
{
@@ -1082,6 +1088,8 @@ static void segv_handler( int signal, siginfo_t *info, void *ucontext )
stack->rec.ExceptionCode = EXCEPTION_ILLEGAL_INSTRUCTION;
break;
}
+done:
+ setup_raise_exception( context, stack, raise_segv_exception );
}
/**********************************************************************
@@ -1092,7 +1100,7 @@ static void segv_handler( int signal, siginfo_t *info, void *ucontext )
static void trap_handler( int signal, siginfo_t *info, void *ucontext )
{
ucontext_t *context = ucontext;
- struct stack_layout *stack = setup_exception( context, raise_trap_exception );
+ struct stack_layout *stack = setup_exception( context );
switch (info->si_code)
{
@@ -1104,6 +1112,7 @@ static void trap_handler( int signal, siginfo_t *info, void *ucontext )
stack->rec.ExceptionCode = EXCEPTION_BREAKPOINT;
break;
}
+ setup_raise_exception( context, stack, raise_trap_exception );
}
/**********************************************************************
@@ -1113,7 +1122,7 @@ static void trap_handler( int signal, siginfo_t *info, void *ucontext )
*/
static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
- struct stack_layout *stack = setup_exception( sigcontext, raise_generic_exception );
+ struct stack_layout *stack = setup_exception( sigcontext );
switch (siginfo->si_code & 0xffff )
{
@@ -1159,6 +1168,7 @@ static void fpe_handler( int signal, siginfo_t *siginfo, void *sigcontext )
stack->rec.ExceptionCode = EXCEPTION_FLT_INVALID_OPERATION;
break;
}
+ setup_raise_exception( sigcontext, stack, raise_generic_exception );
}
/**********************************************************************
@@ -1170,9 +1180,10 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
if (!dispatch_signal(SIGINT))
{
- struct stack_layout *stack = setup_exception( sigcontext, raise_generic_exception );
+ struct stack_layout *stack = setup_exception( sigcontext );
stack->rec.ExceptionCode = CONTROL_C_EXIT;
+ setup_raise_exception( sigcontext, stack, raise_generic_exception );
}
}
@@ -1184,10 +1195,11 @@ static void int_handler( int signal, siginfo_t *siginfo, void *sigcontext )
*/
static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext )
{
- struct stack_layout *stack = setup_exception( sigcontext, raise_generic_exception );
+ struct stack_layout *stack = setup_exception( sigcontext );
stack->rec.ExceptionCode = EXCEPTION_WINE_ASSERTION;
stack->rec.ExceptionFlags = EH_NONCONTINUABLE;
+ setup_raise_exception( sigcontext, stack, raise_generic_exception );
}
More information about the wine-cvs
mailing list