aboutsummaryrefslogtreecommitdiff
path: root/common/uapi
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-04-21 19:38:45 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-04-21 19:38:45 +0300
commit1a5248bb177242a34fd51efadb4af941853d5e35 (patch)
tree669565c49217876611565c42867dcf0126e08933 /common/uapi
parent7967a9ab13214543041e4408086668b4db8d3e62 (diff)
downloadkmi-1a5248bb177242a34fd51efadb4af941853d5e35.tar.gz
kmi-1a5248bb177242a34fd51efadb4af941853d5e35.zip
use uint64_t for timer ticks
+ GCC seems to provide this even on 32bit platforms, though I should really check.
Diffstat (limited to 'common/uapi')
-rw-r--r--common/uapi/dispatch.c3
-rw-r--r--common/uapi/timers.c29
2 files changed, 26 insertions, 6 deletions
diff --git a/common/uapi/dispatch.c b/common/uapi/dispatch.c
index 3b03c43..e6c334a 100644
--- a/common/uapi/dispatch.c
+++ b/common/uapi/dispatch.c
@@ -8,7 +8,8 @@ static const sys_t syscall_table[] = {
[SYS_FREE_MEM] = sys_free_mem,
/* timers */
- [SYS_REQ_TIMER] = sys_req_timer,
+ [SYS_REQ_REL_TIMER] = sys_req_rel_timer,
+ [SYS_REQ_ABS_TIMER] = sys_req_abs_timer,
[SYS_FREE_TIMER] = sys_free_timer,
/* ipc */
diff --git a/common/uapi/timers.c b/common/uapi/timers.c
index 1dfc8bf..66f6533 100644
--- a/common/uapi/timers.c
+++ b/common/uapi/timers.c
@@ -1,13 +1,32 @@
+#include <apos/timer.h>
#include <apos/uapi.h>
-SYSCALL_DEFINE1(req_timer)(vm_t ticks)
+static ticks_t scaled_ticks(vm_t ticks, vm_t repeat)
{
- /* TODO */
- return 0;
+#if __WORDSIZE == 64
+ UNUSED(repeat);
+ return ticks;
+#else
+ return ((ticks_t)ticks << 32) + repeat;
+#endif
+}
+
+SYSCALL_DEFINE2(req_rel_timer)(vm_t ticks, vm_t repeat)
+{
+ return new_rel_timer(cur_tcb()->tid, scaled_ticks(ticks, repeat));
+}
+
+SYSCALL_DEFINE2(req_abs_timer)(vm_t ticks, vm_t repeat)
+{
+ return new_abs_timer(cur_tcb()->tid, scaled_ticks(ticks, repeat));
}
SYSCALL_DEFINE1(free_timer)(vm_t cid)
{
- /* TODO */
- return 0;
+ struct timer *timer = find_timer(cid);
+ if (!timer)
+ return ERR_NF;
+
+ remove_timer(timer);
+ return OK;
}