Loading gdbstub.c +38 −12 Original line number Diff line number Diff line Loading @@ -1676,6 +1676,36 @@ static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx) put_packet(gdb_ctx->s, "OK"); } static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx) { int reg_size; /* * Older gdb are really dumb, and don't use 'g' if 'p' is avaialable. * This works, but can be very slow. Anything new enough to * understand XML also knows how to use this properly. */ if (!gdb_has_xml) { put_packet(gdb_ctx->s, ""); return; } if (!gdb_ctx->num_params) { put_packet(gdb_ctx->s, "E14"); return; } reg_size = gdb_read_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf, gdb_ctx->params[0].val_ull); if (!reg_size) { put_packet(gdb_ctx->s, "E14"); return; } memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, reg_size); put_packet(gdb_ctx->s, gdb_ctx->str_buf); } static int gdb_handle_packet(GDBState *s, const char *line_buf) { CPUState *cpu; Loading Loading @@ -1905,18 +1935,14 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf) } break; case 'p': /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable. This works, but can be very slow. Anything new enough to understand XML also knows how to use this properly. */ if (!gdb_has_xml) goto unknown_command; addr = strtoull(p, (char **)&p, 16); reg_size = gdb_read_register(s->g_cpu, mem_buf, addr); if (reg_size) { memtohex(buf, mem_buf, reg_size); put_packet(s, buf); } else { put_packet(s, "E14"); { static const GdbCmdParseEntry get_reg_cmd_desc = { .handler = handle_get_reg, .cmd = "p", .cmd_startswith = 1, .schema = "L0" }; cmd_parser = &get_reg_cmd_desc; } break; case 'P': Loading Loading
gdbstub.c +38 −12 Original line number Diff line number Diff line Loading @@ -1676,6 +1676,36 @@ static void handle_set_reg(GdbCmdContext *gdb_ctx, void *user_ctx) put_packet(gdb_ctx->s, "OK"); } static void handle_get_reg(GdbCmdContext *gdb_ctx, void *user_ctx) { int reg_size; /* * Older gdb are really dumb, and don't use 'g' if 'p' is avaialable. * This works, but can be very slow. Anything new enough to * understand XML also knows how to use this properly. */ if (!gdb_has_xml) { put_packet(gdb_ctx->s, ""); return; } if (!gdb_ctx->num_params) { put_packet(gdb_ctx->s, "E14"); return; } reg_size = gdb_read_register(gdb_ctx->s->g_cpu, gdb_ctx->mem_buf, gdb_ctx->params[0].val_ull); if (!reg_size) { put_packet(gdb_ctx->s, "E14"); return; } memtohex(gdb_ctx->str_buf, gdb_ctx->mem_buf, reg_size); put_packet(gdb_ctx->s, gdb_ctx->str_buf); } static int gdb_handle_packet(GDBState *s, const char *line_buf) { CPUState *cpu; Loading Loading @@ -1905,18 +1935,14 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf) } break; case 'p': /* Older gdb are really dumb, and don't use 'g' if 'p' is avaialable. This works, but can be very slow. Anything new enough to understand XML also knows how to use this properly. */ if (!gdb_has_xml) goto unknown_command; addr = strtoull(p, (char **)&p, 16); reg_size = gdb_read_register(s->g_cpu, mem_buf, addr); if (reg_size) { memtohex(buf, mem_buf, reg_size); put_packet(s, buf); } else { put_packet(s, "E14"); { static const GdbCmdParseEntry get_reg_cmd_desc = { .handler = handle_get_reg, .cmd = "p", .cmd_startswith = 1, .schema = "L0" }; cmd_parser = &get_reg_cmd_desc; } break; case 'P': Loading