diff --git a/src/sysc/core_complex.cpp b/src/sysc/core_complex.cpp index 410bdea..00e7414 100644 --- a/src/sysc/core_complex.cpp +++ b/src/sysc/core_complex.cpp @@ -88,6 +88,10 @@ using namespace sc_core; namespace { iss::debugger::encoder_decoder encdec; std::array lvl = {{'U', 'S', 'H', 'M'}}; + +inline bool is_in_end_range(uint64_t end, uint64_t inclusive_range_end) { + return (end <= inclusive_range_end) || ((end >= 0) && ((end - 1) <= inclusive_range_end)); +} } // namespace template @@ -191,20 +195,20 @@ template void core_complex::i core_complex_if::exec_on_sysc = util::delegate&)>::from>(this); ibus.register_invalidate_direct_mem_ptr([this](uint64_t start, uint64_t end) -> void { auto lut_entry = fetch_lut.getEntry(start); - if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) { + if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && is_in_end_range(end, lut_entry.get_end_address())) { fetch_lut.removeEntry(lut_entry); } }); dbus.register_invalidate_direct_mem_ptr([this](uint64_t start, uint64_t end) -> void { for(auto& read_lut : dmi_read_luts) { auto lut_entry = read_lut.getEntry(start); - if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) { + if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && is_in_end_range(end, lut_entry.get_end_address())) { read_lut.removeEntry(lut_entry); } } for(auto& write_lut : dmi_write_luts) { auto lut_entry = write_lut.getEntry(start); - if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address() + 1) { + if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && is_in_end_range(end, lut_entry.get_end_address())) { write_lut.removeEntry(lut_entry); } } @@ -396,7 +400,7 @@ bool core_complex::read_mem(const addr_t& addr, unsigned length, u bool is_fetch = addr.space == std::numeric_limits::max() ? true : false; auto& dmi_lut = is_fetch ? fetch_lut : get_read_lut(addr.space); auto lut_entry = dmi_lut.getEntry(addr.val); - if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && (addr.val + length) <= (lut_entry.get_end_address() + 1)) { + if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && is_in_end_range(addr.val + length, lut_entry.get_end_address())) { auto offset = addr.val - lut_entry.get_start_address(); std::copy(lut_entry.get_dmi_ptr() + offset, lut_entry.get_dmi_ptr() + offset + length, data); if(is_fetch) @@ -450,7 +454,7 @@ bool core_complex::read_mem(const addr_t& addr, unsigned length, u gp.set_address(addr.val); tlm_dmi_ext dmi_data; if(exec_get_direct_mem_ptr(gp, dmi_data)) { - if(dmi_data.is_read_allowed() && (addr.val + length - 1) <= dmi_data.get_end_address()) + if(dmi_data.is_read_allowed() && is_in_end_range(addr.val + length, dmi_data.get_end_address())) dmi_lut.addEntry(dmi_data, dmi_data.get_start_address(), dmi_data.get_end_address() - dmi_data.get_start_address() + 1); } } @@ -461,7 +465,7 @@ bool core_complex::read_mem(const addr_t& addr, unsigned length, u template bool core_complex::write_mem(const addr_t& addr, unsigned length, const uint8_t* const data) { auto lut_entry = get_write_lut(addr.space).getEntry(addr.val); - if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && (addr.val + length) <= (lut_entry.get_end_address() + 1)) { + if(lut_entry.get_granted_access() != tlm::tlm_dmi::DMI_ACCESS_NONE && is_in_end_range(addr.val + length, lut_entry.get_end_address())) { auto offset = addr.val - lut_entry.get_start_address(); std::copy(data, data + length, lut_entry.get_dmi_ptr() + offset); dbus_inc += lut_entry.get_write_latency() / curr_clk; @@ -508,7 +512,7 @@ bool core_complex::write_mem(const addr_t& addr, unsigned length, gp.set_address(addr.val); tlm_dmi_ext dmi_data; if(exec_get_direct_mem_ptr(gp, dmi_data)) { - if(dmi_data.is_write_allowed() && (addr.val + length - 1) <= dmi_data.get_end_address()) + if(dmi_data.is_write_allowed() && is_in_end_range(addr.val + length, dmi_data.get_end_address())) get_write_lut(addr.space) .addEntry(dmi_data, dmi_data.get_start_address(), dmi_data.get_end_address() - dmi_data.get_start_address() + 1); }