Module: wine Branch: master Commit: cb2013e7b40ba796a42b32d2e6a08cee4191b3ec URL: https://gitlab.winehq.org/wine/wine/-/commit/cb2013e7b40ba796a42b32d2e6a08ce...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Feb 14 16:04:18 2024 +0100
ntdll: Implement RtlVirtualUnwind for ARM64EC.
---
dlls/ntdll/ntdll_misc.h | 5 +++++ dlls/ntdll/signal_arm64ec.c | 17 ++--------------- dlls/ntdll/unwind.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 40273d8944a..dedf0484b55 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -84,6 +84,11 @@ extern void WINAPI KiUserCallbackDispatcher(ULONG,void*,ULONG); extern void WINAPI KiUserCallbackDispatcherReturn(void); extern void (WINAPI *pWow64PrepareForException)( EXCEPTION_RECORD *rec, CONTEXT *context );
+#ifdef __arm64ec__ +extern void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ); +extern void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ); +#endif + /* debug helpers */ extern LPCSTR debugstr_us( const UNICODE_STRING *str ); extern const char *debugstr_exception_code( DWORD code ); diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 3f1869a644f..ddf37ea6545 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -130,7 +130,7 @@ static UINT fpcsr_to_mxcsr( UINT fpcr, UINT fpsr ) return ret; }
-static void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ) +void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ) { ARM64EC_NT_CONTEXT *ec_ctx = (ARM64EC_NT_CONTEXT *)ctx; UINT64 fpcsr; @@ -177,7 +177,7 @@ static void context_x64_to_arm( ARM64_NT_CONTEXT *arm_ctx, const CONTEXT *ctx ) arm_ctx->Fpsr = fpcsr >> 32; }
-static void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ) +void context_arm_to_x64( CONTEXT *ctx, const ARM64_NT_CONTEXT *arm_ctx ) { ARM64EC_NT_CONTEXT *ec_ctx = (ARM64EC_NT_CONTEXT *)ctx;
@@ -1769,19 +1769,6 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec ) }
-/********************************************************************** - * RtlVirtualUnwind (NTDLL.@) - */ -PVOID WINAPI RtlVirtualUnwind( ULONG type, ULONG64 base, ULONG64 pc, - RUNTIME_FUNCTION *function, CONTEXT *context, - PVOID *data, ULONG64 *frame_ret, - KNONVOLATILE_CONTEXT_POINTERS *ctx_ptr ) -{ - FIXME( "not implemented\n" ); - return NULL; -} - - /******************************************************************* * RtlUnwindEx (NTDLL.@) */ diff --git a/dlls/ntdll/unwind.c b/dlls/ntdll/unwind.c index db95f12ebb2..be99fe67453 100644 --- a/dlls/ntdll/unwind.c +++ b/dlls/ntdll/unwind.c @@ -1751,6 +1751,20 @@ PVOID WINAPI RtlVirtualUnwind( ULONG type, ULONG64 base, ULONG64 pc, unsigned int i, prolog_offset; BOOL mach_frame = FALSE;
+#ifdef __arm64ec__ + if (RtlIsEcCode( (void *)pc )) + { + ARM64_NT_CONTEXT arm_context; + void *ret; + + context_x64_to_arm( &arm_context, context ); + ret = RtlVirtualUnwind_arm64( type, base, pc, (ARM64_RUNTIME_FUNCTION *)function, + &arm_context, data, frame_ret, NULL ); + context_arm_to_x64( context, &arm_context ); + return ret; + } +#endif + TRACE( "type %lx rip %I64x rsp %I64x\n", type, pc, context->Rsp ); if (TRACE_ON(unwind)) dump_unwind_info( base, function );