* warning only about subsequent ACK's. */
if (gdb_con->noack_mode > 1) {
LOG_WARNING("acknowledgment received, but no packet pending");
- } else {
+ } else if (gdb_con->noack_mode) {
LOG_DEBUG("Received first acknowledgment after entering noack mode. Ignoring it.");
gdb_con->noack_mode = 2;
}
static void gdb_signal_reply(struct target *target, struct connection *connection)
{
struct gdb_connection *gdb_connection = connection->priv;
- char sig_reply[20];
+ char sig_reply[45];
char stop_reason[20];
+ char current_thread[25];
int sig_reply_len;
int signal_var;
+ rtos_update_threads(target);
+
if (target->debug_reason == DBG_REASON_EXIT) {
sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "W00");
} else {
}
}
- sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "T%2.2x%s",
- signal_var, stop_reason);
+ current_thread[0] = '\0';
+ if (target->rtos != NULL) {
+ snprintf(current_thread, sizeof(current_thread), "thread:%016" PRIx64 ";", target->rtos->current_thread);
+ target->rtos->current_threadid = target->rtos->current_thread;
+ }
+
+ sig_reply_len = snprintf(sig_reply, sizeof(sig_reply), "T%2.2x%s%s",
+ signal_var, stop_reason, current_thread);
}
gdb_put_packet(connection, sig_reply, sig_reply_len);
gdb_connection->frontend_state = TARGET_HALTED;
- rtos_update_threads(target);
}
static void gdb_fileio_reply(struct target *target, struct connection *connection)
assert(reg_packet_size > 0);
reg_packet = malloc(reg_packet_size + 1); /* plus one for string termination null */
+ if (reg_packet == NULL)
+ return ERROR_FAIL;
+
reg_packet_p = reg_packet;
for (i = 0; i < reg_list_size; i++) {
/* Get a list of available target registers features. feature_list must
* be freed by caller.
*/
-static int get_reg_features_list(struct target *target, char **feature_list[], int *feature_list_size,
+static int get_reg_features_list(struct target *target, char const **feature_list[], int *feature_list_size,
struct reg **reg_list, int reg_list_size)
{
int tbl_sz = 0;
*/
for (int j = 0; j < (tbl_sz + 1); j++) {
if (!((*feature_list)[j])) {
- (*feature_list)[tbl_sz++] = strdup(reg_list[i]->feature->name);
+ (*feature_list)[tbl_sz++] = reg_list[i]->feature->name;
*feature_list = realloc(*feature_list, sizeof(char *) * (tbl_sz + 1));
(*feature_list)[tbl_sz] = NULL;
break;
int retval = ERROR_OK;
struct reg **reg_list = NULL;
int reg_list_size;
- char **features = NULL;
+ char const **features = NULL;
int feature_list_size = 0;
char *tdesc = NULL;
int pos = 0;
"</target>\n");
error:
-
- /* note: features[] contains (feature_list_size + 1) elements */
- for (int j = feature_list_size; j >= 0; j--)
- free(features[j]);
free(features);
free(reg_list);
int retval = ERROR_OK;
struct reg **reg_list = NULL;
int reg_list_size = 0;
- char **features = NULL;
+ char const **features = NULL;
int feature_list_size = 0;
retval = target_get_gdb_reg_list(target, ®_list,
}
error:
-
- /* note: features[] contains (feature_list_size + 1) elements */
- for (int j = feature_list_size; j >= 0; j--)
- free(features[j]);
free(features);
free(reg_list);