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
for (;;)
{
- retval=check_pending(connection, 1, NULL);
- if (retval!=ERROR_OK)
- return retval;
- gdb_con->buf_cnt = read_socket(connection->fd, gdb_con->buffer, GDB_BUFFER_SIZE);
+ if (connection->service->type == CONNECTION_PIPE)
+ {
+ gdb_con->buf_cnt = read(connection->fd, gdb_con->buffer, GDB_BUFFER_SIZE);
+ }
+ else
+ {
+ retval = check_pending(connection, 1, NULL);
+ if (retval != ERROR_OK)
+ return retval;
+ gdb_con->buf_cnt = read_socket(connection->fd, gdb_con->buffer, GDB_BUFFER_SIZE);
+ }
+
if (gdb_con->buf_cnt > 0)
{
break;
if (gdb_con->closed)
return ERROR_SERVER_REMOTE_CLOSED;
- if (write_socket(connection->fd, data, len) == len)
+ if (connection->service->type == CONNECTION_PIPE)
{
- return ERROR_OK;
+ /* write to stdout */
+ if (write(STDOUT_FILENO, data, len) == len)
+ {
+ return ERROR_OK;
+ }
+ }
+ else
+ {
+ if (write_socket(connection->fd, data, len) == len)
+ {
+ return ERROR_OK;
+ }
}
gdb_con->closed = 1;
return ERROR_SERVER_REMOTE_CLOSED;
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
*/
{
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 */
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 (retval == ERROR_SERVER_REMOTE_CLOSED)
return retval;
- /* logging does not propagate the error, yet can set th gdb_con->closed flag */
+ /* logging does not propagate the error, yet can set the gdb_con->closed flag */
if (gdb_con->closed)
return ERROR_SERVER_REMOTE_CLOSED;
return ERROR_OK;
}
- if (gdb_port == 0)
+ if (gdb_port == 0 && server_use_pipes == 0)
{
LOG_WARNING("no gdb port specified, using default port 3333");
gdb_port = 3333;
}
- while (target)
+ if (server_use_pipes)
{
- char service_name[8];
-
- snprintf(service_name, 8, "gdb-%2.2i", target->target_number);
+ /* only a single gdb connection when using a pipe */
gdb_service = malloc(sizeof(gdb_service_t));
gdb_service->target = target;
- add_service("gdb", CONNECTION_GDB,
- gdb_port + target->target_number,
- 1, gdb_new_connection, gdb_input,
- gdb_connection_closed,
- gdb_service);
+ add_service("gdb", CONNECTION_PIPE, 0, 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 using pipes", target->type->name);
+ }
+ else
+ {
+ 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);
- target = target->next;
+ LOG_DEBUG("gdb service for target %s at port %i", target->type->name, gdb_port + target->target_number);
+ target = target->next;
+ }
}
return ERROR_OK;
int gdb_register_commands(command_context_t *command_context)
{
register_command(command_context, NULL, "gdb_port", handle_gdb_port_command,
- COMMAND_CONFIG, "daemon configuration command gdb_port");
+ COMMAND_ANY, "daemon configuration command gdb_port");
register_command(command_context, NULL, "gdb_detach", handle_gdb_detach_command,
COMMAND_CONFIG, "");
register_command(command_context, NULL, "gdb_memory_map", handle_gdb_memory_map_command,
register_command(command_context, NULL, "gdb_report_data_abort", handle_gdb_report_data_abort_command,
COMMAND_CONFIG, "enable or disable report data");
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."
+ COMMAND_EXEC, "hard/soft/disable - 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");