int stub_main(int arch_reason) { int ret; int gdb_signal; gdb_signal = decode_signal(arch_reason); /* Do not announce stop reply if we were detached. */ if (isattached) { send_stop_reply(gdb_signal); } /* We are now attached. */ isattached = 1; do { int cmd; char *p; while (getpkt(&pktbuf[0], sizeof(pktbuf)) < 1); p = &pktbuf[0]; cmd = *p; if ('?' == cmd) { send_stop_reply(gdb_signal); ret = 0; } else if ('c' == cmd) { ret = handle_c(p); } else if ('s' == cmd) { ret = handle_s(p); } else if ('D' == cmd) { ret = handle_D(p); if (ret & CMD_LEAVE) { isattached = 0; } } else if ('g' == cmd) { ret = handle_g(p); } else if ('G' == cmd) { ret = handle_G(p); } else if ('P' == cmd) { ret = handle_P(p); } else if ('m' == cmd) { ret = handle_m(p); } else if ('M' == cmd) { ret = handle_M(p); } else { /* * For any command not supported by the stub, an empty * response ('$#00') should be returned. */ p = ""; ret = CMD_REPLY; } if (ret & CMD_REPLY) { putpkt(p); } } while (!(ret & CMD_LEAVE)); return ret; }
int gdbr_read_memory(libgdbr_t* g, uint64_t address, uint64_t len) { char command[255] = {}; int ret = snprintf (command, 255, "%s%016lx,%ld", CMD_READMEM, address, len); if (ret < 0) return ret; ret = send_command(g, command); if (ret < 0) return ret; if (read_packet (g) > 0) { parse_packet (g, 0); return handle_m (g); } return -1; }
int gdbr_read_memory(libgdbr_t* g, ut64 address, ut64 len) { char command[255] = {}; int ret = snprintf(command, 255, "%s%016"PFMT64x",%"PFMT64d, CMD_READMEM, address, len); if (ret < 0) return ret; ret = send_command(g, command); if (ret < 0) return ret; int read_len = read_packet(g); if (read_len > 0) { parse_packet(g, 0); return handle_m(g); } return -1; }
int gdbr_read_memory(libgdbr_t *g, ut64 address, ut64 len) { char command[64] = {0}; int ret; ut64 num_pkts, last, data_sz, ret_len; int pkt; if (!g) { return -1; } if (len > g->data_max) { eprintf ("%s: Requested read too long: (%d bytes)\n", __func__, (unsigned) len); return -1; } g->stub_features.pkt_sz = R_MAX (g->stub_features.pkt_sz, 64); data_sz = g->stub_features.pkt_sz / 2; num_pkts = len / data_sz; last = len % data_sz; ret_len = 0; ret = 0; if (last) { if ((ret = snprintf (command, sizeof (command) - 1, "%s%016"PFMT64x ",%"PFMT64x, CMD_READMEM, address + (num_pkts * data_sz), last)) < 0) { return -1; } if ((ret = send_msg (g, command)) < 0) { return -1; } if ((ret = read_packet (g)) < 0) { return -1; } if ((ret = handle_m (g)) < 0) { return -1; } if (num_pkts) { memmove (g->data + (num_pkts * data_sz), g->data, g->data_len); } ret_len += g->data_len; } for (pkt = num_pkts - 1; pkt >= 0; pkt--) { if ((ret = snprintf (command, sizeof (command) - 1, "%s%016"PFMT64x ",%"PFMT64x, CMD_READMEM, address + (pkt * data_sz), data_sz)) < 0) { return -1; } if ((ret = send_msg (g, command)) < 0) { return -1; } if ((ret = read_packet (g)) < 0) { return -1; } if ((ret = handle_m (g)) < 0) { return -1; } if (pkt) { memmove (g->data + (pkt * data_sz), g->data, g->data_len); } ret_len += g->data_len; } g->data_len = ret_len; return ret; }
static int gdbr_read_memory_page(libgdbr_t *g, ut64 address, ut8 *buf, int len) { char command[128] = {0}; int last, ret_len, pkt; if (!g) { return -1; } if (len < 1) { return len; } g->stub_features.pkt_sz = R_MAX (g->stub_features.pkt_sz, GDB_MAX_PKTSZ); int data_sz = g->stub_features.pkt_sz / 2; int num_pkts = len / data_sz; last = len % data_sz; ret_len = 0; for (pkt = 0; pkt < num_pkts; pkt++) { if (snprintf (command, sizeof (command) - 1, "%s%"PFMT64x ",%"PFMT64x, CMD_READMEM, (ut64)address + (pkt * data_sz), (ut64)data_sz) < 0) { return -1; } if (send_msg (g, command) < 0) { return -1; } if (read_packet (g, false) < 0) { return -1; } if (handle_m (g) < 0) { return -1; } int delta = (pkt * data_sz); if (delta > len) { eprintf ("oops\n"); break; } int left = R_MIN (g->data_len, len - delta); if (left > 0) { memcpy (buf + delta, g->data, left); ret_len += g->data_len; } } if (last) { if (snprintf (command, sizeof (command) - 1, "%s%016"PFMT64x ",%"PFMT64x, CMD_READMEM, (ut64)(address + (num_pkts * data_sz)), (ut64)last) < 0) { return -1; } if (send_msg (g, command) < 0) { return -1; } if (read_packet (g, false) < 0) { return -1; } if (handle_m (g) < 0) { return -1; } int delta = num_pkts * data_sz; int left = R_MIN (g->data_len, len - delta); if (left > 0) { memcpy (buf + delta, g->data, left); ret_len += g->data_len; } } return ret_len; }