summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril Bur <cyrilbur@gmail.com>2018-02-09 15:38:45 +1100
committerAlistair Popple <alistair@popple.id.au>2018-02-16 16:22:23 +1100
commit08cc9da08ba9eb976a8b8f5d8772369d174bc4db (patch)
tree3c341964f62dc7e5e08acb33c4f5d99d7c588c8b
parentd6467012a75ec547b0734b26f8a376c90baa353e (diff)
downloadpdbg-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.c35
-rw-r--r--src/thread.c51
-rw-r--r--src/thread.h14
3 files changed, 56 insertions, 44 deletions
diff --git a/src/main.c b/src/main.c
index 4c618c9..42aeeba 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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[]);
OpenPOWER on IntegriCloud