Browse Source

dscr.ebreakh is now dcsr.ebreakv[su]

This change was made ages ago in the spec.

I did not actually test that the new privilege checks in ebreak and
c.ebreak are correct, but all the existing debug tests still pass.
pull/1373/head
Tim Newsome 3 years ago
parent
commit
bb101c7a2c
  1. 9
      riscv/csrs.cc
  2. 3
      riscv/csrs.h
  3. 10
      riscv/insns/c_ebreak.h
  4. 10
      riscv/insns/ebreak.h

9
riscv/csrs.cc

@ -1232,9 +1232,10 @@ dcsr_csr_t::dcsr_csr_t(processor_t* const proc, const reg_t addr):
prv(0), prv(0),
step(false), step(false),
ebreakm(false), ebreakm(false),
ebreakh(false),
ebreaks(false), ebreaks(false),
ebreaku(false), ebreaku(false),
ebreakvs(false),
ebreakvu(false),
halt(false), halt(false),
v(false), v(false),
cause(0) { cause(0) {
@ -1250,9 +1251,10 @@ reg_t dcsr_csr_t::read() const noexcept {
reg_t result = 0; reg_t result = 0;
result = set_field(result, DCSR_XDEBUGVER, 1); result = set_field(result, DCSR_XDEBUGVER, 1);
result = set_field(result, DCSR_EBREAKM, ebreakm); result = set_field(result, DCSR_EBREAKM, ebreakm);
result = set_field(result, DCSR_EBREAKH, ebreakh);
result = set_field(result, DCSR_EBREAKS, ebreaks); result = set_field(result, DCSR_EBREAKS, ebreaks);
result = set_field(result, DCSR_EBREAKU, ebreaku); result = set_field(result, DCSR_EBREAKU, ebreaku);
result = set_field(result, CSR_DCSR_EBREAKVS, ebreakvs);
result = set_field(result, CSR_DCSR_EBREAKVU, ebreakvu);
result = set_field(result, DCSR_STOPCYCLE, 0); result = set_field(result, DCSR_STOPCYCLE, 0);
result = set_field(result, DCSR_STOPTIME, 0); result = set_field(result, DCSR_STOPTIME, 0);
result = set_field(result, DCSR_CAUSE, cause); result = set_field(result, DCSR_CAUSE, cause);
@ -1267,9 +1269,10 @@ bool dcsr_csr_t::unlogged_write(const reg_t val) noexcept {
step = get_field(val, DCSR_STEP); step = get_field(val, DCSR_STEP);
// TODO: ndreset and fullreset // TODO: ndreset and fullreset
ebreakm = get_field(val, DCSR_EBREAKM); ebreakm = get_field(val, DCSR_EBREAKM);
ebreakh = get_field(val, DCSR_EBREAKH);
ebreaks = get_field(val, DCSR_EBREAKS); ebreaks = get_field(val, DCSR_EBREAKS);
ebreaku = get_field(val, DCSR_EBREAKU); ebreaku = get_field(val, DCSR_EBREAKU);
ebreakvs = get_field(val, CSR_DCSR_EBREAKVS);
ebreakvu = get_field(val, CSR_DCSR_EBREAKVU);
halt = get_field(val, DCSR_HALT); halt = get_field(val, DCSR_HALT);
v = proc->extension_enabled('H') ? get_field(val, CSR_DCSR_V) : false; v = proc->extension_enabled('H') ? get_field(val, CSR_DCSR_V) : false;
return true; return true;

3
riscv/csrs.h

@ -663,9 +663,10 @@ class dcsr_csr_t: public csr_t {
uint8_t prv; uint8_t prv;
bool step; bool step;
bool ebreakm; bool ebreakm;
bool ebreakh;
bool ebreaks; bool ebreaks;
bool ebreaku; bool ebreaku;
bool ebreakvs;
bool ebreakvu;
bool halt; bool halt;
bool v; bool v;
uint8_t cause; uint8_t cause;

10
riscv/insns/c_ebreak.h

@ -1,8 +1,10 @@
require_extension(EXT_ZCA); require_extension(EXT_ZCA);
if (!STATE.debug_mode && if (!STATE.debug_mode && (
((STATE.prv == PRV_M && STATE.dcsr->ebreakm) || (!STATE.v && STATE.prv == PRV_M && STATE.dcsr->ebreakm) ||
(STATE.prv == PRV_S && STATE.dcsr->ebreaks) || (!STATE.v && STATE.prv == PRV_S && STATE.dcsr->ebreaks) ||
(STATE.prv == PRV_U && STATE.dcsr->ebreaku))) { (!STATE.v && STATE.prv == PRV_U && STATE.dcsr->ebreaku) ||
(STATE.v && STATE.prv == PRV_S && STATE.dcsr->ebreakvs) ||
(STATE.v && STATE.prv == PRV_U && STATE.dcsr->ebreakvu))) {
throw trap_debug_mode(); throw trap_debug_mode();
} else { } else {
throw trap_breakpoint(STATE.v, pc); throw trap_breakpoint(STATE.v, pc);

10
riscv/insns/ebreak.h

@ -1,7 +1,9 @@
if (!STATE.debug_mode && if (!STATE.debug_mode && (
((STATE.prv == PRV_M && STATE.dcsr->ebreakm) || (!STATE.v && STATE.prv == PRV_M && STATE.dcsr->ebreakm) ||
(STATE.prv == PRV_S && STATE.dcsr->ebreaks) || (!STATE.v && STATE.prv == PRV_S && STATE.dcsr->ebreaks) ||
(STATE.prv == PRV_U && STATE.dcsr->ebreaku))) { (!STATE.v && STATE.prv == PRV_U && STATE.dcsr->ebreaku) ||
(STATE.v && STATE.prv == PRV_S && STATE.dcsr->ebreakvs) ||
(STATE.v && STATE.prv == PRV_U && STATE.dcsr->ebreakvu))) {
throw trap_debug_mode(); throw trap_debug_mode();
} else { } else {
throw trap_breakpoint(STATE.v, pc); throw trap_breakpoint(STATE.v, pc);

Loading…
Cancel
Save