From e47fc7075110fd97ee3fc96a4e67acb4a3b9c5fa Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Fri, 2 Jun 2023 09:15:03 -0700 Subject: clint: Change clint_t::increment to override abstract_device_t::tick(rtc_ticks) --- riscv/abstract_device.h | 2 ++ riscv/clint.cc | 10 +++++----- riscv/devices.h | 4 ++-- riscv/ns16550.cc | 2 +- riscv/sim.cc | 5 +++-- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/riscv/abstract_device.h b/riscv/abstract_device.h index 559c64f..f4ccebe 100644 --- a/riscv/abstract_device.h +++ b/riscv/abstract_device.h @@ -2,6 +2,7 @@ #define _RISCV_ABSTRACT_DEVICE_H #include "decode.h" +#include "common.h" #include #include @@ -10,6 +11,7 @@ class abstract_device_t { virtual bool load(reg_t addr, size_t len, uint8_t* bytes) = 0; virtual bool store(reg_t addr, size_t len, const uint8_t* bytes) = 0; virtual ~abstract_device_t() {} + virtual void tick(reg_t UNUSED rtc_ticks) {} }; #endif diff --git a/riscv/clint.cc b/riscv/clint.cc index f27f02c..485c997 100644 --- a/riscv/clint.cc +++ b/riscv/clint.cc @@ -12,7 +12,7 @@ clint_t::clint_t(simif_t* sim, uint64_t freq_hz, bool real_time) real_time_ref_secs = base.tv_sec; real_time_ref_usecs = base.tv_usec; - increment(0); + tick(0); } /* 0000 msip hart 0 @@ -34,7 +34,7 @@ bool clint_t::load(reg_t addr, size_t len, uint8_t* bytes) if (len > 8) return false; - increment(0); + tick(0); if (addr >= MSIP_BASE && addr < MTIMECMP_BASE) { if (len == 8) { @@ -90,11 +90,11 @@ bool clint_t::store(reg_t addr, size_t len, const uint8_t* bytes) } else { return false; } - increment(0); + tick(0); return true; } -void clint_t::increment(reg_t inc) +void clint_t::tick(reg_t rtc_ticks) { if (real_time) { struct timeval now; @@ -104,7 +104,7 @@ void clint_t::increment(reg_t inc) diff_usecs = ((now.tv_sec - real_time_ref_secs) * 1000000) + (now.tv_usec - real_time_ref_usecs); mtime = diff_usecs * freq_hz / 1000000; } else { - mtime += inc; + mtime += rtc_ticks; } for (const auto& [hart_id, hart] : sim->get_harts()) { diff --git a/riscv/devices.h b/riscv/devices.h index b9f639d..a62509a 100644 --- a/riscv/devices.h +++ b/riscv/devices.h @@ -62,7 +62,7 @@ class clint_t : public abstract_device_t { bool load(reg_t addr, size_t len, uint8_t* bytes) override; bool store(reg_t addr, size_t len, const uint8_t* bytes) override; size_t size() { return CLINT_SIZE; } - void increment(reg_t inc); + void tick(reg_t rtc_ticks) override; uint64_t get_mtimecmp(reg_t hartid) { return mtimecmp[hartid]; } uint64_t get_mtime() { return mtime; } private: @@ -131,7 +131,7 @@ class ns16550_t : public abstract_device_t { uint32_t interrupt_id, uint32_t reg_shift, uint32_t reg_io_width); bool load(reg_t addr, size_t len, uint8_t* bytes) override; bool store(reg_t addr, size_t len, const uint8_t* bytes) override; - void tick(void); + void tick(reg_t rtc_ticks) override; size_t size() { return NS16550_SIZE; } private: class bus_t *bus; diff --git a/riscv/ns16550.cc b/riscv/ns16550.cc index 8d7e4de..d21983b 100644 --- a/riscv/ns16550.cc +++ b/riscv/ns16550.cc @@ -292,7 +292,7 @@ bool ns16550_t::store(reg_t addr, size_t len, const uint8_t* bytes) return ret; } -void ns16550_t::tick(void) +void ns16550_t::tick(reg_t UNUSED rtc_ticks) { if (!(fcr & UART_FCR_ENABLE_FIFO) || (mcr & UART_MCR_LOOP) || diff --git a/riscv/sim.cc b/riscv/sim.cc index 82619e7..77ed4c7 100644 --- a/riscv/sim.cc +++ b/riscv/sim.cc @@ -245,8 +245,9 @@ void sim_t::step(size_t n) procs[current_proc]->get_mmu()->yield_load_reservation(); if (++current_proc == procs.size()) { current_proc = 0; - if (clint) clint->increment(INTERLEAVE / INSNS_PER_RTC_TICK); - if (ns16550) ns16550->tick(); + reg_t rtc_ticks = INTERLEAVE / INSNS_PER_RTC_TICK; + if (clint) clint->tick(rtc_ticks); + if (ns16550) ns16550->tick(rtc_ticks); } } } -- cgit v1.1