Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}