/src/SockFuzzer/third_party/xnu/osfmk/kern/timer.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright (c) 2000-2007 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 | | * Mach Operating System |
33 | | * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University |
34 | | * All Rights Reserved. |
35 | | * |
36 | | * Permission to use, copy, modify and distribute this software and its |
37 | | * documentation is hereby granted, provided that both the copyright |
38 | | * notice and this permission notice appear in all copies of the |
39 | | * software, derivative works or modified versions, and any portions |
40 | | * thereof, and that both notices appear in supporting documentation. |
41 | | * |
42 | | * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" |
43 | | * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR |
44 | | * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. |
45 | | * |
46 | | * Carnegie Mellon requests users of this software to return to |
47 | | * |
48 | | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU |
49 | | * School of Computer Science |
50 | | * Carnegie Mellon University |
51 | | * Pittsburgh PA 15213-3890 |
52 | | * |
53 | | * any improvements or extensions that they make and grant Carnegie Mellon |
54 | | * the rights to redistribute these changes. |
55 | | */ |
56 | | /* |
57 | | */ |
58 | | |
59 | | #ifndef _KERN_TIMER_H_ |
60 | | #define _KERN_TIMER_H_ |
61 | | |
62 | | #include <kern/kern_types.h> |
63 | | |
64 | | /* |
65 | | * Some platforms have very expensive timebase routines. An optimization |
66 | | * is to avoid switching timers on kernel exit/entry, which results in all |
67 | | * time billed to the system timer. However, when exposed to userspace, |
68 | | * we report as user time to indicate that work was done on behalf of |
69 | | * userspace. |
70 | | * |
71 | | * Although this policy is implemented as a global variable, we snapshot it |
72 | | * at key points in the thread structure (when the thread is locked and |
73 | | * executing in the kernel) to avoid imbalances. |
74 | | */ |
75 | | extern int precise_user_kernel_time; |
76 | | |
77 | | /* |
78 | | * thread must be locked, or be the current executing thread, so that |
79 | | * it doesn't transition from user to kernel while updating the |
80 | | * thread-local value (or in kernel debugger context). In the future, |
81 | | * we make take into account task-level or thread-level policy. |
82 | | */ |
83 | | #define use_precise_user_kernel_time(thread) (precise_user_kernel_time) |
84 | | |
85 | | /* |
86 | | * Definitions for high resolution timers. |
87 | | */ |
88 | | |
89 | | #if __LP64__ |
90 | | #define TIMER_ALIGNMENT |
91 | | #else |
92 | | #define TIMER_ALIGNMENT __attribute__((packed, aligned(4))) |
93 | | #endif |
94 | | |
95 | | struct timer { |
96 | | uint64_t tstamp; |
97 | | #if defined(__LP64__) |
98 | | uint64_t all_bits; |
99 | | #else /* defined(__LP64__) */ |
100 | | /* A check word on the high portion allows atomic updates. */ |
101 | | uint32_t low_bits; |
102 | | uint32_t high_bits; |
103 | | uint32_t high_bits_check; |
104 | | #endif /* !defined(__LP64__) */ |
105 | | } TIMER_ALIGNMENT; |
106 | | |
107 | | typedef struct timer timer_data_t, *timer_t; |
108 | | |
109 | | /* |
110 | | * Initialize the `timer`. |
111 | | */ |
112 | | void timer_init(timer_t timer); |
113 | | |
114 | | /* |
115 | | * Start the `timer` at time `tstamp`. |
116 | | */ |
117 | | void timer_start(timer_t timer, uint64_t tstamp); |
118 | | |
119 | | /* |
120 | | * Stop the `timer` and update it with time `tstamp`. |
121 | | */ |
122 | | void timer_stop(timer_t timer, uint64_t tstamp); |
123 | | |
124 | | /* |
125 | | * Update the `timer` at time `tstamp`, leaving it running. |
126 | | */ |
127 | | void timer_update(timer_t timer, uint64_t tstamp); |
128 | | |
129 | | /* |
130 | | * Update the `timer` with time `tstamp` and start `new_timer`. |
131 | | */ |
132 | | void timer_switch(timer_t timer, uint64_t tstamp, timer_t new_timer); |
133 | | |
134 | | /* |
135 | | * Update the thread timer at an "event," like a context switch, at time |
136 | | * `tstamp`. This stops the current timer and starts the `new_timer` running. |
137 | | * |
138 | | * Must be called with interrupts disabled. |
139 | | */ |
140 | | void processor_timer_switch_thread(uint64_t tstamp, timer_t new_timer); |
141 | | |
142 | | /* |
143 | | * Return the difference between the `timer` and a previous value pointed to by |
144 | | * `prev_in_cur_out`. Store the current value of the timer to |
145 | | * `prev_in_cur_out`. |
146 | | */ |
147 | | uint64_t timer_delta(timer_t timer, uint64_t *prev_in_cur_out); |
148 | | |
149 | | /* |
150 | | * Read the accumulated time of `timer`. |
151 | | */ |
152 | | #if defined(__LP64__) |
153 | | static inline |
154 | | uint64_t |
155 | | timer_grab(timer_t timer) |
156 | 0 | { |
157 | 0 | return timer->all_bits; |
158 | 0 | } |
159 | | #else /* defined(__LP64__) */ |
160 | | uint64_t timer_grab(timer_t timer); |
161 | | #endif /* !defined(__LP64__) */ |
162 | | |
163 | | #endif /* _KERN_TIMER_H_ */ |