Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Only implement tcontrol to handle reentrant triggers. #1780

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 4 additions & 19 deletions riscv/triggers.cc
Original file line number Diff line number Diff line change
Expand Up @@ -110,21 +110,6 @@ bool trigger_t::textra_match(processor_t * const proc) const noexcept
return true;
}

bool trigger_t::allow_action(const state_t * const state) const
{
if (get_action() == ACTION_DEBUG_EXCEPTION) {
const bool mstatus_mie = state->mstatus->read() & MSTATUS_MIE;
const bool sstatus_sie = state->sstatus->read() & MSTATUS_SIE;
const bool vsstatus_sie = state->vsstatus->read() & MSTATUS_SIE;
const bool medeleg_breakpoint = (state->medeleg->read() >> CAUSE_BREAKPOINT) & 1;
const bool hedeleg_breakpoint = (state->hedeleg->read() >> CAUSE_BREAKPOINT) & 1;
return (state->prv != PRV_M || mstatus_mie) &&
(state->prv != PRV_S || state->v || !medeleg_breakpoint || sstatus_sie) &&
(state->prv != PRV_S || !state->v || !medeleg_breakpoint || !hedeleg_breakpoint || vsstatus_sie);
}
return true;
}

reg_t disabled_trigger_t::tdata1_read(const processor_t * const proc) const noexcept
{
auto xlen = proc->get_xlen();
Expand Down Expand Up @@ -235,7 +220,7 @@ std::optional<match_result_t> mcontrol_common_t::detect_memory_access_match(proc
value &= 0xffffffff;
}

if (simple_match(xlen, value) && allow_action(proc->get_state())) {
if (simple_match(xlen, value)) {
/* This is OK because this function is only called if the trigger was not
* inhibited by the previous trigger in the chain. */
set_hit(timing ? HIT_IMMEDIATELY_AFTER : HIT_BEFORE);
Expand Down Expand Up @@ -316,7 +301,7 @@ void mcontrol6_t::tdata1_write(processor_t * const proc, const reg_t val, const

std::optional<match_result_t> icount_t::detect_icount_fire(processor_t * const proc) noexcept
{
if (!common_match(proc) || !allow_action(proc->get_state()))
if (!common_match(proc))
return std::nullopt;

std::optional<match_result_t> ret = std::nullopt;
Expand All @@ -331,7 +316,7 @@ std::optional<match_result_t> icount_t::detect_icount_fire(processor_t * const p

void icount_t::detect_icount_decrement(processor_t * const proc) noexcept
{
if (!common_match(proc) || !allow_action(proc->get_state()))
if (!common_match(proc))
return;

if (count >= 1) {
Expand Down Expand Up @@ -423,7 +408,7 @@ std::optional<match_result_t> trap_common_t::detect_trap_match(processor_t * con
bool interrupt = (t.cause() & ((reg_t)1 << (xlen - 1))) != 0;
reg_t bit = t.cause() & ~((reg_t)1 << (xlen - 1));
assert(bit < xlen);
if (simple_match(interrupt, bit) && allow_action(proc->get_state())) {
if (simple_match(interrupt, bit)) {
hit = true;
return match_result_t(TIMING_AFTER, action);
}
Expand Down
1 change: 0 additions & 1 deletion riscv/triggers.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ class trigger_t {
protected:
static action_t legalize_action(reg_t val, reg_t action_mask, reg_t dmode_mask) noexcept;
bool common_match(processor_t * const proc, bool use_prev_prv = false) const noexcept;
bool allow_action(const state_t * const state) const;
reg_t tdata2;

bool vs = false;
Expand Down
Loading