diff options
author | ntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-10-08 13:12:39 +0000 |
---|---|---|
committer | ntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2007-10-08 13:12:39 +0000 |
commit | ce8768f46345e3f88ca6f8f0b88603d79e22d89a (patch) | |
tree | e2699853fff61fbb58fd4579bb30e30789d894a6 /src/server | |
parent | 995326b6000773efd454e308d487dec0b9f564b5 (diff) | |
download | riscv-openocd-ce8768f46345e3f88ca6f8f0b88603d79e22d89a.zip riscv-openocd-ce8768f46345e3f88ca6f8f0b88603d79e22d89a.tar.gz riscv-openocd-ce8768f46345e3f88ca6f8f0b88603d79e22d89a.tar.bz2 |
- cleaned up str7, str9 and stm32 flash drivers
- str7 flash driver now checks correct busy bits depending on device
- str9 flash driver now disables ITCM order as per st programming manual
- added str7 disable_jtag command
- added gdb_detach command
- updated arm966e cp15 support
- fix crash on mingw build when enabling target_request debugmsgs
git-svn-id: svn://svn.berlios.de/openocd/trunk@209 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/gdb_server.c | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index f579de1..74928c8 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -44,6 +44,16 @@ static unsigned short gdb_port; +enum gdb_detach_mode +{ + GDB_DETACH_RESUME, + GDB_DETACH_RESET, + GDB_DETACH_HALT, + GDB_DETACH_NOTHING +}; + +enum gdb_detach_mode detach_mode = GDB_DETACH_RESUME; + int gdb_last_signal(target_t *target) { switch (target->debug_reason) @@ -172,7 +182,6 @@ int gdb_put_packet(connection_t *connection, char *buffer, int len) while (1) { - debug_buffer = malloc(len + 1); memcpy(debug_buffer, buffer, len); debug_buffer[len] = 0; @@ -1304,6 +1313,31 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p return ERROR_OK; } +int gdb_detach(connection_t *connection, target_t *target) +{ + switch( detach_mode ) + { + case GDB_DETACH_RESUME: + target->type->resume(target, 1, 0, 1, 0); + break; + + case GDB_DETACH_RESET: + target_process_reset(connection->cmd_ctx); + break; + + case GDB_DETACH_HALT: + target->type->halt(target); + break; + + case GDB_DETACH_NOTHING: + break; + } + + gdb_put_packet(connection, "OK", 2); + + return ERROR_OK; +} + int gdb_input(connection_t *connection) { gdb_service_t *gdb_service = connection->service->priv; @@ -1383,8 +1417,7 @@ int gdb_input(connection_t *connection) retval = gdb_v_packet(connection, target, packet, packet_size); break; case 'D': - target->type->resume(target, 1, 0, 1, 0); - gdb_put_packet(connection, "OK", 2); + retval = gdb_detach(connection, target); break; case 'X': if ((retval = gdb_write_memory_binary_packet(connection, target, packet, packet_size)) != ERROR_OK) @@ -1470,10 +1503,42 @@ int handle_gdb_port_command(struct command_context_s *cmd_ctx, char *cmd, char * return ERROR_OK; } +int handle_gdb_detach_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; + } + } + + WARNING("invalid gdb_detach configuration directive: %s", args[0]); + 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, ""); - + register_command(command_context, NULL, "gdb_detach", handle_gdb_detach_command, + COMMAND_CONFIG, ""); + return ERROR_OK; } |