diff options
author | Cyril Bur <cyrilbur@gmail.com> | 2018-02-09 15:38:45 +1100 |
---|---|---|
committer | Alistair Popple <alistair@popple.id.au> | 2018-02-16 16:22:23 +1100 |
commit | 08cc9da08ba9eb976a8b8f5d8772369d174bc4db (patch) | |
tree | 3c341964f62dc7e5e08acb33c4f5d99d7c588c8b | |
parent | d6467012a75ec547b0734b26f8a376c90baa353e (diff) | |
download | pdbg-08cc9da08ba9eb976a8b8f5d8772369d174bc4db.tar.gz pdbg-08cc9da08ba9eb976a8b8f5d8772369d174bc4db.zip |
main: Use new command handling for threads
Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
-rw-r--r-- | src/main.c | 35 | ||||
-rw-r--r-- | src/thread.c | 51 | ||||
-rw-r--r-- | src/thread.h | 14 |
3 files changed, 56 insertions, 44 deletions
@@ -98,6 +98,11 @@ static struct { { "putspr", "<spr> <value>", "Write Special Purpose Register (SPR)", &handle_spr }, { "getmsr", "", "Get Machine State Register (MSR)", &handle_msr }, { "putmsr", "<value>", "Write Machine State Register (MSR)", &handle_msr }, + { "start", "", "Start thread", &thread_start }, + { "step", "<count>", "Set a thread <count> instructions", &thread_step }, + { "stop", "", "Stop thread", &thread_stop }, + { "threadstatus", "", "Print the status of a thread", &thread_status_print }, + { "sreset", "", "Reset", &thread_sreset }, }; static void print_usage(char *pname) @@ -161,21 +166,6 @@ enum command parse_cmd(char *optarg) if (strcmp(optarg, "getvmem") == 0) { cmd = GETVMEM; cmd_min_arg_count = 1; - } else if (strcmp(optarg, "start") == 0) { - cmd = START; - cmd_min_arg_count = 0; - } else if (strcmp(optarg, "step") == 0) { - cmd = STEP; - cmd_min_arg_count = 1; - } else if (strcmp(optarg, "stop") == 0) { - cmd = STOP; - cmd_min_arg_count = 0; - } else if (strcmp(optarg, "sreset") == 0) { - cmd = SRESET; - cmd_min_arg_count = 0; - } else if (strcmp(optarg, "threadstatus") == 0) { - cmd = THREADSTATUS; - cmd_min_arg_count = 0; } else if (strcmp(optarg, "probe") == 0) { cmd = PROBE; cmd_min_arg_count = 0; @@ -586,21 +576,6 @@ int main(int argc, char *argv[]) return -1; switch(cmd) { - case THREADSTATUS: - rc = for_each_target("pib", print_proc_thread_status, NULL, NULL); - break; - case START: - rc = for_each_target("thread", start_thread, NULL, NULL); - break; - case STEP: - rc = for_each_target("thread", step_thread, &cmd_args[0], NULL); - break; - case STOP: - rc = for_each_target("thread", stop_thread, NULL, NULL); - break; - case SRESET: - rc = for_each_target("thread", sreset_thread, NULL, NULL); - break; case PROBE: rc = 1; pdbg_for_each_class_target("pib", target) diff --git a/src/thread.c b/src/thread.c index c01049f..03e5212 100644 --- a/src/thread.c +++ b/src/thread.c @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include <errno.h> #include <inttypes.h> #include <stdio.h> +#include <stdlib.h> #include <bitutils.h> @@ -74,30 +76,69 @@ static int print_core_thread_status(struct pdbg_target *core_target, uint32_t in return rc; } -int print_proc_thread_status(struct pdbg_target *pib_target, uint32_t index, uint64_t *unused, uint64_t *unused1) +static int print_proc_thread_status(struct pdbg_target *pib_target, uint32_t index, uint64_t *unused, uint64_t *unused1) { printf("\np%01dt: 0 1 2 3 4 5 6 7\n", index); return for_each_child_target("core", pib_target, print_core_thread_status, NULL, NULL); }; -int start_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1) +static int start_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1) { return ram_start_thread(thread_target) ? 0 : 1; } -int step_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *count, uint64_t *unused1) +static int step_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *count, uint64_t *unused1) { return ram_step_thread(thread_target, *count) ? 0 : 1; } -int stop_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1) +static int stop_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1) { return ram_stop_thread(thread_target) ? 0 : 1; } -int sreset_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1) +static int sreset_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1) { return ram_sreset_thread(thread_target) ? 0 : 1; } +int thread_start(int optind, int argc, char *argv[]) +{ + return for_each_target("thread", start_thread, NULL, NULL); +} +int thread_step(int optind, int argc, char *argv[]) +{ + uint64_t count; + char *endptr; + + if (optind + 1 >= argc) { + printf("%s: command '%s' requires a count\n", argv[0], argv[optind]); + return -1; + } + + errno = 0; + count = strtoull(argv[optind + 1], &endptr, 0); + if (errno || *endptr != '\0') { + printf("%s: command '%s' couldn't parse count '%s'\n", + argv[0], argv[optind], argv[optind + 1]); + return -1; + } + + return for_each_target("thread", step_thread, &count, NULL); +} + +int thread_stop(int optind, int argc, char *argv[]) +{ + return for_each_target("thread", stop_thread, NULL, NULL); +} + +int thread_status_print(int optind, int argc, char *argv[]) +{ + return for_each_target("pib", print_proc_thread_status, NULL, NULL); +} + +int thread_sreset(int optind, int argc, char *argv[]) +{ + return for_each_target("thread", sreset_thread, NULL, NULL); +} diff --git a/src/thread.h b/src/thread.h index 8a9c901..01a8034 100644 --- a/src/thread.h +++ b/src/thread.h @@ -17,12 +17,8 @@ #include <target.h> -int print_proc_thread_status(struct pdbg_target *pib_target, uint32_t index, uint64_t *unused, uint64_t *unused1); - -int start_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1); - -int step_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *count, uint64_t *unused1); - -int stop_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1); - -int sreset_thread(struct pdbg_target *thread_target, uint32_t index, uint64_t *unused, uint64_t *unused1); +int thread_start(int optind, int argc, char *argv[]); +int thread_step(int optind, int argc, char *argv[]); +int thread_stop(int optind, int argc, char *argv[]); +int thread_status_print(int optind, int argc, char *argv[]); +int thread_sreset(int optind, int argc, char *argv[]); |