1*33de042dSApple OSS Distributions /* 2*33de042dSApple OSS Distributions * Copyright (c) 2000-2008 Apple Inc. All rights reserved. 3*33de042dSApple OSS Distributions * 4*33de042dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5*33de042dSApple OSS Distributions * 6*33de042dSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code 7*33de042dSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License 8*33de042dSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in 9*33de042dSApple OSS Distributions * compliance with the License. The rights granted to you under the License 10*33de042dSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of, 11*33de042dSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to 12*33de042dSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any 13*33de042dSApple OSS Distributions * terms of an Apple operating system software license agreement. 14*33de042dSApple OSS Distributions * 15*33de042dSApple OSS Distributions * Please obtain a copy of the License at 16*33de042dSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file. 17*33de042dSApple OSS Distributions * 18*33de042dSApple OSS Distributions * The Original Code and all software distributed under the License are 19*33de042dSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20*33de042dSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21*33de042dSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22*33de042dSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23*33de042dSApple OSS Distributions * Please see the License for the specific language governing rights and 24*33de042dSApple OSS Distributions * limitations under the License. 25*33de042dSApple OSS Distributions * 26*33de042dSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27*33de042dSApple OSS Distributions */ 28*33de042dSApple OSS Distributions /* 29*33de042dSApple OSS Distributions * @OSF_COPYRIGHT@ 30*33de042dSApple OSS Distributions */ 31*33de042dSApple OSS Distributions /* 32*33de042dSApple OSS Distributions */ 33*33de042dSApple OSS Distributions 34*33de042dSApple OSS Distributions #ifndef _KERN_CLOCK_H_ 35*33de042dSApple OSS Distributions #define _KERN_CLOCK_H_ 36*33de042dSApple OSS Distributions 37*33de042dSApple OSS Distributions #include <stdint.h> 38*33de042dSApple OSS Distributions #include <mach/mach_types.h> 39*33de042dSApple OSS Distributions #include <mach/clock_types.h> 40*33de042dSApple OSS Distributions #include <mach/message.h> 41*33de042dSApple OSS Distributions #include <mach/mach_time.h> 42*33de042dSApple OSS Distributions #include <mach/boolean.h> 43*33de042dSApple OSS Distributions 44*33de042dSApple OSS Distributions #include <kern/kern_types.h> 45*33de042dSApple OSS Distributions 46*33de042dSApple OSS Distributions #include <sys/cdefs.h> 47*33de042dSApple OSS Distributions 48*33de042dSApple OSS Distributions 49*33de042dSApple OSS Distributions #ifdef __LP64__ 50*33de042dSApple OSS Distributions 51*33de042dSApple OSS Distributions typedef unsigned long clock_sec_t; 52*33de042dSApple OSS Distributions typedef unsigned int clock_usec_t, clock_nsec_t; 53*33de042dSApple OSS Distributions 54*33de042dSApple OSS Distributions #else /* __LP64__ */ 55*33de042dSApple OSS Distributions 56*33de042dSApple OSS Distributions typedef uint32_t clock_sec_t; 57*33de042dSApple OSS Distributions typedef uint32_t clock_usec_t, clock_nsec_t; 58*33de042dSApple OSS Distributions 59*33de042dSApple OSS Distributions #endif /* __LP64__ */ 60*33de042dSApple OSS Distributions 61*33de042dSApple OSS Distributions #ifdef MACH_KERNEL_PRIVATE 62*33de042dSApple OSS Distributions 63*33de042dSApple OSS Distributions #include <kern/queue.h> 64*33de042dSApple OSS Distributions 65*33de042dSApple OSS Distributions /* 66*33de042dSApple OSS Distributions * Clock operations list structure. Contains vectors to machine 67*33de042dSApple OSS Distributions * dependent clock routines. 68*33de042dSApple OSS Distributions */ 69*33de042dSApple OSS Distributions struct clock_ops { 70*33de042dSApple OSS Distributions int (*c_config)(void); /* configuration */ 71*33de042dSApple OSS Distributions 72*33de042dSApple OSS Distributions int (*c_init)(void); /* initialize */ 73*33de042dSApple OSS Distributions 74*33de042dSApple OSS Distributions kern_return_t (*c_gettime)( /* get time */ 75*33de042dSApple OSS Distributions mach_timespec_t *cur_time); 76*33de042dSApple OSS Distributions 77*33de042dSApple OSS Distributions kern_return_t (*c_getattr)( /* get attributes */ 78*33de042dSApple OSS Distributions clock_flavor_t flavor, 79*33de042dSApple OSS Distributions clock_attr_t attr, 80*33de042dSApple OSS Distributions mach_msg_type_number_t *count); 81*33de042dSApple OSS Distributions }; 82*33de042dSApple OSS Distributions typedef const struct clock_ops *clock_ops_t; 83*33de042dSApple OSS Distributions typedef struct clock_ops clock_ops_data_t; 84*33de042dSApple OSS Distributions 85*33de042dSApple OSS Distributions /* 86*33de042dSApple OSS Distributions * Actual clock object data structure. Contains the machine 87*33de042dSApple OSS Distributions * dependent operations list and clock operation ports. 88*33de042dSApple OSS Distributions */ 89*33de042dSApple OSS Distributions struct clock { 90*33de042dSApple OSS Distributions clock_ops_t cl_ops; /* operations list */ 91*33de042dSApple OSS Distributions struct ipc_port *cl_service; /* service port */ 92*33de042dSApple OSS Distributions }; 93*33de042dSApple OSS Distributions typedef struct clock clock_data_t; 94*33de042dSApple OSS Distributions 95*33de042dSApple OSS Distributions /* 96*33de042dSApple OSS Distributions * Configure the clock system. 97*33de042dSApple OSS Distributions */ 98*33de042dSApple OSS Distributions extern void clock_config(void); 99*33de042dSApple OSS Distributions extern void clock_oldconfig(void); 100*33de042dSApple OSS Distributions 101*33de042dSApple OSS Distributions /* 102*33de042dSApple OSS Distributions * Initialize the clock system. 103*33de042dSApple OSS Distributions */ 104*33de042dSApple OSS Distributions extern void clock_init(void); 105*33de042dSApple OSS Distributions extern void clock_oldinit(void); 106*33de042dSApple OSS Distributions 107*33de042dSApple OSS Distributions extern void clock_timebase_init(void); 108*33de042dSApple OSS Distributions 109*33de042dSApple OSS Distributions /* 110*33de042dSApple OSS Distributions * Initialize the clock ipc service facility. 111*33de042dSApple OSS Distributions */ 112*33de042dSApple OSS Distributions extern void clock_service_create(void); 113*33de042dSApple OSS Distributions 114*33de042dSApple OSS Distributions extern void clock_gettimeofday_set_commpage( 115*33de042dSApple OSS Distributions uint64_t abstime, 116*33de042dSApple OSS Distributions uint64_t sec, 117*33de042dSApple OSS Distributions uint64_t frac, 118*33de042dSApple OSS Distributions uint64_t scale, 119*33de042dSApple OSS Distributions uint64_t tick_per_sec); 120*33de042dSApple OSS Distributions 121*33de042dSApple OSS Distributions extern void machine_delay_until(uint64_t interval, 122*33de042dSApple OSS Distributions uint64_t deadline); 123*33de042dSApple OSS Distributions 124*33de042dSApple OSS Distributions extern uint32_t hz_tick_interval; 125*33de042dSApple OSS Distributions 126*33de042dSApple OSS Distributions extern void nanotime_to_absolutetime( 127*33de042dSApple OSS Distributions clock_sec_t secs, 128*33de042dSApple OSS Distributions clock_nsec_t nanosecs, 129*33de042dSApple OSS Distributions uint64_t *result); 130*33de042dSApple OSS Distributions 131*33de042dSApple OSS Distributions #endif /* MACH_KERNEL_PRIVATE */ 132*33de042dSApple OSS Distributions 133*33de042dSApple OSS Distributions __BEGIN_DECLS 134*33de042dSApple OSS Distributions 135*33de042dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 136*33de042dSApple OSS Distributions 137*33de042dSApple OSS Distributions extern void clock_adjtime( 138*33de042dSApple OSS Distributions long *secs, 139*33de042dSApple OSS Distributions int *microsecs); 140*33de042dSApple OSS Distributions 141*33de042dSApple OSS Distributions extern void clock_initialize_calendar(void); 142*33de042dSApple OSS Distributions 143*33de042dSApple OSS Distributions extern void clock_wakeup_calendar(void); 144*33de042dSApple OSS Distributions 145*33de042dSApple OSS Distributions extern void clock_update_calendar(void); 146*33de042dSApple OSS Distributions 147*33de042dSApple OSS Distributions extern void clock_get_calendar_uptime(clock_sec_t *secs); 148*33de042dSApple OSS Distributions 149*33de042dSApple OSS Distributions extern void clock_gettimeofday_new(clock_sec_t *secs, 150*33de042dSApple OSS Distributions clock_usec_t *microsecs); 151*33de042dSApple OSS Distributions extern void clock_gettimeofday( 152*33de042dSApple OSS Distributions clock_sec_t *secs, 153*33de042dSApple OSS Distributions clock_usec_t *microsecs); 154*33de042dSApple OSS Distributions 155*33de042dSApple OSS Distributions extern void clock_gettimeofday_and_absolute_time( 156*33de042dSApple OSS Distributions clock_sec_t *secs, 157*33de042dSApple OSS Distributions clock_usec_t *microsecs, 158*33de042dSApple OSS Distributions uint64_t *absolute_time); 159*33de042dSApple OSS Distributions 160*33de042dSApple OSS Distributions 161*33de042dSApple OSS Distributions extern void clock_set_calendar_microtime( 162*33de042dSApple OSS Distributions clock_sec_t secs, 163*33de042dSApple OSS Distributions clock_usec_t microsecs); 164*33de042dSApple OSS Distributions 165*33de042dSApple OSS Distributions extern void clock_get_boottime_nanotime( 166*33de042dSApple OSS Distributions clock_sec_t *secs, 167*33de042dSApple OSS Distributions clock_nsec_t *nanosecs); 168*33de042dSApple OSS Distributions 169*33de042dSApple OSS Distributions extern void clock_get_boottime_microtime( 170*33de042dSApple OSS Distributions clock_sec_t *secs, 171*33de042dSApple OSS Distributions clock_nsec_t *microsecs); 172*33de042dSApple OSS Distributions 173*33de042dSApple OSS Distributions extern void clock_deadline_for_periodic_event( 174*33de042dSApple OSS Distributions uint64_t interval, 175*33de042dSApple OSS Distributions uint64_t abstime, 176*33de042dSApple OSS Distributions uint64_t *deadline); 177*33de042dSApple OSS Distributions 178*33de042dSApple OSS Distributions #if CONFIG_DTRACE 179*33de042dSApple OSS Distributions 180*33de042dSApple OSS Distributions extern void clock_get_calendar_nanotime_nowait( 181*33de042dSApple OSS Distributions clock_sec_t *secs, 182*33de042dSApple OSS Distributions clock_nsec_t *nanosecs); 183*33de042dSApple OSS Distributions 184*33de042dSApple OSS Distributions #endif /* CONFIG_DTRACE */ 185*33de042dSApple OSS Distributions 186*33de042dSApple OSS Distributions boolean_t kdp_clock_is_locked(void); 187*33de042dSApple OSS Distributions 188*33de042dSApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 189*33de042dSApple OSS Distributions 190*33de042dSApple OSS Distributions extern void clock_get_calendar_microtime( 191*33de042dSApple OSS Distributions clock_sec_t *secs, 192*33de042dSApple OSS Distributions clock_usec_t *microsecs); 193*33de042dSApple OSS Distributions 194*33de042dSApple OSS Distributions extern void clock_get_calendar_absolute_and_microtime( 195*33de042dSApple OSS Distributions clock_sec_t *secs, 196*33de042dSApple OSS Distributions clock_usec_t *microsecs, 197*33de042dSApple OSS Distributions uint64_t *abstime); 198*33de042dSApple OSS Distributions 199*33de042dSApple OSS Distributions extern void clock_get_calendar_nanotime( 200*33de042dSApple OSS Distributions clock_sec_t *secs, 201*33de042dSApple OSS Distributions clock_nsec_t *nanosecs); 202*33de042dSApple OSS Distributions 203*33de042dSApple OSS Distributions extern void clock_get_system_microtime( 204*33de042dSApple OSS Distributions clock_sec_t *secs, 205*33de042dSApple OSS Distributions clock_usec_t *microsecs); 206*33de042dSApple OSS Distributions 207*33de042dSApple OSS Distributions extern void clock_get_system_nanotime( 208*33de042dSApple OSS Distributions clock_sec_t *secs, 209*33de042dSApple OSS Distributions clock_nsec_t *nanosecs); 210*33de042dSApple OSS Distributions 211*33de042dSApple OSS Distributions extern void clock_timebase_info( 212*33de042dSApple OSS Distributions mach_timebase_info_t info); 213*33de042dSApple OSS Distributions 214*33de042dSApple OSS Distributions extern void clock_get_uptime( 215*33de042dSApple OSS Distributions uint64_t *result); 216*33de042dSApple OSS Distributions 217*33de042dSApple OSS Distributions extern void clock_interval_to_deadline( 218*33de042dSApple OSS Distributions uint32_t interval, 219*33de042dSApple OSS Distributions uint32_t scale_factor, 220*33de042dSApple OSS Distributions uint64_t *result); 221*33de042dSApple OSS Distributions 222*33de042dSApple OSS Distributions extern void nanoseconds_to_deadline( 223*33de042dSApple OSS Distributions uint64_t interval, 224*33de042dSApple OSS Distributions uint64_t *result); 225*33de042dSApple OSS Distributions 226*33de042dSApple OSS Distributions extern void clock_interval_to_absolutetime_interval( 227*33de042dSApple OSS Distributions uint32_t interval, 228*33de042dSApple OSS Distributions uint32_t scale_factor, 229*33de042dSApple OSS Distributions uint64_t *result); 230*33de042dSApple OSS Distributions 231*33de042dSApple OSS Distributions extern void clock_absolutetime_interval_to_deadline( 232*33de042dSApple OSS Distributions uint64_t abstime, 233*33de042dSApple OSS Distributions uint64_t *result); 234*33de042dSApple OSS Distributions 235*33de042dSApple OSS Distributions extern void clock_continuoustime_interval_to_deadline( 236*33de042dSApple OSS Distributions uint64_t abstime, 237*33de042dSApple OSS Distributions uint64_t *result); 238*33de042dSApple OSS Distributions 239*33de042dSApple OSS Distributions extern void clock_delay_until( 240*33de042dSApple OSS Distributions uint64_t deadline); 241*33de042dSApple OSS Distributions 242*33de042dSApple OSS Distributions extern void absolutetime_to_nanoseconds( 243*33de042dSApple OSS Distributions uint64_t abstime, 244*33de042dSApple OSS Distributions uint64_t *result); 245*33de042dSApple OSS Distributions 246*33de042dSApple OSS Distributions extern void nanoseconds_to_absolutetime( 247*33de042dSApple OSS Distributions uint64_t nanoseconds, 248*33de042dSApple OSS Distributions uint64_t *result); 249*33de042dSApple OSS Distributions 250*33de042dSApple OSS Distributions extern void absolutetime_to_microtime( 251*33de042dSApple OSS Distributions uint64_t abstime, 252*33de042dSApple OSS Distributions clock_sec_t *secs, 253*33de042dSApple OSS Distributions clock_usec_t *microsecs); 254*33de042dSApple OSS Distributions 255*33de042dSApple OSS Distributions /* 256*33de042dSApple OSS Distributions * Absolute <-> Continuous Time conversion routines 257*33de042dSApple OSS Distributions * 258*33de042dSApple OSS Distributions * It is the caller's responsibility to ensure that these functions are 259*33de042dSApple OSS Distributions * synchronized with respect to updates to the continuous timebase. The 260*33de042dSApple OSS Distributions * returned value is only valid until the next update to the continuous 261*33de042dSApple OSS Distributions * timebase. 262*33de042dSApple OSS Distributions * 263*33de042dSApple OSS Distributions * If the value to be returned by continuoustime_to_absolutetime would be 264*33de042dSApple OSS Distributions * negative, zero is returned. This occurs when the provided continuous time 265*33de042dSApple OSS Distributions * is less the amount of the time the system spent asleep and /must/ be 266*33de042dSApple OSS Distributions * handled. 267*33de042dSApple OSS Distributions */ 268*33de042dSApple OSS Distributions extern uint64_t absolutetime_to_continuoustime( 269*33de042dSApple OSS Distributions uint64_t abstime); 270*33de042dSApple OSS Distributions extern uint64_t continuoustime_to_absolutetime( 271*33de042dSApple OSS Distributions uint64_t conttime); 272*33de042dSApple OSS Distributions 273*33de042dSApple OSS Distributions extern uint64_t mach_absolutetime_asleep; 274*33de042dSApple OSS Distributions extern uint64_t mach_absolutetime_last_sleep; 275*33de042dSApple OSS Distributions #if HIBERNATION && HAS_CONTINUOUS_HWCLOCK 276*33de042dSApple OSS Distributions extern uint64_t hwclock_conttime_offset; 277*33de042dSApple OSS Distributions #endif 278*33de042dSApple OSS Distributions 279*33de042dSApple OSS Distributions #ifdef KERNEL_PRIVATE 280*33de042dSApple OSS Distributions 281*33de042dSApple OSS Distributions /* 282*33de042dSApple OSS Distributions * Obsolete interfaces. 283*33de042dSApple OSS Distributions */ 284*33de042dSApple OSS Distributions 285*33de042dSApple OSS Distributions #ifndef __LP64__ 286*33de042dSApple OSS Distributions 287*33de042dSApple OSS Distributions #define MACH_TIMESPEC_SEC_MAX (0 - 1) 288*33de042dSApple OSS Distributions #define MACH_TIMESPEC_NSEC_MAX (NSEC_PER_SEC - 1) 289*33de042dSApple OSS Distributions 290*33de042dSApple OSS Distributions #define MACH_TIMESPEC_MAX ((mach_timespec_t) { \ 291*33de042dSApple OSS Distributions MACH_TIMESPEC_SEC_MAX, \ 292*33de042dSApple OSS Distributions MACH_TIMESPEC_NSEC_MAX } ) 293*33de042dSApple OSS Distributions #define MACH_TIMESPEC_ZERO ((mach_timespec_t) { 0, 0 } ) 294*33de042dSApple OSS Distributions 295*33de042dSApple OSS Distributions #define ADD_MACH_TIMESPEC_NSEC(t1, nsec) \ 296*33de042dSApple OSS Distributions do { \ 297*33de042dSApple OSS Distributions (t1)->tv_nsec += (clock_res_t)(nsec); \ 298*33de042dSApple OSS Distributions if ((clock_res_t)(nsec) > 0 && \ 299*33de042dSApple OSS Distributions (t1)->tv_nsec >= NSEC_PER_SEC) { \ 300*33de042dSApple OSS Distributions (t1)->tv_nsec -= NSEC_PER_SEC; \ 301*33de042dSApple OSS Distributions (t1)->tv_sec += 1; \ 302*33de042dSApple OSS Distributions } \ 303*33de042dSApple OSS Distributions else if ((clock_res_t)(nsec) < 0 && \ 304*33de042dSApple OSS Distributions (t1)->tv_nsec < 0) { \ 305*33de042dSApple OSS Distributions (t1)->tv_nsec += NSEC_PER_SEC; \ 306*33de042dSApple OSS Distributions (t1)->tv_sec -= 1; \ 307*33de042dSApple OSS Distributions } \ 308*33de042dSApple OSS Distributions } while (0) 309*33de042dSApple OSS Distributions 310*33de042dSApple OSS Distributions #include <Availability.h> 311*33de042dSApple OSS Distributions 312*33de042dSApple OSS Distributions /* Use mach_absolute_time() */ 313*33de042dSApple OSS Distributions 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); 314*33de042dSApple OSS Distributions 315*33de042dSApple OSS Distributions 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); 316*33de042dSApple OSS Distributions 317*33de042dSApple OSS Distributions #else /* __LP64__ */ 318*33de042dSApple OSS Distributions 319*33de042dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 320*33de042dSApple OSS Distributions 321*33de042dSApple OSS Distributions #define MACH_TIMESPEC_ZERO ((mach_timespec_t) { 0, 0 } ) 322*33de042dSApple OSS Distributions 323*33de042dSApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 324*33de042dSApple OSS Distributions 325*33de042dSApple OSS Distributions #endif /* __LP64__ */ 326*33de042dSApple OSS Distributions 327*33de042dSApple OSS Distributions extern void delay_for_interval( 328*33de042dSApple OSS Distributions uint32_t interval, 329*33de042dSApple OSS Distributions uint32_t scale_factor); 330*33de042dSApple OSS Distributions 331*33de042dSApple OSS Distributions extern void delay_for_interval_with_leeway( 332*33de042dSApple OSS Distributions uint32_t interval, 333*33de042dSApple OSS Distributions uint32_t leeway, 334*33de042dSApple OSS Distributions uint32_t scale_factor); 335*33de042dSApple OSS Distributions 336*33de042dSApple OSS Distributions #ifdef XNU_KERNEL_PRIVATE 337*33de042dSApple OSS Distributions extern void delay(int usec); 338*33de042dSApple OSS Distributions #endif /* XNU_KERNEL_PRIVATE */ 339*33de042dSApple OSS Distributions 340*33de042dSApple OSS Distributions #endif /* KERNEL_PRIVATE */ 341*33de042dSApple OSS Distributions 342*33de042dSApple OSS Distributions __END_DECLS 343*33de042dSApple OSS Distributions 344*33de042dSApple OSS Distributions #endif /* _KERN_CLOCK_H_ */ 345