From 82382a1290739068dd38dda8fac29a498f8987a7 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Thu, 10 Mar 2016 00:13:32 -0800 Subject: Set time comparator correctly on RV32 The old code truncated the upper 32 bits, and even if it got that right, it would have generated spurious interrupts. --- machine/mtrap.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'machine/mtrap.c') diff --git a/machine/mtrap.c b/machine/mtrap.c index 6fc5476..44023b2 100644 --- a/machine/mtrap.c +++ b/machine/mtrap.c @@ -134,13 +134,14 @@ static uintptr_t mcall_shutdown() poweroff(); } -static uintptr_t mcall_set_timer(unsigned long long when) +static uintptr_t mcall_set_timer(uint64_t when) { // bbl/pk don't use the timer, so there's no need to virtualize it - write_csr(mtimecmp, when); -#ifndef __riscv64 - write_csr(mtimecmph, when >> 32); +#ifdef __riscv32 + write_csr(mtimecmp, -1); + write_csr(mtimecmph, (uintptr_t)(when >> 32)); #endif + write_csr(mtimecmp, (uintptr_t)when); clear_csr(mip, MIP_STIP); set_csr(mie, MIP_MTIP); return 0; @@ -225,7 +226,11 @@ void mcall_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc) retval = mcall_shutdown(); break; case MCALL_SET_TIMER: +#ifdef __riscv32 + retval = mcall_set_timer(arg0 + ((uint64_t)arg1 << 32)); +#else retval = mcall_set_timer(arg0); +#endif break; case MCALL_REMOTE_SFENCE_VM: retval = mcall_remote_sfence_vm((uintptr_t*)arg0, arg1); -- cgit v1.1