aboutsummaryrefslogtreecommitdiff
path: root/riscv/debug_module.cc
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/debug_module.cc')
-rw-r--r--riscv/debug_module.cc20
1 files changed, 16 insertions, 4 deletions
diff --git a/riscv/debug_module.cc b/riscv/debug_module.cc
index 985cbbd..cbc8c48 100644
--- a/riscv/debug_module.cc
+++ b/riscv/debug_module.cc
@@ -16,7 +16,12 @@
///////////////////////// debug_module_t
-debug_module_t::debug_module_t(sim_t *sim) : sim(sim)
+debug_module_t::debug_module_t(sim_t *sim, unsigned progsize) :
+ progsize(progsize),
+ program_buffer_bytes(4 + 4*progsize),
+ debug_progbuf_start(debug_data_start - program_buffer_bytes),
+ debug_abstract_start(debug_progbuf_start - debug_abstract_size*4),
+ sim(sim)
{
dmcontrol = {0};
@@ -29,17 +34,24 @@ debug_module_t::debug_module_t(sim_t *sim) : sim(sim)
abstractauto = {0};
+ program_buffer = new uint8_t[program_buffer_bytes];
+
memset(halted, 0, sizeof(halted));
memset(debug_rom_flags, 0, sizeof(debug_rom_flags));
memset(resumeack, 0, sizeof(resumeack));
- memset(program_buffer, 0, sizeof(program_buffer));
+ memset(program_buffer, 0, program_buffer_bytes);
+ program_buffer[progsize] = ebreak();
memset(dmdata, 0, sizeof(dmdata));
write32(debug_rom_whereto, 0,
jal(ZERO, debug_abstract_start - DEBUG_ROM_WHERETO));
memset(debug_abstract, 0, sizeof(debug_abstract));
+}
+debug_module_t::~debug_module_t()
+{
+ delete[] program_buffer;
}
void debug_module_t::reset()
@@ -97,7 +109,7 @@ bool debug_module_t::load(reg_t addr, size_t len, uint8_t* bytes)
return true;
}
- if (addr >= debug_progbuf_start && ((addr + len) <= (debug_progbuf_start + sizeof(program_buffer)))) {
+ if (addr >= debug_progbuf_start && ((addr + len) <= (debug_progbuf_start + program_buffer_bytes))) {
memcpy(bytes, program_buffer + addr - debug_progbuf_start, len);
return true;
}
@@ -138,7 +150,7 @@ bool debug_module_t::store(reg_t addr, size_t len, const uint8_t* bytes)
return true;
}
- if (addr >= debug_progbuf_start && ((addr + len) <= (debug_progbuf_start + sizeof(program_buffer)))) {
+ if (addr >= debug_progbuf_start && ((addr + len) <= (debug_progbuf_start + program_buffer_bytes))) {
memcpy(program_buffer + addr - debug_progbuf_start, bytes, len);
return true;