24 #include <sys/types.h>
26 #include <sys/select.h>
29 #include <sys/socket.h>
31 #if !defined(UNIX_PATH_MAX)
32 #define UNIX_PATH_MAX (size_t)sizeof(((struct sockaddr_un *) 0)->sun_path)
35 #include <arpa/inet.h>
36 #include <netinet/tcp.h>
57 static inline int __h2ul(
char *str,
unsigned int len,
unsigned long *out);
58 static inline int __hs2ul_lsb(
char *str,
unsigned int len,
unsigned long *out);
59 static inline int __h2ul_be(
char *str,
unsigned int len,
unsigned long *out);
60 static inline int __hs2d(
char *str,
unsigned int len,
char *buf);
61 static inline int __d2hs(
char *buf,
unsigned int len,
char *str);
63 char *data,
unsigned int len);
65 gdb_rsp_simple_ack_handler(
struct target *
target,
char *data,
unsigned int len,
68 gdb_rsp_features_handler(
struct target *
target,
char *data,
unsigned int len,
71 gdb_rsp_vcont_check_handler(
struct target *
target,
char *data,
unsigned int len,
88 struct sockaddr_un sun,sun_client;
97 struct sockaddr_in sin,sinc;
98 struct sockaddr_in6 sin6,sin6c;
102 if (gstate->
fd > -1) {
103 verror(
"already connected via fd %d!\n",gstate->
fd);
108 if (spec->hostname || spec->port > -1) {
110 spec->hostname = strdup(
"localhost");
114 he = gethostbyname(spec->hostname);
116 verror(
"gethostbyname(%s): %s (%d)!",spec->hostname,
121 addrtype = he->h_addrtype;
122 if (addrtype == AF_INET) {
123 memcpy(&sin.sin_addr,he->h_addr,he->h_length);
125 sin.sin_port = htons(spec->port);
126 sin.sin_family = addrtype;
128 else if (addrtype == AF_INET6) {
129 memcpy(&sin6.sin6_addr,he->h_addr,he->h_length);
131 sin6.sin6_port = htons(spec->port);
132 sin6.sin6_family = addrtype;
135 verror(
"unknown addrtype %d for hostname %s!\n",
136 addrtype,spec->hostname);
148 gstate->
fd = socket(addrtype,SOCK_DGRAM,0);
150 gstate->
fd = socket(addrtype,SOCK_STREAM,0);
151 if (gstate->
fd < 0) {
152 verror(
"socket(): %s\n",strerror(errno));
156 if (addrtype == AF_INET) {
160 sinc.sin_family = addrtype;
161 sinc.sin_addr.s_addr = INADDR_ANY;
163 if (bind(gstate->
fd,&sinc,
sizeof(sinc))) {
164 verror(
"could not bind udp socket: %s (%d)!\n",
165 strerror(errno),errno);
174 sin6c.sin6_family = addrtype;
175 sin6c.sin6_addr = in6addr_any;
177 if (bind(gstate->
fd,&sin6c,
sizeof(sin6c))) {
178 verror(
"could not bind udp socket: %s (%d)!\n",
179 strerror(errno),errno);
185 if (connect(gstate->
fd,(
struct sockaddr *)dst,dlen) < 0) {
186 verror(
"connect(%s): %s\n",he->h_addr,strerror(errno));
192 setsockopt(gstate->
fd,IPPROTO_TCP,TCP_NODELAY,&one,
sizeof(&one));
196 "connected to %s socket %s:%d (fd %d)\n",
197 (spec->do_udp) ?
"udp" :
"tcp",he->h_name,spec->port,gstate->
fd);
202 if (gstate->
fd > -1) {
209 else if (spec->sockfile) {
210 memset(&sun,0,
sizeof(sun));
211 sun.sun_family = AF_UNIX;
217 if ((tmpdir = getenv(
"TMPDIR"))
218 && stat(tmpdir,&sbuf) == 0 && access(tmpdir,W_OK) == 0) {
220 strlen(tmpdir) + 1 + strlen(
"target_gdb_sock.") + 11 + 1;
221 cpath =
malloc(cpath_len);
222 snprintf(cpath,cpath_len,
"%s/target_gdb_sock.%d",tmpdir,getpid());
224 else if (stat(
"/tmp",&sbuf) == 0
225 && S_ISDIR(sbuf.st_mode) && access(
"/tmp",W_OK) == 0) {
227 strlen(
"/tmp") + 1 + strlen(
"target_gdb_sock.") + 11 + 1;
228 cpath =
malloc(cpath_len);
229 snprintf(cpath,cpath_len,
"/tmp/target_gdb_sock.%d",getpid());
231 else if (stat(
"/var/tmp",&sbuf) == 0
232 && S_ISDIR(sbuf.st_mode) && access(
"/var/run",W_OK) == 0) {
234 strlen(
"/var/run") + 1 + strlen(
"target_gdb_sock.") + 11 + 1;
235 cpath =
malloc(cpath_len);
236 snprintf(cpath,cpath_len,
"/var/run/target_gdb_sock.%d",getpid());
239 cpath_len = strlen(
".") + 1 + strlen(
"target_gdb_sock.") + 11 + 1;
240 cpath =
malloc(cpath_len);
241 snprintf(cpath,cpath_len,
"./target_gdb_sock.%d",getpid());
244 memset(&sun_client,0,
sizeof(sun_client));
245 sun_client.sun_family = AF_UNIX;
250 gstate->
fd = socket(AF_UNIX,SOCK_STREAM,0);
251 if (gstate->
fd < 0) {
252 verror(
"socket(): %s\n",strerror(errno));
255 len = offsetof(
struct sockaddr_un,sun_path)
256 + strlen(sun_client.sun_path);
257 if (bind(gstate->
fd,&sun_client,len) < 0) {
258 verror(
"bind(%s): %s\n",sun_client.sun_path,strerror(errno));
261 if (fchmod(gstate->
fd,S_IRUSR | S_IWUSR) < 0) {
262 verror(
"chmod(%s): %s\n",sun_client.sun_path,strerror(errno));
266 len = offsetof(
struct sockaddr_un,sun_path) + strlen(sun.sun_path);
267 if (connect(gstate->
fd,&sun,len) < 0) {
268 verror(
"connect(%s): %s\n",sun.sun_path,strerror(errno));
273 "connected to unix socket %s (fd %d)\n",
279 if (gstate->
fd > -1) {
290 else if (spec->devfile || spec->do_stdio) {
291 verror(
"unsupported transport!\n");
296 verror(
"unspecified transport!\n");
324 verror(
"failed to send an initial ack!\n");
332 verror(
"failed to query stub features!\n");
340 verror(
"failed to set Hg0 defaults!\n");
345 verror(
"failed to recv Hg0 defaults response; aborting!\n");
349 verror(
"simple ack handler returned not done: %d; aborting!\n",hret);
353 verror(
"failed to set Hg0 defaults: error %d!\n",sret);
358 verror(
"failed to set Hc-1 defaults!\n");
363 verror(
"failed to recv Hc-1 response; aborting!\n");
367 verror(
"simple ack handler returned not done: %d; aborting!\n",hret);
371 verror(
"failed to set Hc-1 defaults: error %d!\n",sret);
391 #define GDB_CHECKCONN(errcode) \
393 if (gstate->fd < 0) { \
394 verror("not connected to gdb server!\n"); \
405 if (stay_paused && gstate->
vcont) {
407 verror(
"failed to detach, STOPPED, via vCont;t!\n");
412 verror(
"failed to detach via D !\n");
427 if (gstate->
wfd > -1) {
431 if (gstate->
fd > -1) {
445 char *data,
unsigned int len) {
447 unsigned int remaining;
454 verror(
"gdb already sending packet; BUG!\n");
461 if (gstate->
wfd > -1)
467 verror(
"connection not up!\n");
474 rc = write(
fd,data + (len - remaining),remaining);
477 if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
479 else if (errno == EPIPE) {
483 verror(
"connection unexpectedly terminated!\n");
488 verror(
"write to fd %d failed after %d of %d bytes: %s (%d)!\n",
489 fd,(len - remaining),len,strerror(errno),errno);
507 static char GDB_INT_BYTE[1] = { 0x03, };
508 static char GDB_ACK_BYTE[1] = {
'+', };
509 static char GDB_NAK_BYTE[1] = {
'-', };
520 "gdb already sending packet; scheduling interrupt!\n");
525 rc = gdb_rsp_send_raw(target,GDB_INT_BYTE,
sizeof(GDB_INT_BYTE));
527 verror(
"could not send interrupt request!\n");
537 if (gstate->
handler == gdb_rsp_stop_handler) {
539 verror(
"failed to recv stop response; aborting!\n");
543 verror(
"stop handler error returned not done: %d; aborting!\n",hret);
579 verror(
"gdb already sending packet; BUG!\n");
583 return gdb_rsp_send_raw(target,GDB_ACK_BYTE,
sizeof(GDB_ACK_BYTE));
592 verror(
"gdb already sending packet; BUG!\n");
596 return gdb_rsp_send_raw(target,GDB_NAK_BYTE,
sizeof(GDB_NAK_BYTE));
607 static int gdb_rsp_encode(
struct target *target,
char ptype,
608 char *
ibuf,
unsigned int ilen,
609 char **
obuf,
unsigned int *olen) {
610 unsigned long int sum = 0;
611 unsigned int alen = ilen + 32;
620 for (i = 0; i < ilen; ++
i,++j) {
621 if ((j + 1) >= alen) {
626 if (ibuf[i] == 0x7d || ibuf[i] ==
'#' || ibuf[i] ==
'$') {
628 sum = (sum + lbuf[j]) % 256;
630 lbuf[j] = lbuf[
i] ^ 0x20;
631 sum = (sum + lbuf[j]) % 256;
635 sum = (sum + lbuf[j]) % 256;
641 else if ((j + 4) < alen)
645 snprintf(lbuf + j,3,
"%02hhx",(uint8_t)sum);
654 char *data,
unsigned int len,
661 verror(
"gdb already writing; BUG!\n");
668 if (gdb_rsp_encode(target,
'$',data,len,
670 verror(
"failed to encode data of len %d!\n",len);
677 if (gdb_rsp_send_raw(target,gstate->
obuf,gstate->
obuf_len)) {
678 verror(
"could not send %d encoded bytes (%d non-encoded)!\n",
704 char *data,
unsigned int len) {
705 verror(
"client should not send notifications!");
716 static int gdb_rsp_decode(
struct target *target,
char *ibuf,
unsigned int ilen,
718 char **obuf,
unsigned int *olen) {
719 unsigned long int sum = 0;
722 unsigned long decsum;
775 *(ibuf+i),*(ibuf+i));
802 for (; i < ilen && ibuf[
i] !=
'#'; ++
i)
803 sum = (sum + ibuf[i]) % 256;
809 "incomplete packet len %d (%d garbage)\n",ilen,start);
812 else if ((i + 2) >= ilen) {
817 "incomplete packet '%s' len %d (%d garbage; missing %d checksum bytes)\n",
818 ibuf + start,ilen,start,(i + 3 - ilen));
822 if (__h2ul(ibuf + i + 1,2,&decsum)) {
823 verror(
"error computing checksum!\n");
828 else if (decsum != sum) {
829 verror(
"bad checksum: expected 0x%lx, got 0x%lx (%d data bytes)\n",
830 sum,decsum,i - start - 1);
832 *ilen_used = i + 1 + 2;
837 "good checksum: expected 0x%lx, got 0x%lx (%d data bytes)\n",
838 sum,decsum,i - start - 1);
840 *ilen_used = i + 1 + 2;
854 if ((end - start) == 0) {
862 alen = ((end - start) / 4096) * 4096;
863 if ((end - start) != 4096)
868 for (i = start,j = 0; i < end; ++
i,++j) {
876 (*obuf)[j] = ibuf[i + 1] ^ 0x20;
880 else if (ibuf[i] == 0x7d)
882 else if (ibuf[i] == 0x2a) {
884 rlen = ibuf[i + 1] - 29;
886 if ((j + rlen) >= alen) {
891 for (k = 0; k < rlen; ++k)
892 (*obuf)[j + 1 + k] = prevchar;
897 prevchar = (*obuf)[j] = ibuf[
i];
912 gdb_rsp_default_handler(
struct target *target,
char *data,
unsigned int len,
926 unsigned int new_alen;
927 unsigned int olen = 0;
928 unsigned int ilen_used = 0;
957 rc = gdb_rsp_decode(target,gstate->
ibuf,gstate->
ibuf_len,
958 &ptype,&ilen_used,&obuf,&olen);
961 "incomplete packet; not skipping %u processed bytes\n",
965 verror(
"decoding error; skipping %u processed bytes!\n",
975 "decoded %u-byte message (%s) of type %d (skip %u);"
976 " processing\n",olen,obuf,ptype,ilen_used);
988 (blocking) ? 0 : MSG_DONTWAIT);
990 vwarn(
"server disconnected unexpectedly!\n");
996 if (errno == EAGAIN || errno == EWOULDBLOCK)
998 else if (errno == EINTR) {
1002 verror(
"recv: %s (%d)\n",strerror(errno),errno);
1013 verror(
"BUG! unknown message type!\n");
1018 "ACK for %d bytes sent; clearing\n",gstate->
obuf_len);
1021 gstate->
obuf = NULL;
1027 "NAK for %d bytes sent; retrying\n",gstate->
obuf_len);
1029 if (gdb_rsp_send_raw(target,gstate->
obuf,gstate->
obuf_len)) {
1030 verror(
"could not send %d encoded bytes that already failed!\n",
1036 "retransmitted %d encoded bytes\n",gstate->
obuf_len);
1040 gstate->
obuf = NULL;
1046 verror(
"BUG! cannot handle notifications yet!\n");
1056 verror(
"handler failed on packet '%s' (len %u); removing handler"
1057 " and trying default handler!\n",
1061 goto default_handler;
1071 "handler handled '%s' (len %u) but expects more packets\n",
1077 "handler does not own '%s' (len %u);"
1078 " trying default handler\n",obuf,olen);
1080 goto default_handler;
1083 vwarn(
"bad return code %d from handler; trying default"
1086 goto default_handler;
1091 rc = gdb_rsp_default_handler(target,obuf,olen,NULL);
1093 verror(
"default handler failed on packet '%s' (len %u)!\n",
1099 "default handler handled '%s' (len %u)\n",obuf,olen);
1104 "default handler handled '%s' (len %u) but expects more"
1105 " packets\n",obuf,olen);
1109 "default handler does not own '%s' (len %u);"
1110 " skipping this message!\n",obuf,olen);
1115 verror(
"invalid packet type %d!\n",ptype);
1124 if (ilen_used >= gstate->
ibuf_len) {
1130 "used all %u bytes; reset input buf to 4096\n",ilen_used);
1138 else if (ilen_used > 0) {
1139 new_alen = (gstate->
ibuf_len - ilen_used) / 4096;
1140 if ((gstate->
ibuf_len - ilen_used) != 4096)
1142 new_ibuf =
malloc(new_alen);
1143 memcpy(new_ibuf,gstate->
ibuf + ilen_used,gstate->
ibuf_len - ilen_used);
1145 gstate->
ibuf = new_ibuf;
1150 "shrunk input buf to %u by %u bytes; current used %u\n",
1151 new_alen,ilen_used,gstate->
ibuf_len);
1165 if (!only_one && retval == 0 && gstate->
ibuf_len > 0 && ilen_used > 0) {
1185 while (gstate->
handler == handler) {
1188 verror(
"failed to recv response; aborting!\n");
1206 verror(
"failed to recv response; aborting!\n");
1225 gdb_rsp_simple_ack_handler(
struct target *target,
char *data,
unsigned int len,
1228 int *ret = (
int *)handler_data;
1238 if (strncmp(next,
"OK",2) == 0) {
1243 else if (*next ==
'E') {
1245 *ret = atoi(next+1);
1255 gdb_rsp_features_handler(
struct target *target,
char *data,
unsigned int len,
1256 void *handler_data) {
1258 char *end = data + len;
1270 while (next < end) {
1273 while (next < end) {
1281 while (next < end) {
1292 while ((next - i) >= cur && *(next - i) ==
' ') {
1299 if (*
value ==
'=') {
1304 else if (*
value ==
'+') {
1309 else if (*
value ==
'-') {
1314 else if (*
value ==
'?') {
1332 gdb_rsp_vcont_check_handler(
struct target *target,
char *data,
unsigned int len,
1333 void *handler_data) {
1335 char *end = data + len;
1345 while (next < end && *next ==
' ')
1348 if (strncmp(next,
"vCont",5) != 0) {
1350 "response '%s' (len %d) not for us!\n",data,len);
1361 while (next < end) {
1426 gdb_rsp_stop_handler(
struct target *target,
char *data,
unsigned int len,
1427 void *handler_data) {
1429 char *end = data + len;
1433 char *colon,*semicolon,*dot;
1438 while (next < end && *next ==
' ') ++next;
1446 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1448 __h2ul(next,((end - next) > 2) ? 2 : (end - next),&ss->signal);
1454 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1456 xlen = ((end - next) > 2) ? 2 : (end - next);
1457 __h2ul(next,xlen,&ss->signal);
1459 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1460 while (next < end) {
1464 colon = index(next,
':');
1467 semicolon = index(next,
';');
1475 if (strncmp(next,
"thread",6) == 0) {
1476 dot = index(colon,
'.');
1477 if (*colon ==
'p' && dot) {
1482 if (strcmp(colon,
"-1") == 0)
1484 else if (*colon ==
'0' && *(colon + 1) ==
'\0')
1487 __h2ul_be(colon,(dot - colon),(
unsigned long *)&ss->pid);
1489 if (strncmp(dot + 1,
"-1",2) == 0)
1491 else if (*(dot + 1) ==
'0')
1494 __h2ul_be(colon,(semicolon - (dot + 1)),
1495 (
unsigned long *)&ss->tid);
1500 if (strcmp(colon,
"-1") == 0)
1502 else if (*colon ==
'0' && *(colon + 1) ==
'\0')
1505 __h2ul_be(colon,(dot - colon),(
unsigned long *)&ss->tid);
1509 else if (strncmp(next,
"core",4) == 0) {
1512 __h2ul(colon,semicolon - colon,&ss->core);
1514 else if (strncmp(next,
"watch",5) == 0) {
1517 __h2ul(colon,semicolon - colon,&ss->addr);
1519 else if (strncmp(next,
"rwatch",6) == 0) {
1522 __h2ul(colon,semicolon - colon,&ss->addr);
1524 else if (strncmp(next,
"awatch",6) == 0) {
1527 __h2ul(colon,semicolon - colon,&ss->addr);
1529 else if (strncmp(next,
"library",7) == 0) {
1532 else if (strncmp(next,
"replaylog",9) == 0) {
1535 else if (isdigit(*next) || (*next >=
'a' && *next <=
'f')
1536 || (*next >=
'f' && *next <=
'F')) {
1538 "skipping register value %s:%s\n",next,colon);
1542 "skipping unknown reason:value %s:%s\n",next,colon);
1552 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1554 xlen = ((end - next) > 2) ? 2 : (end - next);
1555 __h2ul(next,xlen,&ss->signal);
1557 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1558 if (strncmp(next,
"process:",8) == 0) {
1562 __h2ul_be(next,end - next,(
unsigned long *)&ss->pid);
1568 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1570 xlen = ((end - next) > 2) ? 2 : (end - next);
1571 __h2ul(next,xlen,&ss->signal);
1573 while (next < end && (*next ==
' ' || *next ==
';')) ++next;
1574 if (strncmp(next,
"process:",8) == 0) {
1578 __h2ul_be(next,end - next,(
unsigned long *)&ss->pid);
1583 vwarn(
"unsupported console output stop \"status\"\n");
1587 vwarn(
"unsupported file i/o extension; ignoring\n");
1591 "response '%s' (len %d) not for us!\n",data,len);
1595 switch (ss->reason) {
1631 static unsigned int qemu_reg_count_64 = 24;
1632 static unsigned int qemu_offset_to_reg_64[24] = {
1633 0,3,2,1,4,5,6,7,8,9,10,11,12,13,14,15,16,51,52,53,50,54,55,
1636 0,3,2,1,4,5,6,7,8,9,10,11,12,13,14,15,16,
1637 -1,-1,-1,-1,-1,-1,-1,-1,
1638 -1,-1,-1,-1,-1,-1,-1,-1,
1639 -1,-1,-1,-1,-1,-1,-1,-1,
1640 -1,-1,-1,-1,-1,-1,-1,-1,
1641 -1,17,18,19,20,21,22,
1646 -1,-1,-1,-1,-1,-1,-1,-1,-1,
1648 -1,-1,-1,-1,-1,-1,-1,-1,
1651 static unsigned int qemu_reg_sizes_64[24] = {
1652 8,8,8,8,8,8,8,8,8,8,8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4,
1654 static unsigned int qemu_reg_count_32 = 16;
1655 static unsigned int qemu_offset_to_reg_32[16] = {
1656 0,3,2,1,4,5,6,7,8,9, 41,42,43,40,44,45,
1659 0,3,2,1,4,5,6,7,8,9,
1661 -1,-1,-1,-1,-1,-1,-1,-1,
1663 -1,-1,-1,-1,-1,-1,-1,-1,
1664 -1,-1,-1,-1,-1,-1,-1,-1,
1668 -1,-1,-1,-1,-1,-1,-1,-1,
1671 static unsigned int qemu_reg_sizes_32[16] = {
1672 4,4,4,4,4,4,4,4,4,4, 4, 4, 4, 4, 4, 4,
1676 gdb_rsp_regs_handler(
struct target *target,
char *data,
unsigned int len,
1677 void *handler_data) {
1679 char *end = data + len;
1684 unsigned int *offset_to_reg = NULL;
1685 unsigned int *reg_sizes = NULL;
1686 unsigned int reg_count = 0;
1690 offset_to_reg = qemu_offset_to_reg_64;
1691 reg_sizes = qemu_reg_sizes_64;
1692 reg_count = qemu_reg_count_64;
1695 offset_to_reg = qemu_offset_to_reg_32;
1696 reg_sizes = qemu_reg_sizes_32;
1697 reg_count = qemu_reg_count_32;
1704 while (next < end) {
1713 if (reg_count > 0) {
1716 __hs2ul_lsb(next,reg_sizes[i] * 2,®val);
1718 next += reg_sizes[
i] * 2;
1721 __hs2ul_lsb(next,
sizeof(regval)*2,®val);
1723 next +=
sizeof(regval) * 2;
1735 gdb_rsp_read_mem_handler(
struct target *target,
char *data,
unsigned int len,
1736 void *handler_data) {
1739 unsigned int dlen =
len;
1743 d->
error = atoi(data+1);
1748 d->
length = len / 2 + (len % 2);
1752 else if (d->
length < (len / 2 + (len % 2))) {
1754 "not enough space in supplied buffer for decoded response;"
1755 " filling what we can!\n");
1763 __hs2d(data,dlen,d->
buf);
1802 verror(
"failed to check status via ? !\n");
1810 verror(
"failed to recv stop response; aborting!\n");
1814 verror(
"stop handler error returned not done: %d; aborting!\n",hret);
1844 verror(
"failed to resume via vCont;c!\n");
1854 verror(
"failed to resume via c!\n");
1867 verror(
"failed to recv ACK; aborting!\n");
1893 verror(
"failed to resume via vCont;s!\n");
1903 verror(
"failed to resume via s!\n");
1912 verror(
"failed to recv ACK; aborting!\n");
1923 "qSupported:multiprocess+;qRelocInsn-;xmlRegisters-",
1924 0,gdb_rsp_features_handler,NULL)) {
1925 verror(
"could not send features via qSupported!\n");
1930 verror(
"failed to recv qSupported response; aborting!\n");
1934 verror(
"features handler error returned not done: %d; aborting!\n",hret);
1939 verror(
"could not check vCont features via vCont?!\n");
1944 verror(
"failed to recv vCont? response; aborting!\n");
1948 verror(
"vCont? handler error returned not done: %d; aborting!\n",hret);
1959 verror(
"could not read regs!\n");
1964 verror(
"failed to recv read regs response; aborting!\n");
1968 verror(
"regs handler error returned not done: %d; aborting!\n",hret);
1985 unsigned int *offset_to_reg = NULL;
1986 unsigned int *reg_sizes = NULL;
1987 unsigned int reg_count = 0;
1991 offset_to_reg = qemu_offset_to_reg_64;
1992 reg_sizes = qemu_reg_sizes_64;
1993 reg_count = qemu_reg_count_64;
1996 offset_to_reg = qemu_offset_to_reg_32;
1997 reg_sizes = qemu_reg_sizes_32;
1998 reg_count = qemu_reg_count_32;
2013 for (i = 0; i < reg_count; ++
i) {
2022 if (offset_to_reg) {
2023 if (((next + reg_sizes[i] * 2) - buf) >= (len - 1)) {
2028 __d2hs((
char *)®val,reg_sizes[i],next);
2029 next += reg_sizes[
i] * 2;
2032 if (((next + target->
arch->
wordsize * 2) - buf) >= (len - 1)) {
2046 verror(
"could not write registers!\n");
2052 verror(
"failed to recv response!\n");
2056 verror(
"simple ack handler returned not done: %d\n",hret);
2060 verror(
"failed: error %d\n",sret);
2084 int *areg_to_qreg = NULL;
2092 unsigned int *reg_sizes = NULL;
2099 areg_to_qreg = qemu_arch_reg_to_reg_64;
2100 reg_sizes = qemu_reg_sizes_64;
2103 areg_to_qreg = qemu_arch_reg_to_reg_32;
2104 reg_sizes = qemu_reg_sizes_32;
2113 qreg = areg_to_qreg[
i];
2116 qsize = reg_sizes[qreg];
2127 __d2hs((
char *)®val,qsize,rsval);
2128 rsval[qsize * 2] =
'\0';
2129 rc = snprintf(buf,
sizeof(buf),
"P%x=%s",qreg,rsval);
2133 verror(
"could not write areg %d qreg %d!\n",i,qreg);
2140 verror(
"failed to recv response (areg %d qreg %d)!\n",i,qreg);
2144 verror(
"simple ack handler returned not done: %d (areg %d qreg %d)!\n",
2149 verror(
"failed: error %d! (areg %d qreg %d)\n",sret,i,qreg);
2165 unsigned long length,
unsigned char *buf) {
2170 memset(&d,0,
sizeof(d));
2171 d.
buf = (
char *)buf;
2174 snprintf(cmd,
sizeof(cmd),
"m%"PRIxADDR",%lx",addr,length);
2177 verror(
"could not send read mem request '%s'!\n",cmd);
2182 verror(
"failed to recv read mem response; aborting!\n");
2186 verror(
"read mem handler returned not done: %d; aborting!\n",hret);
2190 verror(
"failed to read mem: error %d!\n",d.
error);
2198 unsigned long length,
unsigned char *
buf) {
2204 len = 16 + 1 + 16 + length * 2 + 1;
2208 sret = snprintf(cmd,len,
"M%"PRIxADDR",%lu:",addr,length);
2209 __d2hs((
char *)buf,length,cmd + len);
2212 verror(
"could not send request '%s'!\n",cmd);
2217 verror(
"failed to recv response; aborting!\n");
2221 verror(
"simple ack handler returned not done: %d; aborting!\n",hret);
2225 verror(
"failed: error %d!\n",sret);
2238 snprintf(buf,
sizeof(buf),
"Z%d,%"PRIxADDR",%d",bt,addr,kind);
2241 verror(
"could not send breakpoint insert request '%s'!\n",buf);
2246 verror(
"failed to recv breakpoint insert response; aborting!\n");
2250 verror(
"simple ack handler returned not done: %d; aborting!\n",hret);
2254 verror(
"failed to insert breakpoint: error %d!\n",sret);
2267 snprintf(buf,
sizeof(buf),
"z%d,%"PRIxADDR",%d",bt,addr,kind);
2270 verror(
"could not send breakpoint remove request '%s'!\n",buf);
2275 verror(
"failed to recv breakpoint remove response; aborting!\n");
2279 verror(
"simple ack handler returned not done: %d; aborting!\n",hret);
2283 verror(
"failed to remove breakpoint: error %d!\n",sret);
2294 static inline int __h2ul(
char *str,
unsigned int len,
unsigned long *out) {
2295 unsigned long factor = 0;
2297 unsigned long sum = 0;
2299 if (len >
sizeof(*out) * 2) {
2307 if (x >=
'0' && x <=
'9')
2309 else if (x >=
'A' && x <=
'F')
2311 else if (x >=
'a' && x <=
'f')
2335 static inline int __hs2ul_lsb(
char *str,
unsigned int len,
unsigned long *out) {
2336 unsigned long factor = 0;
2338 unsigned long sum = 0;
2341 if (len >
sizeof(*out) * 2) {
2351 if (x >=
'0' && x <=
'9') x -=
'0';
2352 else if (x >=
'A' && x <=
'F') x = (x -
'A') + 10;
2353 else if (x >=
'a' && x <=
'f') x = (x -
'a') + 10;
2360 if (y >=
'0' && y <=
'9') y -=
'0';
2361 else if (y >=
'A' && y <=
'F') y = (y -
'A') + 10;
2362 else if (y >=
'a' && y <=
'f') y = (y -
'a') + 10;
2390 static inline int __h2ul_be(
char *str,
unsigned int len,
unsigned long *out) {
2391 unsigned long factor = 0;
2393 unsigned long sum = 0;
2396 if (len >
sizeof(*out) * 2) {
2404 if (x >=
'0' && x <=
'9')
2406 else if (x >=
'A' && x <=
'F')
2408 else if (x >=
'a' && x <=
'f')
2434 static inline int __hs2d(
char *str,
unsigned int len,
char *
buf) {
2443 if (x >=
'0' && x <=
'9') x -=
'0';
2444 else if (x >=
'A' && x <=
'F') x = (x -
'A') + 10;
2445 else if (x >=
'a' && x <=
'f') x = (x -
'a') + 10;
2452 if (y >=
'0' && y <=
'9') y -=
'0';
2453 else if (y >=
'A' && y <=
'F') y = (y -
'A') + 10;
2454 else if (y >=
'a' && y <=
'f') y = (y -
'a') + 10;
2461 buf[i/2] = y + 16*x;
2469 static inline int __d2hs(
char *buf,
unsigned int len,
char *str) {
2476 hi = (buf[
i] >> 4) & 0xf;
2478 if (lo <= 9) str[i*2+1] =
'0' + lo;
2479 else str[i*2+1] =
'a' + (lo - 10);
2481 if (hi <= 9) str[i*2] =
'0' + hi;
2482 else str[i*2] =
'a' + (hi - 10);
int gdb_rsp_recv_until_handled(struct target *target, gdb_rsp_handler_t handler, gdb_rsp_handler_ret_t *handler_ret)
gdb_rsp_handler_t handler
#define vwarnopt(level, area, flags, format,...)
int gdb_rsp_send_notification(struct target *target, char *data, unsigned int len)
int gdb_rsp_step(struct target *target)
int gdb_rsp_remove_break(struct target *target, ADDR addr, gdb_rsp_break_t bt, int kind)
int gdb_rsp_recv(struct target *target, int blocking, int only_one, gdb_ptype_t *o_ptype)
int gdb_rsp_nak(struct target *target)
int gdb_rsp_send_packet(struct target *target, char *data, unsigned int len, gdb_rsp_handler_t handler, void *handler_data)
static uint64_t unsigned int i
unsigned int need_interrupt
int regcache_init_reg(struct regcache *regcache, REG reg, REGVAL regval)
int gdb_rsp_write_mem(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
#define verror(format,...)
int gdb_rsp_close(struct target *target, int stay_paused)
int gdb_rsp_resume(struct target *target)
#define vwarn(format,...)
target_status_t gdb_rsp_load_status(struct target *target)
int regcache_read_reg_ifdirty(struct regcache *regcache, REG reg, REGVAL *regval)
int gdb_rsp_connect(struct target *target)
gdb_rsp_handler_ret_t(* gdb_rsp_handler_t)(struct target *target, char *data, unsigned int len, void *handler_data)
gdb_rsp_handler_ret_t handler_ret
int gdb_rsp_write_reg_one_by_one(struct target *target, struct regcache *regcache)
int gdb_rsp_query_stub(struct target *target)
#define vdebug(devel, areas, flags, format,...)
int gdb_rsp_read_regs(struct target *target, struct regcache *regcache)
void * realloc(void *ptr, size_t size)
int regcache_read_reg(struct regcache *regcache, REG reg, REGVAL *regval)
int gdb_rsp_write_regs(struct target *target, struct regcache *regcache)
unsigned int rsp_status_valid
int gdb_rsp_pause(struct target *target)
#define ARCH_X86_64_REG_COUNT
int unlink(const char *pathname)
#define ARCH_X86_REG_COUNT
int gdb_rsp_read_mem(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
struct gdb_rsp_stop_status last_stop_status
int gdb_rsp_ack(struct target *target)
struct target_spec * spec
int gdb_rsp_recv_until_acked(struct target *target)
void * malloc(size_t size)
void target_set_status(struct target *target, target_status_t status)
GHashTable * stubfeatures
#define GDB_CHECKCONN(errcode)
int gdb_rsp_insert_break(struct target *target, ADDR addr, gdb_rsp_break_t bt, int kind)
int gdb_rsp_interrupt(struct target *target)