From b8ae3f073bafadf48b8ce0985010a63dfd3ccd6e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 27 Aug 2009 16:38:47 +0200 Subject: [PATCH] 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 1a0fd886058..5cb2c9e3008 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 6ab1df24bd0..0b18b500e77 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 d6b282a19d8..974893193d4 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 38a20b764b8..511c46048ab 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) {