1271743Sbz/*-
2271743Sbz * Copyright (c) 2014 Bjoern A. Zeeb
3271743Sbz * All rights reserved.
4271743Sbz *
5271743Sbz * This software was developed by SRI International and the University of
6271743Sbz * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249
7271743Sbz * ("MRC2"), as part of the DARPA MRC research programme.
8271743Sbz *
9271743Sbz * Redistribution and use in source and binary forms, with or without
10271743Sbz * modification, are permitted provided that the following conditions
11271743Sbz * are met:
12271743Sbz * 1. Redistributions of source code must retain the above copyright
13271743Sbz *    notice, this list of conditions and the following disclaimer.
14271743Sbz * 2. Redistributions in binary form must reproduce the above copyright
15271743Sbz *    notice, this list of conditions and the following disclaimer in the
16271743Sbz *    documentation and/or other materials provided with the distribution.
17271743Sbz *
18271743Sbz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19271743Sbz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20271743Sbz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21271743Sbz * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22271743Sbz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23271743Sbz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24271743Sbz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25271743Sbz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26271743Sbz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27271743Sbz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28271743Sbz * SUCH DAMAGE.
29271743Sbz *
30271743Sbz * $FreeBSD: releng/10.3/sys/compat/linux/linux_timer.h 293566 2016-01-09 17:12:45Z dchagin $
31271743Sbz */
32271743Sbz
33271743Sbz#ifndef	_LINUX_TIMER_H
34271743Sbz#define	_LINUX_TIMER_H
35271743Sbz
36271743Sbz#ifndef	__LINUX_ARCH_SIGEV_PREAMBLE_SIZE
37271743Sbz#define	__LINUX_ARCH_SIGEV_PREAMBLE_SIZE	\
38271743Sbz	(sizeof(l_int) * 2 + sizeof(l_sigval_t))
39271743Sbz#endif
40271743Sbz
41271743Sbz#define	LINUX_SIGEV_MAX_SIZE			64
42271743Sbz#define	LINUX_SIGEV_PAD_SIZE			\
43271743Sbz	((LINUX_SIGEV_MAX_SIZE - __LINUX_ARCH_SIGEV_PREAMBLE_SIZE) / \
44271743Sbz	sizeof(l_int))
45271743Sbz
46271743Sbz#define	LINUX_CLOCK_REALTIME			0
47271743Sbz#define	LINUX_CLOCK_MONOTONIC			1
48271743Sbz#define	LINUX_CLOCK_PROCESS_CPUTIME_ID		2
49271743Sbz#define	LINUX_CLOCK_THREAD_CPUTIME_ID		3
50271743Sbz#define	LINUX_CLOCK_MONOTONIC_RAW		4
51271743Sbz#define	LINUX_CLOCK_REALTIME_COARSE		5
52271743Sbz#define	LINUX_CLOCK_MONOTONIC_COARSE		6
53271743Sbz#define	LINUX_CLOCK_BOOTTIME			7
54271743Sbz#define	LINUX_CLOCK_REALTIME_ALARM		8
55271743Sbz#define	LINUX_CLOCK_BOOTTIME_ALARM		9
56271743Sbz#define	LINUX_CLOCK_SGI_CYCLE			10
57271743Sbz#define	LINUX_CLOCK_TAI				11
58271743Sbz
59293561Sdchagin#define	LINUX_CPUCLOCK_PERTHREAD_MASK		4
60293561Sdchagin#define	LINUX_CPUCLOCK_MASK			3
61293561Sdchagin#define	LINUX_CPUCLOCK_WHICH(clock)		\
62293561Sdchagin	((clock) & (clockid_t) LINUX_CPUCLOCK_MASK)
63293561Sdchagin#define	LINUX_CPUCLOCK_PROF			0
64293561Sdchagin#define	LINUX_CPUCLOCK_VIRT			1
65293561Sdchagin#define	LINUX_CPUCLOCK_SCHED			2
66293561Sdchagin#define	LINUX_CPUCLOCK_MAX			3
67293561Sdchagin#define	LINUX_CLOCKFD				LINUX_CPUCLOCK_MAX
68293561Sdchagin#define	LINUX_CLOCKFD_MASK			\
69293561Sdchagin	(LINUX_CPUCLOCK_PERTHREAD_MASK|LINUX_CPUCLOCK_MASK)
70293561Sdchagin
71293561Sdchagin#define	LINUX_CPUCLOCK_ID(clock)		((pid_t) ~((clock) >> 3))
72293561Sdchagin#define	LINUX_CPUCLOCK_PERTHREAD(clock)		\
73293561Sdchagin	(((clock) & (clockid_t) LINUX_CPUCLOCK_PERTHREAD_MASK) != 0)
74293561Sdchagin
75293561Sdchagin
76271743Sbz#define	L_SIGEV_SIGNAL				0
77271743Sbz#define	L_SIGEV_NONE				1
78271743Sbz#define	L_SIGEV_THREAD				2
79271743Sbz#define	L_SIGEV_THREAD_ID			4
80271743Sbz
81271743Sbz#define	TS_CP(src,dst,fld) do {			\
82271743Sbz	CP((src).fld,(dst).fld,tv_sec);		\
83271743Sbz	CP((src).fld,(dst).fld,tv_nsec);	\
84271743Sbz} while (0)
85271743Sbz
86271743Sbz#define	ITS_CP(src, dst) do {			\
87271743Sbz	TS_CP((src), (dst), it_interval);	\
88271743Sbz	TS_CP((src), (dst), it_value);		\
89271743Sbz} while (0)
90271743Sbz
91271743Sbzstruct l_sigevent {
92271743Sbz	l_sigval_t sigev_value;
93271743Sbz	l_int sigev_signo;
94271743Sbz	l_int sigev_notify;
95271743Sbz	union {
96271743Sbz		l_int _pad[LINUX_SIGEV_PAD_SIZE];
97271743Sbz		l_int _tid;
98271743Sbz		struct {
99271743Sbz			l_uintptr_t _function;
100271743Sbz			l_uintptr_t _attribute;
101271743Sbz		} _l_sigev_thread;
102271743Sbz	} _l_sigev_un;
103271743Sbz}
104271743Sbz#if defined(__amd64__) && defined(COMPAT_LINUX32)
105271743Sbz__packed
106271743Sbz#endif
107271743Sbz;
108271743Sbz
109271743Sbzstruct l_itimerspec {
110271743Sbz	struct l_timespec it_interval;
111271743Sbz	struct l_timespec it_value;
112271743Sbz};
113271743Sbz
114293565Sdchaginvoid native_to_linux_timespec(struct l_timespec *,
115293565Sdchagin				     struct timespec *);
116293565Sdchaginint linux_to_native_timespec(struct timespec *,
117293565Sdchagin				     struct l_timespec *);
118293566Sdchaginint linux_to_native_clockid(clockid_t *, clockid_t);
119293565Sdchagin
120271743Sbz#endif	/* _LINUX_TIMER_H */
121