Remove MTIME[CMP]; add RTC device
[riscv-isa-sim.git] / riscv / rtc.cc
1 #include "devices.h"
2 #include "processor.h"
3
4 rtc_t::rtc_t(std::vector<processor_t*>& procs)
5 : procs(procs), regs(1 + procs.size())
6 {
7 }
8
9 bool rtc_t::load(reg_t addr, size_t len, uint8_t* bytes)
10 {
11 if (addr + len > size())
12 return false;
13 memcpy(bytes, (uint8_t*)&regs[0] + addr, len);
14 return true;
15 }
16
17 bool rtc_t::store(reg_t addr, size_t len, const uint8_t* bytes)
18 {
19 if (addr + len > size() || addr < 8)
20 return false;
21 memcpy((uint8_t*)&regs[0] + addr, bytes, len);
22 increment(0);
23 return true;
24 }
25
26 void rtc_t::increment(reg_t inc)
27 {
28 regs[0] += inc;
29 for (size_t i = 0; i < procs.size(); i++) {
30 procs[i]->state.mip &= ~MIP_MTIP;
31 if (regs[0] >= regs[1+i])
32 procs[i]->state.mip |= MIP_MTIP;
33 }
34 }