Alexandre Julliard : ntdll: Fix handling of the duplicate MxCsr entry in the x86_64 context.

Alexandre Julliard julliard at winehq.org
Thu Aug 27 10:31:57 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Aug 27 16:38:47 2009 +0200

ntdll: Fix handling of the duplicate MxCsr entry in the x86_64 context.

---

 dlls/ntdll/signal_x86_64.c     |    7 +++----
 include/wine/server_protocol.h |    4 ++--
 server/protocol.def            |    2 +-
 server/trace.c                 |    5 ++---
 4 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 1a0fd88..5cb2c9e 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -1019,11 +1019,11 @@ static void save_context( CONTEXT *context, const ucontext_t *sigcontext )
 #else
     __asm__("movw %%ss,%0" : "=m" (context->SegSs));
 #endif
-    context->MxCsr  = 0;  /* FIXME */
     if (FPU_sig(sigcontext))
     {
         context->ContextFlags |= CONTEXT_FLOATING_POINT;
         context->u.FltSave = *FPU_sig(sigcontext);
+        context->MxCsr = context->u.FltSave.MxCsr;
     }
 }
 
@@ -1107,7 +1107,6 @@ void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags )
         to->SegCs  = from->SegCs;
         to->SegSs  = from->SegSs;
         to->EFlags = from->EFlags;
-        to->MxCsr  = from->MxCsr;
     }
     if (flags & CONTEXT_INTEGER)
     {
@@ -1135,6 +1134,7 @@ void copy_context( CONTEXT *to, const CONTEXT *from, DWORD flags )
     }
     if (flags & CONTEXT_FLOATING_POINT)
     {
+        to->MxCsr = from->MxCsr;
         to->u.FltSave = from->u.FltSave;
     }
     if (flags & CONTEXT_DEBUG_REGISTERS)
@@ -1170,7 +1170,6 @@ NTSTATUS context_to_server( context_t *to, const CONTEXT *from )
         to->ctl.x86_64_regs.cs    = from->SegCs;
         to->ctl.x86_64_regs.ss    = from->SegSs;
         to->ctl.x86_64_regs.flags = from->EFlags;
-        to->ctl.x86_64_regs.mxcsr = from->MxCsr;
     }
     if (flags & CONTEXT_INTEGER)
     {
@@ -1236,7 +1235,6 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
         to->SegCs  = from->ctl.x86_64_regs.cs;
         to->SegSs  = from->ctl.x86_64_regs.ss;
         to->EFlags = from->ctl.x86_64_regs.flags;
-        to->MxCsr  = from->ctl.x86_64_regs.mxcsr;
     }
 
     if (from->flags & SERVER_CTX_INTEGER)
@@ -1269,6 +1267,7 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
     {
         to->ContextFlags |= CONTEXT_FLOATING_POINT;
         memcpy( &to->u.FltSave, from->fp.x86_64_regs.fpregs, sizeof(from->fp.x86_64_regs.fpregs) );
+        to->MxCsr = to->u.FltSave.MxCsr;
     }
     if (from->flags & SERVER_CTX_DEBUG_REGISTERS)
     {
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 6ab1df2..0b18b50 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -143,7 +143,7 @@ typedef struct
     {
         struct { unsigned int eip, ebp, esp, eflags, cs, ss; } i386_regs;
         struct { unsigned __int64 rip, rbp, rsp;
-                 unsigned int cs, ss, flags, mxcsr; } x86_64_regs;
+                 unsigned int cs, ss, flags; } x86_64_regs;
         struct { unsigned __int64 fir;
                  unsigned int psr; } alpha_regs;
         struct { unsigned int iar, msr, ctr, lr, dar, dsisr, trap; } powerpc_regs;
@@ -5347,6 +5347,6 @@ union generic_reply
     struct set_window_layered_info_reply set_window_layered_info_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 389
+#define SERVER_PROTOCOL_VERSION 390
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index d6b282a..9748931 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -159,7 +159,7 @@ typedef struct
     {
         struct { unsigned int eip, ebp, esp, eflags, cs, ss; } i386_regs;
         struct { unsigned __int64 rip, rbp, rsp;
-                 unsigned int cs, ss, flags, mxcsr; } x86_64_regs;
+                 unsigned int cs, ss, flags; } x86_64_regs;
         struct { unsigned __int64 fir;
                  unsigned int psr; } alpha_regs;
         struct { unsigned int iar, msr, ctr, lr, dar, dsisr, trap; } powerpc_regs;
diff --git a/server/trace.c b/server/trace.c
index 38a20b7..511c460 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -457,9 +457,8 @@ static void dump_varargs_context( const char *prefix, data_size_t size )
             dump_uint64( ",rip=", &ctx.ctl.x86_64_regs.rip );
             dump_uint64( ",rbp=", &ctx.ctl.x86_64_regs.rbp );
             dump_uint64( ",rsp=", &ctx.ctl.x86_64_regs.rsp );
-            fprintf( stderr, ",cs=%04x,ss=%04x,flags=%08x,mxcsr=%08x",
-                     ctx.ctl.x86_64_regs.cs, ctx.ctl.x86_64_regs.ss,
-                     ctx.ctl.x86_64_regs.flags, ctx.ctl.x86_64_regs.mxcsr );
+            fprintf( stderr, ",cs=%04x,ss=%04x,flags=%08x",
+                     ctx.ctl.x86_64_regs.cs, ctx.ctl.x86_64_regs.ss, ctx.ctl.x86_64_regs.flags );
         }
         if (ctx.flags & SERVER_CTX_INTEGER)
         {




More information about the wine-cvs mailing list