Module: wine Branch: master Commit: 3e421c6675a2cfa45a5a641585b235b5cd1ecf6d URL: https://gitlab.winehq.org/wine/wine/-/commit/3e421c6675a2cfa45a5a641585b235b...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Nov 20 14:39:22 2023 +0100
ntdll: Switch to the kernel stack to abort a thread on ARM.
---
dlls/ntdll/unix/signal_arm.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index b6f4636e3eb..a5ab2473ade 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -1219,6 +1219,30 @@ __ASM_GLOBAL_FUNC( user_mode_callback_return, "pop {r4-r12,pc}" )
+/*********************************************************************** + * user_mode_abort_thread + */ +extern void DECLSPEC_NORETURN user_mode_abort_thread( NTSTATUS status, struct syscall_frame *frame ); +__ASM_GLOBAL_FUNC( user_mode_abort_thread, + __ASM_EHABI(".cantunwind\n\t") + "ldr r7, [r1, #0x28]\n\t" /* frame->syscall_cfa */ + "sub r7, r7, #0x28\n\t" + /* switch to kernel stack */ + "mov sp, r7\n\t" + __ASM_CFI(".cfi_def_cfa 7,0x28\n\t") + __ASM_CFI(".cfi_offset r4,-0x28\n\t") + __ASM_CFI(".cfi_offset r5,-0x24\n\t") + __ASM_CFI(".cfi_offset r6,-0x20\n\t") + __ASM_CFI(".cfi_offset r7,-0x1c\n\t") + __ASM_CFI(".cfi_offset r8,-0x18\n\t") + __ASM_CFI(".cfi_offset r9,-0x14\n\t") + __ASM_CFI(".cfi_offset r10,-0x10\n\t") + __ASM_CFI(".cfi_offset r11,-0x0c\n\t") + __ASM_CFI(".cfi_offset r12,-0x08\n\t") + __ASM_CFI(".cfi_offset lr,-0x04\n\t") + "bl " __ASM_NAME("abort_thread") ) + + /*********************************************************************** * KeUserModeCallback */ @@ -1472,6 +1496,7 @@ static void abrt_handler( int signal, siginfo_t *siginfo, void *sigcontext ) */ static void quit_handler( int signal, siginfo_t *siginfo, void *sigcontext ) { + if (!is_inside_syscall( sigcontext )) user_mode_abort_thread( 0, arm_thread_data()->syscall_frame ); abort_thread(0); }