diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-07-05 16:52:05 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-07-05 16:52:05 -0700 |
commit | a6da37f21720d12f0295876ce426bc081a62a7d8 (patch) | |
tree | ce3a531905b52858899a470eca3bfb43050de536 /pk/mtrap.c | |
parent | 027ba300cbeaa425218fd472e1fcf45c785f645c (diff) | |
download | pk-a6da37f21720d12f0295876ce426bc081a62a7d8.zip pk-a6da37f21720d12f0295876ce426bc081a62a7d8.tar.gz pk-a6da37f21720d12f0295876ce426bc081a62a7d8.tar.bz2 |
New M-mode timer and SBI call to use it
Diffstat (limited to 'pk/mtrap.c')
-rw-r--r-- | pk/mtrap.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -207,6 +207,18 @@ static uintptr_t mcall_shutdown() return 0; } +static uintptr_t mcall_set_timer(unsigned long long 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); +#endif + clear_csr(mip, MIP_STIP); + set_csr(mie, MIP_MTIP); + return 0; +} + uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs) { uintptr_t n = regs[17], arg0 = regs[10], retval; @@ -233,6 +245,9 @@ uintptr_t mcall_trap(uintptr_t mcause, uintptr_t* regs) case MCALL_SHUTDOWN: retval = mcall_shutdown(); break; + case MCALL_SET_TIMER: + retval = mcall_set_timer(arg0); + break; default: retval = -ENOSYS; break; |