[PATCH 10/11] ntdll: arm64: Fix unwinding through raise_generic_exception
Martin Storsjo
martin at martin.st
Thu May 28 03:14:46 CDT 2020
Signed-off-by: Martin Storsjo <martin at martin.st>
---
dlls/ntdll/signal_arm64.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 88492755bec..cc6c1574ecb 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -135,6 +135,8 @@ static DWORD64 get_fault_esr( ucontext_t *sigcontext )
static const size_t teb_size = 0x2000; /* we reserve two pages for the TEB */
+typedef void (*raise_func)( EXCEPTION_RECORD *rec, CONTEXT *context );
+
/* stack layout when calling an exception raise function */
struct stack_layout
{
@@ -1044,6 +1046,24 @@ static void WINAPI raise_generic_exception( EXCEPTION_RECORD *rec, CONTEXT *cont
raise_status( status, rec );
}
+extern void raise_func_trampoline( EXCEPTION_RECORD *rec, CONTEXT *context, raise_func func, void *sp );
+__ASM_GLOBAL_FUNC( raise_func_trampoline,
+ __ASM_CFI(".cfi_signal_frame\n\t")
+ "stp x29, x30, [sp, #-0x20]!\n\t"
+ __ASM_CFI(".cfi_def_cfa_offset 32\n\t")
+ __ASM_CFI(".cfi_offset 29, -32\n\t")
+ __ASM_CFI(".cfi_offset 30, -24\n\t")
+ "mov x29, sp\n\t"
+ __ASM_CFI(".cfi_def_cfa_register 29\n\t")
+ "str x3, [sp, 0x10]\n\t"
+ __ASM_CFI(".cfi_remember_state\n\t")
+ __ASM_CFI(".cfi_escape 0x0f,0x03,0x8d,0x10,0x06\n\t") /* CFA */
+ __ASM_CFI(".cfi_escape 0x10,0x1d,0x02,0x8d,0x00\n\t") /* x29 */
+ __ASM_CFI(".cfi_escape 0x10,0x1e,0x02,0x8d,0x08\n\t") /* x30 */
+ "blr x2\n\t"
+ __ASM_CFI(".cfi_restore_state\n\t")
+ "brk #1")
+
/***********************************************************************
* setup_raise_exception
*
@@ -1058,10 +1078,13 @@ static void setup_raise_exception( ucontext_t *sigcontext, struct stack_layout *
restore_context( &stack->context, sigcontext );
return;
}
+ REGn_sig(3, sigcontext) = SP_sig(sigcontext); /* original stack pointer, fourth arg for raise_func_trampoline */
SP_sig(sigcontext) = (ULONG_PTR)stack;
- PC_sig(sigcontext) = (ULONG_PTR)raise_generic_exception;
+ LR_sig(sigcontext) = PC_sig(sigcontext);
+ PC_sig(sigcontext) = (ULONG_PTR)raise_func_trampoline; // raise_generic_exception;
REGn_sig(0, sigcontext) = (ULONG_PTR)&stack->rec; /* first arg for raise_generic_exception */
REGn_sig(1, sigcontext) = (ULONG_PTR)&stack->context; /* second arg for raise_generic_exception */
+ REGn_sig(2, sigcontext) = (ULONG_PTR)raise_generic_exception; /* third arg for raise_func_trampoline */
REGn_sig(18, sigcontext) = (ULONG_PTR)NtCurrentTeb();
}
--
2.17.1
More information about the wine-devel
mailing list