* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
- * Copyright (C) 2007,2008 Øyvind Harboe *
+ * Copyright (C) 2007,2008 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
* Copyright (C) 2008 by Spencer Oliver *
break;
if ((retval = gdb_get_char(connection, &reply)) != ERROR_OK)
return retval;
- if ( reply == '$' ){
+ if (reply == '$') {
/* fix a problem with some IAR tools */
- gdb_putback_char( connection, reply );
+ gdb_putback_char(connection, reply);
LOG_DEBUG("Unexpected start of new packet");
break;
}
log_remove_callback(gdb_log_callback, connection);
LOG_WARNING("negative reply, retrying");
}
- else if ( reply == '$' ){
+ else if (reply == '$') {
LOG_ERROR("GDB missing ack(1) - assumed good");
- gdb_putback_char( connection, reply );
+ gdb_putback_char(connection, reply);
return ERROR_OK;
} else {
return ERROR_SERVER_REMOTE_CLOSED;
}
}
- else if ( reply == '$' ){
+ else if (reply == '$') {
LOG_ERROR("GDB missing ack(2) - assumed good");
- gdb_putback_char( connection, reply );
+ gdb_putback_char(connection, reply);
return ERROR_OK;
}
else
{
gdb_connection_t *gdb_connection = connection->priv;
- /* In the GDB protocol when we are stepping or coninuing execution,
+ /* In the GDB protocol when we are stepping or continuing execution,
* we have a lingering reply. Upon receiving a halted event
* when we have that lingering packet, we reply to the original
* step or continue packet.
int retval;
connection_t *connection = priv;
- target_handle_event( target, event );
+ target_handle_event(target, event);
switch (event)
{
case TARGET_EVENT_EARLY_HALTED:
target_call_event_callbacks(target, TARGET_EVENT_GDB_END);
break;
case TARGET_EVENT_GDB_FLASH_ERASE_START:
- target_handle_event( target, TARGET_EVENT_OLD_gdb_program_config );
+ target_handle_event(target, TARGET_EVENT_OLD_gdb_program_config);
if ((retval = jtag_execute_queue()) != ERROR_OK)
{
return retval;
*/
if (initial_ack != '+')
gdb_putback_char(connection, initial_ack);
- target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_ATTACH );
+ target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_ATTACH);
gdb_actual_connections++;
+ LOG_DEBUG("New GDB Connection: %d, Target %s, state: %s",
+ gdb_actual_connections,
+ gdb_service->target->cmd_name,
+ target_state_name(gdb_service->target));
return ERROR_OK;
}
gdb_service_t *gdb_service = connection->service->priv;
gdb_connection_t *gdb_connection = connection->priv;
+ /* we're done forwarding messages. Tear down callback before
+ * cleaning up connection.
+ */
+ log_remove_callback(gdb_log_callback, connection);
+
gdb_actual_connections--;
+ LOG_DEBUG("GDB Close, Target: %s, state: %s, gdb_actual_connections=%d",
+ gdb_service->target->cmd_name,
+ target_state_name(gdb_service->target),
+ gdb_actual_connections);
/* see if an image built with vFlash commands is left */
if (gdb_connection->vflash_image)
LOG_ERROR("BUG: connection->priv == NULL");
}
+
target_unregister_event_callback(gdb_target_callback_event_handler, connection);
+
target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_END);
- log_remove_callback(gdb_log_callback, connection);
- target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_DETACH );
+ target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_DETACH);
return ERROR_OK;
}
void gdb_send_error(connection_t *connection, uint8_t the_error)
{
char err[4];
- snprintf(err, 4, "E%2.2X", the_error );
+ snprintf(err, 4, "E%2.2X", the_error);
gdb_put_packet(connection, err, 3);
}
if (packet[0] == 'c')
{
LOG_DEBUG("continue");
- target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
+ target_handle_event(target, TARGET_EVENT_OLD_pre_resume);
retval = target_resume(target, current, address, 0, 0); /* resume at current address, don't handle breakpoints, not debugging */
}
else if (packet[0] == 's')
/* perform any target specific operations before the erase */
target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_ERASE_START);
- result = flash_erase_address_range(gdb_service->target, addr, length );
+ result = flash_erase_address_range(gdb_service->target, addr, length);
target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_ERASE_END);
/* perform erase */
target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_WRITE_START);
result = flash_write(gdb_service->target, gdb_connection->vflash_image, &written, 0);
target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_WRITE_END);
- if ( result != ERROR_OK)
+ if (result != ERROR_OK)
{
if (result == ERROR_FLASH_DST_OUT_OF_BANK)
gdb_put_packet(connection, "E.memtype", 9);
int gdb_detach(connection_t *connection, target_t *target)
{
- switch ( detach_mode )
+ switch (detach_mode)
{
case GDB_DETACH_RESUME:
- target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
+ target_handle_event(target, TARGET_EVENT_OLD_pre_resume);
target_resume(target, 1, 0, 1, 0);
break;
/* terminate with zero */
packet[packet_size] = 0;
- if ( LOG_LEVEL_IS( LOG_LVL_DEBUG ) ){
- if ( packet[0] == 'X' ){
+ if (LOG_LEVEL_IS(LOG_LVL_DEBUG)) {
+ if (packet[0] == 'X') {
// binary packets spew junk into the debug log stream
char buf[ 50 ];
int x;
- for ( x = 0 ; (x < 49) && (packet[x] != ':') ; x++ ){
+ for (x = 0 ; (x < 49) && (packet[x] != ':') ; x++) {
buf[x] = packet[x];
}
buf[x] = 0;
- LOG_DEBUG("received packet: '%s:<binary-data>'", buf );
+ LOG_DEBUG("received packet: '%s:<binary-data>'", buf);
} else {
- LOG_DEBUG("received packet: '%s'", packet );
+ LOG_DEBUG("received packet: '%s'", packet);
}
}
/* handle extended restart packet */
breakpoint_clear_target(gdb_service->target);
watchpoint_clear_target(gdb_service->target);
- command_run_linef(connection->cmd_ctx, "ocd_gdb_restart %d", get_num_by_target(target));
+ command_run_linef(connection->cmd_ctx,
+ "ocd_gdb_restart %s",
+ target->cmd_name);
break;
default:
/* ignore unkown packets */
}
else
{
+ unsigned short port = gdb_port;
+
while (target)
{
gdb_service = malloc(sizeof(gdb_service_t));
gdb_service->target = target;
- add_service("gdb", CONNECTION_TCP, gdb_port + target->target_number, 1, gdb_new_connection, gdb_input, gdb_connection_closed, gdb_service);
+ add_service("gdb", CONNECTION_TCP,
+ port, 1,
+ gdb_new_connection, gdb_input,
+ gdb_connection_closed, gdb_service);
- LOG_DEBUG("gdb service for target %s at port %i",
+ LOG_DEBUG("gdb service for target %s at TCP port %i",
target_get_name(target),
- gdb_port + target->target_number);
+ port);
target = target->next;
+ port++;
}
}
return ERROR_OK;
}
- /* only if the port wasn't overwritten by cmdline */
- if (gdb_port == 0)
- gdb_port = strtoul(args[0], NULL, 0);
+ gdb_port = strtoul(args[0], NULL, 0);
return ERROR_OK;
}