[KDGDB]
[reactos.git] / reactos / drivers / base / kdgdb / i386_sup.c
index e2ee4b9..71ee218 100644 (file)
@@ -83,10 +83,10 @@ static
 void*
 thread_to_reg(PETHREAD Thread, enum reg_name reg_name, unsigned short* size)
 {
-    /* See if the guy got a stack */
-    if (Thread->Tcb.InitialStack == NULL)
+    static const void* NullValue = NULL;
+
+    if (!Thread->Tcb.InitialStack)
     {
-        static const void* NullValue = NULL;
         /* Terminated thread ? */
         switch (reg_name)
         {
@@ -130,28 +130,33 @@ thread_to_reg(PETHREAD Thread, enum reg_name reg_name, unsigned short* size)
     }
     else
     {
-        /* The thread was not yet scheduled */
+        static PULONG Esp;
+        Esp = Thread->Tcb.KernelStack;
         *size = 4;
         switch(reg_name)
         {
-            case ESP: return &Thread->Tcb.KernelStack;
-            case EBP: return &((ULONG*)Thread->Tcb.KernelStack)[4];
-            case EIP: return &Thread->StartAddress;
+            case EBP: return &Esp[3];
+            case ESP: return &Esp;
+            case EIP: return &NullValue;
             default:
                 return NULL;
         }
     }
+
     return NULL;
 }
 
-void
+KDSTATUS
 gdb_send_registers(void)
 {
-    CHAR Registers[16*8 + 1];
+    CHAR RegisterStr[9];
     UCHAR* RegisterPtr;
     unsigned i;
     unsigned short size;
-    CHAR* ptr = Registers;
+
+    RegisterStr[8] = '\0';
+
+    start_gdb_packet();
 
     KDDBGPRINT("Sending registers of thread %" PRIxPTR ".\n", gdb_dbg_tid);
     KDDBGPRINT("Current thread_id: %p.\n", PsGetThreadId((PETHREAD)(ULONG_PTR)CurrentStateChange.Thread));
@@ -161,14 +166,16 @@ gdb_send_registers(void)
         for(i=0; i < 16; i++)
         {
             RegisterPtr = ctx_to_reg(&CurrentContext, i, &size);
-            *ptr++ = hex_chars[RegisterPtr[0] >> 4];
-            *ptr++ = hex_chars[RegisterPtr[0] & 0xF];
-            *ptr++ = hex_chars[RegisterPtr[1] >> 4];
-            *ptr++ = hex_chars[RegisterPtr[1] & 0xF];
-            *ptr++ = hex_chars[RegisterPtr[2] >> 4];
-            *ptr++ = hex_chars[RegisterPtr[2] & 0xF];
-            *ptr++ = hex_chars[RegisterPtr[3] >> 4];
-            *ptr++ = hex_chars[RegisterPtr[3] & 0xF];
+            RegisterStr[0] = hex_chars[RegisterPtr[0] >> 4];
+            RegisterStr[1] = hex_chars[RegisterPtr[0] & 0xF];
+            RegisterStr[2] = hex_chars[RegisterPtr[1] >> 4];
+            RegisterStr[3] = hex_chars[RegisterPtr[1] & 0xF];
+            RegisterStr[4] = hex_chars[RegisterPtr[2] >> 4];
+            RegisterStr[5] = hex_chars[RegisterPtr[2] & 0xF];
+            RegisterStr[6] = hex_chars[RegisterPtr[3] >> 4];
+            RegisterStr[7] = hex_chars[RegisterPtr[3] & 0xF];
+
+            send_gdb_partial_packet(RegisterStr);
         }
     }
     else
@@ -180,8 +187,8 @@ gdb_send_registers(void)
         if (DbgThread == NULL)
         {
             /* Thread is dead */
-            send_gdb_packet("E03");
-            return;
+            send_gdb_partial_packet("E03");
+            return finish_gdb_packet();
         }
 
         for(i=0; i < 16; i++)
@@ -189,26 +196,29 @@ gdb_send_registers(void)
             RegisterPtr = thread_to_reg(DbgThread, i, &size);
             if (RegisterPtr)
             {
-                *ptr++ = hex_chars[RegisterPtr[0] >> 4];
-                *ptr++ = hex_chars[RegisterPtr[0] & 0xF];
-                *ptr++ = hex_chars[RegisterPtr[1] >> 4];
-                *ptr++ = hex_chars[RegisterPtr[1] & 0xF];
-                *ptr++ = hex_chars[RegisterPtr[2] >> 4];
-                *ptr++ = hex_chars[RegisterPtr[2] & 0xF];
-                *ptr++ = hex_chars[RegisterPtr[3] >> 4];
-                *ptr++ = hex_chars[RegisterPtr[3] & 0xF];
+                RegisterPtr = ctx_to_reg(&CurrentContext, i, &size);
+                RegisterStr[0] = hex_chars[RegisterPtr[0] >> 4];
+                RegisterStr[1] = hex_chars[RegisterPtr[0] & 0xF];
+                RegisterStr[2] = hex_chars[RegisterPtr[1] >> 4];
+                RegisterStr[3] = hex_chars[RegisterPtr[1] & 0xF];
+                RegisterStr[4] = hex_chars[RegisterPtr[2] >> 4];
+                RegisterStr[5] = hex_chars[RegisterPtr[2] & 0xF];
+                RegisterStr[6] = hex_chars[RegisterPtr[3] >> 4];
+                RegisterStr[7] = hex_chars[RegisterPtr[3] & 0xF];
+
+                send_gdb_partial_packet(RegisterStr);
             }
             else
             {
-                ptr += sprintf(ptr, "xxxxxxxx");
+                send_gdb_partial_packet("xxxxxxxx");
             }
         }
     }
-    *ptr = '\0';
-    send_gdb_packet(Registers);
+    
+    return finish_gdb_packet();
 }
 
-void
+KDSTATUS
 gdb_send_register(void)
 {
     enum reg_name reg_name;
@@ -233,8 +243,7 @@ gdb_send_register(void)
         if (DbgThread == NULL)
         {
             /* Thread is dead */
-            send_gdb_packet("E03");
-            return;
+            return send_gdb_packet("E03");
         }
 
         ptr = thread_to_reg(DbgThread, reg_name, &size);
@@ -243,11 +252,12 @@ gdb_send_register(void)
     if (!ptr)
     {
         /* Undefined. Let's assume 32 bit register */
-        send_gdb_packet("xxxxxxxx");
+        return send_gdb_packet("xxxxxxxx");
     }
     else
     {
-        send_gdb_memory(ptr, size);
+        KDDBGPRINT("KDDBG : Sending registers as memory.\n");
+        return send_gdb_memory(ptr, size);
     }
 }