server: Define a generic context structure instead of using the platform-specific version.
diff --git a/server/trace.c b/server/trace.c
index 88ea5e5..4a7bfa5 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -298,33 +298,6 @@
     fprintf( stderr, "%s%d.%u", prefix, luid->high_part, luid->low_part );
 }
 
-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,",
-             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 *)&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 *)&ctx, sizeof(ctx) / sizeof(int) );
-#endif
-}
-
 static void dump_varargs_ints( const char *prefix, data_size_t size )
 {
     const int *data = cur_data;
@@ -428,14 +401,190 @@
 
 static void dump_varargs_context( const char *prefix, data_size_t size )
 {
+    const context_t *context = cur_data;
+    context_t ctx;
+    unsigned int i;
+
     if (!size)
     {
         fprintf( stderr, "%s{}", prefix );
         return;
     }
-    fprintf( stderr, "%s", prefix );
-    dump_context( cur_data, size );
-    remove_data( min( size, sizeof(CONTEXT) ));
+    size = min( size, sizeof(ctx) );
+    memset( &ctx, 0, sizeof(ctx) );
+    memcpy( &ctx, context, size );
+
+    fprintf( stderr,"%s{", prefix );
+    dump_cpu_type( "cpu=", &ctx.cpu );
+    switch (ctx.cpu)
+    {
+    case CPU_x86:
+        if (ctx.flags & SERVER_CTX_CONTROL)
+            fprintf( stderr, ",eip=%08x,esp=%08x,ebp=%08x,eflags=%08x,cs=%04x,ss=%04x",
+                     ctx.ctl.i386_regs.eip, ctx.ctl.i386_regs.esp, ctx.ctl.i386_regs.ebp,
+                     ctx.ctl.i386_regs.eflags, ctx.ctl.i386_regs.cs, ctx.ctl.i386_regs.ss );
+        if (ctx.flags & SERVER_CTX_SEGMENTS)
+            fprintf( stderr, ",ds=%04x,es=%04x,fs=%04x,gs=%04x",
+                     ctx.seg.i386_regs.ds, ctx.seg.i386_regs.es,
+                     ctx.seg.i386_regs.fs, ctx.seg.i386_regs.gs );
+        if (ctx.flags & SERVER_CTX_INTEGER)
+            fprintf( stderr, ",eax=%08x,ebx=%08x,ecx=%08x,edx=%08x,esi=%08x,edi=%08x",
+                     ctx.integer.i386_regs.eax, ctx.integer.i386_regs.ebx, ctx.integer.i386_regs.ecx,
+                     ctx.integer.i386_regs.edx, ctx.integer.i386_regs.esi, ctx.integer.i386_regs.edi );
+        if (ctx.flags & SERVER_CTX_DEBUG_REGISTERS)
+            fprintf( stderr, ",dr0=%08x,dr1=%08x,dr2=%08x,dr3=%08x,dr6=%08x,dr7=%08x",
+                     ctx.debug.i386_regs.dr0, ctx.debug.i386_regs.dr1, ctx.debug.i386_regs.dr2,
+                     ctx.debug.i386_regs.dr3, ctx.debug.i386_regs.dr6, ctx.debug.i386_regs.dr7 );
+        if (ctx.flags & SERVER_CTX_FLOATING_POINT)
+        {
+            fprintf( stderr, "fp.ctrl=%08x,fp.status=%08x,fp.tag=%08x,fp.err_off=%08x,fp.err_sel=%08x",
+                     ctx.fp.i386_regs.ctrl, ctx.fp.i386_regs.status, ctx.fp.i386_regs.tag,
+                     ctx.fp.i386_regs.err_off, ctx.fp.i386_regs.err_sel );
+            fprintf( stderr, ",fp.data_off=%08x,fp.data_sel=%08x,fp.cr0npx=%08x",
+                     ctx.fp.i386_regs.data_off, ctx.fp.i386_regs.data_sel, ctx.fp.i386_regs.cr0npx );
+            for (i = 0; i < 8; i++)
+                fprintf( stderr, ",fp.reg%u=%Lg", i, *(long double *)&ctx.fp.i386_regs.regs[10*i] );
+        }
+        if (ctx.flags & SERVER_CTX_EXTENDED_REGISTERS)
+        {
+            fprintf( stderr, ",extended=" );
+            dump_uints( (const int *)ctx.ext.i386_regs, sizeof(ctx.ext.i386_regs) / sizeof(int) );
+        }
+        break;
+    case CPU_x86_64:
+        if (ctx.flags & SERVER_CTX_CONTROL)
+        {
+            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 );
+        }
+        if (ctx.flags & SERVER_CTX_INTEGER)
+        {
+            dump_uint64( ",rax=", &ctx.integer.x86_64_regs.rax );
+            dump_uint64( ",rbx=", &ctx.integer.x86_64_regs.rbx );
+            dump_uint64( ",rcx=", &ctx.integer.x86_64_regs.rcx );
+            dump_uint64( ",rdx=", &ctx.integer.x86_64_regs.rdx );
+            dump_uint64( ",rsi=", &ctx.integer.x86_64_regs.rsi );
+            dump_uint64( ",rdi=", &ctx.integer.x86_64_regs.rdi );
+            dump_uint64( ",r8=",  &ctx.integer.x86_64_regs.r8 );
+            dump_uint64( ",r9=",  &ctx.integer.x86_64_regs.r9 );
+            dump_uint64( ",r10=", &ctx.integer.x86_64_regs.r10 );
+            dump_uint64( ",r11=", &ctx.integer.x86_64_regs.r11 );
+            dump_uint64( ",r12=", &ctx.integer.x86_64_regs.r12 );
+            dump_uint64( ",r13=", &ctx.integer.x86_64_regs.r13 );
+            dump_uint64( ",r14=", &ctx.integer.x86_64_regs.r14 );
+            dump_uint64( ",r15=", &ctx.integer.x86_64_regs.r15 );
+        }
+        if (ctx.flags & SERVER_CTX_SEGMENTS)
+            fprintf( stderr, ",ds=%04x,es=%04x,fs=%04x,gs=%04x",
+                     ctx.seg.x86_64_regs.ds, ctx.seg.x86_64_regs.es,
+                     ctx.seg.x86_64_regs.fs, ctx.seg.x86_64_regs.gs );
+        if (ctx.flags & SERVER_CTX_DEBUG_REGISTERS)
+        {
+            dump_uint64( ",dr0=", &ctx.debug.x86_64_regs.dr0 );
+            dump_uint64( ",dr1=", &ctx.debug.x86_64_regs.dr1 );
+            dump_uint64( ",dr2=", &ctx.debug.x86_64_regs.dr2 );
+            dump_uint64( ",dr3=", &ctx.debug.x86_64_regs.dr3 );
+            dump_uint64( ",dr6=", &ctx.debug.x86_64_regs.dr6 );
+            dump_uint64( ",dr7=", &ctx.debug.x86_64_regs.dr7 );
+        }
+        if (ctx.flags & SERVER_CTX_FLOATING_POINT)
+        {
+            for (i = 0; i < 32; i++)
+                fprintf( stderr, ",fp%u=%08x%08x%08x%08x", i,
+                         (unsigned int)(ctx.fp.x86_64_regs.fpregs[i].high >> 32),
+                         (unsigned int)ctx.fp.x86_64_regs.fpregs[i].high,
+                         (unsigned int)(ctx.fp.x86_64_regs.fpregs[i].low >> 32),
+                         (unsigned int)ctx.fp.x86_64_regs.fpregs[i].low );
+        }
+        break;
+    case CPU_ALPHA:
+        if (ctx.flags & SERVER_CTX_CONTROL)
+        {
+            dump_uint64( ",fir=", &ctx.ctl.alpha_regs.fir );
+            fprintf( stderr, ",psr=%08x", ctx.ctl.alpha_regs.psr );
+        }
+        if (ctx.flags & SERVER_CTX_INTEGER)
+        {
+            dump_uint64( ",v0=",  &ctx.integer.alpha_regs.v0 );
+            dump_uint64( ",t0=",  &ctx.integer.alpha_regs.t0 );
+            dump_uint64( ",t1=",  &ctx.integer.alpha_regs.t1 );
+            dump_uint64( ",t2=",  &ctx.integer.alpha_regs.t2 );
+            dump_uint64( ",t3=",  &ctx.integer.alpha_regs.t3 );
+            dump_uint64( ",t4=",  &ctx.integer.alpha_regs.t4 );
+            dump_uint64( ",t5=",  &ctx.integer.alpha_regs.t5 );
+            dump_uint64( ",t6=",  &ctx.integer.alpha_regs.t6 );
+            dump_uint64( ",t7=",  &ctx.integer.alpha_regs.t7 );
+            dump_uint64( ",t8=",  &ctx.integer.alpha_regs.t8 );
+            dump_uint64( ",t9=",  &ctx.integer.alpha_regs.t9 );
+            dump_uint64( ",t10=", &ctx.integer.alpha_regs.t10 );
+            dump_uint64( ",t11=", &ctx.integer.alpha_regs.t11 );
+            dump_uint64( ",t12=", &ctx.integer.alpha_regs.t12 );
+            dump_uint64( ",s0=",  &ctx.integer.alpha_regs.s0 );
+            dump_uint64( ",s1=",  &ctx.integer.alpha_regs.s1 );
+            dump_uint64( ",s2=",  &ctx.integer.alpha_regs.s2 );
+            dump_uint64( ",s3=",  &ctx.integer.alpha_regs.s3 );
+            dump_uint64( ",s4=",  &ctx.integer.alpha_regs.s4 );
+            dump_uint64( ",s5=",  &ctx.integer.alpha_regs.s5 );
+            dump_uint64( ",s6=",  &ctx.integer.alpha_regs.s6 );
+            dump_uint64( ",a0=",  &ctx.integer.alpha_regs.a0 );
+            dump_uint64( ",a1=",  &ctx.integer.alpha_regs.a1 );
+            dump_uint64( ",a2=",  &ctx.integer.alpha_regs.a2 );
+            dump_uint64( ",a3=",  &ctx.integer.alpha_regs.a3 );
+            dump_uint64( ",a4=",  &ctx.integer.alpha_regs.a4 );
+            dump_uint64( ",a5=",  &ctx.integer.alpha_regs.a5 );
+            dump_uint64( ",at=",  &ctx.integer.alpha_regs.at );
+        }
+        if (ctx.flags & SERVER_CTX_FLOATING_POINT)
+        {
+            for (i = 0; i < 32; i++)
+            {
+                fprintf( stderr, ",f%u", i );
+                dump_uint64( "=", &ctx.fp.alpha_regs.f[i] );
+            }
+            dump_uint64( ",fpcr=", &ctx.fp.alpha_regs.fpcr );
+            dump_uint64( ",softfpcr=", &ctx.fp.alpha_regs.softfpcr );
+        }
+        break;
+    case CPU_POWERPC:
+        if (ctx.flags & SERVER_CTX_CONTROL)
+            fprintf( stderr, ",iar=%08x,msr=%08x,ctr=%08x,lr=%08x,dar=%08x,dsisr=%08x,trap=%08x",
+                     ctx.ctl.powerpc_regs.iar, ctx.ctl.powerpc_regs.msr, ctx.ctl.powerpc_regs.ctr,
+                     ctx.ctl.powerpc_regs.lr, ctx.ctl.powerpc_regs.dar, ctx.ctl.powerpc_regs.dsisr,
+                     ctx.ctl.powerpc_regs.trap );
+        if (ctx.flags & SERVER_CTX_INTEGER)
+        {
+            for (i = 0; i < 32; i++) fprintf( stderr, ",gpr%u=%08x", i, ctx.integer.powerpc_regs.gpr[i] );
+            fprintf( stderr, ",cr=%08x,xer=%08x",
+                     ctx.integer.powerpc_regs.cr, ctx.integer.powerpc_regs.xer );
+        }
+        if (ctx.flags & SERVER_CTX_DEBUG_REGISTERS)
+            for (i = 0; i < 8; i++) fprintf( stderr, ",dr%u=%08x", i, ctx.debug.powerpc_regs.dr[i] );
+        if (ctx.flags & SERVER_CTX_FLOATING_POINT)
+        {
+            for (i = 0; i < 32; i++) fprintf( stderr, ",fpr%u=%g", i, ctx.fp.powerpc_regs.fpr[i] );
+            fprintf( stderr, ",fpscr=%g", ctx.fp.powerpc_regs.fpscr );
+        }
+        break;
+    case CPU_SPARC:
+        if (ctx.flags & SERVER_CTX_CONTROL)
+            fprintf( stderr, ",psr=%08x,pc=%08x,npc=%08x,y=%08x,wim=%08x,tbr=%08x",
+                     ctx.ctl.sparc_regs.psr, ctx.ctl.sparc_regs.pc, ctx.ctl.sparc_regs.npc,
+                     ctx.ctl.sparc_regs.y, ctx.ctl.sparc_regs.wim, ctx.ctl.sparc_regs.tbr );
+        if (ctx.flags & SERVER_CTX_INTEGER)
+        {
+            for (i = 0; i < 8; i++) fprintf( stderr, ",g%u=%08x", i, ctx.integer.sparc_regs.g[i] );
+            for (i = 0; i < 8; i++) fprintf( stderr, ",o%u=%08x", i, ctx.integer.sparc_regs.o[i] );
+            for (i = 0; i < 8; i++) fprintf( stderr, ",l%u=%08x", i, ctx.integer.sparc_regs.l[i] );
+            for (i = 0; i < 8; i++) fprintf( stderr, ",i%u=%08x", i, ctx.integer.sparc_regs.i[i] );
+        }
+        break;
+    }
+    fputc( '}', stderr );
+    remove_data( size );
 }
 
 static void dump_varargs_debug_event( const char *prefix, data_size_t size )
@@ -2128,7 +2277,6 @@
 static void dump_set_thread_context_request( const struct set_thread_context_request *req )
 {
     fprintf( stderr, " handle=%04x", req->handle );
-    fprintf( stderr, ", flags=%08x", req->flags );
     fprintf( stderr, ", suspend=%d", req->suspend );
     dump_varargs_context( ", context=", cur_size );
 }