Jacek Caban : ntdll: Store instruction pointer register in x86_64 syscall frame.

Alexandre Julliard julliard at winehq.org
Wed Feb 17 16:23:33 CST 2021


Module: wine
Branch: master
Commit: accf7a09080eb38f75e5b730725ac987248d6e1f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=accf7a09080eb38f75e5b730725ac987248d6e1f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Feb 15 21:58:09 2021 +0100

ntdll: Store instruction pointer register in x86_64 syscall frame.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/unix/signal_x86_64.c | 4 ++--
 tools/winebuild/import.c        | 4 +++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 9366d8913c0..d5a34c700f8 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -1946,7 +1946,7 @@ NTSTATUS WINAPI NtGetContextThread( HANDLE handle, CONTEXT *context )
         {
             context->Rsp    = (ULONG64)&frame->ret_addr;
             context->Rbp    = frame->rbp;
-            context->Rip    = frame->thunk_addr;
+            context->Rip    = frame->rip;
             context->EFlags = frame->eflags;
             __asm__( "movw %%cs,%0" : "=g" (context->SegCs) );
             __asm__( "movw %%ss,%0" : "=g" (context->SegSs) );
@@ -2410,7 +2410,7 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, EXCEPTION_RECORD *rec,
         R14_sig(sigcontext) = frame->r14;
         R15_sig(sigcontext) = frame->r15;
         RSP_sig(sigcontext) = (ULONG_PTR)&frame->ret_addr;
-        RIP_sig(sigcontext) = frame->thunk_addr;
+        RIP_sig(sigcontext) = frame->rip;
         if (fpu) *fpu = get_syscall_xsave( frame )->xsave;
         amd64_thread_data()->syscall_frame = NULL;
     }
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index 8c949a383e3..2db414b3b30 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -1522,10 +1522,12 @@ void output_syscalls( DLLSPEC *spec )
             output( "\tmovq %%r13,-0x40(%%rbp)\n" );
             output( "\tmovq %%r14,-0x38(%%rbp)\n" );
             output( "\tmovq %%r15,-0x30(%%rbp)\n" );
-            output( "\tfxsave64 (%%rsp)\n" );
             /* Legends of Runeterra hooks the first system call return instruction, and
              * depends on us returning to it. Adjust the return address accordingly. */
             output( "\tsubq $0xb,0x8(%%rbp)\n" );
+            output( "\tmovq 0x8(%%rbp),%%rbx\n" );
+            output( "\tmovq %%rbx,-0x28(%%rbp)\n" );
+            output( "\tfxsave64 (%%rsp)\n" );
             output( "\tmovq %%gs:0x30,%%rcx\n" );
             output( "\tleaq -0x98(%%rbp),%%rbx\n" );
             output( "\tmovq %%rbx,0x328(%%rcx)\n" );  /* amd64_thread_data()->syscall_frame */




More information about the wine-cvs mailing list