From 93f6cd522ae1fc7793d94ef21c4c3e5c5f4eb2d8 Mon Sep 17 00:00:00 2001 From: ardishco-the-great Date: Fri, 16 Feb 2024 18:43:37 +0300 Subject: vinegar: switched Wine version to wine64Packages.staging, added segregrevert patch, added mouselock patch, added wine-loader-prefer-winedllpath.patch, bumped vinegar version from 1.6.1 --> 1.7.3 and removed patches folder --- pkgs/by-name/vi/vinegar/package.nix | 27 +- .../vi/vinegar/patches/segregrevert.mypatch | 350 --------------------- 2 files changed, 21 insertions(+), 356 deletions(-) delete mode 100644 pkgs/by-name/vi/vinegar/patches/segregrevert.mypatch (limited to 'pkgs/by-name/vi') diff --git a/pkgs/by-name/vi/vinegar/package.nix b/pkgs/by-name/vi/vinegar/package.nix index 08a566a7f87fb..1740c3aa9d089 100644 --- a/pkgs/by-name/vi/vinegar/package.nix +++ b/pkgs/by-name/vi/vinegar/package.nix @@ -9,30 +9,45 @@ , wayland , vulkan-headers , wine64Packages +, fetchpatch }: let - wine = wine64Packages.stable.overrideDerivation (oldAttrs: { + wine = wine64Packages.staging.overrideDerivation (oldAttrs: { patches = - (oldAttrs.patches or [ ]) + (oldAttrs.patches or []) ++ [ # upstream issue: https://bugs.winehq.org/show_bug.cgi?id=55604 # Here are the currently applied patches for Roblox to run under WINE: - ./patches/segregrevert.mypatch + (fetchpatch { + name = "vinegar-wine-segregrevert.patch"; + url = "https://raw.githubusercontent.com/flathub/org.vinegarhq.Vinegar/e24cb9dfa996bcfeaa46504c0375660fe271148d/patches/wine/segregrevert.patch"; + hash = "sha256-+3Nld81nG3GufI4jAF6yrWfkJmsSCOku39rx0Hov29c="; + }) + (fetchpatch { + name = "vinegar-wine-mouselock.patch"; + url = "https://raw.githubusercontent.com/flathub/org.vinegarhq.Vinegar/e24cb9dfa996bcfeaa46504c0375660fe271148d/patches/wine/mouselock.patch"; + hash = "sha256-0AGA4AQbxTL5BGVbm072moav7xVA3zpotYqM8pcEDa4="; + }) + (fetchpatch { + name = "vinegar-wine-loader-prefer-winedllpath.patch"; + url = "https://raw.githubusercontent.com/flathub/org.vinegarhq.Vinegar/e24cb9dfa996bcfeaa46504c0375660fe271148d/patches/wine/loader-prefer-winedllpath.patch"; + hash = "sha256-KscGMMSmjnQEBjNSHECw9VCX2H6z7fKxrqxEfElGwJQ="; + }) ]; }); in buildGoModule rec { pname = "vinegar"; - version = "1.6.1"; + version = "1.7.3"; src = fetchFromGitHub { owner = "vinegarhq"; repo = "vinegar"; rev = "v${version}"; - hash = "sha256-uRdWE5NwRVSuUZyU5B5u5DfJOxu/gUqwM682eORTDOs="; + hash = "sha256-aKL+4jw/uMbbvLRCBHstCTrcQ1PTYSCwMNgXTvSvMeY="; }; - vendorHash = "sha256-Ex6PRd3rD2jbLXlY36koNvZF3P+gAZTE9hExIfOw9CE="; + vendorHash = "sha256-OaMfWecOPQh6quXjYkZLyBDHZ9TINSA7Ue/Y0sz5ZYY="; nativeBuildInputs = [ pkg-config makeBinaryWrapper ]; buildInputs = [ libGL libxkbcommon xorg.libX11 xorg.libXcursor xorg.libXfixes wayland vulkan-headers wine ]; diff --git a/pkgs/by-name/vi/vinegar/patches/segregrevert.mypatch b/pkgs/by-name/vi/vinegar/patches/segregrevert.mypatch deleted file mode 100644 index 09a38e0aff321..0000000000000 --- a/pkgs/by-name/vi/vinegar/patches/segregrevert.mypatch +++ /dev/null @@ -1,350 +0,0 @@ -diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c -index 2f7715a0a60..66cabfd5e64 100644 ---- a/dlls/ntdll/signal_x86_64.c -+++ b/dlls/ntdll/signal_x86_64.c -@@ -559,6 +559,10 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) - context->R12, context->R13, context->R14, context->R15 ); - } - -+ /* Legends of Runeterra depends on having SegDs == SegSs in an exception -+ * handler. */ -+ context->SegDs = context->SegSs; -+ - if (call_vectored_handlers( rec, context ) == EXCEPTION_CONTINUE_EXECUTION) - NtContinue( context, FALSE ); - -diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c -index 3c4d6620fe8..cccd62ae8c0 100644 ---- a/dlls/ntdll/tests/exception.c -+++ b/dlls/ntdll/tests/exception.c -@@ -1825,8 +1825,8 @@ static void test_thread_context(void) - ok( context.SegDs == LOWORD(expect.SegDs), "wrong SegDs %08lx/%08lx\n", context.SegDs, expect.SegDs ); - ok( context.SegEs == LOWORD(expect.SegEs), "wrong SegEs %08lx/%08lx\n", context.SegEs, expect.SegEs ); - ok( context.SegFs == LOWORD(expect.SegFs), "wrong SegFs %08lx/%08lx\n", context.SegFs, expect.SegFs ); -- if (LOWORD(expect.SegGs)) ok( context.SegGs == LOWORD(expect.SegGs), "wrong SegGs %08lx/%08lx\n", context.SegGs, expect.SegGs ); -- ok( context.SegSs == LOWORD(expect.SegSs), "wrong SegSs %08lx/%08lx\n", context.SegSs, expect.SegSs ); -+ ok( context.SegGs == LOWORD(expect.SegGs), "wrong SegGs %08lx/%08lx\n", context.SegGs, expect.SegGs ); -+ ok( context.SegSs == LOWORD(expect.SegSs), "wrong SegSs %08lx/%08lx\n", context.SegSs, expect.SegGs ); - - ok( LOWORD(context.FloatSave.ControlWord) == LOWORD(expect.x87_control), - "wrong x87 control word %#lx/%#lx.\n", context.FloatSave.ControlWord, expect.x87_control ); -@@ -3278,9 +3278,9 @@ static DWORD WINAPI handler( EXCEPTION_RECORD *rec, ULONG64 frame, - ok( context->SegSs == ss, "ss %#x does not match %#x\n", context->SegSs, ss ); - ok( context->SegDs == context->SegSs, - "ds %#x does not match ss %#x\n", context->SegDs, context->SegSs ); -- ok( context->SegEs == context->SegSs, -+ todo_wine ok( context->SegEs == context->SegSs, - "es %#x does not match ss %#x\n", context->SegEs, context->SegSs ); -- ok( context->SegGs == context->SegSs, -+ todo_wine ok( context->SegGs == context->SegSs, - "gs %#x does not match ss %#x\n", context->SegGs, context->SegSs ); - todo_wine ok( context->SegFs && context->SegFs != context->SegSs, - "got fs %#x\n", context->SegFs ); -@@ -3618,12 +3618,13 @@ static void test_exceptions(void) - ok( ctx.SegDs == ds, "wrong ds %04x / %04x\n", ctx.SegDs, ds ); - ok( ctx.SegEs == es, "wrong es %04x / %04x\n", ctx.SegEs, es ); - ok( ctx.SegFs == fs, "wrong fs %04x / %04x\n", ctx.SegFs, fs ); -- ok( ctx.SegGs == gs || !gs, "wrong gs %04x / %04x\n", ctx.SegGs, gs ); -+ ok( ctx.SegGs == gs, "wrong gs %04x / %04x\n", ctx.SegGs, gs ); - ok( ctx.SegSs == ss, "wrong ss %04x / %04x\n", ctx.SegSs, ss ); -- ok( ctx.SegDs == ctx.SegSs, "wrong ds %04x / %04x\n", ctx.SegDs, ctx.SegSs ); -- ok( ctx.SegEs == ctx.SegSs, "wrong es %04x / %04x\n", ctx.SegEs, ctx.SegSs ); -+ todo_wine ok( ctx.SegEs == ctx.SegSs, "wrong es %04x / %04x\n", ctx.SegEs, ctx.SegSs ); - ok( ctx.SegFs != ctx.SegSs, "wrong fs %04x / %04x\n", ctx.SegFs, ctx.SegSs ); -- ok( ctx.SegGs == ctx.SegSs, "wrong gs %04x / %04x\n", ctx.SegGs, ctx.SegSs ); -+ todo_wine ok( ctx.SegGs == ctx.SegSs, "wrong gs %04x / %04x\n", ctx.SegGs, ctx.SegSs ); -+ if (ctx.SegDs == ctx.SegSs) /* FIXME: remove once Wine is fixed */ -+ { - ctx.SegDs = 0; - ctx.SegEs = ctx.SegFs; - ctx.SegFs = ctx.SegSs; -@@ -3639,12 +3640,13 @@ static void test_exceptions(void) - ok( ctx.SegDs == ds, "wrong ds %04x / %04x\n", ctx.SegDs, ds ); - ok( ctx.SegEs == es, "wrong es %04x / %04x\n", ctx.SegEs, es ); - ok( ctx.SegFs == fs, "wrong fs %04x / %04x\n", ctx.SegFs, fs ); -- ok( ctx.SegGs == gs || !gs, "wrong gs %04x / %04x\n", ctx.SegGs, gs ); -+ ok( ctx.SegGs == gs, "wrong gs %04x / %04x\n", ctx.SegGs, gs ); - ok( ctx.SegSs == ss, "wrong ss %04x / %04x\n", ctx.SegSs, ss ); - ok( ctx.SegDs == ctx.SegSs, "wrong ds %04x / %04x\n", ctx.SegDs, ctx.SegSs ); - ok( ctx.SegEs == ctx.SegSs, "wrong es %04x / %04x\n", ctx.SegEs, ctx.SegSs ); - ok( ctx.SegFs != ctx.SegSs, "wrong fs %04x / %04x\n", ctx.SegFs, ctx.SegSs ); -- ok( ctx.SegGs == ctx.SegSs, "wrong gs %04x / %04x\n", ctx.SegGs, ctx.SegSs ); -+ todo_wine ok( ctx.SegGs == ctx.SegSs, "wrong gs %04x / %04x\n", ctx.SegGs, ctx.SegSs ); -+ } - } - - static DWORD WINAPI simd_fault_handler( EXCEPTION_RECORD *rec, ULONG64 frame, -@@ -4403,7 +4405,7 @@ static void test_thread_context(void) - COMPARE( SegDs ); - COMPARE( SegEs ); - COMPARE( SegFs ); -- if (expect.SegGs) COMPARE( SegGs ); -+ COMPARE( SegGs ); - COMPARE( SegSs ); - - /* AMD CPUs don't save the opcode or data pointer if no exception is -diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c -index 53827629af4..526885221b3 100644 ---- a/dlls/ntdll/unix/signal_x86_64.c -+++ b/dlls/ntdll/unix/signal_x86_64.c -@@ -413,16 +413,20 @@ struct syscall_frame - ULONG64 r14; /* 0060 */ - ULONG64 r15; /* 0068 */ - ULONG64 rip; /* 0070 */ -- ULONG64 cs; /* 0078 */ -+ WORD cs; /* 0078 */ -+ WORD ds; /* 007a */ -+ WORD es; /* 007c */ -+ WORD fs; /* 007e */ - ULONG64 eflags; /* 0080 */ - ULONG64 rsp; /* 0088 */ -- ULONG64 ss; /* 0090 */ -+ WORD ss; /* 0090 */ -+ WORD gs; /* 0092 */ -+ DWORD restore_flags; /* 0094 */ - ULONG64 rbp; /* 0098 */ - struct syscall_frame *prev_frame; /* 00a0 */ - void *syscall_cfa; /* 00a8 */ - DWORD syscall_flags; /* 00b0 */ -- DWORD restore_flags; /* 00b4 */ -- DWORD align[2]; /* 00b8 */ -+ DWORD align[3]; /* 00b4 */ - XMM_SAVE_AREA32 xsave; /* 00c0 */ - DECLSPEC_ALIGN(64) XSTATE xstate; /* 02c0 */ - }; -@@ -809,7 +813,17 @@ static inline void set_sigcontext( const CONTEXT *context, ucontext_t *sigcontex - RIP_sig(sigcontext) = context->Rip; - CS_sig(sigcontext) = context->SegCs; - FS_sig(sigcontext) = context->SegFs; -+ GS_sig(sigcontext) = context->SegGs; - EFL_sig(sigcontext) = context->EFlags; -+ #ifdef DS_sig -+ DS_sig(sigcontext) = context->SegDs; -+ #endif -+ #ifdef ES_sig -+ ES_sig(sigcontext) = context->SegEs; -+ #endif -+ #ifdef SS_sig -+ SS_sig(sigcontext) = context->SegSs; -+ #endif - } - - -@@ -838,16 +852,6 @@ static inline void leave_handler( ucontext_t *sigcontext ) - if (fs32_sel && !is_inside_signal_stack( (void *)RSP_sig(sigcontext )) && !is_inside_syscall(sigcontext)) - __asm__ volatile( "movw %0,%%fs" :: "r" (fs32_sel) ); - #endif --#ifdef DS_sig -- DS_sig(sigcontext) = ds64_sel; --#else -- __asm__ volatile( "movw %0,%%ds" :: "r" (ds64_sel) ); --#endif --#ifdef ES_sig -- ES_sig(sigcontext) = ds64_sel; --#else -- __asm__ volatile( "movw %0,%%es" :: "r" (ds64_sel) ); --#endif - } - - -@@ -880,11 +884,23 @@ static void save_context( struct xcontext *xcontext, const ucontext_t *sigcontex - context->Rip = RIP_sig(sigcontext); - context->SegCs = CS_sig(sigcontext); - context->SegFs = FS_sig(sigcontext); -+ context->SegGs = GS_sig(sigcontext); - context->EFlags = EFL_sig(sigcontext); -- context->SegDs = ds64_sel; -- context->SegEs = ds64_sel; -- context->SegGs = ds64_sel; -- context->SegSs = ds64_sel; -+ #ifdef DS_sig -+ context->SegDs = DS_sig(sigcontext); -+ #else -+ __asm__("movw %%ds,%0" : "=m" (context->SegDs)); -+ #endif -+ #ifdef ES_sig -+ context->SegEs = ES_sig(sigcontext); -+ #else -+ __asm__("movw %%es,%0" : "=m" (context->SegEs)); -+ #endif -+ #ifdef SS_sig -+ context->SegSs = SS_sig(sigcontext); -+ #else -+ __asm__("movw %%ss,%0" : "=m" (context->SegSs)); -+ #endif - context->Dr0 = amd64_thread_data()->dr0; - context->Dr1 = amd64_thread_data()->dr1; - context->Dr2 = amd64_thread_data()->dr2; -@@ -1041,6 +1057,15 @@ NTSTATUS WINAPI NtSetContextThread( HANDLE handle, const CONTEXT *context ) - frame->rbp = context->Rbp; - frame->rip = context->Rip; - frame->eflags = context->EFlags; -+ frame->cs = context->SegCs; -+ frame->ss = context->SegSs; -+ } -+ if (flags & CONTEXT_SEGMENTS) -+ { -+ frame->ds = context->SegDs; -+ frame->es = context->SegEs; -+ frame->fs = context->SegFs; -+ frame->gs = context->SegGs; - } - if (flags & CONTEXT_FLOATING_POINT) - { -@@ -1108,16 +1133,16 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context ) - context->Rbp = frame->rbp; - context->Rip = frame->rip; - context->EFlags = frame->eflags; -- context->SegCs = cs64_sel; -- context->SegSs = ds64_sel; -+ context->SegCs = frame->cs; -+ context->SegSs = frame->ss; - context->ContextFlags |= CONTEXT_CONTROL; - } - if (needed_flags & CONTEXT_SEGMENTS) - { -- context->SegDs = ds64_sel; -- context->SegEs = ds64_sel; -- context->SegFs = amd64_thread_data()->fs; -- context->SegGs = ds64_sel; -+ context->SegDs = frame->ds; -+ context->SegEs = frame->es; -+ context->SegFs = frame->fs; -+ context->SegGs = frame->gs; - context->ContextFlags |= CONTEXT_SEGMENTS; - } - if (needed_flags & CONTEXT_FLOATING_POINT) -@@ -1345,16 +1370,16 @@ NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size ) - context->Ebp = wow_frame->Ebp; - context->Eip = wow_frame->Eip; - context->EFlags = wow_frame->EFlags; -- context->SegCs = cs32_sel; -- context->SegSs = ds64_sel; -+ context->SegCs = wow_frame->SegCs; -+ context->SegSs = wow_frame->SegSs; - context->ContextFlags |= CONTEXT_I386_CONTROL; - } - if (needed_flags & CONTEXT_I386_SEGMENTS) - { -- context->SegDs = ds64_sel; -- context->SegEs = ds64_sel; -- context->SegFs = amd64_thread_data()->fs; -- context->SegGs = ds64_sel; -+ context->SegDs = wow_frame->SegDs; -+ context->SegEs = wow_frame->SegEs; -+ context->SegFs = wow_frame->SegFs; -+ context->SegGs = wow_frame->SegGs; - context->ContextFlags |= CONTEXT_I386_SEGMENTS; - } - if (needed_flags & CONTEXT_I386_EXTENDED_REGISTERS) -@@ -2523,11 +2548,11 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB - wow_context->Esp = get_wow_teb( teb )->Tib.StackBase - 16; - wow_context->Eip = pLdrSystemDllInitBlock->pRtlUserThreadStart; - wow_context->SegCs = cs32_sel; -- wow_context->SegDs = ds64_sel; -- wow_context->SegEs = ds64_sel; -- wow_context->SegFs = thread_data->fs; -- wow_context->SegGs = ds64_sel; -- wow_context->SegSs = ds64_sel; -+ wow_context->SegDs = context.SegDs; -+ wow_context->SegEs = context.SegEs; -+ wow_context->SegFs = context.SegFs; -+ wow_context->SegGs = context.SegGs; -+ wow_context->SegSs = context.SegSs; - wow_context->EFlags = 0x202; - wow_context->FloatSave.ControlWord = context.FltSave.ControlWord; - *(XSAVE_FORMAT *)wow_context->ExtendedRegisters = context.FltSave; -@@ -2541,8 +2566,6 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB - memset( frame, 0, sizeof(*frame) ); - NtSetContextThread( GetCurrentThread(), ctx ); - -- frame->cs = cs64_sel; -- frame->ss = ds64_sel; - frame->rsp = (ULONG64)ctx - 8; - frame->rip = (ULONG64)pLdrInitializeThunk; - frame->rcx = (ULONG64)ctx; -@@ -2606,7 +2629,7 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher, - __ASM_CFI(".cfi_adjust_cfa_offset 8\n\t") - "popq 0x80(%rcx)\n\t" - __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t") -- "movl $0,0xb4(%rcx)\n\t" /* frame->restore_flags */ -+ "movl $0,0x94(%rcx)\n\t" /* frame->restore_flags */ - __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_prolog_end") ":\n\t" - "movq %rax,0x00(%rcx)\n\t" - "movq %rbx,0x08(%rcx)\n\t" -@@ -2625,9 +2648,13 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher, - "movq %r15,0x68(%rcx)\n\t" - __ASM_CFI_REG_IS_AT2(r15, rcx, 0xe8, 0x00) - "movw %cs,0x78(%rcx)\n\t" -+ "movw %ds,0x7a(%rcx)\n\t" -+ "movw %es,0x7c(%rcx)\n\t" -+ "movw %fs,0x7e(%rcx)\n\t" - "movq %rsp,0x88(%rcx)\n\t" - __ASM_CFI_CFA_IS_AT2(rcx, 0x88, 0x01) - "movw %ss,0x90(%rcx)\n\t" -+ "movw %gs,0x92(%rcx)\n\t" - "movq %rbp,0x98(%rcx)\n\t" - __ASM_CFI_REG_IS_AT2(rbp, rcx, 0x98, 0x01) - /* Legends of Runeterra hooks the first system call return instruction, and -@@ -2732,7 +2759,7 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher, - "callq *(%r10,%rax,8)\n\t" - "leaq -0x98(%rbp),%rcx\n\t" - __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") ":\n\t" -- "movl 0xb4(%rcx),%edx\n\t" /* frame->restore_flags */ -+ "movl 0x94(%rcx),%edx\n\t" /* frame->restore_flags */ - "testl $0x48,%edx\n\t" /* CONTEXT_FLOATING_POINT | CONTEXT_XSTATE */ - "jnz 2f\n\t" - "movaps 0x1c0(%rcx),%xmm6\n\t" -@@ -2753,7 +2780,7 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher, - "xorl %edx,%edx\n\t" - "xrstor64 0xc0(%rcx)\n\t" - "movq %r11,%rax\n\t" -- "movl 0xb4(%rcx),%edx\n\t" /* frame->restore_flags */ -+ "movl 0x94(%rcx),%edx\n\t" - "jmp 4f\n" - "3:\tfxrstor64 0xc0(%rcx)\n" - "4:\tmovq 0x98(%rcx),%rbp\n\t" -@@ -2771,7 +2798,7 @@ __ASM_GLOBAL_FUNC( __wine_syscall_dispatcher, - #ifdef __linux__ - "testl $12,%r14d\n\t" /* SYSCALL_HAVE_PTHREAD_TEB | SYSCALL_HAVE_WRFSGSBASE */ - "jz 1f\n\t" -- "movw %gs:0x338,%fs\n" /* amd64_thread_data()->fs */ -+ "movw 0x7e(%rcx),%fs\n" - "1:\n\t" - #endif - "movq 0x60(%rcx),%r14\n\t" -@@ -2844,7 +2871,7 @@ __ASM_GLOBAL_FUNC( __wine_unix_call_dispatcher, - "popq 0x70(%rcx)\n\t" /* frame->rip */ - __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t") - __ASM_CFI_REG_IS_AT2(rip, rcx, 0xf0,0x00) -- "movl $0,0xb4(%rcx)\n\t" /* frame->restore_flags */ -+ "movl $0,0x94(%rcx)\n\t" /* frame->restore_flags */ - __ASM_LOCAL_LABEL("__wine_unix_call_dispatcher_prolog_end") ":\n\t" - "movq %rbx,0x08(%rcx)\n\t" - __ASM_CFI_REG_IS_AT1(rbx, rcx, 0x08) -@@ -2892,6 +2919,7 @@ __ASM_GLOBAL_FUNC( __wine_unix_call_dispatcher, - #ifdef __linux__ - "testl $12,%r14d\n\t" /* SYSCALL_HAVE_PTHREAD_TEB | SYSCALL_HAVE_WRFSGSBASE */ - "jz 2f\n\t" -+ "movw %fs,0x7e(%rcx)\n\t" - "movq %gs:0x320,%rsi\n\t" /* amd64_thread_data()->pthread_teb */ - "testl $8,%r14d\n\t" /* SYSCALL_HAVE_WRFSGSBASE */ - "jz 1f\n\t" -@@ -2915,7 +2943,7 @@ __ASM_GLOBAL_FUNC( __wine_unix_call_dispatcher, - "movdqa 0x230(%rcx),%xmm13\n\t" - "movdqa 0x240(%rcx),%xmm14\n\t" - "movdqa 0x250(%rcx),%xmm15\n\t" -- "testl $0xffff,0xb4(%rcx)\n\t" /* frame->restore_flags */ -+ "testl $0xffff,0x94(%rcx)\n\t" /* frame->restore_flags */ - "jnz " __ASM_LOCAL_LABEL("__wine_syscall_dispatcher_return") "\n\t" - /* switch to user stack */ - "movq 0x88(%rcx),%rsp\n\t" -@@ -2923,7 +2951,7 @@ __ASM_GLOBAL_FUNC( __wine_unix_call_dispatcher, - #ifdef __linux__ - "testl $12,%r14d\n\t" /* SYSCALL_HAVE_PTHREAD_TEB | SYSCALL_HAVE_WRFSGSBASE */ - "jz 1f\n\t" -- "movw %gs:0x338,%fs\n" /* amd64_thread_data()->fs */ -+ "movw 0x7e(%rcx),%fs\n" - "1:\n\t" - #endif - "movq 0x60(%rcx),%r14\n\t" -- cgit 1.4.1