aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/debug_rom.h (renamed from debug_rom/debug_rom.c)4
-rw-r--r--riscv/debug_rom/Makefile (renamed from debug_rom/Makefile)2
-rwxr-xr-xriscv/debug_rom/debug_rom.S (renamed from debug_rom/debug_rom.S)0
-rw-r--r--riscv/debug_rom/debug_rom.h2
-rw-r--r--riscv/debug_rom/link.ld (renamed from debug_rom/link.ld)0
-rw-r--r--riscv/decode.h7
-rw-r--r--riscv/mmu.cc1
-rw-r--r--riscv/processor.cc7
-rw-r--r--riscv/sim.cc9
9 files changed, 25 insertions, 7 deletions
diff --git a/debug_rom/debug_rom.c b/riscv/debug_rom.h
index 9d67df5..d2837ac 100644
--- a/debug_rom/debug_rom.c
+++ b/riscv/debug_rom.h
@@ -1,4 +1,4 @@
-unsigned char debug_rom_raw[] = {
+static unsigned char debug_rom_raw[] = {
0x6f, 0x00, 0x40, 0x05, 0xf3, 0x24, 0x00, 0xf1, 0x23, 0x24, 0x90, 0x10,
0xf3, 0x24, 0x00, 0x79, 0x93, 0xf4, 0x04, 0x40, 0x63, 0x94, 0x04, 0x08,
0xf3, 0x24, 0x00, 0xf0, 0x63, 0xc6, 0x04, 0x00, 0x83, 0x24, 0xc0, 0x43,
@@ -15,4 +15,4 @@ unsigned char debug_rom_raw[] = {
0x73, 0x24, 0x00, 0x79, 0x13, 0x74, 0x04, 0x40, 0xe3, 0x0c, 0x04, 0xfe,
0x6f, 0xf0, 0x1f, 0xfc
};
-unsigned int debug_rom_raw_len = 172;
+static unsigned int debug_rom_raw_len = 172;
diff --git a/debug_rom/Makefile b/riscv/debug_rom/Makefile
index 17cc95e..ff37a29 100644
--- a/debug_rom/Makefile
+++ b/riscv/debug_rom/Makefile
@@ -7,7 +7,7 @@ OBJCOPY = $(RISCV)/bin/riscv64-unknown-elf-objcopy
%.o: %.S
$(CC) -c $<
-debug_rom.c: debug_rom.raw
+debug_rom.cc: debug_rom.raw
xxd -i $^ > $@
debug_rom.raw: debug_rom
diff --git a/debug_rom/debug_rom.S b/riscv/debug_rom/debug_rom.S
index 230f4b4..230f4b4 100755
--- a/debug_rom/debug_rom.S
+++ b/riscv/debug_rom/debug_rom.S
diff --git a/riscv/debug_rom/debug_rom.h b/riscv/debug_rom/debug_rom.h
new file mode 100644
index 0000000..a99534e
--- /dev/null
+++ b/riscv/debug_rom/debug_rom.h
@@ -0,0 +1,2 @@
+extern unsigned char *debug_rom_raw;
+extern unsigned int debug_rom_raw_len;
diff --git a/debug_rom/link.ld b/riscv/debug_rom/link.ld
index 356099c..356099c 100644
--- a/debug_rom/link.ld
+++ b/riscv/debug_rom/link.ld
diff --git a/riscv/decode.h b/riscv/decode.h
index d1254ee..b59ee78 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -14,6 +14,7 @@
#include "config.h"
#include "common.h"
#include <cinttypes>
+#include "debug_rom.h"
typedef int64_t sreg_t;
typedef uint64_t reg_t;
@@ -236,7 +237,9 @@ private:
#define DCSR_CAUSE_STEPPED 4
#define DCSR_CAUSE_HALT 5
-#define DEBUG_RAM 0xfffffc00 // TODO: 0x400
-#define DEBUG_ROM_ENTRY 0xfffff800 // TODO: 0x800
+#define DEBUG_RAM_START 0xfffffffffffffc00 // TODO: 0x400
+#define DEBUG_RAM_END (DEBUG_RAM_START + 64)
+#define DEBUG_ROM_START 0xfffffffffffff800 // TODO: 0x800
+#define DEBUG_ROM_END (DEBUG_ROM_START + debug_rom_raw_len)
#endif
diff --git a/riscv/mmu.cc b/riscv/mmu.cc
index 0113443..5fb72bf 100644
--- a/riscv/mmu.cc
+++ b/riscv/mmu.cc
@@ -54,6 +54,7 @@ reg_t mmu_t::translate(reg_t addr, access_type type)
const uint16_t* mmu_t::fetch_slow_path(reg_t addr)
{
reg_t paddr = translate(addr, FETCH);
+
if (sim->addr_is_mem(paddr)) {
refill_tlb(addr, paddr, FETCH);
return (const uint16_t*)sim->addr_to_mem(paddr);
diff --git a/riscv/processor.cc b/riscv/processor.cc
index 4ef8e02..7c5c0fb 100644
--- a/riscv/processor.cc
+++ b/riscv/processor.cc
@@ -199,9 +199,13 @@ void processor_t::set_privilege(reg_t prv)
void processor_t::enter_debug_mode(uint8_t cause)
{
+ fprintf(stderr, "enter_debug_mode(%d)\n", cause);
state.dcsr.cause = cause;
+ state.dcsr.prv = state.prv;
+ state.prv = PRV_M;
state.dpc = state.pc;
- state.pc = DEBUG_ROM_ENTRY;
+ state.pc = DEBUG_ROM_START;
+ debug = true; // TODO
}
void processor_t::take_trap(trap_t& t, reg_t epc)
@@ -365,6 +369,7 @@ void processor_t::set_csr(int which, reg_t val)
case CSR_MCAUSE: state.mcause = val; break;
case CSR_MBADADDR: state.mbadaddr = val; break;
case DCSR_ADDRESS:
+ // TODO: Use get_field style
state.dcsr.prv = (val & DCSR_PRV_MASK) >> DCSR_PRV_OFFSET;
state.dcsr.step = (val & DCSR_STEP_MASK) >> DCSR_STEP_OFFSET;
// TODO: ndreset and fullreset
diff --git a/riscv/sim.cc b/riscv/sim.cc
index 095c2d9..5cf2646 100644
--- a/riscv/sim.cc
+++ b/riscv/sim.cc
@@ -41,11 +41,18 @@ sim_t::sim_t(const char* isa, size_t nprocs, size_t mem_mb, bool halted,
fprintf(stderr, "warning: only got %lu bytes of target mem (wanted %lu)\n",
(unsigned long)memsz, (unsigned long)memsz0);
+ /* Copy Debug ROM into the end of the allocated block, because we surely
+ * didn't succeed in allocation 0xfffffffff800 bytes. */
+ /* TODO: Once everything uses the new memory map, just put this at the
+ * address that it actually belongs at. */
+ memcpy(mem + memsz - debug_rom_raw_len, debug_rom_raw, debug_rom_raw_len);
+
debug_mmu = new mmu_t(this, NULL);
for (size_t i = 0; i < procs.size(); i++) {
procs[i] = new processor_t(isa, this, i);
- procs[i]->enter_debug_mode(DCSR_CAUSE_HALT);
+ if (halted)
+ procs[i]->enter_debug_mode(DCSR_CAUSE_HALT);
}
rtc.reset(new rtc_t(procs));