diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index cea5ad0db..bbcff58c5 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -509,6 +509,7 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len) my_checksum += character & 0xff; buffer[count++] = character & 0xff; } + } *len = count; @@ -678,6 +679,12 @@ int gdb_new_connection(connection_t *connection) * connect. */ target_halt(gdb_service->target); + /* FIX!!!! could extended-remote work better here? + * + * wait a tiny bit for halted state or we just continue. The + * GDB register packet will then contain garbage + */ + target_wait_state(gdb_service->target, TARGET_HALTED, 500); /* remove the initial ACK from the incoming buffer */ if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK) diff --git a/src/target/target.c b/src/target/target.c index 506a5d78b..e1341a0a3 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -1683,7 +1683,6 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args return ERROR_OK; } -static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms); int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { @@ -1729,11 +1728,12 @@ int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } } + target_t *target = get_current_target(cmd_ctx); - return wait_state(cmd_ctx, cmd, TARGET_HALTED, ms); + return target_wait_state(target, TARGET_HALTED, ms); } -static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms) +int target_wait_state(target_t *target, enum target_state state, int ms) { int retval; struct timeval timeout, now; @@ -1741,7 +1741,6 @@ static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_ gettimeofday(&timeout, NULL); timeval_add_time(&timeout, 0, ms * 1000); - target_t *target = get_current_target(cmd_ctx); for (;;) { if ((retval=target_poll(target))!=ERROR_OK) @@ -1754,7 +1753,7 @@ static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_ if (once) { once=0; - command_print(cmd_ctx, "waiting for target %s...", target_state_strings[state]); + LOG_USER("waiting for target %s...", target_state_strings[state]); } gettimeofday(&now, NULL); diff --git a/src/target/target.h b/src/target/target.h index f1c61e3bf..05dbbb91c 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -280,6 +280,7 @@ extern int target_write_buffer(struct target_s *target, u32 address, u32 size, u extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer); extern int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc); extern int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank); +extern int target_wait_state(target_t *target, enum target_state state, int ms); /* DANGER!!!!! *