static void gdb_log_callback(void *priv, const char *file, int line,
const char *function, const char *string);
-enum gdb_detach_mode
-{
- GDB_DETACH_RESUME,
- GDB_DETACH_RESET,
- GDB_DETACH_HALT,
- GDB_DETACH_NOTHING
-};
-
-/* 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;
int gdb_detach(connection_t *connection, target_t *target)
{
+ gdb_service_t *gdb_service = connection->service->priv;
- switch (detach_mode)
- {
- case GDB_DETACH_RESUME:
- target_handle_event(target, TARGET_EVENT_OLD_pre_resume);
- target_resume(target, 1, 0, 1, 0);
- break;
-
- case GDB_DETACH_RESET:
- /* FIX?? make this configurable?? */
- target_process_reset(connection->cmd_ctx, RESET_HALT);
- break;
-
- case GDB_DETACH_HALT:
- target_halt(target);
- break;
-
- case GDB_DETACH_NOTHING:
- break;
- }
+ target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_DETACH);
- gdb_put_packet(connection, "OK", 2);
- return ERROR_OK;
+ return gdb_put_packet(connection, "OK", 2);
}
static void gdb_log_callback(void *priv, const char *file, int line,
return ERROR_OK;
}
-int handle_gdb_sync_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_gdb_sync_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
if (argc != 0)
{
}
/* daemon configuration command gdb_port */
-int handle_gdb_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
- if (argc == 0)
- {
- command_print(cmd_ctx, "%d", gdb_port);
- return ERROR_OK;
- }
-
- gdb_port = strtoul(args[0], NULL, 0);
-
- return ERROR_OK;
-}
-
-int handle_gdb_detach_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_gdb_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- if (argc == 1)
- {
- if (strcmp(args[0], "resume") == 0)
- {
- detach_mode = GDB_DETACH_RESUME;
- return ERROR_OK;
- }
- else if (strcmp(args[0], "reset") == 0)
- {
- detach_mode = GDB_DETACH_RESET;
- return ERROR_OK;
- }
- else if (strcmp(args[0], "halt") == 0)
- {
- detach_mode = GDB_DETACH_HALT;
- return ERROR_OK;
- }
- else if (strcmp(args[0], "nothing") == 0)
- {
- detach_mode = GDB_DETACH_NOTHING;
- return ERROR_OK;
- }
- else
- LOG_WARNING("invalid gdb_detach configuration directive: %s", args[0]);
- }
-
- return ERROR_COMMAND_SYNTAX_ERROR;
+ return server_port_command(cmd_ctx, cmd, args, argc, &gdb_port);
}
-int handle_gdb_memory_map_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_gdb_memory_map_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
if (argc == 1)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
-int handle_gdb_flash_program_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_gdb_flash_program_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
if (argc == 1)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
-int handle_gdb_report_data_abort_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_gdb_report_data_abort_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
if (argc == 1)
{
}
/* gdb_breakpoint_override */
-int handle_gdb_breakpoint_override_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static int handle_gdb_breakpoint_override_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
if (argc == 0)
{
int gdb_register_commands(command_context_t *command_context)
{
- register_command(command_context, NULL, "gdb_sync", handle_gdb_sync_command,
- COMMAND_ANY, "next stepi will return immediately allowing GDB fetch register state without affecting target state");
- 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, "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 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.");
+ register_command(command_context, NULL, "gdb_sync",
+ handle_gdb_sync_command, COMMAND_ANY,
+ "next stepi will return immediately allowing GDB to "
+ "fetch register state without affecting target state");
+ register_command(command_context, NULL, "gdb_port",
+ handle_gdb_port_command, COMMAND_ANY,
+ "daemon configuration command gdb_port");
+ 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 reporting data aborts");
+ register_command(command_context, NULL, "gdb_breakpoint_override",
+ handle_gdb_breakpoint_override_command, COMMAND_EXEC,
+ "hard/soft/disable - force type of breakpoint "
+ "used by gdb 'break' commands.");
return ERROR_OK;
}