aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/timers.c
blob: bc3ef593c731d6205fcb2d56058190bd9d69c5e4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/* SPDX-License-Identifier: GPL-3.0-or-later */
/* Copyright 2021 - 2022, Kim Kuparinen < kimi.h.kuparinen@gmail.com > */

/**
 * @file timers.c
 * Timer syscall implementations.
 */

#include <apos/timer.h>
#include <apos/uapi.h>

static ticks_t scaled_ticks(sys_arg_t ticks, sys_arg_t repeat)
{
#if __WORDSIZE == 64
	UNUSED(repeat);
	return ticks;
#else
	return ((ticks_t)ticks << 32) + repeat;
#endif
}

SYSCALL_DEFINE0(timebase)()
{
	return (struct sys_ret){ OK, secs_to_ticks(1) };
}

SYSCALL_DEFINE2(req_rel_timer)(sys_arg_t ticks, sys_arg_t repeat)
{
	return (struct sys_ret){
		       OK,
		       new_rel_timer(cur_tcb()->tid,
		                     scaled_ticks(ticks, repeat))
	};
}

SYSCALL_DEFINE2(req_abs_timer)(sys_arg_t ticks, sys_arg_t repeat)
{
	return (struct sys_ret){
		       OK,
		       new_abs_timer(cur_tcb()->tid,
		                     scaled_ticks(ticks, repeat))
	};
}

SYSCALL_DEFINE1(free_timer)(sys_arg_t cid)
{
	struct timer *timer = find_timer(cid);
	if (!timer)
		return (struct sys_ret){ ERR_NF, 0 };

	remove_timer(timer);
	return (struct sys_ret){ OK, 0 };
}