mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
hw/intc: Fix upper/lower mtime write calculation
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> Message-ID: <20230728082502.26439-1-jason.chien@sifive.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
eda633a534
commit
e0922b73ba
1 changed files with 3 additions and 2 deletions
|
@ -208,11 +208,12 @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr,
|
||||||
return;
|
return;
|
||||||
} else if (addr == mtimer->time_base || addr == mtimer->time_base + 4) {
|
} 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_r = cpu_riscv_read_rtc_raw(mtimer->timebase_freq);
|
||||||
|
uint64_t rtc = cpu_riscv_read_rtc(mtimer);
|
||||||
|
|
||||||
if (addr == mtimer->time_base) {
|
if (addr == mtimer->time_base) {
|
||||||
if (size == 4) {
|
if (size == 4) {
|
||||||
/* time_lo for RV32/RV64 */
|
/* time_lo for RV32/RV64 */
|
||||||
mtimer->time_delta = ((rtc_r & ~0xFFFFFFFFULL) | value) - rtc_r;
|
mtimer->time_delta = ((rtc & ~0xFFFFFFFFULL) | value) - rtc_r;
|
||||||
} else {
|
} else {
|
||||||
/* time for RV64 */
|
/* time for RV64 */
|
||||||
mtimer->time_delta = value - rtc_r;
|
mtimer->time_delta = value - rtc_r;
|
||||||
|
@ -220,7 +221,7 @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr,
|
||||||
} else {
|
} else {
|
||||||
if (size == 4) {
|
if (size == 4) {
|
||||||
/* time_hi for RV32/RV64 */
|
/* 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 {
|
} else {
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
"aclint-mtimer: invalid time_hi write: %08x",
|
"aclint-mtimer: invalid time_hi write: %08x",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue