Browse Source

Add SBA write delay.

This is helpful to test OpenOCD behavior when sbbusyerror is set.
pull/1513/head
Tim Newsome 3 years ago
parent
commit
650c15caf9
  1. 31
      riscv/debug_module.cc
  2. 5
      riscv/debug_module.h

31
riscv/debug_module.cc

@ -44,7 +44,7 @@ debug_module_t::debug_module_t(simif_t *sim, const debug_module_config_t &config
hart_state(1 << field_width(sim->get_cfg().max_hartid() + 1)),
hart_array_mask(sim->get_cfg().max_hartid() + 1),
rti_remaining(0),
sb_read_wait(0)
sb_read_wait(0), sb_write_wait(0)
{
D(fprintf(stderr, "debug_data_start=0x%x\n", debug_data_start));
D(fprintf(stderr, "debug_progbuf_start=0x%x\n", debug_progbuf_start));
@ -300,7 +300,7 @@ void debug_module_t::sb_autoincrement()
bool debug_module_t::sb_busy() const
{
return sb_read_wait > 0;
return sb_read_wait > 0 || sb_write_wait > 0;
}
void debug_module_t::sb_read_start()
@ -339,6 +339,19 @@ void debug_module_t::sb_read()
}
}
void debug_module_t::sb_write_start()
{
if (sb_busy() || sbcs.sbbusyerror) {
if (!sbcs.sbbusyerror)
D(fprintf(stderr, "Set sbbusyerror because write start while busy\n"));
sbcs.sbbusyerror = true;
return;
}
/* Insert artificial delay, so debuggers can test how they handle that
* sbbusyerror being set. */
sb_write_wait = 20;
}
void debug_module_t::sb_write()
{
reg_t address = ((uint64_t) sbaddress[1] << 32) | sbaddress[0];
@ -602,6 +615,15 @@ void debug_module_t::run_test_idle()
}
}
}
if (sb_write_wait > 0) {
sb_write_wait--;
if (sb_write_wait == 0) {
sb_write();
if (sbcs.error == 0) {
sb_autoincrement();
}
}
}
}
static bool is_fpu_reg(unsigned regno)
@ -950,10 +972,7 @@ bool debug_module_t::dmi_write(unsigned address, uint32_t value)
case DM_SBDATA0:
sbdata[0] = value;
if (sbcs.error == 0) {
sb_write();
if (sbcs.error == 0) {
sb_autoincrement();
}
sb_write_start();
}
return true;
case DM_SBDATA1:

5
riscv/debug_module.h

@ -159,9 +159,10 @@ class debug_module_t : public abstract_device_t
void sb_autoincrement();
/* Start a system bus read. (It could be instantaneous, but to help test
/* Start a system bus access. (It could be instantaneous, but to help test
* OpenOCD a delay can be added.) */
void sb_read_start();
void sb_write_start();
/* Actually read/write. */
void sb_read();
@ -203,7 +204,7 @@ class debug_module_t : public abstract_device_t
bool hart_available_state[2];
bool hart_available(unsigned hart_id) const;
unsigned sb_read_wait;
unsigned sb_read_wait, sb_write_wait;
};
#endif

Loading…
Cancel
Save