Module: wine Branch: master Commit: 8ec8a7f11cc4dea5755e66fc0b0d8da2325aebf9 URL: https://gitlab.winehq.org/wine/wine/-/commit/8ec8a7f11cc4dea5755e66fc0b0d8da...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 7 10:24:17 2024 +0100
ntdll: Export _setjmpex.
---
dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/signal_arm.c | 18 ++++++++++++++++++ dlls/ntdll/signal_arm64.c | 26 ++++++++++++++++++++++++++ dlls/ntdll/signal_x86_64.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 66995346e57..6fb91e8c9f1 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1550,6 +1550,8 @@ @ cdecl _makepath_s(ptr long str str str str) @ cdecl _memccpy(ptr ptr long long) @ cdecl _memicmp(str str long) +@ cdecl -norelay -arch=arm,x86_64 _setjmp(ptr ptr) NTDLL__setjmpex +@ cdecl -norelay -arch=!i386 _setjmpex(ptr ptr) NTDLL__setjmpex @ varargs _snprintf(ptr long str) NTDLL__snprintf @ varargs _snprintf_s(ptr long long str) @ varargs _snwprintf(ptr long wstr) diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 49018d35721..dd259322368 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -714,6 +714,24 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return 0; }
+ +/*********************************************************************** + * _setjmp (NTDLL.@) + * _setjmpex (NTDLL.@) + */ +__ASM_GLOBAL_FUNC( NTDLL__setjmpex, + ".seh_endprologue\n\t" + "stm r0, {r1,r4-r11}\n" /* jmp_buf->Frame,R4..R11 */ + "str sp, [r0, #0x24]\n\t" /* jmp_buf->Sp */ + "str lr, [r0, #0x28]\n\t" /* jmp_buf->Pc */ + "vmrs r2, fpscr\n\t" + "str r2, [r0, #0x2c]\n\t" /* jmp_buf->Fpscr */ + "add r0, r0, #0x30\n\t" + "vstm r0, {d8-d15}\n\t" /* jmp_buf->D[0..7] */ + "mov r0, #0\n\t" + "bx lr" ) + + /*********************************************************************** * RtlUserThreadStart (NTDLL.@) */ diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 0be1807c0c3..c53d3382207 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -826,6 +826,32 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return 0; }
+ +/*********************************************************************** + * _setjmpex (NTDLL.@) + */ +__ASM_GLOBAL_FUNC( NTDLL__setjmpex, + ".seh_endprologue\n\t" + "str x1, [x0]\n\t" /* jmp_buf->Frame */ + "stp x19, x20, [x0, #0x10]\n\t" /* jmp_buf->X19, X20 */ + "stp x21, x22, [x0, #0x20]\n\t" /* jmp_buf->X21, X22 */ + "stp x23, x24, [x0, #0x30]\n\t" /* jmp_buf->X23, X24 */ + "stp x25, x26, [x0, #0x40]\n\t" /* jmp_buf->X25, X26 */ + "stp x27, x28, [x0, #0x50]\n\t" /* jmp_buf->X27, X28 */ + "stp x29, x30, [x0, #0x60]\n\t" /* jmp_buf->Fp, Lr */ + "mov x2, sp\n\t" + "str x2, [x0, #0x70]\n\t" /* jmp_buf->Sp */ + "mrs x2, fpcr\n\t" + "mrs x3, fpsr\n\t" + "stp w2, w3, [x0, #0x78]\n\t" /* jmp_buf->Fpcr,Fpsr */ + "stp d8, d9, [x0, #0x80]\n\t" /* jmp_buf->D[0-1] */ + "stp d10, d11, [x0, #0x90]\n\t" /* jmp_buf->D[2-3] */ + "stp d12, d13, [x0, #0xa0]\n\t" /* jmp_buf->D[4-5] */ + "stp d14, d15, [x0, #0xb0]\n\t" /* jmp_buf->D[6-7] */ + "mov x0, #0\n\t" + "ret" ) + + /*********************************************************************** * RtlUserThreadStart (NTDLL.@) */ diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index cf6e9d8e65f..6e88877ee78 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -1023,6 +1023,41 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, }
+/*********************************************************************** + * _setjmp (NTDLL.@) + * _setjmpex (NTDLL.@) + */ +__ASM_GLOBAL_FUNC( NTDLL__setjmpex, + __ASM_SEH(".seh_endprologue\n\t") + "movq %rdx,(%rcx)\n\t" /* jmp_buf->Frame */ + "movq %rbx,0x8(%rcx)\n\t" /* jmp_buf->Rbx */ + "leaq 0x8(%rsp),%rax\n\t" + "movq %rax,0x10(%rcx)\n\t" /* jmp_buf->Rsp */ + "movq %rbp,0x18(%rcx)\n\t" /* jmp_buf->Rbp */ + "movq %rsi,0x20(%rcx)\n\t" /* jmp_buf->Rsi */ + "movq %rdi,0x28(%rcx)\n\t" /* jmp_buf->Rdi */ + "movq %r12,0x30(%rcx)\n\t" /* jmp_buf->R12 */ + "movq %r13,0x38(%rcx)\n\t" /* jmp_buf->R13 */ + "movq %r14,0x40(%rcx)\n\t" /* jmp_buf->R14 */ + "movq %r15,0x48(%rcx)\n\t" /* jmp_buf->R15 */ + "movq (%rsp),%rax\n\t" + "movq %rax,0x50(%rcx)\n\t" /* jmp_buf->Rip */ + "stmxcsr 0x58(%rcx)\n\t" /* jmp_buf->MxCsr */ + "fnstcw 0x5c(%rcx)\n\t" /* jmp_buf->FpCsr */ + "movdqa %xmm6,0x60(%rcx)\n\t" /* jmp_buf->Xmm6 */ + "movdqa %xmm7,0x70(%rcx)\n\t" /* jmp_buf->Xmm7 */ + "movdqa %xmm8,0x80(%rcx)\n\t" /* jmp_buf->Xmm8 */ + "movdqa %xmm9,0x90(%rcx)\n\t" /* jmp_buf->Xmm9 */ + "movdqa %xmm10,0xa0(%rcx)\n\t" /* jmp_buf->Xmm10 */ + "movdqa %xmm11,0xb0(%rcx)\n\t" /* jmp_buf->Xmm11 */ + "movdqa %xmm12,0xc0(%rcx)\n\t" /* jmp_buf->Xmm12 */ + "movdqa %xmm13,0xd0(%rcx)\n\t" /* jmp_buf->Xmm13 */ + "movdqa %xmm14,0xe0(%rcx)\n\t" /* jmp_buf->Xmm14 */ + "movdqa %xmm15,0xf0(%rcx)\n\t" /* jmp_buf->Xmm15 */ + "xorq %rax,%rax\n\t" + "retq" ) + + /*********************************************************************** * RtlUserThreadStart (NTDLL.@) */