summaryrefslogtreecommitdiff
path: root/msim/debug.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--msim/debug.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/msim/debug.c b/msim/debug.c
new file mode 100644
index 0000000..1613c76
--- /dev/null
+++ b/msim/debug.c
@@ -0,0 +1,79 @@
+#include <merror.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <melf.h>
+
+#include "sim.h"
+
+static uint32_t read_num() {
+ int i = 0;
+ while (1) {
+ int c = getc(stdin);
+ if (c < '0' || c > '9') {
+ ungetc(c, stdin);
+ break;
+ }
+ i *= 10;
+ i += c - '0';
+ }
+
+ if (i)
+ return i;
+ return 1;
+}
+
+_Noreturn void sim_debug(struct simulator *sim) {
+
+ int c;
+ sim->pc = sim->entry;
+ sim->current_pc = sim->pc;
+
+prompt:
+ printf(">> ");
+ fflush(stdout);
+next:
+ switch ((c = getchar())) {
+
+ /* skip whitespace */
+ case ' ':
+ case '\t':
+ goto next;
+
+ /* ignore nl */
+ case '\n':
+ goto prompt;
+
+ /* exit on eof */
+ case EOF:
+ exit(0);
+ break;
+
+ /* dump registers */
+ case 'r':
+ sim_dump_reg(sim);
+ break;
+
+ /* step ins */
+ case 's': {
+ for (uint32_t i = read_num(); i > 0; i--)
+ sim_step(sim);
+ break;
+ }
+
+ /* print curr ins */
+ case 'i':
+ printf("0x%08x\n", B32(* (uint32_t *) (uintptr_t) sim->pc));
+ break;
+
+ case 'a':
+ printf("0x%08x\n", sim->pc);
+ break;
+
+ default:
+ ERROR("unknown command '%c'", c);
+ break;
+ }
+
+ goto next;
+}