diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-04-21 19:38:45 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-04-21 19:38:45 +0300 |
| commit | 1a5248bb177242a34fd51efadb4af941853d5e35 (patch) | |
| tree | 669565c49217876611565c42867dcf0126e08933 /common/uapi | |
| parent | 7967a9ab13214543041e4408086668b4db8d3e62 (diff) | |
| download | kmi-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.c | 3 | ||||
| -rw-r--r-- | common/uapi/timers.c | 29 |
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; } |
