char hex_buffer[len * 2 + 1];
uint8_t buffer[len];
buf_set_u32(buffer, 0, len * 8, target->gdb_service->core[0]);
- int pkt_len = hexify(hex_buffer, (char *)buffer, sizeof(buffer), sizeof(hex_buffer));
+ size_t pkt_len = hexify(hex_buffer, buffer, sizeof(buffer),
+ sizeof(hex_buffer));
retval = gdb_put_packet(connection, hex_buffer, pkt_len);
}
return retval;
}
+
+COMMAND_HANDLER(default_handle_smp_command)
+{
+ struct target *target = get_current_target(CMD_CTX);
+ struct target_list *head;
+
+ if (CMD_ARGC > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ if (!CMD_ARGC) {
+ command_print(CMD, "%s", target->smp ? "on" : "off");
+ return ERROR_OK;
+ }
+
+ if (!strcmp(CMD_ARGV[0], "on")) {
+ foreach_smp_target(head, target->head)
+ head->target->smp = 1;
+
+ return ERROR_OK;
+ }
+
+ if (!strcmp(CMD_ARGV[0], "off")) {
+ foreach_smp_target(head, target->head)
+ head->target->smp = 0;
+
+ /* fixes the target display to the debugger */
+ if (target->head)
+ target->gdb_service->target = target;
+
+ return ERROR_OK;
+ }
+
+ return ERROR_COMMAND_SYNTAX_ERROR;
+}
+
+COMMAND_HANDLER(handle_smp_gdb_command)
+{
+ struct target *target = get_current_target(CMD_CTX);
+ int retval = ERROR_OK;
+ struct target_list *head;
+ head = target->head;
+ if (head) {
+ if (CMD_ARGC == 1) {
+ int coreid = 0;
+ COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], coreid);
+ if (retval != ERROR_OK)
+ return retval;
+ target->gdb_service->core[1] = coreid;
+
+ }
+ command_print(CMD, "gdb coreid %" PRId32 " -> %" PRId32, target->gdb_service->core[0]
+ , target->gdb_service->core[1]);
+ }
+ return ERROR_OK;
+}
+
+const struct command_registration smp_command_handlers[] = {
+ {
+ .name = "smp",
+ .handler = default_handle_smp_command,
+ .mode = COMMAND_EXEC,
+ .help = "smp handling",
+ .usage = "[on|off]",
+ },
+ {
+ .name = "smp_gdb",
+ .handler = handle_smp_gdb_command,
+ .mode = COMMAND_EXEC,
+ .help = "display/fix current core played to gdb",
+ .usage = "",
+ },
+ COMMAND_REGISTRATION_DONE
+};