[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] gdbstub: Implement "Xfer:spaces" requests. This
From: |
Jan Kiszka |
Subject: |
Re: [Qemu-devel] [PATCH] gdbstub: Implement "Xfer:spaces" requests. This is a part of Codebench IDE integration. |
Date: |
Tue, 22 Jan 2013 17:56:47 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 |
On 2013-01-09 09:50, Stefan Hajnoczi wrote:
> On Tue, Jan 08, 2013 at 01:31:36AM +0200, Alex Rozenman wrote:
>> Signed-off-by: Alex Rozenman <address@hidden>
>> ---
>> gdbstub.c | 113
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 113 insertions(+)
>
> Also worth CCing Jan Kiszka on gdbstub changes.
>
>> diff --git a/gdbstub.c b/gdbstub.c
>> index a8dd437..564bde1 100644
>> --- a/gdbstub.c
>> +++ b/gdbstub.c
>> @@ -1839,6 +1839,90 @@ static const char *get_feature_xml(const char *p,
>> const char **newp)
>> }
>> return name ? xml_builtin[i][1] : NULL;
>> }
>> +
>> +typedef struct XferSpaceReq {
>> + int is_write;
>> + char annex[32];
>> + uint64_t offset;
>> + unsigned length;
>> + char* data; /* Data buffer for write. */
>> +} XferSpaceReq;
>> +
>> +static int remote_unescape_input(const char* begin, const char* end, char*
>> out)
>> +{
>> + int escaped = 0;
>> + const char *p, *out_begin = out;
>> + for (p = begin; p != end; ++p) {
>> + char b = *p;
>> + if (escaped) {
>> + *out++ = b ^ 0x20;
>> + escaped = 0;
>> + } else if (b == '}') {
>> + escaped = 1;
>> + } else {
>> + *out++ = b;
>> + }
>> + }
>> + if (escaped) {
>> + fprintf(stderr, "Unmatched escape character in target response.\n");
>> + }
>> + return out - out_begin;
>> +}
>> +
>> +static int parse_xfer_spaces_req(const char* begin, const char* end,
>> XferSpaceReq* req)
>> +{
>> + const char *p;
>> + char *out, *limit;
>> +
>> + p = begin;
>> +
>> + /* Read read/write word. */
>> + if (strncmp(p, "read", 4) == 0) {
>> + req->is_write = 0;
>> + p += 4;
>> + } else if (strncmp(p, "write", 5) == 0) {
>> + req->is_write = 1;
>> + p += 5;
>> + } else {
>> + return 0; /* Malformed. */
>> + }
>> +
>> + /* Consume the next colon. */
>> + if (*p != ':') return 0; /* Malformed. */
>> + p++;
>> +
>> + /* Read the annex designator. */
>> + out = req->annex;
>> + limit = out + sizeof(req->annex);
>> + while (*p != ':' && out != limit) {
>> + *out++ = *p++;
>> + }
>> + if (out == limit) return 0; /* Too long. */
>> + *out = (char)0;
>> +
>> + /* Consume the next colon. */
>> + if (*p != ':') return 0; /* Malformed. */
>> + p++;
>> +
>> + /* Read the offset */
>> + req->offset = strtoul(p, (char **)&p, 16);
>> +
>> + if (req->is_write) {
>> + if (*p != ':') return 0; /* Should be colon. */
>> + p++;
>> + req->length = remote_unescape_input(p, end, req->data);
>> + } else {
>> + if (*p != ',') return 0; /* Should be comma. */
>> + p++;
>> + /* Read the length */
>> + req->length = strtoul(p, (char **)&p, 16);
>> + if (!req->length) return 0; /* Zero length request. */
>> + }
>> +
>> + return 1;
>> +}
>> +
>> +
>> #endif
>>
>> static int gdb_read_register(CPUArchState *env, uint8_t *mem_buf, int reg)
>> @@ -2467,6 +2551,35 @@ static int gdb_handle_packet(GDBState *s, const char
>> *line_buf)
>> }
>> put_packet_binary(s, buf, len + 1);
>> break;
>> + } else if (strncmp(p, "Xfer:spaces:", 12) == 0) {
>> + /* The following code is implemented according to:
>> +
>> http://sourceware.org/gdb/onlinedocs/gdb/General-Query-Packets.html */
I do not find what you implement here on that website or in gdb's git.
Is there an even more recent version? Is that protocol actually approved
already?
Jan
>> + XferSpaceReq req;
>> + req.data = (char*)mem_buf;
>> + if (!parse_xfer_spaces_req(p + 12, s->line_buf +
>> s->line_buf_index, &req)) {
>> + fprintf(stderr, "gdbstub: Malformed Xfer '%s'\n", p);
>> + put_packet(s, "E00");
>> + break;
>> + }
>> + if (strcmp(req.annex, "memory") != 0) {
>> + /* Only annex "memory" is currently supported. */
>> + put_packet(s, "E14");
>> + break;
>> + }
>> + if (target_memory_rw_debug(s->g_cpu, req.offset, mem_buf,
>> req.length,
>> + req.is_write) != 0) {
>> + put_packet(s, "E14");
>> + break;
>> + }
>> + if (req.is_write) {
>> + sprintf(buf, "%02X", req.length);
>> + put_packet(s, buf);
>> + } else {
>> + buf[0] = 'm';
>> + memtox(buf + 1, (const char*)mem_buf, req.length);
>> + put_packet_binary(s, buf, req.length + 1);
>> + }
>> + break;
>> }
>> #endif
>> /* Unrecognised 'q' command. */
>> --
>> 1.7.9.6
>>
>>
--
Siemens AG, Corporate Technology, CT RTC ITP SDP-DE
Corporate Competence Center Embedded Linux