diff options
author | Freya Murphy <freya@freyacat.org> | 2024-09-30 18:52:25 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-09-30 18:52:25 -0400 |
commit | 4af200b00188e02b2c6207dfe494a3dd12556c5f (patch) | |
tree | 25d993117e6306907d1d3821ef4fca729390d221 /msim/debug.c | |
parent | update runtime to return exit code from main (diff) | |
download | mips-4af200b00188e02b2c6207dfe494a3dd12556c5f.tar.gz mips-4af200b00188e02b2c6207dfe494a3dd12556c5f.tar.bz2 mips-4af200b00188e02b2c6207dfe494a3dd12556c5f.zip |
msim done (ish)
Diffstat (limited to 'msim/debug.c')
-rw-r--r-- | msim/debug.c | 79 |
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; +} |