Module: wine Branch: master Commit: 7a156cbd7fbbf1ce10f805bcfb43ff94fd94dda1 URL: https://gitlab.winehq.org/wine/wine/-/commit/7a156cbd7fbbf1ce10f805bcfb43ff9...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 7 10:23:15 2024 +0100
ntdll: Use jump buffer definitions from setjmp.h.
---
dlls/ntdll/signal_arm.c | 30 ++++-------------------------- dlls/ntdll/signal_arm64.c | 27 ++------------------------- dlls/ntdll/signal_x86_64.c | 44 +++----------------------------------------- 3 files changed, 9 insertions(+), 92 deletions(-)
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index af33c6c08b6..49018d35721 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -23,6 +23,7 @@
#include <stdlib.h> #include <stdarg.h> +#include <setjmp.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -37,25 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh); WINE_DECLARE_DEBUG_CHANNEL(relay);
-/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */ -struct MSVCRT_JUMP_BUFFER -{ - unsigned long Frame; - unsigned long R4; - unsigned long R5; - unsigned long R6; - unsigned long R7; - unsigned long R8; - unsigned long R9; - unsigned long R10; - unsigned long R11; - unsigned long Sp; - unsigned long Pc; - unsigned long Fpscr; - unsigned long long D[8]; -}; - - static void dump_scope_table( ULONG base, const SCOPE_TABLE *table ) { unsigned int i; @@ -424,17 +406,13 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1) { - struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0]; - int i; + struct _JUMP_BUFFER *jmp = (struct _JUMP_BUFFER *)rec->ExceptionInformation[0];
- for (i = 4; i <= 11; i++) - (&context->R4)[i-4] = (&jmp->R4)[i-4]; + memcpy( &context->R4, &jmp->R4, 8 * sizeof(DWORD) ); + memcpy( &context->D[8], &jmp->D[0], 8 * sizeof(ULONGLONG) ); context->Lr = jmp->Pc; context->Sp = jmp->Sp; context->Fpscr = jmp->Fpscr; - - for (i = 0; i < 8; i++) - context->D[8+i] = jmp->D[i]; } else if (rec && rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1) { diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 32aca81b198..0be1807c0c3 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -25,6 +25,7 @@ #include <stdlib.h> #include <stdarg.h> #include <stdio.h> +#include <setjmp.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -39,30 +40,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh); WINE_DECLARE_DEBUG_CHANNEL(relay);
-/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */ -struct MSVCRT_JUMP_BUFFER -{ - unsigned __int64 Frame; - unsigned __int64 Reserved; - unsigned __int64 X19; - unsigned __int64 X20; - unsigned __int64 X21; - unsigned __int64 X22; - unsigned __int64 X23; - unsigned __int64 X24; - unsigned __int64 X25; - unsigned __int64 X26; - unsigned __int64 X27; - unsigned __int64 X28; - unsigned __int64 Fp; - unsigned __int64 Lr; - unsigned __int64 Sp; - ULONG Fpcr; - ULONG Fpsr; - double D[8]; -}; - - static void dump_scope_table( ULONG64 base, const SCOPE_TABLE *table ) { unsigned int i; @@ -486,7 +463,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1) { - struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0]; + struct _JUMP_BUFFER *jmp = (struct _JUMP_BUFFER *)rec->ExceptionInformation[0]; int i;
context->X19 = jmp->X19; diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index d5cc29bd5e1..cf6e9d8e65f 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -22,6 +22,7 @@
#include <stdlib.h> #include <stdarg.h> +#include <setjmp.h>
#include "ntstatus.h" #define WIN32_NO_STATUS @@ -37,36 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(seh); WINE_DECLARE_DEBUG_CHANNEL(relay);
-/* layering violation: the setjmp buffer is defined in msvcrt, but used by RtlUnwindEx */ -struct MSVCRT_JUMP_BUFFER -{ - ULONG64 Frame; - ULONG64 Rbx; - ULONG64 Rsp; - ULONG64 Rbp; - ULONG64 Rsi; - ULONG64 Rdi; - ULONG64 R12; - ULONG64 R13; - ULONG64 R14; - ULONG64 R15; - ULONG64 Rip; - ULONG MxCsr; - USHORT FpCsr; - USHORT Spare; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; -}; - - /******************************************************************* * syscalls */ @@ -726,7 +697,7 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec )
if (rec && rec->ExceptionCode == STATUS_LONGJUMP && rec->NumberParameters >= 1) { - struct MSVCRT_JUMP_BUFFER *jmp = (struct MSVCRT_JUMP_BUFFER *)rec->ExceptionInformation[0]; + struct _JUMP_BUFFER *jmp = (struct _JUMP_BUFFER *)rec->ExceptionInformation[0]; context->Rbx = jmp->Rbx; context->Rsp = jmp->Rsp; context->Rbp = jmp->Rbp; @@ -737,19 +708,10 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec ) context->R14 = jmp->R14; context->R15 = jmp->R15; context->Rip = jmp->Rip; - context->Xmm6 = jmp->Xmm6; - context->Xmm7 = jmp->Xmm7; - context->Xmm8 = jmp->Xmm8; - context->Xmm9 = jmp->Xmm9; - context->Xmm10 = jmp->Xmm10; - context->Xmm11 = jmp->Xmm11; - context->Xmm12 = jmp->Xmm12; - context->Xmm13 = jmp->Xmm13; - context->Xmm14 = jmp->Xmm14; - context->Xmm15 = jmp->Xmm15; context->MxCsr = jmp->MxCsr; context->FltSave.MxCsr = jmp->MxCsr; context->FltSave.ControlWord = jmp->FpCsr; + memcpy( &context->Xmm6, &jmp->Xmm6, 10 * sizeof(M128A) ); } else if (rec && rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1) {