- jtag_khz/speed are now single parameter only. These are used
[openocd.git] / src / server / gdb_server.c
index 1d29d2129173c27d7a2516a1db2f20b3a5532b26..665e3507af179a0d832504aaf71cd7516d5a8156 100644 (file)
@@ -63,8 +63,10 @@ enum gdb_detach_mode detach_mode = GDB_DETACH_RESUME;
 
 /* set if we are sending a memory map to gdb
  * via qXfer:memory-map:read packet */
-int gdb_use_memory_map = 0;
-int gdb_flash_program = 0;
+/* enabled by default*/
+int gdb_use_memory_map = 1;
+/* enabled by default*/
+int gdb_flash_program = 1;
 
 /* if set, data aborts cause an error to be reported in memory read packets
  * see the code in gdb_read_memory_packet() for further explanations */
@@ -85,12 +87,11 @@ int gdb_last_signal(target_t *target)
                case DBG_REASON_NOTHALTED:
                        return 0x0; /* no signal... shouldn't happen */
                default:
-                       USER("undefined debug reason %d - target needs reset", target->debug_reason);
+                       LOG_USER("undefined debug reason %d - target needs reset", target->debug_reason);
                        return 0x0;
        }
 }
 
-#ifndef _WIN32
 int check_pending(connection_t *connection, int timeout_s, int *got_data)
 {
        /* a non-blocking socket will block if there is 0 bytes available on the socket,
@@ -131,7 +132,6 @@ int check_pending(connection_t *connection, int timeout_s, int *got_data)
        *got_data=FD_ISSET(connection->fd, &read_fds)!=0;
        return ERROR_OK;
 }
-#endif
 
 int gdb_get_char(connection_t *connection, int* next_char)
 {
@@ -151,7 +151,7 @@ int gdb_get_char(connection_t *connection, int* next_char)
                        connection->input_pending = 0;
 
 #ifdef _DEBUG_GDB_IO_
-               DEBUG("returned char '%c' (0x%2.2x)", *next_char, *next_char);
+               LOG_DEBUG("returned char '%c' (0x%2.2x)", *next_char, *next_char);
 #endif
 
                return ERROR_OK;
@@ -159,11 +159,9 @@ int gdb_get_char(connection_t *connection, int* next_char)
 
        for (;;)
        {
-#ifndef _WIN32
                retval=check_pending(connection, 1, NULL);
                if (retval!=ERROR_OK)
                        return retval;
-#endif
                gdb_con->buf_cnt = read_socket(connection->fd, gdb_con->buffer, GDB_BUFFER_SIZE);
                if (gdb_con->buf_cnt > 0)
                {
@@ -190,7 +188,7 @@ int gdb_get_char(connection_t *connection, int* next_char)
                                gdb_con->closed = 1;
                                return ERROR_SERVER_REMOTE_CLOSED;
                        default:
-                               ERROR("read: %d", errno);
+                               LOG_ERROR("read: %d", errno);
                                exit(-1);
                }
 #else
@@ -206,7 +204,7 @@ int gdb_get_char(connection_t *connection, int* next_char)
                                gdb_con->closed = 1;
                                return ERROR_SERVER_REMOTE_CLOSED;
                        default:
-                               ERROR("read: %s", strerror(errno));
+                               LOG_ERROR("read: %s", strerror(errno));
                                gdb_con->closed = 1;
                                return ERROR_SERVER_REMOTE_CLOSED;
                }
@@ -217,7 +215,7 @@ int gdb_get_char(connection_t *connection, int* next_char)
        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("received '%s'", debug_buffer);
+       LOG_DEBUG("received '%s'", debug_buffer);
        free(debug_buffer);
 #endif
 
@@ -229,7 +227,7 @@ int gdb_get_char(connection_t *connection, int* next_char)
        else
                connection->input_pending = 0;
 #ifdef _DEBUG_GDB_IO_
-       DEBUG("returned char '%c' (0x%2.2x)", *next_char, *next_char);
+       LOG_DEBUG("returned char '%c' (0x%2.2x)", *next_char, *next_char);
 #endif
 
        return retval;
@@ -246,7 +244,7 @@ int gdb_putback_char(connection_t *connection, int last_char)
        }
        else
        {
-               ERROR("BUG: couldn't put character back");
+               LOG_ERROR("BUG: couldn't put character back");
        }
 
        return ERROR_OK;
@@ -299,7 +297,7 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                        break;
                if ((retval = gdb_get_char(connection, &reply)) != ERROR_OK)
                        return retval;
-               WARNING("Discard unexpected char %c", reply);
+               LOG_WARNING("Discard unexpected char %c", reply);
        }
 #endif
 #endif
@@ -310,7 +308,7 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                debug_buffer = malloc(len + 1);
                memcpy(debug_buffer, buffer, len);
                debug_buffer[len] = 0;
-               DEBUG("sending packet '$%s#%2.2x'", debug_buffer, my_checksum);
+               LOG_DEBUG("sending packet '$%s#%2.2x'", debug_buffer, my_checksum);
                free(debug_buffer);
 #endif
 
@@ -346,7 +344,7 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                {
                        /* Stop sending output packets for now */
                        log_remove_callback(gdb_log_callback, connection);
-                       WARNING("negative reply, retrying");
+                       LOG_WARNING("negative reply, retrying");
                }
                else if (reply == 0x3)
                {
@@ -359,18 +357,18 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                        {
                                /* Stop sending output packets for now */
                                log_remove_callback(gdb_log_callback, connection);
-                               WARNING("negative reply, retrying");
+                               LOG_WARNING("negative reply, retrying");
                        }
                        else
                        {
-                               ERROR("unknown character 0x%2.2x in reply, dropping connection", reply);
+                               LOG_ERROR("unknown character 0x%2.2x in reply, dropping connection", reply);
                                gdb_con->closed=1;
                                return ERROR_SERVER_REMOTE_CLOSED;
                        }
                }
                else
                {
-                       ERROR("unknown character 0x%2.2x in reply, dropping connection", reply);
+                       LOG_ERROR("unknown character 0x%2.2x in reply, dropping connection", reply);
                        gdb_con->closed=1;
                        return ERROR_SERVER_REMOTE_CLOSED;
                }
@@ -407,7 +405,7 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len)
                                return retval;
 
 #ifdef _DEBUG_GDB_IO_
-                       DEBUG("character: '%c'", character);
+                       LOG_DEBUG("character: '%c'", character);
 #endif
 
                        switch (character)
@@ -415,17 +413,17 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len)
                                case '$':
                                        break;
                                case '+':
-                                       WARNING("acknowledgment received, but no packet pending");
+                                       LOG_WARNING("acknowledgment received, but no packet pending");
                                        break;
                                case '-':
-                                       WARNING("negative acknowledgment, but no packet pending");
+                                       LOG_WARNING("negative acknowledgment, but no packet pending");
                                        break;
                                case 0x3:
                                        gdb_con->ctrl_c = 1;
                                        *len = 0;
                                        return ERROR_OK;
                                default:
-                                       WARNING("ignoring character 0x%x", character);
+                                       LOG_WARNING("ignoring character 0x%x", character);
                                        break;
                        }
                } while (character != '$');
@@ -486,7 +484,7 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len)
                        }
                        if (count > *len)
                        {
-                               ERROR("packet buffer too small");
+                               LOG_ERROR("packet buffer too small");
                                return ERROR_GDB_BUFFER_TOO_SMALL;
                        }
 
@@ -530,7 +528,7 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len)
                        break;
                }
 
-               WARNING("checksum error, requesting retransmission");
+               LOG_WARNING("checksum error, requesting retransmission");
                gdb_write(connection, "-", 1);
        }
        if (gdb_con->closed)
@@ -570,33 +568,19 @@ int gdb_output_con(connection_t *connection, const char* line)
        return ERROR_OK;
 }
 
-int gdb_output(struct command_context_s *context, char* line)
+int gdb_output(struct command_context_s *context, const char* line)
 {
        /* this will be dumped to the log and also sent as an O packet if possible */
-       USER_N("%s", line);
+       LOG_USER_N("%s", line);
        return ERROR_OK;
 }
 
 int gdb_program_handler(struct target_s *target, enum target_event event, void *priv)
 {
-       FILE *script;
        struct command_context_s *cmd_ctx = priv;
 
-       if (target->gdb_program_script)
-       {
-               script = open_file_from_path(target->gdb_program_script, "r");
-               if (!script)
-               {
-                       ERROR("couldn't open script file %s", target->gdb_program_script);
-                               return ERROR_OK;
-               }
-
-               INFO("executing gdb_program script '%s'", target->gdb_program_script);
-               command_run_file(cmd_ctx, script, COMMAND_EXEC);
-               fclose(script);
-
-               jtag_execute_queue();
-       }
+       target_invoke_script(cmd_ctx, target, "gdb_program");
+       jtag_execute_queue();
 
        return ERROR_OK;
 }
@@ -694,7 +678,7 @@ int gdb_new_connection(connection_t *connection)
         * instantaneous and thus avoiding annoying timeout problems during
         * connect. 
         */
-       gdb_service->target->type->halt(gdb_service->target);
+       target_halt(gdb_service->target);
        
        /* remove the initial ACK from the incoming buffer */
        if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK)
@@ -732,7 +716,7 @@ int gdb_connection_closed(connection_t *connection)
        }
        else
        {
-               ERROR("BUG: connection->priv == NULL");
+               LOG_ERROR("BUG: connection->priv == NULL");
        }
 
        target_unregister_event_callback(gdb_target_callback_event_handler, connection);
@@ -787,7 +771,7 @@ void gdb_target_to_str(target_t *target, char *tstr, char *str)
 
        if (str_len % 2)
        {
-               ERROR("BUG: gdb value with uneven number of characters encountered");
+               LOG_ERROR("BUG: gdb value with uneven number of characters encountered");
                exit(-1);
        }
 
@@ -809,7 +793,7 @@ int gdb_get_registers_packet(connection_t *connection, target_t *target, char* p
        int i;
 
 #ifdef _DEBUG_GDB_IO_
-       DEBUG("-");
+       LOG_DEBUG("-");
 #endif
 
        if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
@@ -835,7 +819,7 @@ int gdb_get_registers_packet(connection_t *connection, target_t *target, char* p
        {
                char *reg_packet_p;
                reg_packet_p = strndup(reg_packet, CEIL(reg_packet_size, 8) * 2);
-               DEBUG("reg_packet: %s", reg_packet_p);
+               LOG_DEBUG("reg_packet: %s", reg_packet_p);
                free(reg_packet_p);
        }
 #endif
@@ -857,7 +841,7 @@ int gdb_set_registers_packet(connection_t *connection, target_t *target, char *p
        char *packet_p;
 
 #ifdef _DEBUG_GDB_IO_
-       DEBUG("-");
+       LOG_DEBUG("-");
 #endif
 
        /* skip command character */
@@ -866,7 +850,7 @@ int gdb_set_registers_packet(connection_t *connection, target_t *target, char *p
 
        if (packet_size % 2)
        {
-               WARNING("GDB set_registers packet with uneven characters received, dropping connection");
+               LOG_WARNING("GDB set_registers packet with uneven characters received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -894,7 +878,7 @@ int gdb_set_registers_packet(connection_t *connection, target_t *target, char *p
                arch_type = register_get_arch_type(reg_list[i]->arch_type);
                if (arch_type == NULL)
                {
-                       ERROR("BUG: encountered unregistered arch type");
+                       LOG_ERROR("BUG: encountered unregistered arch type");
                        exit(-1);
                }
                arch_type->set(reg_list[i], bin_buf);
@@ -923,7 +907,7 @@ int gdb_get_register_packet(connection_t *connection, target_t *target, char *pa
        int retval;
 
 #ifdef _DEBUG_GDB_IO_
-       DEBUG("-");
+       LOG_DEBUG("-");
 #endif
 
        if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
@@ -933,7 +917,7 @@ int gdb_get_register_packet(connection_t *connection, target_t *target, char *pa
 
        if (reg_list_size <= reg_num)
        {
-               ERROR("gdb requested a non-existing register");
+               LOG_ERROR("gdb requested a non-existing register");
                exit(-1);
        }
 
@@ -960,7 +944,7 @@ int gdb_set_register_packet(connection_t *connection, target_t *target, char *pa
        int retval;
        reg_arch_type_t *arch_type;
 
-       DEBUG("-");
+       LOG_DEBUG("-");
 
        if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
        {
@@ -969,13 +953,13 @@ int gdb_set_register_packet(connection_t *connection, target_t *target, char *pa
 
        if (reg_list_size < reg_num)
        {
-               ERROR("gdb requested a non-existing register");
+               LOG_ERROR("gdb requested a non-existing register");
                return ERROR_SERVER_REMOTE_CLOSED;      
        }
 
        if (*separator != '=')
        {
-               ERROR("GDB 'set register packet', but no '=' following the register number");
+               LOG_ERROR("GDB 'set register packet', but no '=' following the register number");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -991,7 +975,7 @@ int gdb_set_register_packet(connection_t *connection, target_t *target, char *pa
        arch_type = register_get_arch_type(reg_list[reg_num]->arch_type);
        if (arch_type == NULL)
        {
-               ERROR("BUG: encountered unregistered arch type");
+               LOG_ERROR("BUG: encountered unregistered arch type");
                exit(-1);
        }
        arch_type->set(reg_list[reg_num], bin_buf);
@@ -1023,7 +1007,7 @@ int gdb_error(connection_t *connection, int retval)
                        break;
                default:
                        /* This could be that the target reset itself. */
-                       ERROR("unexpected error %i", retval);
+                       LOG_ERROR("unexpected error %i", retval);
                        gdb_send_error(connection, EFAULT);
                        break;
        }
@@ -1054,7 +1038,7 @@ int gdb_read_memory_packet(connection_t *connection, target_t *target, char *pac
 
        if (*separator != ',')
        {
-               ERROR("incomplete read memory packet received, dropping connection");
+               LOG_ERROR("incomplete read memory packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -1062,7 +1046,7 @@ int gdb_read_memory_packet(connection_t *connection, target_t *target, char *pac
 
        buffer = malloc(len);
 
-       DEBUG("addr: 0x%8.8x, len: 0x%8.8x", addr, len);
+       LOG_DEBUG("addr: 0x%8.8x, len: 0x%8.8x", addr, len);
 
        retval = target_read_buffer(target, addr, len, buffer);
 
@@ -1128,7 +1112,7 @@ int gdb_write_memory_packet(connection_t *connection, target_t *target, char *pa
 
        if (*separator != ',')
        {
-               ERROR("incomplete write memory packet received, dropping connection");
+               LOG_ERROR("incomplete write memory packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -1136,13 +1120,13 @@ int gdb_write_memory_packet(connection_t *connection, target_t *target, char *pa
 
        if (*(separator++) != ':')
        {
-               ERROR("incomplete write memory packet received, dropping connection");
+               LOG_ERROR("incomplete write memory packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
        buffer = malloc(len);
 
-       DEBUG("addr: 0x%8.8x, len: 0x%8.8x", addr, len);
+       LOG_DEBUG("addr: 0x%8.8x, len: 0x%8.8x", addr, len);
 
        for (i=0; i<len; i++)
        {
@@ -1182,7 +1166,7 @@ int gdb_write_memory_binary_packet(connection_t *connection, target_t *target, c
 
        if (*separator != ',')
        {
-               ERROR("incomplete write memory binary packet received, dropping connection");
+               LOG_ERROR("incomplete write memory binary packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -1190,14 +1174,14 @@ int gdb_write_memory_binary_packet(connection_t *connection, target_t *target, c
 
        if (*(separator++) != ':')
        {
-               ERROR("incomplete write memory binary packet received, dropping connection");
+               LOG_ERROR("incomplete write memory binary packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
        retval = ERROR_OK;
        if (len)
        {
-               DEBUG("addr: 0x%8.8x, len: 0x%8.8x", addr, len);
+               LOG_DEBUG("addr: 0x%8.8x, len: 0x%8.8x", addr, len);
 
                retval = target_write_buffer(target, addr, len, (u8*)separator);
        }
@@ -1220,7 +1204,7 @@ void gdb_step_continue_packet(connection_t *connection, target_t *target, char *
        int current = 0;
        u32 address = 0x0;
 
-       DEBUG("-");
+       LOG_DEBUG("-");
 
        if (packet_size > 1)
        {
@@ -1234,12 +1218,13 @@ void gdb_step_continue_packet(connection_t *connection, target_t *target, char *
 
        if (packet[0] == 'c')
        {
-               DEBUG("continue");
-               target->type->resume(target, current, address, 0, 0); /* resume at current address, don't handle breakpoints, not debugging */
+               LOG_DEBUG("continue");
+               target_invoke_script(connection->cmd_ctx, target, "pre_resume");
+               target_resume(target, current, address, 0, 0); /* resume at current address, don't handle breakpoints, not debugging */
        }
        else if (packet[0] == 's')
        {
-               DEBUG("step");
+               LOG_DEBUG("step");
                target->type->step(target, current, address, 0); /* step at current or address, don't handle breakpoints */
        }
 }
@@ -1254,7 +1239,7 @@ int gdb_breakpoint_watchpoint_packet(connection_t *connection, target_t *target,
        char *separator;
        int retval;
 
-       DEBUG("-");
+       LOG_DEBUG("-");
 
        type = strtoul(packet + 1, &separator, 16);
 
@@ -1271,7 +1256,7 @@ int gdb_breakpoint_watchpoint_packet(connection_t *connection, target_t *target,
 
        if (*separator != ',')
        {
-               ERROR("incomplete breakpoint/watchpoint packet received, dropping connection");
+               LOG_ERROR("incomplete breakpoint/watchpoint packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -1279,7 +1264,7 @@ int gdb_breakpoint_watchpoint_packet(connection_t *connection, target_t *target,
 
        if (*separator != ',')
        {
-               ERROR("incomplete breakpoint/watchpoint packet received, dropping connection");
+               LOG_ERROR("incomplete breakpoint/watchpoint packet received, dropping connection");
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
@@ -1421,6 +1406,24 @@ int gdb_calc_blocksize(flash_bank_t *bank)
        return block_size;
 }
 
+static int compare_bank (const void * a, const void * b)
+{
+       flash_bank_t *b1, *b2;
+       b1=*((flash_bank_t **)a);
+       b2=*((flash_bank_t **)b);
+       
+       if (b1->base==b2->base)
+       {
+               return 0;
+       } else if (b1->base>b2->base)
+       {
+               return 1;
+       } else
+       {
+               return -1;
+       }
+}
+
 int gdb_query_packet(connection_t *connection, target_t *target, char *packet, int packet_size)
 {
        command_context_t *cmd_ctx = connection->cmd_ctx;
@@ -1442,9 +1445,9 @@ int gdb_query_packet(connection_t *connection, target_t *target, char *packet, i
 
                        /* We want to print all debug output to GDB connection */
                        log_add_callback(gdb_log_callback, connection);
-                       target_call_timer_callbacks();
+                       target_call_timer_callbacks_now();
                        command_run_line(cmd_ctx, cmd);
-                       target_call_timer_callbacks();
+                       target_call_timer_callbacks_now();
                        log_remove_callback(gdb_log_callback, connection);
                        free(cmd);
                }
@@ -1469,7 +1472,7 @@ int gdb_query_packet(connection_t *connection, target_t *target, char *packet, i
 
                        if (*separator != ',')
                        {
-                               ERROR("incomplete read memory packet received, dropping connection");
+                               LOG_ERROR("incomplete read memory packet received, dropping connection");
                                return ERROR_SERVER_REMOTE_CLOSED;
                        }
 
@@ -1541,23 +1544,63 @@ int gdb_query_packet(connection_t *connection, target_t *target, char *packet, i
                length = strtoul(separator + 1, &separator, 16);
 
                xml_printf(&retval, &xml, &pos, &size, "<memory-map>\n");
-
+       
+               /* 
+               sort banks in ascending order, we need to make non-flash memory be ram(or rather
+               read/write) by default for GDB.
+               GDB does not have a concept of non-cacheable read/write memory.
+                */
+               flash_bank_t **banks=malloc(sizeof(flash_bank_t *)*flash_get_bank_count());
                int i;
+               
                for (i=0; i<flash_get_bank_count(); i++)
                {
                        p = get_flash_bank_by_num(i);
                        if (p == NULL)
-                               break;
-
+                       {
+                               free(banks);
+                               retval = ERROR_FAIL;
+                               gdb_send_error(connection, retval);
+                               return retval;
+                       }
+                       banks[i]=p;
+               }
+               
+               qsort(banks, flash_get_bank_count(), sizeof(flash_bank_t *), compare_bank);
+               
+               u32 ram_start=0;
+               for (i=0; i<flash_get_bank_count(); i++)
+               {
+                       p = banks[i];
+                       
+                       if (ram_start<p->base)
+                       {
+                               xml_printf(&retval, &xml, &pos, &size, "<memory type=\"ram\" start=\"0x%x\" length=\"0x%x\"/>\n",
+                                       ram_start, p->base-ram_start);
+                       }
+                       
                        /* if device has uneven sector sizes, eg. str7, lpc
                         * we pass the smallest sector size to gdb memory map */
                        blocksize = gdb_calc_blocksize(p);
-
+       
                        xml_printf(&retval, &xml, &pos, &size, "<memory type=\"flash\" start=\"0x%x\" length=\"0x%x\">\n" \
                                "<property name=\"blocksize\">0x%x</property>\n" \
                                "</memory>\n", \
                                p->base, p->size, blocksize);
+                       ram_start=p->base+p->size;                      
                }
+               if (ram_start!=0)
+               {
+                       xml_printf(&retval, &xml, &pos, &size, "<memory type=\"ram\" start=\"0x%x\" length=\"0x%x\"/>\n",
+                               ram_start, 0-ram_start);
+               } else
+               {
+                       /* a flash chip could be at the very end of the 32 bit address space, in which case
+                       ram_start will be precisely 0 */
+               }
+               
+               free(banks);
+               banks = NULL;
 
                xml_printf(&retval, &xml, &pos, &size, "</memory-map>\n");
 
@@ -1616,7 +1659,7 @@ int gdb_query_packet(connection_t *connection, target_t *target, char *packet, i
                        return retval;
                }
 
-               gdb_put_packet(connection, xml, strlen(xml) + 1);
+               gdb_put_packet(connection, xml, strlen(xml));
 
                free(xml);
                return ERROR_OK;
@@ -1648,7 +1691,7 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
                char *parse = packet + 12;
                if (*parse == '\0')
                {
-                       ERROR("incomplete vFlashErase packet received, dropping connection");
+                       LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
                        return ERROR_SERVER_REMOTE_CLOSED;
                }
 
@@ -1656,7 +1699,7 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
                if (*(parse++) != ',' || *parse == '\0')
                {
-                       ERROR("incomplete vFlashErase packet received, dropping connection");
+                       LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
                        return ERROR_SERVER_REMOTE_CLOSED;
                }
 
@@ -1664,7 +1707,7 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
                if (*parse != '\0')
                {
-                       ERROR("incomplete vFlashErase packet received, dropping connection");
+                       LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
                        return ERROR_SERVER_REMOTE_CLOSED;
                }
 
@@ -1682,7 +1725,7 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
                         * treat a failed erase as an I/O error
                         */
                        gdb_send_error(connection, EIO);
-                       ERROR("flash_erase returned %i", result);
+                       LOG_ERROR("flash_erase returned %i", result);
                }
                else
                        gdb_put_packet(connection, "OK", 2);
@@ -1698,13 +1741,13 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
                if (*parse == '\0')
                {
-                       ERROR("incomplete vFlashErase packet received, dropping connection");
+                       LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
                        return ERROR_SERVER_REMOTE_CLOSED;
                }
                addr = strtoul(parse, &parse, 16);
                if (*(parse++) != ':')
                {
-                       ERROR("incomplete vFlashErase packet received, dropping connection");
+                       LOG_ERROR("incomplete vFlashErase packet received, dropping connection");
                        return ERROR_SERVER_REMOTE_CLOSED;
                }
                length = packet_size - (parse - packet);
@@ -1739,7 +1782,7 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
                        }
                else
                {
-                       DEBUG("wrote %u bytes from vFlash image to flash", written);
+                       LOG_DEBUG("wrote %u bytes from vFlash image to flash", written);
                        gdb_put_packet(connection, "OK", 2);
                }
 
@@ -1759,15 +1802,17 @@ int gdb_detach(connection_t *connection, target_t *target)
        switch( detach_mode )
        {
                case GDB_DETACH_RESUME:
-                       target->type->resume(target, 1, 0, 1, 0);
+                       target_invoke_script(connection->cmd_ctx, target, "pre_resume");
+                       target_resume(target, 1, 0, 1, 0);
                        break;
 
                case GDB_DETACH_RESET:
-                       target_process_reset(connection->cmd_ctx);
+                       /* FIX?? make this configurable?? */
+                       target_process_reset(connection->cmd_ctx, RESET_HALT);
                        break;
 
                case GDB_DETACH_HALT:
-                       target->type->halt(target);
+                       target_halt(target);
                        break;
 
                case GDB_DETACH_NOTHING:
@@ -1794,11 +1839,14 @@ static void gdb_log_callback(void *priv, const char *file, int line,
        gdb_output_con(connection, string);
 }
 
+/* Do not allocate this on the stack */
+char gdb_packet_buffer[GDB_BUFFER_SIZE];
+
 int gdb_input_inner(connection_t *connection)
 {
        gdb_service_t *gdb_service = connection->service->priv;
        target_t *target = gdb_service->target;
-       char packet[GDB_BUFFER_SIZE];
+       char *packet=gdb_packet_buffer;
        int packet_size;
        int retval;
        gdb_connection_t *gdb_con = connection->priv;
@@ -1816,7 +1864,7 @@ int gdb_input_inner(connection_t *connection)
                /* terminate with zero */
                packet[packet_size] = 0;
 
-               DEBUG("received packet: '%s'", packet);
+               LOG_DEBUG("received packet: '%s'", packet);
 
                if (packet_size > 0)
                {
@@ -1859,12 +1907,24 @@ int gdb_input_inner(connection_t *connection)
                                case 'c':
                                case 's':
                                        {
-                                       /* We're running/stepping, in which case we can
-                                        * forward log output until the target is halted */
-                                               gdb_connection_t *gdb_con = connection->priv;
-                                               gdb_con->frontend_state = TARGET_RUNNING;
-                                               log_add_callback(gdb_log_callback, connection);
-                                               gdb_step_continue_packet(connection, target, packet, packet_size);
+                                               if (target->state != TARGET_HALTED)
+                                               {
+                                                       /* If the target isn't in the halted state, then we can't
+                                                        * step/continue. This might be early setup, etc.
+                                                        */
+                                                       char sig_reply[4];
+                                                       snprintf(sig_reply, 4, "T%2.2x", 2);
+                                                       gdb_put_packet(connection, sig_reply, 3);
+                                               } else
+                                               {
+                                                       /* We're running/stepping, in which case we can
+                                                        * forward log output until the target is halted 
+                                                        */
+                                                       gdb_connection_t *gdb_con = connection->priv;
+                                                       gdb_con->frontend_state = TARGET_RUNNING;
+                                                       log_add_callback(gdb_log_callback, connection);
+                                                       gdb_step_continue_packet(connection, target, packet, packet_size);
+                                               }
                                        }
                                        break;
                                case 'v':
@@ -1890,11 +1950,12 @@ int gdb_input_inner(connection_t *connection)
                                        break;
                                case 'R':
                                        /* handle extended restart packet */
-                                       target_process_reset(connection->cmd_ctx);
+                                       /* fix?? make this configurable? */
+                                       target_process_reset(connection->cmd_ctx, RESET_HALT);
                                        break;
                                default:
                                        /* ignore unkown packets */
-                                       DEBUG("ignoring 0x%2.2x packet", packet[0]);
+                                       LOG_DEBUG("ignoring 0x%2.2x packet", packet[0]);
                                        gdb_put_packet(connection, NULL, 0);
                                        break;
                        }
@@ -1908,7 +1969,7 @@ int gdb_input_inner(connection_t *connection)
                {
                        if (target->state == TARGET_RUNNING)
                        {
-                               target->type->halt(target);
+                               target_halt(target);
                                gdb_con->ctrl_c = 0;
                        }
                }
@@ -1941,13 +2002,13 @@ int gdb_init()
 
        if (!target)
        {
-               WARNING("no gdb ports allocated as no target has been specified");
+               LOG_WARNING("no gdb ports allocated as no target has been specified");
                return ERROR_OK;
        }
 
        if (gdb_port == 0)
        {
-               WARNING("no gdb port specified, using default port 3333");
+               LOG_WARNING("no gdb port specified, using default port 3333");
                gdb_port = 3333;
        }
 
@@ -1962,7 +2023,7 @@ int gdb_init()
 
                add_service("gdb", CONNECTION_GDB, gdb_port + i, 1, gdb_new_connection, gdb_input, gdb_connection_closed, gdb_service);
 
-               DEBUG("gdb service for target %s at port %i", target->type->name, gdb_port + i);
+               LOG_DEBUG("gdb service for target %s at port %i", target->type->name, gdb_port + i);
 
                i++;
                target = target->next;
@@ -2010,7 +2071,7 @@ int handle_gdb_detach_command(struct command_context_s *cmd_ctx, char *cmd, char
                }
        }
 
-       WARNING("invalid gdb_detach configuration directive: %s", args[0]);
+       LOG_WARNING("invalid gdb_detach configuration directive: %s", args[0]);
        return ERROR_OK;
 }
 
@@ -2030,7 +2091,7 @@ int handle_gdb_memory_map_command(struct command_context_s *cmd_ctx, char *cmd,
                }
        }
 
-       WARNING("invalid gdb_memory_map configuration directive: %s", args[0]);
+       LOG_WARNING("invalid gdb_memory_map configuration directive: %s", args[0]);
        return ERROR_OK;
 }
 
@@ -2050,7 +2111,7 @@ int handle_gdb_flash_program_command(struct command_context_s *cmd_ctx, char *cm
                }
        }
 
-       WARNING("invalid gdb_memory_map configuration directive: %s", args[0]);
+       LOG_WARNING("invalid gdb_memory_map configuration directive: %s", args[0]);
        return ERROR_OK;
 }
 
@@ -2070,7 +2131,7 @@ int handle_gdb_report_data_abort_command(struct command_context_s *cmd_ctx, char
                }
        }
 
-       WARNING("invalid gdb_report_data_abort configuration directive: %s", args[0]);
+       LOG_WARNING("invalid gdb_report_data_abort configuration directive: %s", args[0]);
        return ERROR_OK;
 }
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)