aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Shu <jim.shu@sifive.com>2025-05-19 22:35:15 +0800
committerAlistair Francis <alistair.francis@wdc.com>2025-07-04 21:09:48 +1000
commit6eba6fe967c3a2606ef5ec5ba9a283b21d09f85b (patch)
treed3f964f44588958e7ce335a586c27d58a01038d4
parentc77283dd5d79149f4e7e9edd00f65416c648ee59 (diff)
downloadqemu-6eba6fe967c3a2606ef5ec5ba9a283b21d09f85b.zip
qemu-6eba6fe967c3a2606ef5ec5ba9a283b21d09f85b.tar.gz
qemu-6eba6fe967c3a2606ef5ec5ba9a283b21d09f85b.tar.bz2
target/riscv: Add the checking into stimecmp write function.
Preparation commit to let aclint timer to use stimecmp write function. Aclint timer doesn't call sstc() predicate so we need to check inside the stimecmp write function. Signed-off-by: Jim Shu <jim.shu@sifive.com> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20250519143518.11086-2-jim.shu@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
-rw-r--r--target/riscv/time_helper.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/target/riscv/time_helper.c b/target/riscv/time_helper.c
index bc0d9a0..aebf079 100644
--- a/target/riscv/time_helper.c
+++ b/target/riscv/time_helper.c
@@ -46,8 +46,23 @@ void riscv_timer_write_timecmp(CPURISCVState *env, QEMUTimer *timer,
{
uint64_t diff, ns_diff, next;
RISCVAclintMTimerState *mtimer = env->rdtime_fn_arg;
- uint32_t timebase_freq = mtimer->timebase_freq;
- uint64_t rtc_r = env->rdtime_fn(env->rdtime_fn_arg) + delta;
+ uint32_t timebase_freq;
+ uint64_t rtc_r;
+
+ if (!riscv_cpu_cfg(env)->ext_sstc || !env->rdtime_fn ||
+ !env->rdtime_fn_arg || !get_field(env->menvcfg, MENVCFG_STCE)) {
+ /* S/VS Timer IRQ depends on sstc extension, rdtime_fn(), and STCE. */
+ return;
+ }
+
+ if (timer_irq == MIP_VSTIP &&
+ (!riscv_has_ext(env, RVH) || !get_field(env->henvcfg, HENVCFG_STCE))) {
+ /* VS Timer IRQ also depends on RVH and henvcfg.STCE. */
+ return;
+ }
+
+ timebase_freq = mtimer->timebase_freq;
+ rtc_r = env->rdtime_fn(env->rdtime_fn_arg) + delta;
if (timecmp <= rtc_r) {
/*