diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-03-10 00:13:32 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-03-10 00:21:15 -0800 |
commit | 82382a1290739068dd38dda8fac29a498f8987a7 (patch) | |
tree | 865564e464b058e36d8d8448f2463d9637fc6ce1 | |
parent | ccf79891f0f1fcb570f9a63c15270b52477fe7c0 (diff) | |
download | riscv-pk-82382a1290739068dd38dda8fac29a498f8987a7.zip riscv-pk-82382a1290739068dd38dda8fac29a498f8987a7.tar.gz riscv-pk-82382a1290739068dd38dda8fac29a498f8987a7.tar.bz2 |
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.
-rw-r--r-- | machine/mtrap.c | 13 |
1 files changed, 9 insertions, 4 deletions
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); |