On Fri, Jul 28, 2023 at 5:13 AM Jason Chien <jason.ch...@sifive.com> wrote: > > When writing the upper mtime, we should keep the original lower mtime > whose value is given by cpu_riscv_read_rtc() instead of > cpu_riscv_read_rtc_raw(). The same logic applies to writes to lower mtime. > > Signed-off-by: Jason Chien <jason.ch...@sifive.com>
Reviewed-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > hw/intc/riscv_aclint.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c > index b466a6abaf..bf77e29a70 100644 > --- a/hw/intc/riscv_aclint.c > +++ b/hw/intc/riscv_aclint.c > @@ -208,11 +208,12 @@ static void riscv_aclint_mtimer_write(void *opaque, > hwaddr addr, > return; > } else if (addr == mtimer->time_base || addr == mtimer->time_base + 4) { > uint64_t rtc_r = cpu_riscv_read_rtc_raw(mtimer->timebase_freq); > + uint64_t rtc = cpu_riscv_read_rtc(mtimer); > > if (addr == mtimer->time_base) { > if (size == 4) { > /* time_lo for RV32/RV64 */ > - mtimer->time_delta = ((rtc_r & ~0xFFFFFFFFULL) | value) - > rtc_r; > + mtimer->time_delta = ((rtc & ~0xFFFFFFFFULL) | value) - > rtc_r; > } else { > /* time for RV64 */ > mtimer->time_delta = value - rtc_r; > @@ -220,7 +221,7 @@ static void riscv_aclint_mtimer_write(void *opaque, > hwaddr addr, > } else { > if (size == 4) { > /* time_hi for RV32/RV64 */ > - mtimer->time_delta = (value << 32 | (rtc_r & 0xFFFFFFFF)) - > rtc_r; > + mtimer->time_delta = (value << 32 | (rtc & 0xFFFFFFFF)) - > rtc_r; > } else { > qemu_log_mask(LOG_GUEST_ERROR, > "aclint-mtimer: invalid time_hi write: %08x", > -- > 2.17.1 > >