diff options
author | Tim Newsome <tim@sifive.com> | 2017-10-10 15:53:23 -0700 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2017-12-11 13:21:47 -0800 |
commit | 46a67860915391458d7cc8cb93248059df20b8f2 (patch) | |
tree | 8dad89d9c6bb72e55fd3a09676bd63fba86e94e3 /riscv/debug_module.cc | |
parent | 12714e371e9b8ce2efcf0e77347ed1b33c8de27b (diff) | |
download | spike-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.cc | 20 |
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; |