aboutsummaryrefslogtreecommitdiff
path: root/pk/mtrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'pk/mtrap.c')
-rw-r--r--pk/mtrap.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/pk/mtrap.c b/pk/mtrap.c
index 77b562a..ab7134b 100644
--- a/pk/mtrap.c
+++ b/pk/mtrap.c
@@ -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;