[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 1/2] hw/intc: Fix upper/lower mtime write calculation
From: |
Alistair Francis |
Subject: |
Re: [PATCH 1/2] hw/intc: Fix upper/lower mtime write calculation |
Date: |
Thu, 10 Aug 2023 14:23:58 -0400 |
On Fri, Jul 28, 2023 at 5:13 AM Jason Chien <jason.chien@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.chien@sifive.com>
Reviewed-by: Alistair Francis <alistair.francis@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
>
>