summaryrefslogtreecommitdiff
path: root/gdb/gdbserver/gdbfreeplay-i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/gdbserver/gdbfreeplay-i386.c')
-rw-r--r--gdb/gdbserver/gdbfreeplay-i386.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/gdb/gdbserver/gdbfreeplay-i386.c b/gdb/gdbserver/gdbfreeplay-i386.c
index 319064f1680..ef4d96f8f8f 100644
--- a/gdb/gdbserver/gdbfreeplay-i386.c
+++ b/gdb/gdbserver/gdbfreeplay-i386.c
@@ -331,4 +331,75 @@ target_compose_T_packet (char *origTpacket,
/* Caller has to recompute checksum. */
return reply_buf;
}
+ /* Bail... */
+ return origTpacket;
+}
+
+/*
+ * target_compose_g_packet
+ *
+ * Take the registers from the 'T' packet, and compose them into a
+ * 'g' packet response. Registers for which we have no values will
+ * be filled in with 'xxxx', in the manner of tracepoints.
+ *
+ * Returns: string, g packet reply.
+ */
+
+#define IX86_TARGET_GBYTES 624
+static char gbuffer[IX86_TARGET_GBYTES + 1];
+#define IX86_BOGUS_NUMREGS (IX86_TARGET_GBYTES / 8)
+
+static unsigned long regval[IX86_BOGUS_NUMREGS];
+static int gotreg[IX86_BOGUS_NUMREGS];
+
+char *
+target_compose_g_packet (char *tpac)
+{
+ int i;
+ int regnum;
+ int signum;
+
+ /* See which regs we can get from the T packet. Assume none... */
+ for (i = 0; i < IX86_BOGUS_NUMREGS; i++)
+ gotreg[i] = 0;
+
+ /* OK, scan off the prefix -- $T plus signal number. */
+ if (*tpac++ == '$' && *tpac++ == 'T')
+ {
+ /* We won't actually use signum. */
+ signum = (hex_to_int (*tpac++) << 4) + hex_to_int (*tpac++);
+ while (*tpac)
+ {
+ regnum = (hex_to_int (*tpac++) << 4) + hex_to_int (*tpac++);
+ if (*tpac++ == ':')
+ {
+ gotreg[regnum] = 1;
+ regval[regnum] = ix86_hex_to_unsigned_long (expand_rle (tpac));
+ tpac = strchr (tpac, ';');
+ }
+ else goto gpacket_fail;
+
+ if (tpac && *tpac == ';')
+ tpac++;
+ else goto gpacket_fail;
+
+ if (strncmp (tpac, "thread", 6) == 0)
+ break;
+ }
+
+ /* Got values, now get to composin'. */
+ strcpy (gbuffer, "$");
+ for (i = 0; i < IX86_BOGUS_NUMREGS; i++)
+ if (gotreg[i])
+ strcat (gbuffer, ix86_unsigned_long_to_hex (regval[i]));
+ else
+ strcat (gbuffer, "xxxxxxxx");
+
+ /* Return composed g packet reply.
+ Caller has responsibility of appending checksum. */
+ return gbuffer;
+ }
+ gpacket_fail:
+ /* Fail. */
+ return NULL;
}