aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linux/linux_time.h
blob: bb23105f4f234bb92142b3266c37582b8b6e913b (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*-
 * Copyright (c) 2014 Bjoern A. Zeeb
 * All rights reserved.
 *
 * This software was developed by SRI International and the University of
 * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249
 * ("MRC2"), as part of the DARPA MRC research programme.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef	_LINUX_TIME_H
#define	_LINUX_TIME_H

#ifndef	__LINUX_ARCH_SIGEV_PREAMBLE_SIZE
#define	__LINUX_ARCH_SIGEV_PREAMBLE_SIZE	\
	(sizeof(l_int) * 2 + sizeof(l_sigval_t))
#endif

#define	LINUX_SIGEV_MAX_SIZE			64
#define	LINUX_SIGEV_PAD_SIZE			\
	((LINUX_SIGEV_MAX_SIZE - __LINUX_ARCH_SIGEV_PREAMBLE_SIZE) / \
	sizeof(l_int))

#define	LINUX_CLOCK_REALTIME			0
#define	LINUX_CLOCK_MONOTONIC			1
#define	LINUX_CLOCK_PROCESS_CPUTIME_ID		2
#define	LINUX_CLOCK_THREAD_CPUTIME_ID		3
#define	LINUX_CLOCK_MONOTONIC_RAW		4
#define	LINUX_CLOCK_REALTIME_COARSE		5
#define	LINUX_CLOCK_MONOTONIC_COARSE		6
#define	LINUX_CLOCK_BOOTTIME			7
#define	LINUX_CLOCK_REALTIME_ALARM		8
#define	LINUX_CLOCK_BOOTTIME_ALARM		9
#define	LINUX_CLOCK_SGI_CYCLE			10
#define	LINUX_CLOCK_TAI				11

#define	LINUX_CPUCLOCK_PERTHREAD_MASK		4
#define	LINUX_CPUCLOCK_MASK			3
#define	LINUX_CPUCLOCK_WHICH(clock)		\
	((clock) & (clockid_t) LINUX_CPUCLOCK_MASK)
#define	LINUX_CPUCLOCK_PROF			0
#define	LINUX_CPUCLOCK_VIRT			1
#define	LINUX_CPUCLOCK_SCHED			2
#define	LINUX_CPUCLOCK_MAX			3
#define	LINUX_CLOCKFD				LINUX_CPUCLOCK_MAX
#define	LINUX_CLOCKFD_MASK			\
	(LINUX_CPUCLOCK_PERTHREAD_MASK|LINUX_CPUCLOCK_MASK)

#define	LINUX_CPUCLOCK_ID(clock)		((pid_t) ~((clock) >> 3))
#define	LINUX_CPUCLOCK_PERTHREAD(clock)		\
	(((clock) & (clockid_t) LINUX_CPUCLOCK_PERTHREAD_MASK) != 0)

#define	LINUX_TIMER_ABSTIME			0x01

#define	L_SIGEV_SIGNAL				0
#define	L_SIGEV_NONE				1
#define	L_SIGEV_THREAD				2
#define	L_SIGEV_THREAD_ID			4

struct l_sigevent {
	l_sigval_t sigev_value;
	l_int sigev_signo;
	l_int sigev_notify;
	union {
		l_int _pad[LINUX_SIGEV_PAD_SIZE];
		l_int _tid;
		struct {
			l_uintptr_t _function;
			l_uintptr_t _attribute;
		} _l_sigev_thread;
	} _l_sigev_un;
}
#if defined(__amd64__) && defined(COMPAT_LINUX32)
__packed
#endif
;

struct l_itimerspec {
	struct l_timespec it_interval;
	struct l_timespec it_value;
};

#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
struct l_itimerspec64 {
	struct l_timespec64 it_interval;
	struct l_timespec64 it_value;
};
#endif

int native_to_linux_timespec(struct l_timespec *,
				     struct timespec *);
int linux_to_native_timespec(struct timespec *,
				     struct l_timespec *);
int linux_put_timespec(struct timespec *,
				     struct l_timespec *);
int linux_get_timespec(struct timespec *,
				     const struct l_timespec *);
#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
int native_to_linux_timespec64(struct l_timespec64 *,
				     struct timespec *);
int linux_to_native_timespec64(struct timespec *,
				     struct l_timespec64 *);
int linux_put_timespec64(struct timespec *,
				     struct l_timespec64 *);
int linux_get_timespec64(struct timespec *,
				    const  struct l_timespec64 *);
#endif
int linux_to_native_clockid(clockid_t *, clockid_t);
int native_to_linux_itimerspec(struct l_itimerspec *,
				     struct itimerspec *);
int linux_to_native_itimerspec(struct itimerspec *,
				     struct l_itimerspec *);
#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
int native_to_linux_itimerspec64(struct l_itimerspec64 *,
				     struct itimerspec *);
int linux_to_native_itimerspec64(struct itimerspec *,
				     struct l_itimerspec64 *);
#endif

int linux_convert_l_sigevent(const struct l_sigevent *l_sig, struct sigevent *sig);
int linux_to_native_timerflags(int *, int);

#endif	/* _LINUX_TIME_H */