Lines Matching +full:stop +full:- +full:ack
6 * https://sourceware.org/gdb/onlinedocs/gdb/Remote-Protocol.html
8 * Copyright (c) 2003-2005 Fabrice Bellard
23 * SPDX-License-Identifier: LGPL-2.0-or-later
30 #include "qemu/error-report.h"
31 #include "qemu/target-info.h"
37 #include "accel/tcg/vcpu-state.h"
47 #include "exec/replay-core.h"
71 * What single-step modes are supported is accelerator dependent. in gdb_init_gdbserver_state()
132 trace_fn(i & -16, line_buffer); in hexdump()
136 /* return -1 if error, 0 if OK */
161 gdb_put_buffer(gdbserver_state.last_packet->data, in gdb_put_packet_binary()
162 gdbserver_state.last_packet->len); in gdb_put_packet_binary()
171 /* return -1 if error, 0 if OK */
181 gdb_put_packet(gdbserver_state.str_buf->str); in gdb_put_strbuf()
189 while (len--) { in gdb_memtox()
208 if (cpu->cluster_index == UNASSIGNED_CLUSTER_INDEX) { in gdb_get_cpu_pid()
210 int index = gdbserver_state.process_num - 1; in gdb_get_cpu_pid()
213 return cpu->cluster_index + 1; in gdb_get_cpu_pid()
258 if (gdb_get_cpu_pid(cpu) == process->pid) { in gdb_get_first_cpu_in_process()
288 if (gdb_get_cpu_process(cpu)->attached) { in gdb_next_attached_cpu()
304 if (!process->attached) { in gdb_first_attached_cpu()
327 if (!process->attached) { in gdb_get_cpu()
342 if (pid && process->pid != pid) { in gdb_get_cpu()
346 if (!process->attached) { in gdb_get_cpu()
367 len = term - p; in get_feature_xml()
371 if (!process->target_xml) { in get_feature_xml()
377 "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">" in get_feature_xml()
380 if (cpu->cc->gdb_arch_name) { in get_feature_xml()
384 cpu->cc->gdb_arch_name(cpu))); in get_feature_xml()
386 for (guint i = 0; i < cpu->gdb_regs->len; i++) { in get_feature_xml()
387 r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i); in get_feature_xml()
391 r->feature->xmlname)); in get_feature_xml()
396 process->target_xml = g_strjoinv(NULL, (void *)xml->pdata); in get_feature_xml()
398 return process->target_xml; in get_feature_xml()
401 for (guint i = 0; i < cpu->gdb_regs->len; i++) { in get_feature_xml()
402 r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i); in get_feature_xml()
403 if (strncmp(p, r->feature->xmlname, len) == 0) { in get_feature_xml()
404 return r->feature->xml; in get_feature_xml()
418 "<!DOCTYPE feature SYSTEM \"gdb-target.dtd\">" in gdb_feature_builder_init()
422 builder->feature = feature; in gdb_feature_builder_init()
423 builder->xml = g_ptr_array_new(); in gdb_feature_builder_init()
424 g_ptr_array_add(builder->xml, header); in gdb_feature_builder_init()
425 builder->regs = g_ptr_array_new(); in gdb_feature_builder_init()
426 builder->base_reg = base_reg; in gdb_feature_builder_init()
427 feature->xmlname = xmlname; in gdb_feature_builder_init()
428 feature->name = name; in gdb_feature_builder_init()
436 g_ptr_array_add(builder->xml, g_markup_vprintf_escaped(format, ap)); in gdb_feature_builder_append_tag()
447 if (builder->regs->len <= regnum) { in gdb_feature_builder_append_reg()
448 g_ptr_array_set_size(builder->regs, regnum + 1); in gdb_feature_builder_append_reg()
451 builder->regs->pdata[regnum] = (gpointer *)name; in gdb_feature_builder_append_reg()
457 name, bitsize, builder->base_reg + regnum, type, group); in gdb_feature_builder_append_reg()
462 name, bitsize, builder->base_reg + regnum, type); in gdb_feature_builder_append_reg()
468 g_ptr_array_add(builder->xml, (void *)"</feature>"); in gdb_feature_builder_end()
469 g_ptr_array_add(builder->xml, NULL); in gdb_feature_builder_end()
471 builder->feature->xml = g_strjoinv(NULL, (void *)builder->xml->pdata); in gdb_feature_builder_end()
473 for (guint i = 0; i < builder->xml->len - 2; i++) { in gdb_feature_builder_end()
474 g_free(g_ptr_array_index(builder->xml, i)); in gdb_feature_builder_end()
477 g_ptr_array_free(builder->xml, TRUE); in gdb_feature_builder_end()
479 builder->feature->num_regs = builder->regs->len; in gdb_feature_builder_end()
480 builder->feature->regs = (void *)g_ptr_array_free(builder->regs, FALSE); in gdb_feature_builder_end()
487 for (feature = gdb_static_features; feature->xmlname; feature++) { in gdb_find_static_feature()
488 if (!strcmp(feature->xmlname, xmlname)) { in gdb_find_static_feature()
501 if (!cpu->gdb_regs) { in gdb_get_register_list()
505 for (int f = 0; f < cpu->gdb_regs->len; f++) { in gdb_get_register_list()
506 GDBRegisterState *r = &g_array_index(cpu->gdb_regs, GDBRegisterState, f); in gdb_get_register_list()
507 for (int i = 0; i < r->feature->num_regs; i++) { in gdb_get_register_list()
508 const char *name = r->feature->regs[i]; in gdb_get_register_list()
510 r->base_reg + i, in gdb_get_register_list()
512 r->feature->name in gdb_get_register_list()
525 if (reg < cpu->cc->gdb_num_core_regs) { in gdb_read_register()
526 return cpu->cc->gdb_read_register(cpu, buf, reg); in gdb_read_register()
529 for (guint i = 0; i < cpu->gdb_regs->len; i++) { in gdb_read_register()
530 r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i); in gdb_read_register()
531 if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) { in gdb_read_register()
532 return r->get_reg(cpu, buf, reg - r->base_reg); in gdb_read_register()
542 if (reg < cpu->cc->gdb_num_core_regs) { in gdb_write_register()
543 return cpu->cc->gdb_write_register(cpu, mem_buf, reg); in gdb_write_register()
546 for (guint i = 0; i < cpu->gdb_regs->len; i++) { in gdb_write_register()
547 r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i); in gdb_write_register()
548 if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) { in gdb_write_register()
549 return r->set_reg(cpu, mem_buf, reg - r->base_reg); in gdb_write_register()
566 g_array_append_val(cpu->gdb_regs, s); in gdb_register_feature()
571 CPUClass *cc = cpu->cc; in gdb_get_core_xml_file()
577 if (cc->gdb_get_core_xml_file) { in gdb_get_core_xml_file()
578 return cc->gdb_get_core_xml_file(cpu); in gdb_get_core_xml_file()
580 return cc->gdb_core_xml_file; in gdb_get_core_xml_file()
585 CPUClass *cc = cpu->cc; in gdb_init_cpu()
589 cpu->gdb_regs = g_array_new(false, false, sizeof(GDBRegisterState)); in gdb_init_cpu()
594 cc->gdb_read_register, cc->gdb_write_register, in gdb_init_cpu()
596 cpu->gdb_num_regs = cpu->gdb_num_g_regs = feature->num_regs; in gdb_init_cpu()
599 if (cc->gdb_num_core_regs) { in gdb_init_cpu()
600 cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs; in gdb_init_cpu()
610 int base_reg = cpu->gdb_num_regs; in gdb_register_coprocessor()
612 for (i = 0; i < cpu->gdb_regs->len; i++) { in gdb_register_coprocessor()
614 s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i); in gdb_register_coprocessor()
615 if (s->feature == feature) { in gdb_register_coprocessor()
623 cpu->gdb_num_regs += feature->num_regs; in gdb_register_coprocessor()
627 "expected %d got %d", feature->xml, g_pos, base_reg); in gdb_register_coprocessor()
629 cpu->gdb_num_g_regs = cpu->gdb_num_regs; in gdb_register_coprocessor()
640 g_array_free(cpu->gdb_regs, true); in gdb_unregister_coprocessor_all()
642 cpu->gdb_regs = NULL; in gdb_unregister_coprocessor_all()
643 cpu->gdb_num_regs = 0; in gdb_unregister_coprocessor_all()
644 cpu->gdb_num_g_regs = 0; in gdb_unregister_coprocessor_all()
704 if (p == -1) { in read_thread_id()
712 if (t == -1) { in read_thread_id()
724 * gdb_handle_vcont - Parses and handles a vCont packet.
725 * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
743 newstates[cpu->cpu_index] = 1; in gdb_handle_vcont()
747 * res keeps track of what error we are returning, with -ENOTSUP meaning in gdb_handle_vcont()
749 * packet, while -EINVAL and -ERANGE cause an E22 packet, due to invalid, in gdb_handle_vcont()
764 return -ENOTSUP; in gdb_handle_vcont()
777 return -ENOTSUP; in gdb_handle_vcont()
790 return -ENOTSUP; in gdb_handle_vcont()
795 return -EINVAL; in gdb_handle_vcont()
800 if (newstates[cpu->cpu_index] == 1) { in gdb_handle_vcont()
801 newstates[cpu->cpu_index] = cur_action; in gdb_handle_vcont()
814 if (!process->attached) { in gdb_handle_vcont()
815 return -EINVAL; in gdb_handle_vcont()
820 if (newstates[cpu->cpu_index] == 1) { in gdb_handle_vcont()
821 newstates[cpu->cpu_index] = cur_action; in gdb_handle_vcont()
836 return -EINVAL; in gdb_handle_vcont()
840 if (newstates[cpu->cpu_index] == 1) { in gdb_handle_vcont()
841 newstates[cpu->cpu_index] = cur_action; in gdb_handle_vcont()
852 * in case execution gets interrupted, we can send GDB a stop reply with a in gdb_handle_vcont()
854 * happened in (VM pauses stop all of them anyway), so long as it is one of in gdb_handle_vcont()
896 g_assert(params->len == 0); in cmd_parse_params()
907 return -EINVAL; in cmd_parse_params()
915 return -EINVAL; in cmd_parse_params()
942 return -EINVAL; in cmd_parse_params()
968 g_assert(cmd->handler && cmd->cmd); in process_string_cmd()
970 if ((cmd->cmd_startswith && !startswith(data, cmd->cmd)) || in process_string_cmd()
971 (!cmd->cmd_startswith && strcmp(cmd->cmd, data))) { in process_string_cmd()
975 if (cmd->schema) { in process_string_cmd()
976 if (cmd_parse_params(&data[strlen(cmd->cmd)], in process_string_cmd()
977 cmd->schema, params)) { in process_string_cmd()
982 if (cmd->need_cpu_context) { in process_string_cmd()
986 gdbserver_state.allow_stop_reply = cmd->allow_stop_reply; in process_string_cmd()
987 cmd->handler(params, user_ctx); in process_string_cmd()
1016 if (!params->len) { in handle_detach()
1021 pid = gdb_get_cmd_param(params, 0)->val_ul; in handle_detach()
1032 process->attached = false; in handle_detach()
1054 if (!params->len) { in handle_thread_alive()
1059 if (gdb_get_cmd_param(params, 0)->thread_id.kind == GDB_READ_THREAD_ERR) { in handle_thread_alive()
1064 cpu = gdb_get_cpu(gdb_get_cmd_param(params, 0)->thread_id.pid, in handle_thread_alive()
1065 gdb_get_cmd_param(params, 0)->thread_id.tid); in handle_thread_alive()
1076 if (params->len) { in handle_continue()
1077 gdb_set_cpu_pc(gdb_get_cmd_param(params, 0)->val_ull); in handle_continue()
1092 if (params->len) { in handle_cont_with_sig()
1093 signal = gdb_get_cmd_param(params, 0)->val_ul; in handle_cont_with_sig()
1097 if (gdbserver_state.signal == -1) { in handle_cont_with_sig()
1108 if (params->len != 2) { in handle_set_thread()
1113 if (gdb_get_cmd_param(params, 1)->thread_id.kind == GDB_READ_THREAD_ERR) { in handle_set_thread()
1118 if (gdb_get_cmd_param(params, 1)->thread_id.kind != GDB_ONE_THREAD) { in handle_set_thread()
1123 pid = gdb_get_cmd_param(params, 1)->thread_id.pid; in handle_set_thread()
1124 tid = gdb_get_cmd_param(params, 1)->thread_id.tid; in handle_set_thread()
1140 switch (gdb_get_cmd_param(params, 0)->opcode) { in handle_set_thread()
1159 if (params->len != 3) { in handle_insert_bp()
1165 gdb_get_cmd_param(params, 0)->val_ul, in handle_insert_bp()
1166 gdb_get_cmd_param(params, 1)->val_ull, in handle_insert_bp()
1167 gdb_get_cmd_param(params, 2)->val_ull); in handle_insert_bp()
1171 } else if (res == -ENOSYS) { in handle_insert_bp()
1183 if (params->len != 3) { in handle_remove_bp()
1189 gdb_get_cmd_param(params, 0)->val_ul, in handle_remove_bp()
1190 gdb_get_cmd_param(params, 1)->val_ull, in handle_remove_bp()
1191 gdb_get_cmd_param(params, 2)->val_ull); in handle_remove_bp()
1195 } else if (res == -ENOSYS) { in handle_remove_bp()
1218 if (params->len != 2) { in handle_set_reg()
1223 reg_size = strlen(gdb_get_cmd_param(params, 1)->data) / 2; in handle_set_reg()
1224 gdb_hextomem(gdbserver_state.mem_buf, gdb_get_cmd_param(params, 1)->data, reg_size); in handle_set_reg()
1225 gdb_write_register(gdbserver_state.g_cpu, gdbserver_state.mem_buf->data, in handle_set_reg()
1226 gdb_get_cmd_param(params, 0)->val_ull); in handle_set_reg()
1234 if (!params->len) { in handle_get_reg()
1241 gdb_get_cmd_param(params, 0)->val_ull); in handle_get_reg()
1250 gdbserver_state.mem_buf->data, reg_size); in handle_get_reg()
1256 if (params->len != 3) { in handle_write_mem()
1262 if (gdb_get_cmd_param(params, 1)->val_ull > in handle_write_mem()
1263 strlen(gdb_get_cmd_param(params, 2)->data) / 2) { in handle_write_mem()
1268 gdb_hextomem(gdbserver_state.mem_buf, gdb_get_cmd_param(params, 2)->data, in handle_write_mem()
1269 gdb_get_cmd_param(params, 1)->val_ull); in handle_write_mem()
1271 gdb_get_cmd_param(params, 0)->val_ull, in handle_write_mem()
1272 gdbserver_state.mem_buf->data, in handle_write_mem()
1273 gdbserver_state.mem_buf->len, true)) { in handle_write_mem()
1283 if (params->len != 2) { in handle_read_mem()
1289 if (gdb_get_cmd_param(params, 1)->val_ull > MAX_PACKET_LENGTH / 2) { in handle_read_mem()
1295 gdb_get_cmd_param(params, 1)->val_ull); in handle_read_mem()
1298 gdb_get_cmd_param(params, 0)->val_ull, in handle_read_mem()
1299 gdbserver_state.mem_buf->data, in handle_read_mem()
1300 gdbserver_state.mem_buf->len, false)) { in handle_read_mem()
1305 gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, in handle_read_mem()
1306 gdbserver_state.mem_buf->len); in handle_read_mem()
1317 if (!params->len) { in handle_write_all_regs()
1322 len = strlen(gdb_get_cmd_param(params, 0)->data) / 2; in handle_write_all_regs()
1323 gdb_hextomem(gdbserver_state.mem_buf, gdb_get_cmd_param(params, 0)->data, len); in handle_write_all_regs()
1324 registers = gdbserver_state.mem_buf->data; in handle_write_all_regs()
1326 reg_id < gdbserver_state.g_cpu->gdb_num_g_regs && len > 0; in handle_write_all_regs()
1329 len -= reg_size; in handle_write_all_regs()
1343 for (reg_id = 0; reg_id < gdbserver_state.g_cpu->gdb_num_g_regs; reg_id++) { in handle_read_all_regs()
1347 g_assert(len == gdbserver_state.mem_buf->len); in handle_read_all_regs()
1350 gdb_memtohex(gdbserver_state.str_buf, gdbserver_state.mem_buf->data, len); in handle_read_all_regs()
1357 if (params->len) { in handle_step()
1358 gdb_set_cpu_pc(gdb_get_cmd_param(params, 0)->val_ull); in handle_step()
1370 if (params->len == 1) { in handle_backward()
1371 switch (gdb_get_cmd_param(params, 0)->opcode) { in handle_backward()
1402 if (!params->len) { in handle_v_cont()
1406 res = gdb_handle_vcont(gdb_get_cmd_param(params, 0)->data); in handle_v_cont()
1407 if ((res == -EINVAL) || (res == -ERANGE)) { in handle_v_cont()
1420 if (!params->len) { in handle_v_attach()
1424 process = gdb_get_process(gdb_get_cmd_param(params, 0)->val_ul); in handle_v_attach()
1434 process->attached = true; in handle_v_attach()
1486 * [1] https://sourceware.org/gdb/onlinedocs/gdb/Host-I_002fO-Packets.html
1517 if (!params->len) { in handle_v_commands()
1521 if (!process_string_cmd(gdb_get_cmd_param(params, 0)->data, in handle_v_commands()
1549 if (!params->len) { in handle_set_qemu_sstep()
1553 new_sstep_flags = gdb_get_cmd_param(params, 0)->val_ul; in handle_set_qemu_sstep()
1604 g_string_printf(gdbserver_state.str_buf, "name:qemu-%s;version:%s;", in handle_query_gdb_server_version()
1607 g_string_printf(gdbserver_state.str_buf, "name:qemu-system-%s;version:%s;", in handle_query_gdb_server_version()
1624 if (!params->len || in handle_query_thread_extra()
1625 gdb_get_cmd_param(params, 0)->thread_id.kind == GDB_READ_THREAD_ERR) { in handle_query_thread_extra()
1630 cpu = gdb_get_cpu(gdb_get_cmd_param(params, 0)->thread_id.pid, in handle_query_thread_extra()
1631 gdb_get_cmd_param(params, 0)->thread_id.tid); in handle_query_thread_extra()
1645 cpu->halted ? "halted " : "running"); in handle_query_thread_extra()
1647 g_string_printf(rs, "CPU#%d [%s]", cpu->cpu_index, in handle_query_thread_extra()
1648 cpu->halted ? "halted " : "running"); in handle_query_thread_extra()
1650 trace_gdbstub_op_extra_info(rs->str); in handle_query_thread_extra()
1651 gdb_memtohex(gdbserver_state.str_buf, (uint8_t *)rs->str, rs->len); in handle_query_thread_extra()
1693 g_string_append(gdbserver_state.str_buf, ";qXfer:exec-file:read+"); in handle_query_supported()
1696 if (params->len) { in handle_query_supported()
1697 const char *gdb_supported = gdb_get_cmd_param(params, 0)->data; in handle_query_supported()
1726 if (params->len < 3) { in handle_query_xfer_features()
1737 p = gdb_get_cmd_param(params, 0)->data; in handle_query_xfer_features()
1744 addr = gdb_get_cmd_param(params, 1)->val_ul; in handle_query_xfer_features()
1745 len = gdb_get_cmd_param(params, 2)->val_ul; in handle_query_xfer_features()
1752 if (len > (MAX_PACKET_LENGTH - 5) / 2) { in handle_query_xfer_features()
1753 len = (MAX_PACKET_LENGTH - 5) / 2; in handle_query_xfer_features()
1756 if (len < total_len - addr) { in handle_query_xfer_features()
1761 gdb_memtox(gdbserver_state.str_buf, xml + addr, total_len - addr); in handle_query_xfer_features()
1764 gdb_put_packet_binary(gdbserver_state.str_buf->str, in handle_query_xfer_features()
1765 gdbserver_state.str_buf->len, true); in handle_query_xfer_features()
1796 * extend_table() - extend one of the command tables
1812 for (int i = 0; i < extensions->len; i++) { in extend_table()
1823 * process_extended_table() - run through an extended command table
1831 for (int i = 0; i < table->len; i++) { in process_extended_table()
1919 .cmd = "Xfer:exec-file:read:",
1983 if (!params->len) { in handle_gen_query()
1987 data = gdb_get_cmd_param(params, 0)->data; in handle_gen_query()
2014 if (!params->len) { in handle_gen_set()
2018 data = gdb_get_cmd_param(params, 0)->data; in handle_gen_set()
2314 if (!p->attached) { in gdb_set_stop_cpu()
2316 * Having a stop CPU corresponding to a process that is not attached in gdb_set_stop_cpu()
2332 if (gdbserver_state.last_packet->len) { in gdb_read_byte()
2335 if (ch == '-') { in gdb_read_byte()
2337 gdb_put_buffer(gdbserver_state.last_packet->data, in gdb_read_byte()
2338 gdbserver_state.last_packet->len); in gdb_read_byte()
2353 * When the CPU is running, we cannot do anything except stop in gdb_read_byte()
2354 * it when receiving a char. This is expected on a Ctrl-C in the in gdb_read_byte()
2355 * gdb client. Because we are in all-stop mode, gdb sends a in gdb_read_byte()
2357 * here, but it does expect a stop reply. in gdb_read_byte()
2396 } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) { in gdb_read_byte()
2409 } else if (gdbserver_state.line_buf_index >= sizeof(gdbserver_state.line_buf) - 1) { in gdb_read_byte()
2422 * Run-length encoding is explained in "Debugging with GDB / in gdb_read_byte()
2431 int repeat = ch - ' ' + 3; in gdb_read_byte()
2432 … if (gdbserver_state.line_buf_index + repeat >= sizeof(gdbserver_state.line_buf) - 1) { in gdb_read_byte()
2443 gdbserver_state.line_buf[gdbserver_state.line_buf_index - 1], repeat); in gdb_read_byte()
2473 reply = '-'; in gdb_read_byte()
2477 /* send ACK reply */ in gdb_read_byte()
2504 pid = s->processes[s->process_num - 1].pid; in gdb_create_default_process()
2513 s->processes = g_renew(GDBProcess, s->processes, ++s->process_num); in gdb_create_default_process()
2514 process = &s->processes[s->process_num - 1]; in gdb_create_default_process()
2515 process->pid = pid; in gdb_create_default_process()
2516 process->attached = false; in gdb_create_default_process()
2517 process->target_xml = NULL; in gdb_create_default_process()