X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fserver%2Fgdb_server.c;h=537513a1b6b831179ac8a405ef02d44170fa1e75;hb=3500109fc736a4818b34c8c7c8e7ebea59bdd47b;hp=9c1d24529645bb0d96063bf8cb57b225f26984df;hpb=1e7e59445287c3389b52903a7cacdb5635248f32;p=openocd.git diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 9c1d245296..537513a1b6 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -44,7 +44,6 @@ #include "rtos/rtos.h" #include "target/smp.h" - /** * @file * GDB server implementation. @@ -77,7 +76,6 @@ struct gdb_connection bool mem_write_error; }; - #if 0 #define _DEBUG_GDB_IO_ #endif @@ -245,9 +243,7 @@ static int gdb_get_char_inner(struct connection *connection, int* next_char) } #ifdef _DEBUG_GDB_IO_ - debug_buffer = malloc(gdb_con->buf_cnt + 1); - memcpy(debug_buffer, gdb_con->buffer, gdb_con->buf_cnt); - debug_buffer[gdb_con->buf_cnt] = 0; + debug_buffer = strndup(gdb_con->buffer, gdb_con->buf_cnt); LOG_DEBUG("received '%s'", debug_buffer); free(debug_buffer); #endif @@ -389,9 +385,7 @@ static int gdb_put_packet_inner(struct connection *connection, while (1) { #ifdef _DEBUG_GDB_IO_ - debug_buffer = malloc(len + 1); - memcpy(debug_buffer, buffer, len); - debug_buffer[len] = 0; + debug_buffer = strndup(buffer, len); LOG_DEBUG("sending packet '$%s#%2.2x'", debug_buffer, my_checksum); free(debug_buffer); #endif @@ -944,8 +938,9 @@ static void gdb_send_error(struct connection *connection, uint8_t the_error) } static int gdb_last_signal_packet(struct connection *connection, - struct target *target, char* packet, int packet_size) + char* packet, int packet_size) { + struct target *target = get_target_from_connection(connection); char sig_reply[4]; int signal_var; @@ -1029,8 +1024,9 @@ static void gdb_target_to_reg(struct target *target, } static int gdb_get_registers_packet(struct connection *connection, - struct target *target, char* packet, int packet_size) + char* packet, int packet_size) { + struct target *target = get_target_from_connection(connection); struct reg **reg_list; int reg_list_size; int retval; @@ -1044,7 +1040,7 @@ static int gdb_get_registers_packet(struct connection *connection, #endif if ( ( target->rtos != NULL ) && - ( ERROR_FAIL != rtos_get_gdb_reg_list( connection, target, ®_list, ®_list_size) ) ) + ( ERROR_FAIL != rtos_get_gdb_reg_list( connection, ®_list, ®_list_size) ) ) { return ERROR_OK; } @@ -1056,28 +1052,32 @@ static int gdb_get_registers_packet(struct connection *connection, for (i = 0; i < reg_list_size; i++) { - reg_packet_size += reg_list[i]->size; + reg_packet_size += DIV_ROUND_UP(reg_list[i]->size, 8) * 2; } - reg_packet = malloc(DIV_ROUND_UP(reg_packet_size, 8) * 2); + assert(reg_packet_size > 0); + + reg_packet = malloc(reg_packet_size); reg_packet_p = reg_packet; for (i = 0; i < reg_list_size; i++) { + if (!reg_list[i]->valid) + reg_list[i]->type->get(reg_list[i]); gdb_str_to_target(target, reg_packet_p, reg_list[i]); reg_packet_p += DIV_ROUND_UP(reg_list[i]->size, 8) * 2; } #ifdef _DEBUG_GDB_IO_ { - char *reg_packet_p; - reg_packet_p = strndup(reg_packet, DIV_ROUND_UP(reg_packet_size, 8) * 2); - LOG_DEBUG("reg_packet: %s", reg_packet_p); - free(reg_packet_p); + char *reg_packet_p_debug; + reg_packet_p_debug = strndup(reg_packet, reg_packet_size); + LOG_DEBUG("reg_packet: %s", reg_packet_p_debug); + free(reg_packet_p_debug); } #endif - gdb_put_packet(connection, reg_packet, DIV_ROUND_UP(reg_packet_size, 8) * 2); + gdb_put_packet(connection, reg_packet, reg_packet_size); free(reg_packet); free(reg_list); @@ -1086,8 +1086,9 @@ static int gdb_get_registers_packet(struct connection *connection, } static int gdb_set_registers_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); int i; struct reg **reg_list; int reg_list_size; @@ -1145,8 +1146,9 @@ static int gdb_set_registers_packet(struct connection *connection, } static int gdb_get_register_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); char *reg_packet; int reg_num = strtoul(packet + 1, NULL, 16); struct reg **reg_list; @@ -1168,6 +1170,9 @@ static int gdb_get_register_packet(struct connection *connection, exit(-1); } + if (!reg_list[reg_num]->valid) + reg_list[reg_num]->type->get(reg_list[reg_num]); + reg_packet = malloc(DIV_ROUND_UP(reg_list[reg_num]->size, 8) * 2); gdb_str_to_target(target, reg_packet, reg_list[reg_num]); @@ -1181,8 +1186,9 @@ static int gdb_get_register_packet(struct connection *connection, } static int gdb_set_register_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); char *separator; uint8_t *bin_buf; int reg_num = strtoul(packet + 1, &separator, 16); @@ -1244,8 +1250,9 @@ static int gdb_error(struct connection *connection, int retval) * 8191 bytes by the looks of it. Why 8191 bytes instead of 8192????? */ static int gdb_read_memory_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); char *separator; uint32_t addr = 0; uint32_t len = 0; @@ -1319,8 +1326,9 @@ static int gdb_read_memory_packet(struct connection *connection, } static int gdb_write_memory_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); char *separator; uint32_t addr = 0; uint32_t len = 0; @@ -1377,8 +1385,9 @@ static int gdb_write_memory_packet(struct connection *connection, } static int gdb_write_memory_binary_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); char *separator; uint32_t addr = 0; uint32_t len = 0; @@ -1441,8 +1450,9 @@ static int gdb_write_memory_binary_packet(struct connection *connection, } static int gdb_step_continue_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); int current = 0; uint32_t address = 0x0; int retval = ERROR_OK; @@ -1475,8 +1485,9 @@ static int gdb_step_continue_packet(struct connection *connection, } static int gdb_breakpoint_watchpoint_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { + struct target *target = get_target_from_connection(connection); int type; enum breakpoint_type bp_type = BKPT_SOFT /* dummy init to avoid warning */; enum watchpoint_rw wp_type = WPT_READ /* dummy init to avoid warning */; @@ -1669,7 +1680,7 @@ static int compare_bank (const void * a, const void * b) } static int gdb_memory_map(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { /* We get away with only specifying flash here. Regions that are not * specified are treated as if we provided no memory map(if not we @@ -1678,6 +1689,7 @@ static int gdb_memory_map(struct connection *connection, * have to regenerate it a couple of times. */ + struct target *target = get_target_from_connection(connection); struct flash_bank *p; char *xml = NULL; int size = 0; @@ -1723,14 +1735,13 @@ static int gdb_memory_map(struct connection *connection, qsort(banks, target_flash_banks, sizeof(struct flash_bank *), compare_bank); - for (i = 0; i < flash_get_bank_count(); i++) { + for (i = 0; i < target_flash_banks; i++) { int j; unsigned sector_size = 0; - uint32_t start, end; + uint32_t start; p = banks[i]; start = p->base; - end = p->base + p->size; if (ram_start < p->base) xml_printf(&retval, &xml, &pos, &size, @@ -1814,10 +1825,11 @@ static int gdb_memory_map(struct connection *connection, } static int gdb_query_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { struct command_context *cmd_ctx = connection->cmd_ctx; struct gdb_connection *gdb_connection = connection->priv; + struct target *target = get_target_from_connection(connection); if (strstr(packet, "qRcmd,")) { @@ -1915,7 +1927,7 @@ static int gdb_query_packet(struct connection *connection, } else if (strstr(packet, "qXfer:memory-map:read::") && (flash_get_bank_count() > 0)) - return gdb_memory_map(connection, target, packet, packet_size); + return gdb_memory_map(connection, packet, packet_size); else if (strstr(packet, "qXfer:features:read:")) { char *xml = NULL; @@ -1968,7 +1980,7 @@ static int gdb_query_packet(struct connection *connection, } static int gdb_v_packet(struct connection *connection, - struct target *target, char *packet, int packet_size) + char *packet, int packet_size) { struct gdb_connection *gdb_connection = connection->priv; struct gdb_service *gdb_service = connection->service->priv; @@ -2115,7 +2127,7 @@ static int gdb_v_packet(struct connection *connection, return ERROR_OK; } -static int gdb_detach(struct connection *connection, struct target *target) +static int gdb_detach(struct connection *connection) { struct gdb_service *gdb_service = connection->service->priv; @@ -2203,61 +2215,43 @@ static int gdb_input_inner(struct connection *connection) switch (packet[0]) { case 'T': // Is thread alive? - gdb_thread_packet(connection, target, packet, packet_size); + gdb_thread_packet(connection, packet, packet_size); break; case 'H': // Set current thread ( 'c' for step and continue, 'g' for all other operations ) - gdb_thread_packet(connection, target, packet, packet_size); + gdb_thread_packet(connection, packet, packet_size); break; case 'q': case 'Q': - retval = gdb_thread_packet(connection, - target, packet, - packet_size); + retval = gdb_thread_packet(connection, packet, packet_size); if ( retval == GDB_THREAD_PACKET_NOT_CONSUMED ) { - retval = gdb_query_packet(connection, - target, packet, - packet_size); + retval = gdb_query_packet(connection, packet, packet_size); } break; case 'g': - retval = gdb_get_registers_packet( - connection, target, - packet, packet_size); + retval = gdb_get_registers_packet(connection, packet, packet_size); break; case 'G': - retval = gdb_set_registers_packet( - connection, target, - packet, packet_size); + retval = gdb_set_registers_packet(connection, packet, packet_size); break; case 'p': - retval = gdb_get_register_packet( - connection, target, - packet, packet_size); + retval = gdb_get_register_packet(connection, packet, packet_size); break; case 'P': - retval = gdb_set_register_packet( - connection, target, - packet, packet_size); + retval = gdb_set_register_packet(connection, packet, packet_size); break; case 'm': - retval = gdb_read_memory_packet( - connection, target, - packet, packet_size); + retval = gdb_read_memory_packet(connection, packet, packet_size); break; case 'M': - retval = gdb_write_memory_packet( - connection, target, - packet, packet_size); + retval = gdb_write_memory_packet(connection, packet, packet_size); break; case 'z': case 'Z': - retval = gdb_breakpoint_watchpoint_packet(connection, target, packet, packet_size); + retval = gdb_breakpoint_watchpoint_packet(connection, packet, packet_size); break; case '?': - gdb_last_signal_packet( - connection, target, - packet, packet_size); + gdb_last_signal_packet(connection, packet, packet_size); break; case 'c': case 's': @@ -2320,7 +2314,7 @@ static int gdb_input_inner(struct connection *connection) { /* Here we don't want packet processing to stop even if this fails, * so we use a local variable instead of retval. */ - retval = gdb_step_continue_packet(connection, target, packet, packet_size); + retval = gdb_step_continue_packet(connection, packet, packet_size); if (retval != ERROR_OK) { /* we'll never receive a halted condition... issue a false one.. */ @@ -2331,18 +2325,14 @@ static int gdb_input_inner(struct connection *connection) } break; case 'v': - retval = gdb_v_packet( - connection, target, - packet, packet_size); + retval = gdb_v_packet(connection, packet, packet_size); break; case 'D': - retval = gdb_detach(connection, target); + retval = gdb_detach(connection); extended_protocol = 0; break; case 'X': - retval = gdb_write_memory_binary_packet( - connection, target, - packet, packet_size); + retval = gdb_write_memory_binary_packet(connection, packet, packet_size); if (retval != ERROR_OK) return retval; break; @@ -2369,18 +2359,14 @@ static int gdb_input_inner(struct connection *connection) case 'j': /* packet supported only by smp target i.e cortex_a.c*/ /* handle smp packet replying coreid played to gbd */ - gdb_read_smp_packet( - connection, target, - packet, packet_size); + gdb_read_smp_packet(connection, packet, packet_size); break; case 'J': /* packet supported only by smp target i.e cortex_a.c */ /* handle smp packet setting coreid to be played at next * resume to gdb */ - gdb_write_smp_packet( - connection, target, - packet, packet_size); + gdb_write_smp_packet(connection, packet, packet_size); break; default: @@ -2459,7 +2445,7 @@ static int gdb_target_start(struct target *target, const char *port) { curr = head->target; if (curr != target) curr->gdb_service = gdb_service; - head = head->next; + head = head->next; } } return ret; @@ -2470,7 +2456,7 @@ static int gdb_target_add_one(struct target *target) /* one gdb instance per smp list */ if ((target->smp) && (target->gdb_service)) return ERROR_OK; int retval = gdb_target_start(target, gdb_port_next); - if (retval == ERROR_OK) + if (retval == ERROR_OK) { long portnumber; /* If we can parse the port number