Alexandre Julliard : server: Take into account the extended registers part of the i386 context.
Alexandre Julliard
julliard at winehq.org
Tue Jan 15 07:47:12 CST 2008
Module: wine
Branch: master
Commit: b317416b20d4ab4a63c8ed83cfa3ba9abaaef714
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b317416b20d4ab4a63c8ed83cfa3ba9abaaef714
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 15 11:53:31 2008 +0100
server: Take into account the extended registers part of the i386 context.
---
server/context_i386.c | 4 ++++
server/trace.c | 36 ++++++++++++++++++++++++------------
2 files changed, 28 insertions(+), 12 deletions(-)
diff --git a/server/context_i386.c b/server/context_i386.c
index 575d5b9..57709fe 100644
--- a/server/context_i386.c
+++ b/server/context_i386.c
@@ -66,6 +66,10 @@ void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
{
to->FloatSave = from->FloatSave;
}
+ if (flags & CONTEXT_EXTENDED_REGISTERS)
+ {
+ memcpy( to->ExtendedRegisters, from->ExtendedRegisters, sizeof(to->ExtendedRegisters) );
+ }
if (flags & CONTEXT_DEBUG_REGISTERS)
{
to->Dr0 = from->Dr0;
diff --git a/server/trace.c b/server/trace.c
index 8a11066..dab137d 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -259,21 +259,30 @@ static void dump_luid( const luid_t *luid )
fprintf( stderr, "%d.%u", luid->high_part, luid->low_part );
}
-static void dump_context( const CONTEXT *context )
+static void dump_context( const CONTEXT *context, data_size_t size )
{
+ CONTEXT ctx;
+
+ memset( &ctx, 0, sizeof(ctx) );
+ memcpy( &ctx, context, min( size, sizeof(CONTEXT) ));
#ifdef __i386__
fprintf( stderr, "{flags=%08x,eax=%08x,ebx=%08x,ecx=%08x,edx=%08x,esi=%08x,edi=%08x,"
"ebp=%08x,eip=%08x,esp=%08x,eflags=%08x,cs=%04x,ds=%04x,es=%04x,"
"fs=%04x,gs=%04x,dr0=%08x,dr1=%08x,dr2=%08x,dr3=%08x,dr6=%08x,dr7=%08x,",
- context->ContextFlags, context->Eax, context->Ebx, context->Ecx, context->Edx,
- context->Esi, context->Edi, context->Ebp, context->Eip, context->Esp, context->EFlags,
- context->SegCs, context->SegDs, context->SegEs, context->SegFs, context->SegGs,
- context->Dr0, context->Dr1, context->Dr2, context->Dr3, context->Dr6, context->Dr7 );
+ ctx.ContextFlags, ctx.Eax, ctx.Ebx, ctx.Ecx, ctx.Edx,
+ ctx.Esi, ctx.Edi, ctx.Ebp, ctx.Eip, ctx.Esp, ctx.EFlags,
+ ctx.SegCs, ctx.SegDs, ctx.SegEs, ctx.SegFs, ctx.SegGs,
+ ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3, ctx.Dr6, ctx.Dr7 );
fprintf( stderr, "float=" );
- dump_uints( (const int *)&context->FloatSave, sizeof(context->FloatSave) / sizeof(int) );
+ dump_uints( (const int *)&ctx.FloatSave, sizeof(ctx.FloatSave) / sizeof(int) );
+ if (size > FIELD_OFFSET( CONTEXT, ExtendedRegisters ))
+ {
+ fprintf( stderr, ",extended=" );
+ dump_uints( (const int *)&ctx.ExtendedRegisters, sizeof(ctx.ExtendedRegisters) / sizeof(int) );
+ }
fprintf( stderr, "}" );
#else
- dump_uints( (const int *)context, sizeof(*context) / sizeof(int) );
+ dump_uints( (const int *)&ctx, sizeof(ctx) / sizeof(int) );
#endif
}
@@ -384,8 +393,8 @@ static void dump_varargs_context( data_size_t size )
fprintf( stderr, "{}" );
return;
}
- dump_context( cur_data );
- remove_data( size );
+ dump_context( cur_data, size );
+ remove_data( min( size, sizeof(CONTEXT) ));
}
static void dump_varargs_exc_event( data_size_t size )
@@ -398,9 +407,12 @@ static void dump_varargs_exc_event( data_size_t size )
return;
}
fprintf( stderr, "{context=" );
- dump_context( ptr );
- fprintf( stderr, ",rec=" );
- dump_exc_record( (const EXCEPTION_RECORD *)(ptr + 1) );
+ dump_context( ptr, size );
+ if (size > sizeof(CONTEXT))
+ {
+ fprintf( stderr, ",rec=" );
+ dump_exc_record( (const EXCEPTION_RECORD *)(ptr + 1) );
+ }
fputc( '}', stderr );
remove_data( size );
}
More information about the wine-cvs
mailing list