Module: wine Branch: master Commit: c47d6ef1f782fe305851ac339c8424162ca7c559 URL: https://gitlab.winehq.org/wine/wine/-/commit/c47d6ef1f782fe305851ac339c84241...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Mar 13 11:03:01 2024 +0100
ntdll: Implement __C_specific_handler on ARM64EC.
---
dlls/ntdll/signal_arm64ec.c | 34 ++++++++++++++++++++++++++++++++++ dlls/ntdll/unwind.c | 6 ++++++ 2 files changed, 40 insertions(+)
diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 1007df91f85..55ed12a609a 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -2333,6 +2333,40 @@ void __attribute__((naked)) __chkstk_arm64ec(void) }
+/******************************************************************* + * __C_ExecuteExceptionFilter + */ +LONG __attribute__((naked)) __C_ExecuteExceptionFilter( EXCEPTION_POINTERS *ptrs, void *frame, + PEXCEPTION_FILTER filter, BYTE *nonvolatile ) +{ + asm( ".seh_proc _C_ExecuteExceptionFilter\n\t" + "stp x29, x30, [sp, #-80]!\n\t" + ".seh_save_fplr_x 80\n\t" + "stp x19, x20, [sp, #16]\n\t" + ".seh_save_regp x19, 16\n\t" + "stp x21, x22, [sp, #32]\n\t" + ".seh_save_regp x21, 32\n\t" + "stp x25, x26, [sp, #48]\n\t" + ".seh_save_regp x25, 48\n\t" + "str x27, [sp, #64]\n\t" + ".seh_save_reg x27, 64\n\t" + ".seh_endprologue\n\t" + "ldp x19, x20, [x3, #0]\n\t" /* nonvolatile regs */ + "ldp x21, x22, [x3, #16]\n\t" + "ldp x25, x26, [x3, #48]\n\t" + "ldr x27, [x3, #64]\n\t" + "ldr x1, [x3, #80]\n\t" /* x29 = frame */ + "blr x2\n\t" /* filter */ + "ldp x19, x20, [sp, #16]\n\t" + "ldp x21, x22, [sp, #32]\n\t" + "ldp x25, x26, [sp, #48]\n\t" + "ldr x27, [sp, #64]\n\t" + "ldp x29, x30, [sp], #80\n\t" + "ret\n\t" + ".seh_endproc" ); +} + + /*********************************************************************** * RtlRaiseException (NTDLL.@) */ diff --git a/dlls/ntdll/unwind.c b/dlls/ntdll/unwind.c index 3960d13143d..06779247da1 100644 --- a/dlls/ntdll/unwind.c +++ b/dlls/ntdll/unwind.c @@ -2204,6 +2204,12 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec, void * ULONG_PTR pc = dispatch->ControlPc; unsigned int i;
+#ifdef __arm64ec__ + if (RtlIsEcCode( pc )) + return __C_specific_handler_arm64( rec, frame, (ARM64_NT_CONTEXT *)context, + (DISPATCHER_CONTEXT_ARM64 *)dispatch ); +#endif + TRACE( "%p %p %p %p pc %Ix\n", rec, frame, context, dispatch, pc ); if (TRACE_ON(unwind)) DUMP_SCOPE_TABLE( base, table );