Add documentation for new interface_list command to user guide.
[fw/openocd] / src / server / gdb_server.c
index 7ba5281bd7898413b42e682c4d8445a792801fbb..d5c3f3510ae9104097eba4de1898424403a1f169 100644 (file)
 #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_
@@ -71,6 +61,10 @@ enum gdb_detach_mode
 /* 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*/
@@ -807,6 +801,9 @@ int gdb_new_connection(connection_t *connection)
        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;
 }
 
@@ -815,6 +812,8 @@ int gdb_connection_closed(connection_t *connection)
        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)
        {
@@ -948,7 +947,7 @@ int gdb_get_registers_packet(connection_t *connection, target_t *target, char* p
        LOG_DEBUG("-");
 #endif
 
-       if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
+       if ((retval = target_get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
        {
                return gdb_error(connection, retval);
        }
@@ -1006,7 +1005,7 @@ int gdb_set_registers_packet(connection_t *connection, target_t *target, char *p
                return ERROR_SERVER_REMOTE_CLOSED;
        }
 
-       if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
+       if ((retval = target_get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
        {
                return gdb_error(connection, retval);
        }
@@ -1058,7 +1057,7 @@ int gdb_get_register_packet(connection_t *connection, target_t *target, char *pa
        LOG_DEBUG("-");
 #endif
 
-       if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
+       if ((retval = target_get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
        {
                return gdb_error(connection, retval);
        }
@@ -1093,7 +1092,7 @@ int gdb_set_register_packet(connection_t *connection, target_t *target, char *pa
 
        LOG_DEBUG("-");
 
-       if ((retval = target->type->get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
+       if ((retval = target_get_gdb_reg_list(target, &reg_list, &reg_list_size)) != ERROR_OK)
        {
                return gdb_error(connection, retval);
        }
@@ -1367,7 +1366,8 @@ int gdb_step_continue_packet(connection_t *connection, target_t *target, char *p
        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;
 }
@@ -2198,7 +2198,7 @@ int gdb_init(void)
 
        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;
        }
 
@@ -2211,7 +2211,8 @@ int gdb_init(void)
 
                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
        {
@@ -2222,7 +2223,9 @@ int gdb_init(void)
 
                        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;
                }
        }
@@ -2379,17 +2382,15 @@ int gdb_register_commands(command_context_t *command_context)
        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/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");
+                       COMMAND_EXEC, "hard/soft/disable - force breakpoint type for gdb 'break' commands.");
        return ERROR_OK;
 }