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