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