From 4af200b00188e02b2c6207dfe494a3dd12556c5f Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Mon, 30 Sep 2024 18:52:25 -0400 Subject: msim done (ish) --- msim/debug.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 msim/debug.c (limited to 'msim/debug.c') 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 +#include +#include +#include +#include + +#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; +} -- cgit v1.2.3-freya