1*c8a79231SDmitry Chagin /*- 2*c8a79231SDmitry Chagin * Copyright (c) 2014 Bjoern A. Zeeb 3*c8a79231SDmitry Chagin * All rights reserved. 4*c8a79231SDmitry Chagin * 5*c8a79231SDmitry Chagin * This software was developed by SRI International and the University of 6*c8a79231SDmitry Chagin * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249 7*c8a79231SDmitry Chagin * ("MRC2"), as part of the DARPA MRC research programme. 8*c8a79231SDmitry Chagin * 9*c8a79231SDmitry Chagin * Redistribution and use in source and binary forms, with or without 10*c8a79231SDmitry Chagin * modification, are permitted provided that the following conditions 11*c8a79231SDmitry Chagin * are met: 12*c8a79231SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 13*c8a79231SDmitry Chagin * notice, this list of conditions and the following disclaimer. 14*c8a79231SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 15*c8a79231SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 16*c8a79231SDmitry Chagin * documentation and/or other materials provided with the distribution. 17*c8a79231SDmitry Chagin * 18*c8a79231SDmitry Chagin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19*c8a79231SDmitry Chagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*c8a79231SDmitry Chagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*c8a79231SDmitry Chagin * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22*c8a79231SDmitry Chagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23*c8a79231SDmitry Chagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24*c8a79231SDmitry Chagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25*c8a79231SDmitry Chagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26*c8a79231SDmitry Chagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27*c8a79231SDmitry Chagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28*c8a79231SDmitry Chagin * SUCH DAMAGE. 29*c8a79231SDmitry Chagin * 30*c8a79231SDmitry Chagin * $FreeBSD$ 31*c8a79231SDmitry Chagin */ 32*c8a79231SDmitry Chagin 33*c8a79231SDmitry Chagin #ifndef _LINUX_TIME_H 34*c8a79231SDmitry Chagin #define _LINUX_TIME_H 35*c8a79231SDmitry Chagin 36*c8a79231SDmitry Chagin #ifndef __LINUX_ARCH_SIGEV_PREAMBLE_SIZE 37*c8a79231SDmitry Chagin #define __LINUX_ARCH_SIGEV_PREAMBLE_SIZE \ 38*c8a79231SDmitry Chagin (sizeof(l_int) * 2 + sizeof(l_sigval_t)) 39*c8a79231SDmitry Chagin #endif 40*c8a79231SDmitry Chagin 41*c8a79231SDmitry Chagin #define LINUX_SIGEV_MAX_SIZE 64 42*c8a79231SDmitry Chagin #define LINUX_SIGEV_PAD_SIZE \ 43*c8a79231SDmitry Chagin ((LINUX_SIGEV_MAX_SIZE - __LINUX_ARCH_SIGEV_PREAMBLE_SIZE) / \ 44*c8a79231SDmitry Chagin sizeof(l_int)) 45*c8a79231SDmitry Chagin 46*c8a79231SDmitry Chagin #define LINUX_CLOCK_REALTIME 0 47*c8a79231SDmitry Chagin #define LINUX_CLOCK_MONOTONIC 1 48*c8a79231SDmitry Chagin #define LINUX_CLOCK_PROCESS_CPUTIME_ID 2 49*c8a79231SDmitry Chagin #define LINUX_CLOCK_THREAD_CPUTIME_ID 3 50*c8a79231SDmitry Chagin #define LINUX_CLOCK_MONOTONIC_RAW 4 51*c8a79231SDmitry Chagin #define LINUX_CLOCK_REALTIME_COARSE 5 52*c8a79231SDmitry Chagin #define LINUX_CLOCK_MONOTONIC_COARSE 6 53*c8a79231SDmitry Chagin #define LINUX_CLOCK_BOOTTIME 7 54*c8a79231SDmitry Chagin #define LINUX_CLOCK_REALTIME_ALARM 8 55*c8a79231SDmitry Chagin #define LINUX_CLOCK_BOOTTIME_ALARM 9 56*c8a79231SDmitry Chagin #define LINUX_CLOCK_SGI_CYCLE 10 57*c8a79231SDmitry Chagin #define LINUX_CLOCK_TAI 11 58*c8a79231SDmitry Chagin 59*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_PERTHREAD_MASK 4 60*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_MASK 3 61*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_WHICH(clock) \ 62*c8a79231SDmitry Chagin ((clock) & (clockid_t) LINUX_CPUCLOCK_MASK) 63*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_PROF 0 64*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_VIRT 1 65*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_SCHED 2 66*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_MAX 3 67*c8a79231SDmitry Chagin #define LINUX_CLOCKFD LINUX_CPUCLOCK_MAX 68*c8a79231SDmitry Chagin #define LINUX_CLOCKFD_MASK \ 69*c8a79231SDmitry Chagin (LINUX_CPUCLOCK_PERTHREAD_MASK|LINUX_CPUCLOCK_MASK) 70*c8a79231SDmitry Chagin 71*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_ID(clock) ((pid_t) ~((clock) >> 3)) 72*c8a79231SDmitry Chagin #define LINUX_CPUCLOCK_PERTHREAD(clock) \ 73*c8a79231SDmitry Chagin (((clock) & (clockid_t) LINUX_CPUCLOCK_PERTHREAD_MASK) != 0) 74*c8a79231SDmitry Chagin 75*c8a79231SDmitry Chagin #define LINUX_TIMER_ABSTIME 0x01 76*c8a79231SDmitry Chagin 77*c8a79231SDmitry Chagin #define L_SIGEV_SIGNAL 0 78*c8a79231SDmitry Chagin #define L_SIGEV_NONE 1 79*c8a79231SDmitry Chagin #define L_SIGEV_THREAD 2 80*c8a79231SDmitry Chagin #define L_SIGEV_THREAD_ID 4 81*c8a79231SDmitry Chagin 82*c8a79231SDmitry Chagin struct l_sigevent { 83*c8a79231SDmitry Chagin l_sigval_t sigev_value; 84*c8a79231SDmitry Chagin l_int sigev_signo; 85*c8a79231SDmitry Chagin l_int sigev_notify; 86*c8a79231SDmitry Chagin union { 87*c8a79231SDmitry Chagin l_int _pad[LINUX_SIGEV_PAD_SIZE]; 88*c8a79231SDmitry Chagin l_int _tid; 89*c8a79231SDmitry Chagin struct { 90*c8a79231SDmitry Chagin l_uintptr_t _function; 91*c8a79231SDmitry Chagin l_uintptr_t _attribute; 92*c8a79231SDmitry Chagin } _l_sigev_thread; 93*c8a79231SDmitry Chagin } _l_sigev_un; 94*c8a79231SDmitry Chagin } 95*c8a79231SDmitry Chagin #if defined(__amd64__) && defined(COMPAT_LINUX32) 96*c8a79231SDmitry Chagin __packed 97*c8a79231SDmitry Chagin #endif 98*c8a79231SDmitry Chagin ; 99*c8a79231SDmitry Chagin 100*c8a79231SDmitry Chagin struct l_itimerspec { 101*c8a79231SDmitry Chagin struct l_timespec it_interval; 102*c8a79231SDmitry Chagin struct l_timespec it_value; 103*c8a79231SDmitry Chagin }; 104*c8a79231SDmitry Chagin 105*c8a79231SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 106*c8a79231SDmitry Chagin struct l_itimerspec64 { 107*c8a79231SDmitry Chagin struct l_timespec64 it_interval; 108*c8a79231SDmitry Chagin struct l_timespec64 it_value; 109*c8a79231SDmitry Chagin }; 110*c8a79231SDmitry Chagin #endif 111*c8a79231SDmitry Chagin 112*c8a79231SDmitry Chagin int native_to_linux_timespec(struct l_timespec *, 113*c8a79231SDmitry Chagin struct timespec *); 114*c8a79231SDmitry Chagin int linux_to_native_timespec(struct timespec *, 115*c8a79231SDmitry Chagin struct l_timespec *); 116*c8a79231SDmitry Chagin int linux_put_timespec(struct timespec *, 117*c8a79231SDmitry Chagin struct l_timespec *); 118*c8a79231SDmitry Chagin int linux_get_timespec(struct timespec *, 119*c8a79231SDmitry Chagin const struct l_timespec *); 120*c8a79231SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 121*c8a79231SDmitry Chagin int native_to_linux_timespec64(struct l_timespec64 *, 122*c8a79231SDmitry Chagin struct timespec *); 123*c8a79231SDmitry Chagin int linux_to_native_timespec64(struct timespec *, 124*c8a79231SDmitry Chagin struct l_timespec64 *); 125*c8a79231SDmitry Chagin int linux_put_timespec64(struct timespec *, 126*c8a79231SDmitry Chagin struct l_timespec64 *); 127*c8a79231SDmitry Chagin int linux_get_timespec64(struct timespec *, 128*c8a79231SDmitry Chagin const struct l_timespec64 *); 129*c8a79231SDmitry Chagin #endif 130*c8a79231SDmitry Chagin int linux_to_native_clockid(clockid_t *, clockid_t); 131*c8a79231SDmitry Chagin int native_to_linux_itimerspec(struct l_itimerspec *, 132*c8a79231SDmitry Chagin struct itimerspec *); 133*c8a79231SDmitry Chagin int linux_to_native_itimerspec(struct itimerspec *, 134*c8a79231SDmitry Chagin struct l_itimerspec *); 135*c8a79231SDmitry Chagin #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32)) 136*c8a79231SDmitry Chagin int native_to_linux_itimerspec64(struct l_itimerspec64 *, 137*c8a79231SDmitry Chagin struct itimerspec *); 138*c8a79231SDmitry Chagin int linux_to_native_itimerspec64(struct itimerspec *, 139*c8a79231SDmitry Chagin struct l_itimerspec64 *); 140*c8a79231SDmitry Chagin #endif 141*c8a79231SDmitry Chagin 142*c8a79231SDmitry Chagin int linux_to_native_timerflags(int *, int); 143*c8a79231SDmitry Chagin 144*c8a79231SDmitry Chagin #endif /* _LINUX_TIME_H */ 145