aboutsummaryrefslogtreecommitdiff
path: root/riscv/debug_module.cc
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2017-10-10 15:53:23 -0700
committerTim Newsome <tim@sifive.com>2017-12-11 13:21:47 -0800
commit46a67860915391458d7cc8cb93248059df20b8f2 (patch)
tree8dad89d9c6bb72e55fd3a09676bd63fba86e94e3 /riscv/debug_module.cc
parent12714e371e9b8ce2efcf0e77347ed1b33c8de27b (diff)
downloadspike-46a67860915391458d7cc8cb93248059df20b8f2.zip
spike-46a67860915391458d7cc8cb93248059df20b8f2.tar.gz
spike-46a67860915391458d7cc8cb93248059df20b8f2.tar.bz2
Make progbuf a run-time option.
Also add an implicit ebreak after the program buffer. This is not part of the spec, but hopefully it will be.
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;