[Pdbg] [PATCH 17/29] main: Use new command handling for threads

Cyril Bur cyrilbur at gmail.com
Fri Feb 9 15:38:45 AEDT 2018


Signed-off-by: Cyril Bur <cyrilbur at gmail.com>
---
 src/main.c   | 35 +++++------------------------------
 src/thread.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++-----
 src/thread.h | 14 +++++---------
 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 b6e50f4..33f0f43 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("chiplet", 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[]);
-- 
2.16.1



More information about the Pdbg mailing list