#include "rtos/rtos.h"
#include "target/smp.h"
-
/**
* @file
* GDB server implementation.
bool mem_write_error;
};
-
#if 0
#define _DEBUG_GDB_IO_
#endif
}
#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
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
breakpoint_clear_target(gdb_service->target);
watchpoint_clear_target(gdb_service->target);
+ /* clean previous rtos session if supported*/
+ if ((gdb_service->target->rtos) &&
+ (gdb_service->target->rtos->type->clean))
+ gdb_service->target->rtos->type->clean(gdb_service->target);
+
/* remove the initial ACK from the incoming buffer */
if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK)
return retval;
gdb_actual_connections++;
LOG_DEBUG("New GDB Connection: %d, Target %s, state: %s",
- gdb_actual_connections,
- target_name(gdb_service->target),
- target_state_name(gdb_service->target));
+ gdb_actual_connections,
+ target_name(gdb_service->target),
+ target_state_name(gdb_service->target));
/* DANGER! If we fail subsequently, we must remove this handler,
* otherwise we occasionally see crashes as the timer can invoke the
LOG_DEBUG("-");
#endif
- if ( ( target->rtos != NULL ) &&
- ( ERROR_FAIL != rtos_get_gdb_reg_list( connection, ®_list, ®_list_size) ) )
+ if ((target->rtos != NULL) &&
+ (ERROR_OK == rtos_get_gdb_reg_list(connection)))
{
return ERROR_OK;
}
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++)
#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);
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;
case 'c':
case 's':
{
+ gdb_thread_packet(connection, packet, packet_size);
log_add_callback(gdb_log_callback, connection);
if (gdb_con->mem_write_error)
command_run_linef(connection->cmd_ctx,
"ocd_gdb_restart %s",
target_name(target));
+ /* info rtos parts */
+ gdb_thread_packet(connection, packet, packet_size);
gdb_put_packet(connection, "OK", 2);
break;
{
curr = head->target;
if (curr != target) curr->gdb_service = gdb_service;
- head = head->next;
+ head = head->next;
}
}
return ret;
/* 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
.help = "next stepi will return immediately allowing "
"GDB to fetch register state without affecting "
"target state",
+ .usage = ""
},
{
.name = "gdb_port",