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)
{
}
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));
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
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++)
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;
if (DbgThread == NULL)
{
/* Thread is dead */
- send_gdb_packet("E03");
- return;
+ return send_gdb_packet("E03");
}
ptr = thread_to_reg(DbgThread, reg_name, &size);
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);
}
}