server: Set the context flags in get_thread_context to indicate which
parts of the returned context are valid.
diff --git a/server/context_alpha.c b/server/context_alpha.c
index bf4df52..1f82d8e 100644
--- a/server/context_alpha.c
+++ b/server/context_alpha.c
@@ -142,7 +142,7 @@
             context->Fpcr = regs.regs[EF_SIZE/8+31];
             context->SoftFpcr = 0; /* FIXME */
         }
-        if (ptrace( PTRACE_SETREGS, pid, 0, &regs ) == -1) goto error;
+        context->ContextFlags |= flags & CONTEXT_FULL;
     }
     return;
  error:
@@ -231,6 +231,7 @@
             regs.regs[EF_SIZE/8+30] = context->FltF30;
             regs.regs[EF_SIZE/8+31] = context->Fpcr;
         }
+        if (ptrace( PTRACE_SETREGS, pid, 0, &regs ) == -1) goto error;
     }
     return;
  error:
@@ -238,7 +239,7 @@
 }
 
 /* copy a context structure according to the flags */
-static void copy_context( CONTEXT *to, const CONTEXT *from, int flags )
+static void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
 {
     if (flags & CONTEXT_CONTROL)
     {
@@ -317,6 +318,7 @@
         to->Fpcr = from->Fpcr;
         to->SoftFpcr = from->SoftFpcr;
     }
+    to->ContextFlags |= flags;
 }
 
 /* retrieve the current instruction pointer of a thread */
@@ -346,60 +348,36 @@
     return -1;
 }
 
-/* retrieve the current context of a thread */
-DECL_HANDLER(get_thread_context)
+/* retrieve the thread context */
+void get_thread_context( struct thread *thread, CONTEXT *context, unsigned int flags )
 {
-    struct thread *thread;
-    void *data;
-    int flags = req->flags & ~CONTEXT_ALPHA;  /* get rid of CPU id */
+    context->ContextFlags |= CONTEXT_ALPHA;
+    flags &= ~CONTEXT_ALPHA;  /* get rid of CPU id */
 
-    if (get_reply_max_size() < sizeof(CONTEXT))
+    if (thread->context)  /* thread is inside an exception event or suspended */
     {
-        set_error( STATUS_INVALID_PARAMETER );
-        return;
+        copy_context( context, thread->context, flags );
     }
-    if (!(thread = get_thread_from_handle( req->handle, THREAD_GET_CONTEXT ))) return;
-
-    if ((data = set_reply_data_size( sizeof(CONTEXT) )))
+    else if (flags && suspend_for_ptrace( thread ))
     {
-        if (thread->context)  /* thread is inside an exception event */
-        {
-            copy_context( data, thread->context, flags );
-            flags = 0;
-        }
-        if (flags && suspend_for_ptrace( thread ))
-        {
-            get_thread_context( thread, flags, data );
-            resume_after_ptrace( thread );
-        }
+        get_thread_context_ptrace( thread, flags, context );
+        resume_after_ptrace( thread );
     }
-    release_object( thread );
 }
 
-/* set the current context of a thread */
-DECL_HANDLER(set_thread_context)
+/* set the thread context */
+void set_thread_context( struct thread *thread, const CONTEXT *context, unsigned int flags )
 {
-    struct thread *thread;
-    int flags = req->flags & ~CONTEXT_ALPHA;  /* get rid of CPU id */
+    flags &= ~CONTEXT_ALPHA;  /* get rid of CPU id */
 
-    if (get_req_data_size() < sizeof(CONTEXT))
+    if (thread->context)  /* thread is inside an exception event or suspended */
     {
-        set_error( STATUS_INVALID_PARAMETER );
-        return;
+        copy_context( thread->context, context, flags );
     }
-    if ((thread = get_thread_from_handle( req->handle, THREAD_SET_CONTEXT )))
+    else if (flags && suspend_for_ptrace( thread ))
     {
-        if (thread->context)  /* thread is inside an exception event */
-        {
-            copy_context( thread->context, get_req_data(), flags );
-            flags = 0;
-        }
-        if (flags && suspend_for_ptrace( thread ))
-        {
-            set_thread_context( thread, flags, get_req_data() );
-            resume_after_ptrace( thread );
-        }
-        release_object( thread );
+        set_thread_context_ptrace( thread, flags, context );
+        resume_after_ptrace( thread );
     }
 }
 
diff --git a/server/context_i386.c b/server/context_i386.c
index c2a985b..1d90482 100644
--- a/server/context_i386.c
+++ b/server/context_i386.c
@@ -147,6 +147,7 @@
             context->SegFs = regs.fs;
             context->SegGs = regs.gs;
         }
+        context->ContextFlags |= flags & CONTEXT_FULL;
     }
     if (flags & CONTEXT_DEBUG_REGISTERS)
     {
@@ -156,6 +157,7 @@
         if (get_debug_reg( pid, 3, &context->Dr3 ) == -1) goto error;
         if (get_debug_reg( pid, 6, &context->Dr6 ) == -1) goto error;
         if (get_debug_reg( pid, 7, &context->Dr7 ) == -1) goto error;
+        context->ContextFlags |= CONTEXT_DEBUG_REGISTERS;
     }
     if (flags & CONTEXT_FLOATING_POINT)
     {
@@ -163,6 +165,7 @@
         /* correct structure (the same as fsave/frstor) */
         if (ptrace( PTRACE_GETFPREGS, pid, 0, &context->FloatSave ) == -1) goto error;
         context->FloatSave.Cr0NpxState = 0;  /* FIXME */
+        context->ContextFlags |= CONTEXT_FLOATING_POINT;
     }
     return;
  error:
@@ -263,6 +266,7 @@
             context->SegFs = regs.r_fs & 0xffff;
             context->SegGs = regs.r_gs & 0xffff;
         }
+        context->ContextFlags |= flags & CONTEXT_FULL;
     }
     if (flags & CONTEXT_DEBUG_REGISTERS)
     {
@@ -274,6 +278,7 @@
         /* correct structure (the same as fsave/frstor) */
         if (ptrace( PTRACE_GETFPREGS, pid, (int) &context->FloatSave, 0 ) == -1) goto error;
         context->FloatSave.Cr0NpxState = 0;  /* FIXME */
+        context->ContextFlags |= CONTEXT_FLOATING_POINT;
     }
     return;
  error:
@@ -371,6 +376,7 @@
             context->SegFs = regs.r_fs & 0xffff;
             context->SegGs = regs.r_gs & 0xffff;
         }
+        context->ContextFlags |= flags & CONTEXT_FULL;
     }
     if (flags & CONTEXT_DEBUG_REGISTERS)
     {
@@ -394,7 +400,7 @@
 	context->Dr6 = dbregs.dr6;
 	context->Dr7 = dbregs.dr7;
 #endif
-
+        context->ContextFlags |= CONTEXT_DEBUG_REGISTERS;
 #endif
     }
     if (flags & CONTEXT_FLOATING_POINT)
@@ -403,6 +409,7 @@
         /* correct structure (the same as fsave/frstor) */
         if (ptrace( PTRACE_GETFPREGS, pid, (caddr_t) &context->FloatSave, 0 ) == -1) goto error;
         context->FloatSave.Cr0NpxState = 0;  /* FIXME */
+        context->ContextFlags |= CONTEXT_FLOATING_POINT;
     }
     return;
  error:
@@ -494,7 +501,7 @@
 
 
 /* copy a context structure according to the flags */
-static void copy_context( CONTEXT *to, const CONTEXT *from, int flags )
+static void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
 {
     if (flags & CONTEXT_CONTROL)
     {
@@ -527,6 +534,7 @@
     }
     /* we don't bother copying the debug registers, since they */
     /* always need to be accessed by ptrace anyway */
+    to->ContextFlags |= flags & ~CONTEXT_DEBUG_REGISTERS;
 }
 
 /* retrieve the current instruction pointer of a thread */
@@ -574,6 +582,7 @@
 /* retrieve the thread context */
 void get_thread_context( struct thread *thread, CONTEXT *context, unsigned int flags )
 {
+    context->ContextFlags |= CONTEXT_i386;
     flags &= ~CONTEXT_i386;  /* get rid of CPU id */
 
     if (thread->context)  /* thread is inside an exception event or suspended */
diff --git a/server/context_powerpc.c b/server/context_powerpc.c
index d1705b1..72947e0 100644
--- a/server/context_powerpc.c
+++ b/server/context_powerpc.c
@@ -56,28 +56,27 @@
 static void get_thread_context_ptrace( struct thread *thread, unsigned int flags, CONTEXT *context )
 {
     int pid = get_ptrace_pid(thread);
-    if (flags & CONTEXT_FULL)
+    if (flags & CONTEXT_INTEGER)
     {
-        if (flags & CONTEXT_INTEGER)
-        {
 #define XREG(x,y) if (ptrace( PTRACE_PEEKUSER, pid, (void*)(x<<2), &context->y) == -1) goto error;
 #define IREG(x) if (ptrace( PTRACE_PEEKUSER, pid, (void*)(x<<2), &context->Gpr##x) == -1) goto error;
-	    IREG(0); IREG(1); IREG(2); IREG(3); IREG(4); IREG(5); IREG(6);
-	    IREG(7); IREG(8); IREG(9); IREG(10); IREG(11); IREG(12); IREG(13);
-	    IREG(14); IREG(15); IREG(16); IREG(17); IREG(18); IREG(19);
-	    IREG(20); IREG(21); IREG(22); IREG(23); IREG(24); IREG(25);
-	    IREG(26); IREG(27); IREG(28); IREG(29); IREG(30); IREG(31);
+        IREG(0); IREG(1); IREG(2); IREG(3); IREG(4); IREG(5); IREG(6);
+        IREG(7); IREG(8); IREG(9); IREG(10); IREG(11); IREG(12); IREG(13);
+        IREG(14); IREG(15); IREG(16); IREG(17); IREG(18); IREG(19);
+        IREG(20); IREG(21); IREG(22); IREG(23); IREG(24); IREG(25);
+        IREG(26); IREG(27); IREG(28); IREG(29); IREG(30); IREG(31);
 #undef IREG
-	    XREG(37,Xer);
-	    XREG(38,Cr);
-        }
-        if (flags & CONTEXT_CONTROL)
-        {
-	    XREG(32,Iar);
-	    XREG(33,Msr);
-	    XREG(35,Ctr);
-	    XREG(36,Lr); /* 36 is LNK ... probably Lr ? */
-        }
+        XREG(37,Xer);
+        XREG(38,Cr);
+        context->ContextFlags |= CONTEXT_INTEGER;
+    }
+    if (flags & CONTEXT_CONTROL)
+    {
+        XREG(32,Iar);
+        XREG(33,Msr);
+        XREG(35,Ctr);
+        XREG(36,Lr); /* 36 is LNK ... probably Lr ? */
+        context->ContextFlags |= CONTEXT_CONTROL;
     }
     if (flags & CONTEXT_FLOATING_POINT)
     {
@@ -115,6 +114,7 @@
 	FREG(30);
 	FREG(31);
 	XREG((48+32*2),Fpscr);
+        context->ContextFlags |= CONTEXT_FLOATING_POINT;
     }
     return;
  error:
@@ -201,13 +201,14 @@
 #define FREG(x) to->Fpr##x = from->Fpr##x;
 #define CREG(x) to->x = from->x;
 /* copy a context structure according to the flags */
-static void copy_context( CONTEXT *to, const CONTEXT *from, int flags )
+static void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
 {
     if (flags & CONTEXT_CONTROL)
     {
     	CREG(Msr);
     	CREG(Ctr);
     	CREG(Iar);
+        to->ContextFlags |= CONTEXT_CONTROL;
     }
     if (flags & CONTEXT_INTEGER)
     {
@@ -218,6 +219,7 @@
 	IREG(26); IREG(27); IREG(28); IREG(29); IREG(30); IREG(31);
 	CREG(Xer);
 	CREG(Cr);
+        to->ContextFlags |= CONTEXT_INTEGER;
     }
     if (flags & CONTEXT_FLOATING_POINT)
     {
@@ -254,6 +256,7 @@
 	FREG(30);
 	FREG(31);
 	CREG(Fpscr);
+        to->ContextFlags |= CONTEXT_FLOATING_POINT;
     }
 }
 
diff --git a/server/context_sparc.c b/server/context_sparc.c
index 7da90ea..b718ff3 100644
--- a/server/context_sparc.c
+++ b/server/context_sparc.c
@@ -82,6 +82,7 @@
             context->wim = 0;  /* FIXME */
             context->tbr = 0;  /* FIXME */
         }
+        context |= flags & (CONTEXT_CONTROL|CONTEXT_INTEGER);
     }
     if (flags & CONTEXT_FLOATING_POINT)
     {
@@ -105,7 +106,7 @@
 
 
 /* copy a context structure according to the flags */
-static void copy_context( CONTEXT *to, const CONTEXT *from, int flags )
+static void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
 {
     if (flags & CONTEXT_CONTROL)
     {
@@ -155,6 +156,7 @@
     {
         /* FIXME */
     }
+    context |= flags & (CONTEXT_CONTROL|CONTEXT_INTEGER);
 }
 
 /* retrieve the current instruction pointer of a thread */
@@ -187,6 +189,7 @@
 /* retrieve the thread context */
 void get_thread_context( struct thread *thread, CONTEXT *context, unsigned int flags )
 {
+    context->ContextFlags |= CONTEXT_SPARC;
     flags &= ~CONTEXT_SPARC;  /* get rid of CPU id */
 
     if (thread->context)  /* thread is inside an exception event or suspended */
diff --git a/server/context_x86_64.c b/server/context_x86_64.c
index 426b493..c102510 100644
--- a/server/context_x86_64.c
+++ b/server/context_x86_64.c
@@ -106,6 +106,7 @@
             context->SegFs = regs.fs;
             context->SegGs = regs.gs;
         }
+        context->ContextFlags |= flags & CONTEXT_FULL;
     }
     if (flags & CONTEXT_DEBUG_REGISTERS)
     {
@@ -115,12 +116,14 @@
         if (get_debug_reg( pid, 3, &context->Dr3 ) == -1) goto error;
         if (get_debug_reg( pid, 6, &context->Dr6 ) == -1) goto error;
         if (get_debug_reg( pid, 7, &context->Dr7 ) == -1) goto error;
+        context->ContextFlags |= CONTEXT_DEBUG_REGISTERS;
     }
     if (flags & CONTEXT_FLOATING_POINT)
     {
         /* we can use context->FloatSave directly as it is using the */
         /* correct structure (the same as fsave/frstor) */
         if (ptrace( PTRACE_GETFPREGS, pid, 0, &context->u.FltSave ) == -1) goto error;
+        context->ContextFlags |= CONTEXT_FLOATING_POINT;
     }
     return;
  error:
@@ -200,7 +203,7 @@
 
 
 /* copy a context structure according to the flags */
-static void copy_context( CONTEXT *to, const CONTEXT *from, int flags )
+static void copy_context( CONTEXT *to, const CONTEXT *from, unsigned int flags )
 {
     if (flags & CONTEXT_CONTROL)
     {
@@ -242,6 +245,7 @@
     }
     /* we don't bother copying the debug registers, since they */
     /* always need to be accessed by ptrace anyway */
+    to->ContextFlags |= flags & ~CONTEXT_DEBUG_REGISTERS;
 }
 
 /* retrieve the current instruction pointer of a thread */
@@ -285,6 +289,7 @@
 /* retrieve the thread context */
 void get_thread_context( struct thread *thread, CONTEXT *context, unsigned int flags )
 {
+    context->ContextFlags |= CONTEXT_AMD64;
     flags &= ~CONTEXT_AMD64;  /* get rid of CPU id */
 
     if (thread->context)  /* thread is inside an exception event or suspended */