commit 94462befc2a71448fc013d053a6753dc6b482949
parent efd8c1bf29cc3a30053a4a4c7776fba70f29c2e3
Author: Brian Swetland <swetland@frotz.net>
Date: Sun, 29 Jun 2025 18:42:19 -0700
sr32emu: IO tracing and better test vector errors
Diffstat:
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/softrisc32/src/cpu-sr32.c b/softrisc32/src/cpu-sr32.c
@@ -59,7 +59,7 @@ void sr32core(CpuState *s) {
case 0: n = mem_rd32(a); break;
case 1: n = mem_rd16(a); if (n & 0x8000) n |= 0xFFFF0000; break;
case 2: n = mem_rd8(a); if (n & 0x80) n |= 0xFFFFFF00; break;
- case 3: n = io_rd32(a); break;
+ case 3: n = io_rd32(s, a); break;
case 4: n = ins & 0xFFFF0000; break;
case 5: n = mem_rd16(a); break;
case 6: n = mem_rd8(a); break;
@@ -82,7 +82,7 @@ void sr32core(CpuState *s) {
case 0: mem_wr32(a, b); break;
case 1: mem_wr16(a, b); break;
case 2: mem_wr8(a, b); break;
- case 3: io_wr32(a, b); break;
+ case 3: io_wr32(s, a, b); break;
default: goto undef;
}
break;
diff --git a/softrisc32/src/emulator-sr32.c b/softrisc32/src/emulator-sr32.c
@@ -50,27 +50,33 @@ void *mem_dma(uint32_t addr, uint32_t len) {
return emu_ram + addr;
}
-uint32_t io_rd32(uint32_t addr) {
+uint32_t io_rd32(CpuState *cs, uint32_t addr) {
if (addr == -1) {
if (innext == incount) {
- fprintf(stderr, "FAIL: input data exhausted\n");
+ fprintf(stderr, "FAIL: PC=%08x: input data exhausted\n", cs->pc);
exit(1);
}
+ if (cs->flags & F_TRACE_IO) {
+ fprintf(stderr, "< %08x\n", indata[innext]);
+ }
return indata[innext++];
}
return 0;
}
-void io_wr32(uint32_t addr, uint32_t val) {
+void io_wr32(CpuState *cs, uint32_t addr, uint32_t val) {
switch (addr) {
case -1:
+ if (cs->flags & F_TRACE_IO) {
+ fprintf(stderr, "> %08x\n", val);
+ }
if (outnext == outcount) {
fprintf(stderr, "FAIL: output data overrun\n");
exit(1);
}
uint32_t data = outdata[outnext++];
if (data != val) {
- fprintf(stderr, "FAIL: output data %08x should be %08x\n", val, data);
+ fprintf(stderr, "FAIL: PC=%08x: output data %08x should be %08x\n", cs->pc, val, data);
exit(1);
}
break;
@@ -152,7 +158,8 @@ void usage(int status) {
"options: -x <datafile> Load Test Vector Data\n"
" -tf Trace Instruction Fetches\n"
" -tr Trace Register Writes\n"
- " -tb Trace Branches\n");
+ " -tb Trace Branches\n"
+ " -ti Trace IO Reads & Writes\n");
exit(status);
}
@@ -177,6 +184,8 @@ int main(int argc, char** argv) {
cs.flags |= F_TRACE_REGS;
} else if (!strcmp(argv[1], "-tb")) {
cs.flags |= F_TRACE_BRANCH;
+ } else if (!strcmp(argv[1], "-ti")) {
+ cs.flags |= F_TRACE_IO;
} else if (argv[1][0] == '-') {
fprintf(stderr, "emu: unknown option: %s\n", argv[1]);
return -1;
diff --git a/softrisc32/src/emulator-sr32.h b/softrisc32/src/emulator-sr32.h
@@ -15,6 +15,7 @@ typedef struct {
#define F_TRACE_FETCH 1
#define F_TRACE_REGS 2
#define F_TRACE_BRANCH 4
+#define F_TRACE_IO 8
uint32_t mem_rd32(uint32_t addr);
uint32_t mem_rd16(uint32_t addr);
@@ -23,8 +24,8 @@ void mem_wr32(uint32_t addr, uint32_t val);
void mem_wr16(uint32_t addr, uint32_t val);
void mem_wr8(uint32_t addr, uint32_t val);
-uint32_t io_rd32(uint32_t addr);
-void io_wr32(uint32_t addr, uint32_t val);
+uint32_t io_rd32(CpuState *s, uint32_t addr);
+void io_wr32(CpuState *s, uint32_t addr, uint32_t val);
void do_syscall(CpuState *s, uint32_t n);
void do_undef(CpuState *s, uint32_t ins);