#include "config.h"
#endif
-#include "replacements.h"
-
#include "gdb_server.h"
-
+#include "target_request.h"
+#include "register.h"
#include "server.h"
-#include "log.h"
-#include "binarybuffer.h"
-#include "jtag.h"
-#include "breakpoints.h"
#include "flash.h"
-#include "target.h"
-#include "target_request.h"
-#include "configuration.h"
+#include "image.h"
+#include "jtag.h"
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
#if 0
#define _DEBUG_GDB_IO_
/* target behaviour on gdb detach */
enum gdb_detach_mode detach_mode = GDB_DETACH_RESUME;
+/* number of gdb connections, mainly to supress gdb related debugging spam
+ * in helper/log.c when no gdb connections are actually active */
+int gdb_actual_connections;
+
/* set if we are sending a memory map to gdb
* via qXfer:memory-map:read packet */
/* enabled by default*/
tv.tv_sec = timeout_s;
tv.tv_usec = 0;
- if (select(connection->fd + 1, &read_fds, NULL, NULL, &tv) == 0)
+ if (socket_select(connection->fd + 1, &read_fds, NULL, NULL, &tv) == 0)
{
/* This can typically be because a "monitor" command took too long
* before printing any progress messages
char local_buffer[1024];
local_buffer[0] = '$';
- if (len+4 <= sizeof(local_buffer))
+ if ((size_t)len + 4 <= sizeof(local_buffer))
{
/* performance gain on smaller packets by only a single call to gdb_write() */
memcpy(local_buffer+1, buffer, len++);
- int checksum_ok;
+ int checksum_ok = 0;
/* explicit code expansion here to get faster inlined code in -O3 by not
* calculating checksum
*/
if (initial_ack != '+')
gdb_putback_char(connection, initial_ack);
target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_ATTACH );
+
+ gdb_actual_connections++;
+
return ERROR_OK;
}
gdb_service_t *gdb_service = connection->service->priv;
gdb_connection_t *gdb_connection = connection->priv;
+ gdb_actual_connections--;
+
/* see if an image built with vFlash commands is left */
if (gdb_connection->vflash_image)
{
LOG_DEBUG("-");
#endif
- if ((retval = target->type->get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
+ if ((retval = target_get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
{
return gdb_error(connection, retval);
}
return ERROR_SERVER_REMOTE_CLOSED;
}
- if ((retval = target->type->get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
+ if ((retval = target_get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
{
return gdb_error(connection, retval);
}
LOG_DEBUG("-");
#endif
- if ((retval = target->type->get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
+ if ((retval = target_get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
{
return gdb_error(connection, retval);
}
LOG_DEBUG("-");
- if ((retval = target->type->get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
+ if ((retval = target_get_gdb_reg_list(target, ®_list, ®_list_size)) != ERROR_OK)
{
return gdb_error(connection, retval);
}
{
hex_buffer = malloc(len * 2 + 1);
- int i;
+ u32 i;
for (i = 0; i < len; i++)
{
u8 t = buffer[i];
u8 *buffer;
- int i;
+ u32 i;
int retval;
/* skip command character */
else if (packet[0] == 's')
{
LOG_DEBUG("step");
- retval=target->type->step(target, current, address, 0); /* step at current or address, don't handle breakpoints */
+ /* step at current or address, don't handle breakpoints */
+ retval = target_step(target, current, address, 0);
}
return retval;
}
int gdb_calc_blocksize(flash_bank_t *bank)
{
- int i;
- int block_size = 0xffffffff;
+ u32 i;
+ u32 block_size = 0xffffffff;
/* loop through all sectors and return smallest sector size */
- for (i = 0; i < bank->num_sectors; i++)
+ for (i = 0; i < (u32)bank->num_sectors; i++)
{
if (bank->sectors[i].size < block_size)
block_size = bank->sectors[i].size;
if (gdb_port == 0 && server_use_pipes == 0)
{
- LOG_WARNING("no gdb port specified, using default port 3333");
+ LOG_DEBUG("no gdb port specified, using default port 3333");
gdb_port = 3333;
}
add_service("gdb", CONNECTION_PIPE, 0, 1, gdb_new_connection, gdb_input, gdb_connection_closed, gdb_service);
- LOG_DEBUG("gdb service for target %s using pipes", target->type->name);
+ LOG_DEBUG("gdb service for target %s using pipes",
+ target_get_name(target));
}
else
{
add_service("gdb", CONNECTION_TCP, gdb_port + target->target_number, 1, gdb_new_connection, gdb_input, gdb_connection_closed, gdb_service);
- LOG_DEBUG("gdb service for target %s at port %i", target->type->name, gdb_port + target->target_number);
+ LOG_DEBUG("gdb service for target %s at port %i",
+ target_get_name(target),
+ gdb_port + target->target_number);
target = target->next;
}
}
register_command(command_context, NULL, "gdb_port", handle_gdb_port_command,
COMMAND_ANY, "daemon configuration command gdb_port");
register_command(command_context, NULL, "gdb_detach", handle_gdb_detach_command,
- COMMAND_CONFIG, "");
+ COMMAND_CONFIG, "resume/reset/halt/nothing - "
+ "specify behavior when GDB detaches from the target");
register_command(command_context, NULL, "gdb_memory_map", handle_gdb_memory_map_command,
COMMAND_CONFIG, "enable or disable memory map");
register_command(command_context, NULL, "gdb_flash_program", handle_gdb_flash_program_command,
COMMAND_CONFIG, "enable or disable flash program");
register_command(command_context, NULL, "gdb_report_data_abort", handle_gdb_report_data_abort_command,
- COMMAND_CONFIG, "enable or disable report data");
+ COMMAND_CONFIG, "enable or disable reporting data aborts");
register_command(command_context, NULL, "gdb_breakpoint_override", handle_gdb_breakpoint_override_command,
- COMMAND_EXEC, "hard/soft/disabled - force breakpoint type for gdb 'break' commands."
- "The raison d'etre for this option is to support GDB GUI's without "
- "a hard/soft breakpoint concept where the default OpenOCD behaviour "
- "is not sufficient");
+ COMMAND_EXEC, "hard/soft/disable - force breakpoint type for gdb 'break' commands.");
return ERROR_OK;
}