Skip to content

Commit 6c83288

Browse files
committed
fixes CLINT interrupt handling
1 parent b4284ff commit 6c83288

3 files changed

Lines changed: 9 additions & 27 deletions

File tree

src/sysc/core2sc_adapter.h

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
#ifndef _SYSC_CORE2SC_ADAPTER_H_
3636
#define _SYSC_CORE2SC_ADAPTER_H_
3737

38-
#include "core_complex.h"
39-
#include "iss/log_categories.h"
4038
#include "sc2core_if.h"
4139
#include "util/delegate.h"
4240
#include "util/logging.h"
@@ -48,6 +46,7 @@
4846
#include <scc/async_event.h>
4947
#include <scc/report.h>
5048
#include <shared_mutex>
49+
#include <sysc/kernel/sc_time.h>
5150
#include <util/instance_logger.h>
5251
#include <util/ities.h>
5352

@@ -245,7 +244,7 @@ template <typename PLAT> class core2sc_adapter : public PLAT, public sc2core_if
245244
void wait_until(uint64_t flags) {
246245
SCCDEBUG(owner->hier_name()) << "Sleeping until interrupt";
247246
PLAT::wait_until(flags);
248-
while(this->reg.pending_trap == 0 && (this->csr[iss::arch::mip] & this->csr[iss::arch::mie]) == 0) {
247+
while((this->csr[iss::arch::mip] & this->csr[iss::arch::mie]) == 0) {
249248
sc_core::wait(wfi_evt);
250249
}
251250
}
@@ -289,21 +288,8 @@ template <typename PLAT> class core2sc_adapter : public PLAT, public sc2core_if
289288

290289
void _local_irq(short id, bool value) {
291290
reg_t mask = 0;
292-
switch(id) {
293-
case 3: // SW
294-
mask = 1 << 3;
295-
break;
296-
case 7: // timer
297-
mask = 1 << 7;
298-
break;
299-
case 11: // external
300-
mask = 1 << 11;
301-
break;
302-
default:
303-
if(id > 15)
304-
mask = 1 << id;
305-
break;
306-
}
291+
assert(id < 32 && "CLINT cannot handle more tahn 32 irq");
292+
mask = 1 << id;
307293
if(value) {
308294
this->csr[iss::arch::mip] |= mask;
309295
wfi_evt.notify();
@@ -313,6 +299,7 @@ template <typename PLAT> class core2sc_adapter : public PLAT, public sc2core_if
313299
if(value)
314300
SCCTRACE(owner->hier_name()) << "Triggering interrupt " << id << " Pending trap: " << this->reg.pending_trap;
315301
}
302+
316303
void _local_irq_mt(short id, bool value) {
317304
std::unique_lock<mutex_t> lock(sync_mtx);
318305
_local_irq(id, value);

src/sysc/core_complex.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,8 @@ template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::i
231231
});
232232
#else
233233
SC_METHOD(clint_irq_cb);
234-
for(auto pin : clint_irq_i)
235-
sensitive << pin;
234+
dont_initialize();
235+
sensitive << clint_irq_i;
236236
#endif
237237

238238
SC_METHOD(forward);
@@ -359,7 +359,7 @@ template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::r
359359
template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::clint_irq_cb() {
360360
for(auto i = 0U; i < clint_irq_i.size(); ++i) {
361361
if(clint_irq_i[i].event()) {
362-
core->local_irq(16 + i, clint_irq_i[i].read());
362+
core->local_irq(i, clint_irq_i[i].read());
363363
}
364364
}
365365
}

src/sysc/core_complex.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ class core_complex : public sc_core::sc_module, public scc::traceable, public co
9797

9898
sc_core::sc_in<bool> rst_i{"rst_i"};
9999

100-
sc_core::sc_vector<irq_signal_t> clint_irq_i{"local_irq_i", 16};
100+
sc_core::sc_vector<irq_signal_t> clint_irq_i{"clint_irq_i", 32};
101101

102102
#ifndef CWR_SYSTEMC
103103
sc_core::sc_in<sc_core::sc_time> clk_i{"clk_i"};
@@ -186,11 +186,6 @@ class core_complex : public sc_core::sc_module, public scc::traceable, public co
186186
void sync(uint64_t cycle) override {
187187
auto core_inc = curr_clk * (cycle - last_sync_cycle);
188188
quantum_keeper.check_and_sync(core_inc);
189-
// quantum_keeper.inc(core_inc);
190-
// if(quantum_keeper.need_sync()) {
191-
// wait(quantum_keeper.get_local_time());
192-
// quantum_keeper.reset();
193-
// }
194189
last_sync_cycle = cycle;
195190
}
196191

0 commit comments

Comments
 (0)