Skip to content

Commit a326c82

Browse files
committed
fixes interrupt configurability of platform wrapper
1 parent 41e5c6d commit a326c82

6 files changed

Lines changed: 17 additions & 8 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ if(NOT TARGET dbt-rise-core)
1919
FetchContent_Declare(
2020
dbt_rise_core_git
2121
GIT_REPOSITORY "https://github.com/Minres/DBT-RISE-Core.git"
22-
GIT_TAG f50d2d185adf8bb9f073018631d7be2a53500224
22+
GIT_TAG 8f181e19e14e3fe5cfba340b47795c7b48b7844a
2323
GIT_SHALLOW OFF
2424
UPDATE_DISCONNECTED NOT ${UPDATE_EXTERNAL_PROJECT} # When enabled, this option causes the update step to be skipped.
2525
)

src/iss/arch/riscv_hart_common.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ template <typename BASE = logging::disass> struct riscv_hart_common : public BAS
514514
if(enable)
515515
this->disass_func = util::delegate<void(uint64_t, std::string const&, bool)>::from<this_class, &this_class::print_disass_output>(this);
516516
else
517-
this->disass_func = util::delegate<void(uint64_t, std::string const&, bool)>::from<this_class, &this_class::print_disass_output>(nullptr);
517+
this->disass_func = util::delegate<void(uint64_t, std::string const&, bool)>(nullptr);
518518
}
519519

520520
void set_semihosting_callback(semihosting_cb_t<reg_t> cb) { semihosting_cb = cb; };
@@ -1011,7 +1011,12 @@ template <typename BASE = logging::disass> struct riscv_hart_common : public BAS
10111011

10121012
void set_next(mem::memory_if mem_if) override { memory = mem_if; };
10131013

1014-
void set_irq_num(unsigned i) { mcause_max_irq = std::max(1u << util::ilog2(i), 16u); }
1014+
void set_max_irq_num(unsigned i) { mcause_max_irq = std::max(1u << util::ilog2(i), 16u); }
1015+
1016+
void set_clint_custom_irq_num(unsigned num) {
1017+
assert(num<=traits<BASE>::XLEN);
1018+
clint_custom_irq_mask=std::numeric_limits<reg_t>::max()>>(traits<BASE>::XLEN-num);
1019+
}
10151020

10161021
protected:
10171022
util::InstanceLogger<logging::dbt_rise_iss> isslogger;
@@ -1060,7 +1065,7 @@ template <typename BASE = logging::disass> struct riscv_hart_common : public BAS
10601065
instrumentation_if* get_instrumentation_if() override { return &instr_if; };
10611066

10621067
using csr_type = std::array<typename traits<BASE>::reg_t, 1ULL << 12>;
1063-
csr_type csr;
1068+
csr_type csr{0};
10641069

10651070
std::unordered_map<unsigned, rd_csr_f> csr_rd_cb;
10661071
std::unordered_map<unsigned, wr_csr_f> csr_wr_cb;
@@ -1074,6 +1079,7 @@ template <typename BASE = logging::disass> struct riscv_hart_common : public BAS
10741079
int64_t instret_offset{0};
10751080
semihosting_cb_t<reg_t> semihosting_cb;
10761081
unsigned mcause_max_irq{traits<BASE>::XLEN};
1082+
reg_t clint_custom_irq_mask{0xffff};
10771083
};
10781084

10791085
} // namespace arch

src/iss/arch/riscv_hart_m_p.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,8 @@ template <typename BASE, features_e FEAT> iss::status riscv_hart_m_p<BASE, FEAT>
316316
}
317317

318318
template <typename BASE, features_e FEAT> iss::status riscv_hart_m_p<BASE, FEAT>::write_ie(unsigned addr, reg_t val) {
319-
auto mask = riscv_hart_common<BASE>::get_irq_mask(3);
319+
// generate mask from allowed writable bits, the number of custom interrupts and the available ie bits
320+
auto mask = riscv_hart_common<BASE>::get_irq_mask(3) & this->clint_custom_irq_mask & 0x0888;
320321
this->csr[mie] = (this->csr[mie] & ~mask) | (val & mask);
321322
check_interrupt();
322323
return iss::Ok;

src/iss/arch/riscv_hart_msu_vp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,8 @@ template <typename BASE, features_e FEAT> iss::status riscv_hart_msu_vp<BASE, FE
416416
}
417417

418418
template <typename BASE, features_e FEAT> iss::status riscv_hart_msu_vp<BASE, FEAT>::write_ie(unsigned addr, reg_t val) {
419-
auto mask = riscv_hart_common<BASE>::get_irq_mask((addr >> 8) & 0x3);
419+
// generate mask from allowed writable bits, the number of custom interrupts and the available ie bits
420+
auto mask = riscv_hart_common<BASE>::get_irq_mask((addr >> 8) & 0x3) & this->clint_custom_irq_mask & (FEAT & FEAT_EXT_N?0xbbb:0xaaa);
420421
this->csr[mie] = (this->csr[mie] & ~mask) | (val & mask);
421422
check_interrupt();
422423
return iss::Ok;

src/iss/arch/riscv_hart_mu_p.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,8 @@ template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT
345345
}
346346

347347
template <typename BASE, features_e FEAT> iss::status riscv_hart_mu_p<BASE, FEAT>::write_ie(unsigned addr, reg_t val) {
348-
auto mask = riscv_hart_common<BASE>::get_irq_mask((addr >> 8) & 0x3);
348+
// generate mask from allowed writable bits, the number of custom interrupts and the available ie bits
349+
auto mask = riscv_hart_common<BASE>::get_irq_mask((addr >> 8) & 0x3) & this->clint_custom_irq_mask & (FEAT & FEAT_EXT_N?0x999:0x888);
349350
this->csr[mie] = (this->csr[mie] & ~mask) | (val & mask);
350351
check_interrupt();
351352
return iss::Ok;

src/sysc/core_complex.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ using irq_signal_t = sc_core::sc_in<bool>;
8686

8787
enum { SW_IRQ = 3, TIMER_IRQ = 7, EXT_IRQ = 11, LOCAL_IRQ_START = 16 };
8888

89-
template <unsigned int BUSWIDTH = scc::LT, typename QK = tlm::scc::quantumkeeper>
89+
template <unsigned int BUSWIDTH = scc::LT, typename QK = tlm::scc::quantumkeeper_st>
9090
class core_complex : public sc_core::sc_module, public scc::traceable, public core_complex_if {
9191
public:
9292
using this_class = core_complex<BUSWIDTH, QK>;

0 commit comments

Comments
 (0)