Andrew Wesie : ntdll: Save rdi and rsi in raise_func_trampoline.

Alexandre Julliard julliard at winehq.org
Tue Mar 7 15:44:00 CST 2017


Module: wine
Branch: master
Commit: 9eecacbeb1561218d4870c83f89a233cabbf7e0c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9eecacbeb1561218d4870c83f89a233cabbf7e0c

Author: Andrew Wesie <awesie at gmail.com>
Date:   Tue Mar  7 19:11:11 2017 +0100

ntdll: Save rdi and rsi in raise_func_trampoline.

Signed-off-by: Andrew Wesie <awesie at gmail.com>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/signal_x86_64.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index f33fe4c..61bb2dd 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -2066,9 +2066,11 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
 extern void raise_func_trampoline( EXCEPTION_RECORD *rec, CONTEXT *context, raise_func func );
 __ASM_GLOBAL_FUNC( raise_func_trampoline,
                    __ASM_CFI(".cfi_signal_frame\n\t")
-                   __ASM_CFI(".cfi_def_cfa %rbp,144\n\t")  /* red zone + rip + rbp */
-                   __ASM_CFI(".cfi_rel_offset %rip,8\n\t")
-                   __ASM_CFI(".cfi_rel_offset %rbp,0\n\t")
+                   __ASM_CFI(".cfi_def_cfa %rbp,160\n\t")  /* red zone + rip + rbp + rdi + rsi */
+                   __ASM_CFI(".cfi_rel_offset %rip,24\n\t")
+                   __ASM_CFI(".cfi_rel_offset %rbp,16\n\t")
+                   __ASM_CFI(".cfi_rel_offset %rdi,8\n\t")
+                   __ASM_CFI(".cfi_rel_offset %rsi,0\n\t")
                    "call *%rdx\n\t"
                    "int $3")
 
@@ -2085,6 +2087,8 @@ static EXCEPTION_RECORD *setup_exception( ucontext_t *sigcontext, raise_func fun
     {
         CONTEXT           context;
         EXCEPTION_RECORD  rec;
+        ULONG64           rsi;
+        ULONG64           rdi;
         ULONG64           rbp;
         ULONG64           rip;
         ULONG64           red_zone[16];
@@ -2154,6 +2158,8 @@ static EXCEPTION_RECORD *setup_exception( ucontext_t *sigcontext, raise_func fun
     rsp_ptr = (ULONG64 *)RSP_sig(sigcontext) - 16;
     *(--rsp_ptr) = RIP_sig(sigcontext);
     *(--rsp_ptr) = RBP_sig(sigcontext);
+    *(--rsp_ptr) = RDI_sig(sigcontext);
+    *(--rsp_ptr) = RSI_sig(sigcontext);
 
     /* now modify the sigcontext to return to the raise function */
     RIP_sig(sigcontext) = (ULONG_PTR)raise_func_trampoline;




More information about the wine-cvs mailing list