Browse Source

Avoid memory-allocation anti-pattern on matched_trigger

pull/1966/head
Andrew Waterman 1 year ago
parent
commit
59eebf0b47
  1. 4
      riscv/execute.cc
  2. 5
      riscv/mmu.cc
  3. 10
      riscv/mmu.h

4
riscv/execute.cc

@ -342,10 +342,6 @@ void processor_t::step(size_t n)
} }
catch (triggers::matched_t& t) catch (triggers::matched_t& t)
{ {
if (mmu->matched_trigger) {
delete mmu->matched_trigger;
mmu->matched_trigger = NULL;
}
take_trigger_action(t.action, t.address, pc, t.gva); take_trigger_action(t.action, t.address, pc, t.gva);
} }
catch(trap_debug_mode&) catch(trap_debug_mode&)

5
riscv/mmu.cc

@ -14,8 +14,7 @@ mmu_t::mmu_t(simif_t* sim, endianness_t endianness, processor_t* proc)
#endif #endif
check_triggers_fetch(false), check_triggers_fetch(false),
check_triggers_load(false), check_triggers_load(false),
check_triggers_store(false), check_triggers_store(false)
matched_trigger(NULL)
{ {
#ifndef RISCV_ENABLE_DUAL_ENDIAN #ifndef RISCV_ENABLE_DUAL_ENDIAN
assert(endianness == endianness_little); assert(endianness == endianness_little);
@ -188,7 +187,7 @@ void mmu_t::check_triggers(triggers::operation_t operation, reg_t address, bool
// We want to take this exception on the next instruction. We check // We want to take this exception on the next instruction. We check
// whether to do so in the I$ refill path, so flush the I$. // whether to do so in the I$ refill path, so flush the I$.
flush_icache(); flush_icache();
matched_trigger = new triggers::matched_t(operation, tval, match->action, virt); matched_trigger = triggers::matched_t(operation, tval, match->action, virt);
} }
} }

10
riscv/mmu.h

@ -293,8 +293,11 @@ public:
inline icache_entry_t* refill_icache(reg_t addr, icache_entry_t* entry) inline icache_entry_t* refill_icache(reg_t addr, icache_entry_t* entry)
{ {
if (matched_trigger) if (matched_trigger) {
throw *matched_trigger; auto trig = matched_trigger.value();
matched_trigger.reset();
throw trig;
}
auto [first_parcel, paddr] = fetch_insn_parcel_and_paddr(addr); auto [first_parcel, paddr] = fetch_insn_parcel_and_paddr(addr);
insn_bits_t insn = first_parcel; insn_bits_t insn = first_parcel;
@ -507,8 +510,7 @@ private:
bool check_triggers_fetch; bool check_triggers_fetch;
bool check_triggers_load; bool check_triggers_load;
bool check_triggers_store; bool check_triggers_store;
// The exception describing a matched trigger, or NULL. std::optional<triggers::matched_t> matched_trigger;
triggers::matched_t *matched_trigger;
friend class processor_t; friend class processor_t;
}; };

Loading…
Cancel
Save