summaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorPrashanth Mundkur2018-09-28 18:37:11 -0700
committerPrashanth Mundkur2018-10-23 15:32:15 -0700
commit8525e0b26eaec05c2c031279693cd61c544fc12a (patch)
tree78f2f2ce1625152b0a3a380b5cdf8b27b5758d95 /riscv
parent0bce4fc40f2473e6f9f59e54b3e5061a4752b2d5 (diff)
RISC-V: tick the clock in the C platform.
Diffstat (limited to 'riscv')
-rw-r--r--riscv/riscv_platform_impl.c1
-rw-r--r--riscv/riscv_platform_impl.h1
-rw-r--r--riscv/riscv_sail.h2
-rw-r--r--riscv/riscv_sim.c18
4 files changed, 20 insertions, 2 deletions
diff --git a/riscv/riscv_platform_impl.c b/riscv/riscv_platform_impl.c
index 1a1d42a7..3135895d 100644
--- a/riscv/riscv_platform_impl.c
+++ b/riscv/riscv_platform_impl.c
@@ -15,3 +15,4 @@ uint64_t rv_clint_base = UINT64_C(0x2000000);
uint64_t rv_clint_size = UINT64_C(0xc0000);
uint64_t rv_htif_tohost = UINT64_C(0x80001000);
+uint64_t rv_insns_per_tick = UINT64_C(100);
diff --git a/riscv/riscv_platform_impl.h b/riscv/riscv_platform_impl.h
index db5ff639..a3ab79f8 100644
--- a/riscv/riscv_platform_impl.h
+++ b/riscv/riscv_platform_impl.h
@@ -21,3 +21,4 @@ extern uint64_t rv_clint_base;
extern uint64_t rv_clint_size;
extern uint64_t rv_htif_tohost;
+extern uint64_t rv_insns_per_tick;
diff --git a/riscv/riscv_sail.h b/riscv/riscv_sail.h
index 596a8263..17afedbd 100644
--- a/riscv/riscv_sail.h
+++ b/riscv/riscv_sail.h
@@ -12,6 +12,8 @@ void model_fini(void);
unit zinit_platform(unit);
unit zinit_sys(unit);
bool zstep(sail_int);
+unit ztick_clock(unit);
+unit ztick_platform(unit);
extern bool zhtif_done;
extern mach_bits zhtif_exit_code;
diff --git a/riscv/riscv_sim.c b/riscv/riscv_sim.c
index 2ac5e800..9e99136d 100644
--- a/riscv/riscv_sim.c
+++ b/riscv/riscv_sim.c
@@ -111,6 +111,8 @@ void init_spike(const char *f, uint64_t entry)
tv_set_dtb_in_rom(s, 1);
tv_load_elf(s, f);
tv_reset(s);
+ /* sync the insns per tick */
+ rv_insns_per_tick = tv_get_insns_per_tick(s);
#else
s = NULL;
#endif
@@ -261,6 +263,7 @@ void run_sail(void)
/* initialize the step number */
mach_int step_no = 0;
+ int insn_cnt = 0;
while (!zhtif_done) {
{ /* run a Sail step */
@@ -271,7 +274,10 @@ void run_sail(void)
if (have_exception) goto step_exception;
flush_logs();
}
- if (stepped) step_no++;
+ if (stepped) {
+ step_no++;
+ insn_cnt++;
+ }
#ifdef SPIKE
{ /* run a Spike step */
@@ -303,7 +309,15 @@ void run_sail(void)
}
#endif
- /* TODO: update time */
+ if (insn_cnt == rv_insns_per_tick) {
+ insn_cnt = 0;
+ ztick_clock(UNIT);
+ ztick_platform(UNIT);
+#ifdef SPIKE
+ tv_tick_clock(s);
+ tv_step_io(s);
+#endif
+ }
}
dump_state: