diff options
Diffstat (limited to 'src/target')
-rw-r--r-- | src/target/aarch64.c | 56 | ||||
-rw-r--r-- | src/target/cortex_a.c | 55 | ||||
-rw-r--r-- | src/target/mips_m4k.c | 55 | ||||
-rw-r--r-- | src/target/smp.c | 79 | ||||
-rw-r--r-- | src/target/smp.h | 5 |
5 files changed, 96 insertions, 154 deletions
diff --git a/src/target/aarch64.c b/src/target/aarch64.c index 1fafcfd4..ff68e3ad 100644 --- a/src/target/aarch64.c +++ b/src/target/aarch64.c @@ -29,6 +29,7 @@ #include "armv8_opcodes.h" #include "armv8_cache.h" #include "arm_semihosting.h" +#include "smp.h" #include <helper/time_support.h> enum restart_mode { @@ -63,9 +64,6 @@ static int aarch64_virt2phys(struct target *target, static int aarch64_read_cpu_memory(struct target *target, uint64_t address, uint32_t size, uint32_t count, uint8_t *buffer); -#define foreach_smp_target(pos, head) \ - for (pos = head; (pos != NULL); pos = pos->next) - static int aarch64_restore_system_control_reg(struct target *target) { enum arm_mode target_mode = ARM_MODE_ANY; @@ -2550,42 +2548,6 @@ COMMAND_HANDLER(aarch64_handle_dbginit_command) return aarch64_init_debug_access(target); } -COMMAND_HANDLER(aarch64_handle_smp_off_command) -{ - struct target *target = get_current_target(CMD_CTX); - /* check target is an smp target */ - struct target_list *head; - struct target *curr; - head = target->head; - target->smp = 0; - if (head != (struct target_list *)NULL) { - while (head != (struct target_list *)NULL) { - curr = head->target; - curr->smp = 0; - head = head->next; - } - /* fixes the target display to the debugger */ - target->gdb_service->target = target; - } - return ERROR_OK; -} - -COMMAND_HANDLER(aarch64_handle_smp_on_command) -{ - struct target *target = get_current_target(CMD_CTX); - struct target_list *head; - struct target *curr; - head = target->head; - if (head != (struct target_list *)NULL) { - target->smp = 1; - while (head != (struct target_list *)NULL) { - curr = head->target; - curr->smp = 1; - head = head->next; - } - } - return ERROR_OK; -} COMMAND_HANDLER(aarch64_mask_interrupts_command) { @@ -2767,19 +2729,6 @@ static const struct command_registration aarch64_exec_command_handlers[] = { .help = "Initialize core debug", .usage = "", }, - { .name = "smp_off", - .handler = aarch64_handle_smp_off_command, - .mode = COMMAND_EXEC, - .help = "Stop smp handling", - .usage = "", - }, - { - .name = "smp_on", - .handler = aarch64_handle_smp_on_command, - .mode = COMMAND_EXEC, - .help = "Restart smp handling", - .usage = "", - }, { .name = "maskisr", .handler = aarch64_mask_interrupts_command, @@ -2801,6 +2750,9 @@ static const struct command_registration aarch64_exec_command_handlers[] = { .help = "read coprocessor register", .usage = "cpnum op1 CRn CRm op2", }, + { + .chain = smp_command_handlers, + }, COMMAND_REGISTRATION_DONE diff --git a/src/target/cortex_a.c b/src/target/cortex_a.c index e460f3b7..c9ef68c2 100644 --- a/src/target/cortex_a.c +++ b/src/target/cortex_a.c @@ -56,11 +56,9 @@ #include "arm_opcodes.h" #include "arm_semihosting.h" #include "transport/transport.h" +#include "smp.h" #include <helper/time_support.h> -#define foreach_smp_target(pos, head) \ - for (pos = head; (pos != NULL); pos = pos->next) - static int cortex_a_poll(struct target *target); static int cortex_a_debug_entry(struct target *target); static int cortex_a_restore_context(struct target *target, bool bpwp); @@ -2969,42 +2967,6 @@ COMMAND_HANDLER(cortex_a_handle_dbginit_command) return cortex_a_init_debug_access(target); } -COMMAND_HANDLER(cortex_a_handle_smp_off_command) -{ - struct target *target = get_current_target(CMD_CTX); - /* check target is an smp target */ - struct target_list *head; - struct target *curr; - head = target->head; - target->smp = 0; - if (head != (struct target_list *)NULL) { - while (head != (struct target_list *)NULL) { - curr = head->target; - curr->smp = 0; - head = head->next; - } - /* fixes the target display to the debugger */ - target->gdb_service->target = target; - } - return ERROR_OK; -} - -COMMAND_HANDLER(cortex_a_handle_smp_on_command) -{ - struct target *target = get_current_target(CMD_CTX); - struct target_list *head; - struct target *curr; - head = target->head; - if (head != (struct target_list *)NULL) { - target->smp = 1; - while (head != (struct target_list *)NULL) { - curr = head->target; - curr->smp = 1; - head = head->next; - } - } - return ERROR_OK; -} COMMAND_HANDLER(cortex_a_handle_smp_gdb_command) { @@ -3096,18 +3058,6 @@ static const struct command_registration cortex_a_exec_command_handlers[] = { .help = "Initialize core debug", .usage = "", }, - { .name = "smp_off", - .handler = cortex_a_handle_smp_off_command, - .mode = COMMAND_EXEC, - .help = "Stop smp handling", - .usage = "",}, - { - .name = "smp_on", - .handler = cortex_a_handle_smp_on_command, - .mode = COMMAND_EXEC, - .help = "Restart smp handling", - .usage = "", - }, { .name = "smp_gdb", .handler = cortex_a_handle_smp_gdb_command, @@ -3133,6 +3083,9 @@ static const struct command_registration cortex_a_exec_command_handlers[] = { { .chain = armv7a_mmu_command_handlers, }, + { + .chain = smp_command_handlers, + }, COMMAND_REGISTRATION_DONE }; diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c index 6981c2ec..016b5a9c 100644 --- a/src/target/mips_m4k.c +++ b/src/target/mips_m4k.c @@ -33,6 +33,7 @@ #include "mips32_dmaacc.h" #include "target_type.h" #include "register.h" +#include "smp.h" static void mips_m4k_enable_breakpoints(struct target *target); static void mips_m4k_enable_watchpoints(struct target *target); @@ -1333,43 +1334,6 @@ COMMAND_HANDLER(mips_m4k_handle_cp0_command) return ERROR_OK; } -COMMAND_HANDLER(mips_m4k_handle_smp_off_command) -{ - struct target *target = get_current_target(CMD_CTX); - /* check target is an smp target */ - struct target_list *head; - struct target *curr; - head = target->head; - target->smp = 0; - if (head != (struct target_list *)NULL) { - while (head != (struct target_list *)NULL) { - curr = head->target; - curr->smp = 0; - head = head->next; - } - /* fixes the target display to the debugger */ - target->gdb_service->target = target; - } - return ERROR_OK; -} - -COMMAND_HANDLER(mips_m4k_handle_smp_on_command) -{ - struct target *target = get_current_target(CMD_CTX); - struct target_list *head; - struct target *curr; - head = target->head; - if (head != (struct target_list *)NULL) { - target->smp = 1; - while (head != (struct target_list *)NULL) { - curr = head->target; - curr->smp = 1; - head = head->next; - } - } - return ERROR_OK; -} - COMMAND_HANDLER(mips_m4k_handle_smp_gdb_command) { struct target *target = get_current_target(CMD_CTX); @@ -1423,20 +1387,6 @@ static const struct command_registration mips_m4k_exec_command_handlers[] = { .help = "display/modify cp0 register", }, { - .name = "smp_off", - .handler = mips_m4k_handle_smp_off_command, - .mode = COMMAND_EXEC, - .help = "Stop smp handling", - .usage = "",}, - - { - .name = "smp_on", - .handler = mips_m4k_handle_smp_on_command, - .mode = COMMAND_EXEC, - .help = "Restart smp handling", - .usage = "", - }, - { .name = "smp_gdb", .handler = mips_m4k_handle_smp_gdb_command, .mode = COMMAND_EXEC, @@ -1450,6 +1400,9 @@ static const struct command_registration mips_m4k_exec_command_handlers[] = { .help = "display/set scan delay in nano seconds", .usage = "[value]", }, + { + .chain = smp_command_handlers, + }, COMMAND_REGISTRATION_DONE }; diff --git a/src/target/smp.c b/src/target/smp.c index bdf81a0e..87944331 100644 --- a/src/target/smp.c +++ b/src/target/smp.c @@ -96,3 +96,82 @@ int gdb_write_smp_packet(struct connection *connection, 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_CTX, "%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(deprecated_handle_smp_on_command) +{ + const char *argv[] = {"on", NULL}; + + LOG_WARNING("\'smp_on\' is deprecated, please use \'smp on\' instead."); + CMD_ARGC = 1; + CMD_ARGV = argv; + return CALL_COMMAND_HANDLER(default_handle_smp_command); +} + +COMMAND_HANDLER(deprecated_handle_smp_off_command) +{ + const char *argv[] = {"off", NULL}; + + LOG_WARNING("\'smp_off\' is deprecated, please use \'smp off\' instead."); + CMD_ARGC = 1; + CMD_ARGV = argv; + return CALL_COMMAND_HANDLER(default_handle_smp_command); +} + +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_on", + .handler = deprecated_handle_smp_on_command, + .mode = COMMAND_EXEC, + .help = "Restart smp handling", + .usage = "", + }, + { + .name = "smp_off", + .handler = deprecated_handle_smp_off_command, + .mode = COMMAND_EXEC, + .help = "Stop smp handling", + .usage = "", + }, + COMMAND_REGISTRATION_DONE +}; diff --git a/src/target/smp.h b/src/target/smp.h index c3e6c6ce..f024b402 100644 --- a/src/target/smp.h +++ b/src/target/smp.h @@ -21,6 +21,11 @@ #include "server/server.h" +#define foreach_smp_target(pos, head) \ + for (pos = head; (pos != NULL); pos = pos->next) + +extern const struct command_registration smp_command_handlers[]; + int gdb_read_smp_packet(struct connection *connection, char const *packet, int packet_size); int gdb_write_smp_packet(struct connection *connection, |