aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Zhao <jerryz123@berkeley.edu>2023-06-02 09:15:03 -0700
committerJerry Zhao <jerryz123@berkeley.edu>2023-06-20 12:23:47 -0700
commite47fc7075110fd97ee3fc96a4e67acb4a3b9c5fa (patch)
treef1c6addc5bec31fef368dc4c840ee91bb0df143a
parent20793b36b79db337187964da3df397c1da576c23 (diff)
downloadriscv-isa-sim-e47fc7075110fd97ee3fc96a4e67acb4a3b9c5fa.zip
riscv-isa-sim-e47fc7075110fd97ee3fc96a4e67acb4a3b9c5fa.tar.gz
riscv-isa-sim-e47fc7075110fd97ee3fc96a4e67acb4a3b9c5fa.tar.bz2
clint: Change clint_t::increment to override abstract_device_t::tick(rtc_ticks)
-rw-r--r--riscv/abstract_device.h2
-rw-r--r--riscv/clint.cc10
-rw-r--r--riscv/devices.h4
-rw-r--r--riscv/ns16550.cc2
-rw-r--r--riscv/sim.cc5
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 <cstdint>
#include <cstddef>
@@ -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);
}
}
}