X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/55e303ae13a4cf49d70f2294092726f2fffb9ef2..f427ee49d309d8fc33ebf3042c3a775f2f530ded:/osfmk/kern/clock.h diff --git a/osfmk/kern/clock.h b/osfmk/kern/clock.h index dd32f211b..44cd5533d 100644 --- a/osfmk/kern/clock.h +++ b/osfmk/kern/clock.h @@ -1,17 +1,20 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2008 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * - * @APPLE_LICENSE_HEADER_START@ - * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in - * compliance with the License. Please obtain a copy of the License at - * http://www.opensource.apple.com/apsl/ and read it before using this - * file. - * + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -19,326 +22,324 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * - * @APPLE_LICENSE_HEADER_END@ + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /* * @OSF_COPYRIGHT@ */ /* - * File: kern/clock.h - * Purpose: Data structures for the kernel alarm clock - * facility. This file is used only by kernel - * level clock facility routines. */ -#ifndef _KERN_CLOCK_H_ -#define _KERN_CLOCK_H_ +#ifndef _KERN_CLOCK_H_ +#define _KERN_CLOCK_H_ -#include +#include +#include #include +#include #include +#include -#include +#include -#ifdef __APPLE_API_PRIVATE +#include -#ifdef MACH_KERNEL_PRIVATE -#include +#ifdef __LP64__ -/* - * Actual clock alarm structure. Used for user clock_sleep() and - * clock_alarm() calls. Alarms are allocated from the alarm free - * list and entered in time priority order into the active alarm - * chain of the target clock. - */ -struct alarm { - struct alarm *al_next; /* next alarm in chain */ - struct alarm *al_prev; /* previous alarm in chain */ - int al_status; /* alarm status */ - mach_timespec_t al_time; /* alarm time */ - struct { /* message alarm data */ - int type; /* alarm type */ - ipc_port_t port; /* alarm port */ - mach_msg_type_name_t - port_type; /* alarm port type */ - struct clock *clock; /* alarm clock */ - void *data; /* alarm data */ - } al_alrm; -#define al_type al_alrm.type -#define al_port al_alrm.port -#define al_port_type al_alrm.port_type -#define al_clock al_alrm.clock -#define al_data al_alrm.data - long al_seqno; /* alarm sequence number */ -}; -typedef struct alarm alarm_data_t; +typedef unsigned long clock_sec_t; +typedef unsigned int clock_usec_t, clock_nsec_t; -/* alarm status */ -#define ALARM_FREE 0 /* alarm is on free list */ -#define ALARM_SLEEP 1 /* active clock_sleep() */ -#define ALARM_CLOCK 2 /* active clock_alarm() */ -#define ALARM_DONE 4 /* alarm has expired */ +#else /* __LP64__ */ -/* - * Clock operations list structure. Contains vectors to machine - * dependent clock routines. The routines c_config, c_init, and - * c_gettime must be implemented for every clock device. - */ -struct clock_ops { - int (*c_config)(void); /* configuration */ +typedef uint32_t clock_sec_t; +typedef uint32_t clock_usec_t, clock_nsec_t; - int (*c_init)(void); /* initialize */ +#endif /* __LP64__ */ - kern_return_t (*c_gettime)( /* get time */ - mach_timespec_t *cur_time); +#ifdef MACH_KERNEL_PRIVATE - kern_return_t (*c_settime)( /* set time */ - mach_timespec_t *clock_time); +#include - kern_return_t (*c_getattr)( /* get attributes */ - clock_flavor_t flavor, - clock_attr_t attr, - mach_msg_type_number_t *count); +/* + * Clock operations list structure. Contains vectors to machine + * dependent clock routines. + */ +struct clock_ops { + int (*c_config)(void); /* configuration */ + + int (*c_init)(void); /* initialize */ - kern_return_t (*c_setattr)( /* set attributes */ - clock_flavor_t flavor, - clock_attr_t attr, - mach_msg_type_number_t count); + kern_return_t (*c_gettime)( /* get time */ + mach_timespec_t *cur_time); - void (*c_setalrm)( /* set next alarm */ - mach_timespec_t *alarm_time); + kern_return_t (*c_getattr)( /* get attributes */ + clock_flavor_t flavor, + clock_attr_t attr, + mach_msg_type_number_t *count); }; -typedef struct clock_ops *clock_ops_t; -typedef struct clock_ops clock_ops_data_t; +typedef const struct clock_ops *clock_ops_t; +typedef struct clock_ops clock_ops_data_t; /* * Actual clock object data structure. Contains the machine - * dependent operations list, clock operations ports, and a - * chain of pending alarms. + * dependent operations list and clock operation ports. */ -struct clock { - clock_ops_t cl_ops; /* operations list */ - struct ipc_port *cl_service; /* service port */ - struct ipc_port *cl_control; /* control port */ - struct { /* alarm chain head */ - struct alarm *al_next; - } cl_alarm; +struct clock { + clock_ops_t cl_ops; /* operations list */ + struct ipc_port *cl_service; /* service port */ + struct ipc_port *cl_control; /* control port */ }; -typedef struct clock clock_data_t; +typedef struct clock clock_data_t; /* * Configure the clock system. */ -extern void clock_config(void); +extern void clock_config(void); +extern void clock_oldconfig(void); /* * Initialize the clock system. */ -extern void clock_init(void); +extern void clock_init(void); +extern void clock_oldinit(void); -extern void clock_timebase_init(void); +extern void clock_timebase_init(void); /* * Initialize the clock ipc service facility. */ -extern void clock_service_create(void); +extern void clock_service_create(void); -/* - * Service clock alarm interrupts. Called from machine dependent - * layer at splclock(). The clock_id argument specifies the clock, - * and the clock_time argument gives that clock's current time. - */ -extern void clock_alarm_intr( - clock_id_t clock_id, - mach_timespec_t *clock_time); +extern void clock_gettimeofday_set_commpage( + uint64_t abstime, + uint64_t sec, + uint64_t frac, + uint64_t scale, + uint64_t tick_per_sec); -extern kern_return_t clock_sleep_internal( - clock_t clock, - sleep_type_t sleep_type, - mach_timespec_t *sleep_time); +extern void machine_delay_until(uint64_t interval, + uint64_t deadline); -typedef void (*clock_timer_func_t)( - uint64_t timestamp); +extern uint32_t hz_tick_interval; -extern void clock_set_timer_func( - clock_timer_func_t func); +extern void nanotime_to_absolutetime( + clock_sec_t secs, + clock_nsec_t nanosecs, + uint64_t *result); -extern void clock_set_timer_deadline( - uint64_t deadline); +#endif /* MACH_KERNEL_PRIVATE */ -extern void mk_timebase_info( - uint32_t *delta, - uint32_t *abs_to_ns_numer, - uint32_t *abs_to_ns_denom, - uint32_t *proc_to_abs_numer, - uint32_t *proc_to_abs_denom); +__BEGIN_DECLS -extern uint32_t clock_set_calendar_adjtime( - int32_t *secs, - int32_t *microsecs); +#ifdef XNU_KERNEL_PRIVATE -extern uint32_t clock_adjust_calendar(void); +extern void clock_adjtime( + long *secs, + int *microsecs); -#endif /* MACH_KERNEL_PRIVATE */ +extern void clock_initialize_calendar(void); -extern void clock_get_calendar_microtime( - uint32_t *secs, - uint32_t *microsecs); +extern void clock_wakeup_calendar(void); -extern void clock_get_calendar_nanotime( - uint32_t *secs, - uint32_t *nanosecs); +extern void clock_update_calendar(void); -extern void clock_set_calendar_microtime( - uint32_t secs, - uint32_t microsecs); +extern void clock_get_calendar_uptime(clock_sec_t *secs); -extern void clock_get_system_microtime( - uint32_t *secs, - uint32_t *microsecs); +extern void clock_gettimeofday_new(clock_sec_t *secs, + clock_usec_t *microsecs); +extern void clock_gettimeofday( + clock_sec_t *secs, + clock_usec_t *microsecs); -extern void clock_get_system_nanotime( - uint32_t *secs, - uint32_t *nanosecs); +extern void clock_gettimeofday_and_absolute_time( + clock_sec_t *secs, + clock_usec_t *microsecs, + uint64_t *absolute_time); -extern void clock_adjtime( - int32_t *secs, - int32_t *microsecs); -extern void clock_initialize_calendar(void); +extern void clock_set_calendar_microtime( + clock_sec_t secs, + clock_usec_t microsecs); -extern void clock_wakeup_calendar(void); +extern void clock_get_boottime_nanotime( + clock_sec_t *secs, + clock_nsec_t *nanosecs); -extern void clock_gettimeofday( - uint32_t *secs, - uint32_t *microsecs); +extern void clock_get_boottime_microtime( + clock_sec_t *secs, + clock_nsec_t *microsecs); -#endif /* __APPLE_API_PRIVATE */ +extern void absolutetime_to_microtime( + uint64_t abstime, + clock_sec_t *secs, + clock_usec_t *microsecs); -#ifdef __APPLE_API_UNSTABLE +extern void clock_deadline_for_periodic_event( + uint64_t interval, + uint64_t abstime, + uint64_t *deadline); -#define MACH_TIMESPEC_SEC_MAX (0 - 1) -#define MACH_TIMESPEC_NSEC_MAX (NSEC_PER_SEC - 1) +#if CONFIG_DTRACE -#define MACH_TIMESPEC_MAX ((mach_timespec_t) { \ - MACH_TIMESPEC_SEC_MAX, \ - MACH_TIMESPEC_NSEC_MAX } ) -#define MACH_TIMESPEC_ZERO ((mach_timespec_t) { 0, 0 } ) +extern void clock_get_calendar_nanotime_nowait( + clock_sec_t *secs, + clock_nsec_t *nanosecs); -#define ADD_MACH_TIMESPEC_NSEC(t1, nsec) \ - do { \ - (t1)->tv_nsec += (clock_res_t)(nsec); \ - if ((clock_res_t)(nsec) > 0 && \ - (t1)->tv_nsec >= NSEC_PER_SEC) { \ - (t1)->tv_nsec -= NSEC_PER_SEC; \ - (t1)->tv_sec += 1; \ - } \ - else if ((clock_res_t)(nsec) < 0 && \ - (t1)->tv_nsec < 0) { \ - (t1)->tv_nsec += NSEC_PER_SEC; \ - (t1)->tv_sec -= 1; \ - } \ - } while (0) +#endif /* CONFIG_DTRACE */ -#endif /* __APPLE_API_UNSTABLE */ +boolean_t kdp_clock_is_locked(void); -extern mach_timespec_t clock_get_system_value(void); +#endif /* XNU_KERNEL_PRIVATE */ -extern mach_timespec_t clock_get_calendar_value(void); +extern void clock_get_calendar_microtime( + clock_sec_t *secs, + clock_usec_t *microsecs); -extern void clock_timebase_info( - mach_timebase_info_t info); +extern void clock_get_calendar_absolute_and_microtime( + clock_sec_t *secs, + clock_usec_t *microsecs, + uint64_t *abstime); -extern void clock_get_uptime( - uint64_t *result); +extern void clock_get_calendar_nanotime( + clock_sec_t *secs, + clock_nsec_t *nanosecs); -extern void clock_interval_to_deadline( - uint32_t interval, - uint32_t scale_factor, - uint64_t *result); +extern void clock_get_system_microtime( + clock_sec_t *secs, + clock_usec_t *microsecs); -extern void clock_interval_to_absolutetime_interval( - uint32_t interval, - uint32_t scale_factor, - uint64_t *result); +extern void clock_get_system_nanotime( + clock_sec_t *secs, + clock_nsec_t *nanosecs); -extern void clock_absolutetime_interval_to_deadline( - uint64_t abstime, - uint64_t *result); +extern void clock_timebase_info( + mach_timebase_info_t info); -extern void clock_deadline_for_periodic_event( - uint64_t interval, - uint64_t abstime, - uint64_t *deadline); +extern void clock_get_uptime( + uint64_t *result); -extern void clock_delay_for_interval( - uint32_t interval, - uint32_t scale_factor); +extern void clock_interval_to_deadline( + uint32_t interval, + uint32_t scale_factor, + uint64_t *result); -extern void clock_delay_until( - uint64_t deadline); +extern void nanoseconds_to_deadline( + uint64_t interval, + uint64_t *result); -extern void absolutetime_to_nanoseconds( - uint64_t abstime, - uint64_t *result); +extern void clock_interval_to_absolutetime_interval( + uint32_t interval, + uint32_t scale_factor, + uint64_t *result); -extern void nanoseconds_to_absolutetime( - uint64_t nanoseconds, - uint64_t *result); +extern void clock_absolutetime_interval_to_deadline( + uint64_t abstime, + uint64_t *result); -#if !defined(MACH_KERNEL_PRIVATE) && !defined(ABSOLUTETIME_SCALAR_TYPE) +extern void clock_continuoustime_interval_to_deadline( + uint64_t abstime, + uint64_t *result); -#include +extern void clock_delay_until( + uint64_t deadline); -#define clock_get_uptime(a) \ - clock_get_uptime(__OSAbsoluteTimePtr(a)) +extern void absolutetime_to_nanoseconds( + uint64_t abstime, + uint64_t *result); -#define clock_interval_to_deadline(a, b, c) \ - clock_interval_to_deadline((a), (b), __OSAbsoluteTimePtr(c)) +extern void nanoseconds_to_absolutetime( + uint64_t nanoseconds, + uint64_t *result); -#define clock_interval_to_absolutetime_interval(a, b, c) \ - clock_interval_to_absolutetime_interval((a), (b), __OSAbsoluteTimePtr(c)) +/* + * Absolute <-> Continuous Time conversion routines + * + * It is the caller's responsibility to ensure that these functions are + * synchronized with respect to updates to the continuous timebase. The + * returned value is only valid until the next update to the continuous + * timebase. + * + * If the value to be returned by continuoustime_to_absolutetime would be + * negative, zero is returned. This occurs when the provided continuous time + * is less the amount of the time the system spent asleep and /must/ be + * handled. + */ +extern uint64_t absolutetime_to_continuoustime( + uint64_t abstime); +extern uint64_t continuoustime_to_absolutetime( + uint64_t conttime); + +extern uint64_t mach_absolutetime_asleep; +extern uint64_t mach_absolutetime_last_sleep; +#if HIBERNATION && HAS_CONTINUOUS_HWCLOCK +extern uint64_t hwclock_conttime_offset; +#endif -#define clock_absolutetime_interval_to_deadline(a, b) \ - clock_absolutetime_interval_to_deadline(__OSAbsoluteTime(a), __OSAbsoluteTimePtr(b)) +#ifdef KERNEL_PRIVATE -#define clock_deadline_for_periodic_event(a, b, c) \ - clock_deadline_for_periodic_event(__OSAbsoluteTime(a), __OSAbsoluteTime(b), __OSAbsoluteTimePtr(c)) +/* + * Obsolete interfaces. + */ + +#ifndef __LP64__ + +#define MACH_TIMESPEC_SEC_MAX (0 - 1) +#define MACH_TIMESPEC_NSEC_MAX (NSEC_PER_SEC - 1) + +#define MACH_TIMESPEC_MAX ((mach_timespec_t) { \ + MACH_TIMESPEC_SEC_MAX, \ + MACH_TIMESPEC_NSEC_MAX } ) +#define MACH_TIMESPEC_ZERO ((mach_timespec_t) { 0, 0 } ) + +#define ADD_MACH_TIMESPEC_NSEC(t1, nsec) \ + do { \ + (t1)->tv_nsec += (clock_res_t)(nsec); \ + if ((clock_res_t)(nsec) > 0 && \ + (t1)->tv_nsec >= NSEC_PER_SEC) { \ + (t1)->tv_nsec -= NSEC_PER_SEC; \ + (t1)->tv_sec += 1; \ + } \ + else if ((clock_res_t)(nsec) < 0 && \ + (t1)->tv_nsec < 0) { \ + (t1)->tv_nsec += NSEC_PER_SEC; \ + (t1)->tv_sec -= 1; \ + } \ + } while (0) -#define clock_delay_until(a) \ - clock_delay_until(__OSAbsoluteTime(a)) +#include -#define absolutetime_to_nanoseconds(a, b) \ - absolutetime_to_nanoseconds(__OSAbsoluteTime(a), (b)) +/* Use mach_absolute_time() */ +extern mach_timespec_t clock_get_system_value(void) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_8, __IPHONE_2_0, __IPHONE_6_0); -#define nanoseconds_to_absolutetime(a, b) \ - nanoseconds_to_absolutetime((a), __OSAbsoluteTimePtr(b)) +extern mach_timespec_t clock_get_calendar_value(void) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_8, __IPHONE_2_0, __IPHONE_6_0); -#define AbsoluteTime_to_scalar(x) (*(uint64_t *)(x)) +#else /* __LP64__ */ -/* t1 < = > t2 */ -#define CMP_ABSOLUTETIME(t1, t2) \ - (AbsoluteTime_to_scalar(t1) > \ - AbsoluteTime_to_scalar(t2)? (int)+1 : \ - (AbsoluteTime_to_scalar(t1) < \ - AbsoluteTime_to_scalar(t2)? (int)-1 : 0)) +#ifdef XNU_KERNEL_PRIVATE -/* t1 += t2 */ -#define ADD_ABSOLUTETIME(t1, t2) \ - (AbsoluteTime_to_scalar(t1) += \ - AbsoluteTime_to_scalar(t2)) +#define MACH_TIMESPEC_ZERO ((mach_timespec_t) { 0, 0 } ) -/* t1 -= t2 */ -#define SUB_ABSOLUTETIME(t1, t2) \ - (AbsoluteTime_to_scalar(t1) -= \ - AbsoluteTime_to_scalar(t2)) +#endif /* XNU_KERNEL_PRIVATE */ -#define ADD_ABSOLUTETIME_TICKS(t1, ticks) \ - (AbsoluteTime_to_scalar(t1) += \ - (int32_t)(ticks)) +#endif /* __LP64__ */ -#endif +extern void delay_for_interval( + uint32_t interval, + uint32_t scale_factor); + +extern void delay_for_interval_with_leeway( + uint32_t interval, + uint32_t leeway, + uint32_t scale_factor); + +#ifdef XNU_KERNEL_PRIVATE +extern void delay(int usec); +#endif /* XNU_KERNEL_PRIVATE */ + +#endif /* KERNEL_PRIVATE */ + +__END_DECLS -#endif /* _KERN_CLOCK_H_ */ +#endif /* _KERN_CLOCK_H_ */