mirror of https://github.com/xemu-project/xemu.git
target/riscv: No need to re-start QEMU timer when timecmp == UINT64_MAX
The time CSR will wrap-around immediately after reaching UINT64_MAX so we don't need to re-start QEMU timer when timecmp == UINT64_MAX in riscv_timer_write_timecmp(). Signed-off-by: Anup Patel <apatel@ventanamicro.com> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20230120125950.2246378-4-apatel@ventanamicro.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
14cb78bfaf
commit
ae0edf2188
|
@ -72,6 +72,30 @@ void riscv_timer_write_timecmp(RISCVCPU *cpu, QEMUTimer *timer,
|
||||||
riscv_cpu_update_mip(cpu, timer_irq, BOOL_TO_MASK(0));
|
riscv_cpu_update_mip(cpu, timer_irq, BOOL_TO_MASK(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sstc specification says the following about timer interrupt:
|
||||||
|
* "A supervisor timer interrupt becomes pending - as reflected in
|
||||||
|
* the STIP bit in the mip and sip registers - whenever time contains
|
||||||
|
* a value greater than or equal to stimecmp, treating the values
|
||||||
|
* as unsigned integers. Writes to stimecmp are guaranteed to be
|
||||||
|
* reflected in STIP eventually, but not necessarily immediately.
|
||||||
|
* The interrupt remains posted until stimecmp becomes greater
|
||||||
|
* than time - typically as a result of writing stimecmp."
|
||||||
|
*
|
||||||
|
* When timecmp = UINT64_MAX, the time CSR will eventually reach
|
||||||
|
* timecmp value but on next timer tick the time CSR will wrap-around
|
||||||
|
* and become zero which is less than UINT64_MAX. Now, the timer
|
||||||
|
* interrupt behaves like a level triggered interrupt so it will
|
||||||
|
* become 1 when time = timecmp = UINT64_MAX and next timer tick
|
||||||
|
* it will become 0 again because time = 0 < timecmp = UINT64_MAX.
|
||||||
|
*
|
||||||
|
* Based on above, we don't re-start the QEMU timer when timecmp
|
||||||
|
* equals UINT64_MAX.
|
||||||
|
*/
|
||||||
|
if (timecmp == UINT64_MAX) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* otherwise, set up the future timer interrupt */
|
/* otherwise, set up the future timer interrupt */
|
||||||
diff = timecmp - rtc_r;
|
diff = timecmp - rtc_r;
|
||||||
/* back to ns (note args switched in muldiv64) */
|
/* back to ns (note args switched in muldiv64) */
|
||||||
|
|
Loading…
Reference in New Issue