1*a1e26a70SApple OSS Distributions #include <mach/mach.h>
2*a1e26a70SApple OSS Distributions #include <mach/mach_time.h>
3*a1e26a70SApple OSS Distributions #include <mach/clock_types.h>
4*a1e26a70SApple OSS Distributions #include <sys/time.h>
5*a1e26a70SApple OSS Distributions #include <spawn.h>
6*a1e26a70SApple OSS Distributions #include <sys/wait.h>
7*a1e26a70SApple OSS Distributions #include <stdio.h>
8*a1e26a70SApple OSS Distributions #include <unistd.h>
9*a1e26a70SApple OSS Distributions #include <stdlib.h>
10*a1e26a70SApple OSS Distributions #include <time.h>
11*a1e26a70SApple OSS Distributions #include <errno.h>
12*a1e26a70SApple OSS Distributions
13*a1e26a70SApple OSS Distributions #include <darwintest.h>
14*a1e26a70SApple OSS Distributions
15*a1e26a70SApple OSS Distributions #if defined(__arm64__)
16*a1e26a70SApple OSS Distributions #define HAS_KERNEL_TIME_TRAPS
17*a1e26a70SApple OSS Distributions
18*a1e26a70SApple OSS Distributions extern uint64_t mach_absolute_time_kernel(void);
19*a1e26a70SApple OSS Distributions extern uint64_t mach_continuous_time_kernel(void);
20*a1e26a70SApple OSS Distributions
21*a1e26a70SApple OSS Distributions #endif
22*a1e26a70SApple OSS Distributions
23*a1e26a70SApple OSS Distributions extern char **environ;
24*a1e26a70SApple OSS Distributions
25*a1e26a70SApple OSS Distributions static const int64_t one_mil = 1000 * 1000;
26*a1e26a70SApple OSS Distributions
27*a1e26a70SApple OSS Distributions #define to_ns(ticks) (((ticks) * tb_info.numer) / (tb_info.denom))
28*a1e26a70SApple OSS Distributions #define to_ms(ticks) (to_ns(ticks)/one_mil)
29*a1e26a70SApple OSS Distributions
30*a1e26a70SApple OSS Distributions static mach_timebase_info_data_t tb_info;
31*a1e26a70SApple OSS Distributions
32*a1e26a70SApple OSS Distributions static void
update(uint64_t * a,uint64_t * c)33*a1e26a70SApple OSS Distributions update(uint64_t *a, uint64_t *c)
34*a1e26a70SApple OSS Distributions {
35*a1e26a70SApple OSS Distributions mach_get_times(a, c, NULL);
36*a1e26a70SApple OSS Distributions }
37*a1e26a70SApple OSS Distributions
38*a1e26a70SApple OSS Distributions T_DECL(mct_monotonic, "Testing mach_continuous_time returns sane, monotonic values",
39*a1e26a70SApple OSS Distributions T_META_ALL_VALID_ARCHS(true), T_META_RUN_CONCURRENTLY(true))
40*a1e26a70SApple OSS Distributions {
41*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
42*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
43*a1e26a70SApple OSS Distributions bool kernel = false;
44*a1e26a70SApple OSS Distributions #endif
45*a1e26a70SApple OSS Distributions
46*a1e26a70SApple OSS Distributions volatile uint64_t multiple_test = to_ms(mach_continuous_time());
47*a1e26a70SApple OSS Distributions for (int i = 0; i < 20; i++) {
48*a1e26a70SApple OSS Distributions uint64_t tmp;
49*a1e26a70SApple OSS Distributions const char *test_type = "user";
50*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
51*a1e26a70SApple OSS Distributions if (kernel) {
52*a1e26a70SApple OSS Distributions test_type = "kernel";
53*a1e26a70SApple OSS Distributions tmp = mach_continuous_time_kernel();
54*a1e26a70SApple OSS Distributions } else {
55*a1e26a70SApple OSS Distributions tmp = mach_continuous_time();
56*a1e26a70SApple OSS Distributions }
57*a1e26a70SApple OSS Distributions kernel = !kernel;
58*a1e26a70SApple OSS Distributions #else
59*a1e26a70SApple OSS Distributions tmp = mach_continuous_time();
60*a1e26a70SApple OSS Distributions #endif
61*a1e26a70SApple OSS Distributions tmp = to_ms(tmp);
62*a1e26a70SApple OSS Distributions T_ASSERT_GE(tmp, multiple_test, "mach_continuous_time (%s) must be monotonic", test_type);
63*a1e26a70SApple OSS Distributions
64*a1e26a70SApple OSS Distributions // each successive call shouldn't be more than 100ms in the future
65*a1e26a70SApple OSS Distributions T_ASSERT_LE(tmp - multiple_test, 100ULL, "mach_continuous_time (%s) should not jump forward too fast", test_type);
66*a1e26a70SApple OSS Distributions
67*a1e26a70SApple OSS Distributions multiple_test = tmp;
68*a1e26a70SApple OSS Distributions }
69*a1e26a70SApple OSS Distributions }
70*a1e26a70SApple OSS Distributions
71*a1e26a70SApple OSS Distributions T_DECL(mat_monotonic, "Testing mach_absolute_time returns sane, monotonic values",
72*a1e26a70SApple OSS Distributions T_META_ALL_VALID_ARCHS(true), T_META_RUN_CONCURRENTLY(true))
73*a1e26a70SApple OSS Distributions {
74*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
75*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
76*a1e26a70SApple OSS Distributions bool kernel = false;
77*a1e26a70SApple OSS Distributions #endif
78*a1e26a70SApple OSS Distributions
79*a1e26a70SApple OSS Distributions volatile uint64_t multiple_test = to_ms(mach_absolute_time());
80*a1e26a70SApple OSS Distributions for (int i = 0; i < 20; i++) {
81*a1e26a70SApple OSS Distributions uint64_t tmp;
82*a1e26a70SApple OSS Distributions const char *test_type = "user";
83*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
84*a1e26a70SApple OSS Distributions if (kernel) {
85*a1e26a70SApple OSS Distributions test_type = "kernel";
86*a1e26a70SApple OSS Distributions tmp = mach_absolute_time_kernel();
87*a1e26a70SApple OSS Distributions } else {
88*a1e26a70SApple OSS Distributions tmp = mach_absolute_time();
89*a1e26a70SApple OSS Distributions }
90*a1e26a70SApple OSS Distributions kernel = !kernel;
91*a1e26a70SApple OSS Distributions #endif
92*a1e26a70SApple OSS Distributions tmp = mach_absolute_time();
93*a1e26a70SApple OSS Distributions tmp = to_ms(tmp);
94*a1e26a70SApple OSS Distributions T_ASSERT_GE(tmp, multiple_test, "mach_absolute_time (%s) must be monotonic", test_type);
95*a1e26a70SApple OSS Distributions
96*a1e26a70SApple OSS Distributions // each successive call shouldn't be more than 100ms in the future
97*a1e26a70SApple OSS Distributions T_ASSERT_LE(tmp - multiple_test, 100ULL, "mach_absolute_time (%s) should not jump forward too fast", test_type);
98*a1e26a70SApple OSS Distributions
99*a1e26a70SApple OSS Distributions multiple_test = tmp;
100*a1e26a70SApple OSS Distributions }
101*a1e26a70SApple OSS Distributions }
102*a1e26a70SApple OSS Distributions
103*a1e26a70SApple OSS Distributions T_DECL(mct_pause, "Testing mach_continuous_time and mach_absolute_time don't diverge",
104*a1e26a70SApple OSS Distributions T_META_RUN_CONCURRENTLY(true))
105*a1e26a70SApple OSS Distributions {
106*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
107*a1e26a70SApple OSS Distributions
108*a1e26a70SApple OSS Distributions uint64_t abs_now;
109*a1e26a70SApple OSS Distributions uint64_t cnt_now;
110*a1e26a70SApple OSS Distributions int before_diff, after_diff;
111*a1e26a70SApple OSS Distributions
112*a1e26a70SApple OSS Distributions update(&abs_now, &cnt_now);
113*a1e26a70SApple OSS Distributions before_diff = (int)(to_ms(cnt_now) - to_ms(abs_now));
114*a1e26a70SApple OSS Distributions
115*a1e26a70SApple OSS Distributions sleep(1);
116*a1e26a70SApple OSS Distributions
117*a1e26a70SApple OSS Distributions update(&abs_now, &cnt_now);
118*a1e26a70SApple OSS Distributions after_diff = (int)(to_ms(cnt_now) - to_ms(abs_now));
119*a1e26a70SApple OSS Distributions
120*a1e26a70SApple OSS Distributions T_ASSERT_LE(abs(after_diff - before_diff), 1, "mach_continuous_time and mach_absolute_time should not diverge");
121*a1e26a70SApple OSS Distributions }
122*a1e26a70SApple OSS Distributions
123*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
124*a1e26a70SApple OSS Distributions static void
update_kern(uint64_t * abs,uint64_t * cont)125*a1e26a70SApple OSS Distributions update_kern(uint64_t *abs, uint64_t *cont)
126*a1e26a70SApple OSS Distributions {
127*a1e26a70SApple OSS Distributions uint64_t abs1, abs2, cont1, cont2;
128*a1e26a70SApple OSS Distributions do {
129*a1e26a70SApple OSS Distributions abs1 = mach_absolute_time_kernel();
130*a1e26a70SApple OSS Distributions cont1 = mach_continuous_time_kernel();
131*a1e26a70SApple OSS Distributions abs2 = mach_absolute_time_kernel();
132*a1e26a70SApple OSS Distributions cont2 = mach_continuous_time_kernel();
133*a1e26a70SApple OSS Distributions } while (to_ms(abs2 - abs1) || to_ms(cont2 - cont1));
134*a1e26a70SApple OSS Distributions *abs = abs2;
135*a1e26a70SApple OSS Distributions *cont = cont2;
136*a1e26a70SApple OSS Distributions }
137*a1e26a70SApple OSS Distributions #endif
138*a1e26a70SApple OSS Distributions
139*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
140*a1e26a70SApple OSS Distributions T_DECL(mct_pause_kern, "Testing kernel mach_continuous_time and mach_absolute_time don't diverge",
141*a1e26a70SApple OSS Distributions T_META_RUN_CONCURRENTLY(true))
142*a1e26a70SApple OSS Distributions {
143*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
144*a1e26a70SApple OSS Distributions
145*a1e26a70SApple OSS Distributions uint64_t abs_now;
146*a1e26a70SApple OSS Distributions uint64_t cnt_now;
147*a1e26a70SApple OSS Distributions int before_diff, after_diff;
148*a1e26a70SApple OSS Distributions
149*a1e26a70SApple OSS Distributions update_kern(&abs_now, &cnt_now);
150*a1e26a70SApple OSS Distributions before_diff = (int)(to_ms(cnt_now) - to_ms(abs_now));
151*a1e26a70SApple OSS Distributions
152*a1e26a70SApple OSS Distributions sleep(1);
153*a1e26a70SApple OSS Distributions
154*a1e26a70SApple OSS Distributions update_kern(&abs_now, &cnt_now);
155*a1e26a70SApple OSS Distributions after_diff = (int)(to_ms(cnt_now) - to_ms(abs_now));
156*a1e26a70SApple OSS Distributions
157*a1e26a70SApple OSS Distributions T_ASSERT_LE(abs(after_diff - before_diff), 1, "mach_continuous_time_kernel and mach_absolute_time_kernel should not diverge");
158*a1e26a70SApple OSS Distributions }
159*a1e26a70SApple OSS Distributions #endif
160*a1e26a70SApple OSS Distributions
161*a1e26a70SApple OSS Distributions T_DECL(mct_sleep, "Testing mach_continuous_time behavior over system sleep"){
162*a1e26a70SApple OSS Distributions #ifndef MCT_SLEEP_TEST
163*a1e26a70SApple OSS Distributions T_SKIP("Skipping test that sleeps the device; compile with MCT_SLEEP_TEST define to enable.");
164*a1e26a70SApple OSS Distributions #endif
165*a1e26a70SApple OSS Distributions
166*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
167*a1e26a70SApple OSS Distributions
168*a1e26a70SApple OSS Distributions uint64_t abs_now;
169*a1e26a70SApple OSS Distributions uint64_t cnt_now;
170*a1e26a70SApple OSS Distributions int before_diff, after_diff = 0;
171*a1e26a70SApple OSS Distributions
172*a1e26a70SApple OSS Distributions T_LOG("Testing mach_continuous_time is ~5 seconds ahead of mach_absolute_time after 5 second sleep");
173*a1e26a70SApple OSS Distributions update(&abs_now, &cnt_now);
174*a1e26a70SApple OSS Distributions before_diff = (int)(to_ms(cnt_now) - to_ms(abs_now));
175*a1e26a70SApple OSS Distributions
176*a1e26a70SApple OSS Distributions // performs:
177*a1e26a70SApple OSS Distributions // pmset relative wake 5
178*a1e26a70SApple OSS Distributions // pmset sleepnow
179*a1e26a70SApple OSS Distributions
180*a1e26a70SApple OSS Distributions pid_t pid;
181*a1e26a70SApple OSS Distributions int spawn_ret = 0;
182*a1e26a70SApple OSS Distributions time_t before_sleep = time(NULL);
183*a1e26a70SApple OSS Distributions int ct_ms_before_sleep = (int)to_ms(cnt_now);
184*a1e26a70SApple OSS Distributions int ab_ms_before_sleep = (int)to_ms(abs_now);
185*a1e26a70SApple OSS Distributions
186*a1e26a70SApple OSS Distributions char *const pmset1_args[] = {"/usr/bin/pmset", "relative", "wake", "5", NULL};
187*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO((spawn_ret = posix_spawn(&pid, pmset1_args[0], NULL, NULL, pmset1_args, environ)), NULL);
188*a1e26a70SApple OSS Distributions
189*a1e26a70SApple OSS Distributions T_ASSERT_EQ(waitpid(pid, &spawn_ret, 0), pid, "waitpid failed");
190*a1e26a70SApple OSS Distributions T_ASSERT_EQ(spawn_ret, 0, "pmset relative wait 5 failed");
191*a1e26a70SApple OSS Distributions
192*a1e26a70SApple OSS Distributions char *const pmset2_args[] = {"/usr/bin/pmset", "sleepnow", NULL};
193*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO((spawn_ret = posix_spawn(&pid, pmset2_args[0], NULL, NULL, pmset2_args, environ)), NULL);
194*a1e26a70SApple OSS Distributions
195*a1e26a70SApple OSS Distributions T_ASSERT_EQ(waitpid(pid, &spawn_ret, 0), pid, "waitpid failed");
196*a1e26a70SApple OSS Distributions T_ASSERT_EQ(spawn_ret, 0, "pmset relative wait 5 failed");
197*a1e26a70SApple OSS Distributions
198*a1e26a70SApple OSS Distributions // wait for device to sleep (up to 30 seconds)
199*a1e26a70SApple OSS Distributions for (int i = 0; i < 30; i++) {
200*a1e26a70SApple OSS Distributions update(&abs_now, &cnt_now);
201*a1e26a70SApple OSS Distributions after_diff = (int)(to_ms(cnt_now) - to_ms(abs_now));
202*a1e26a70SApple OSS Distributions
203*a1e26a70SApple OSS Distributions // on OSX, there's enough latency between calls to MCT and MAT
204*a1e26a70SApple OSS Distributions // when the system is going down for sleep for values to diverge a few ms
205*a1e26a70SApple OSS Distributions if (abs(before_diff - after_diff) > 2) {
206*a1e26a70SApple OSS Distributions break;
207*a1e26a70SApple OSS Distributions }
208*a1e26a70SApple OSS Distributions
209*a1e26a70SApple OSS Distributions sleep(1);
210*a1e26a70SApple OSS Distributions T_LOG("waited %d seconds for sleep...", i + 1);
211*a1e26a70SApple OSS Distributions }
212*a1e26a70SApple OSS Distributions
213*a1e26a70SApple OSS Distributions if ((after_diff - before_diff) < 4000) {
214*a1e26a70SApple OSS Distributions T_LOG("Device slept for less than 4 seconds, did it really sleep? (%d ms change between abs and cont)",
215*a1e26a70SApple OSS Distributions after_diff - before_diff);
216*a1e26a70SApple OSS Distributions }
217*a1e26a70SApple OSS Distributions
218*a1e26a70SApple OSS Distributions time_t after_sleep = time(NULL);
219*a1e26a70SApple OSS Distributions
220*a1e26a70SApple OSS Distributions int cal_sleep_diff = (int)(double)difftime(after_sleep, before_sleep);
221*a1e26a70SApple OSS Distributions int ct_sleep_diff = ((int)to_ms(cnt_now) - ct_ms_before_sleep) / 1000;
222*a1e26a70SApple OSS Distributions int ab_sleep_diff = ((int)to_ms(abs_now) - ab_ms_before_sleep) / 1000;
223*a1e26a70SApple OSS Distributions
224*a1e26a70SApple OSS Distributions T_LOG("Calendar progressed: %d sec; continuous time progressed: %d sec; absolute time progressed %d sec",
225*a1e26a70SApple OSS Distributions cal_sleep_diff, ct_sleep_diff, ab_sleep_diff);
226*a1e26a70SApple OSS Distributions
227*a1e26a70SApple OSS Distributions T_ASSERT_LE(abs(ct_sleep_diff - cal_sleep_diff), 2,
228*a1e26a70SApple OSS Distributions "continuous time should progress at ~ same rate as calendar");
229*a1e26a70SApple OSS Distributions }
230*a1e26a70SApple OSS Distributions
231*a1e26a70SApple OSS Distributions T_DECL(mct_settimeofday, "Testing mach_continuous_time behavior over settimeofday"){
232*a1e26a70SApple OSS Distributions if (geteuid() != 0) {
233*a1e26a70SApple OSS Distributions T_SKIP("The settimeofday() test requires root privileges to run.");
234*a1e26a70SApple OSS Distributions }
235*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
236*a1e26a70SApple OSS Distributions
237*a1e26a70SApple OSS Distributions struct timeval saved_tv;
238*a1e26a70SApple OSS Distributions struct timezone saved_tz;
239*a1e26a70SApple OSS Distributions int before, after;
240*a1e26a70SApple OSS Distributions
241*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO(gettimeofday(&saved_tv, &saved_tz), NULL);
242*a1e26a70SApple OSS Distributions
243*a1e26a70SApple OSS Distributions struct timeval forward_tv = saved_tv;
244*a1e26a70SApple OSS Distributions // move time forward by two minutes, ensure mach_continuous_time keeps
245*a1e26a70SApple OSS Distributions // chugging along with mach_absolute_time
246*a1e26a70SApple OSS Distributions forward_tv.tv_sec += 2 * 60;
247*a1e26a70SApple OSS Distributions
248*a1e26a70SApple OSS Distributions before = (int)to_ms(mach_continuous_time());
249*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO(settimeofday(&forward_tv, &saved_tz), NULL);
250*a1e26a70SApple OSS Distributions
251*a1e26a70SApple OSS Distributions after = (int)to_ms(mach_continuous_time());
252*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO(settimeofday(&saved_tv, &saved_tz), NULL);
253*a1e26a70SApple OSS Distributions
254*a1e26a70SApple OSS Distributions T_ASSERT_LT(abs(before - after), 1000, "mach_continuous_time should not jump more than 1s");
255*a1e26a70SApple OSS Distributions }
256*a1e26a70SApple OSS Distributions
257*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
258*a1e26a70SApple OSS Distributions T_DECL(mct_settimeofday_kern, "Testing kernel mach_continuous_time behavior over settimeofday"){
259*a1e26a70SApple OSS Distributions if (geteuid() != 0) {
260*a1e26a70SApple OSS Distributions T_SKIP("The settimeofday() test requires root privileges to run.");
261*a1e26a70SApple OSS Distributions }
262*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
263*a1e26a70SApple OSS Distributions
264*a1e26a70SApple OSS Distributions struct timeval saved_tv;
265*a1e26a70SApple OSS Distributions struct timezone saved_tz;
266*a1e26a70SApple OSS Distributions int before, after;
267*a1e26a70SApple OSS Distributions
268*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO(gettimeofday(&saved_tv, &saved_tz), NULL);
269*a1e26a70SApple OSS Distributions
270*a1e26a70SApple OSS Distributions struct timeval forward_tv = saved_tv;
271*a1e26a70SApple OSS Distributions // move time forward by two minutes, ensure mach_continuous_time keeps
272*a1e26a70SApple OSS Distributions // chugging along with mach_absolute_time
273*a1e26a70SApple OSS Distributions forward_tv.tv_sec += 2 * 60;
274*a1e26a70SApple OSS Distributions
275*a1e26a70SApple OSS Distributions before = (int)to_ms(mach_continuous_time_kernel());
276*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO(settimeofday(&forward_tv, &saved_tz), NULL);
277*a1e26a70SApple OSS Distributions
278*a1e26a70SApple OSS Distributions after = (int)to_ms(mach_continuous_time_kernel());
279*a1e26a70SApple OSS Distributions T_ASSERT_POSIX_ZERO(settimeofday(&saved_tv, &saved_tz), NULL);
280*a1e26a70SApple OSS Distributions
281*a1e26a70SApple OSS Distributions T_ASSERT_LT(abs(before - after), 1000, "mach_continuous_time_kernel should not jump more than 1s");
282*a1e26a70SApple OSS Distributions }
283*a1e26a70SApple OSS Distributions #endif
284*a1e26a70SApple OSS Distributions
285*a1e26a70SApple OSS Distributions T_DECL(mct_aproximate, "Testing mach_continuous_approximate_time()",
286*a1e26a70SApple OSS Distributions T_META_ALL_VALID_ARCHS(true), T_META_RUN_CONCURRENTLY(true))
287*a1e26a70SApple OSS Distributions {
288*a1e26a70SApple OSS Distributions mach_timebase_info(&tb_info);
289*a1e26a70SApple OSS Distributions
290*a1e26a70SApple OSS Distributions uint64_t absolute = to_ns(mach_continuous_time());
291*a1e26a70SApple OSS Distributions uint64_t approximate = to_ns(mach_continuous_approximate_time());
292*a1e26a70SApple OSS Distributions
293*a1e26a70SApple OSS Distributions T_EXPECT_LE(llabs((long long)absolute - (long long)approximate), (long long)(25 * NSEC_PER_MSEC), NULL);
294*a1e26a70SApple OSS Distributions }
295*a1e26a70SApple OSS Distributions
296*a1e26a70SApple OSS Distributions T_DECL(mach_time_perf, "mach_time performance") {
297*a1e26a70SApple OSS Distributions {
298*a1e26a70SApple OSS Distributions dt_stat_time_t s = dt_stat_time_create("mach_absolute_time");
T_STAT_MEASURE_LOOP(s)299*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
300*a1e26a70SApple OSS Distributions uint64_t t;
301*a1e26a70SApple OSS Distributions t = mach_absolute_time();
302*a1e26a70SApple OSS Distributions }
303*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
304*a1e26a70SApple OSS Distributions }
305*a1e26a70SApple OSS Distributions {
306*a1e26a70SApple OSS Distributions dt_stat_time_t s = dt_stat_time_create("mach_continuous_time");
T_STAT_MEASURE_LOOP(s)307*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
308*a1e26a70SApple OSS Distributions uint64_t t;
309*a1e26a70SApple OSS Distributions t = mach_continuous_time();
310*a1e26a70SApple OSS Distributions }
311*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
312*a1e26a70SApple OSS Distributions }
313*a1e26a70SApple OSS Distributions }
314*a1e26a70SApple OSS Distributions
315*a1e26a70SApple OSS Distributions T_DECL(mach_time_perf_instructions, "instructions retired for mach_time", T_META_TYPE_PERF, T_META_ASROOT(YES)) {
316*a1e26a70SApple OSS Distributions {
317*a1e26a70SApple OSS Distributions dt_stat_thread_instructions_t s = dt_stat_thread_instructions_create("mach_absolute_time");
T_STAT_MEASURE_LOOP(s)318*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
319*a1e26a70SApple OSS Distributions uint64_t t;
320*a1e26a70SApple OSS Distributions t = mach_absolute_time();
321*a1e26a70SApple OSS Distributions }
322*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
323*a1e26a70SApple OSS Distributions }
324*a1e26a70SApple OSS Distributions {
325*a1e26a70SApple OSS Distributions dt_stat_thread_instructions_t s = dt_stat_thread_instructions_create("mach_continuous_time");
T_STAT_MEASURE_LOOP(s)326*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
327*a1e26a70SApple OSS Distributions uint64_t t;
328*a1e26a70SApple OSS Distributions t = mach_continuous_time();
329*a1e26a70SApple OSS Distributions }
330*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
331*a1e26a70SApple OSS Distributions }
332*a1e26a70SApple OSS Distributions }
333*a1e26a70SApple OSS Distributions
334*a1e26a70SApple OSS Distributions #ifdef HAS_KERNEL_TIME_TRAPS
335*a1e26a70SApple OSS Distributions T_DECL(mach_time_perf_kern, "kernel mach_time performance") {
336*a1e26a70SApple OSS Distributions {
337*a1e26a70SApple OSS Distributions dt_stat_time_t s = dt_stat_time_create("mach_absolute_time_kernel");
T_STAT_MEASURE_LOOP(s)338*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
339*a1e26a70SApple OSS Distributions uint64_t t;
340*a1e26a70SApple OSS Distributions t = mach_absolute_time_kernel();
341*a1e26a70SApple OSS Distributions }
342*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
343*a1e26a70SApple OSS Distributions }
344*a1e26a70SApple OSS Distributions {
345*a1e26a70SApple OSS Distributions dt_stat_time_t s = dt_stat_time_create("mach_continuous_time_kernel");
T_STAT_MEASURE_LOOP(s)346*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
347*a1e26a70SApple OSS Distributions uint64_t t;
348*a1e26a70SApple OSS Distributions t = mach_continuous_time_kernel();
349*a1e26a70SApple OSS Distributions }
350*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
351*a1e26a70SApple OSS Distributions }
352*a1e26a70SApple OSS Distributions }
353*a1e26a70SApple OSS Distributions
354*a1e26a70SApple OSS Distributions T_DECL(mach_time_perf_instructions_kern, "instructions retired for kernel mach_time", T_META_TYPE_PERF, T_META_ASROOT(YES)) {
355*a1e26a70SApple OSS Distributions {
356*a1e26a70SApple OSS Distributions dt_stat_thread_instructions_t s = dt_stat_thread_instructions_create("mach_absolute_time_kernel");
T_STAT_MEASURE_LOOP(s)357*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
358*a1e26a70SApple OSS Distributions uint64_t t;
359*a1e26a70SApple OSS Distributions t = mach_absolute_time_kernel();
360*a1e26a70SApple OSS Distributions }
361*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
362*a1e26a70SApple OSS Distributions }
363*a1e26a70SApple OSS Distributions {
364*a1e26a70SApple OSS Distributions dt_stat_thread_instructions_t s = dt_stat_thread_instructions_create("mach_continuous_time_kernel");
T_STAT_MEASURE_LOOP(s)365*a1e26a70SApple OSS Distributions T_STAT_MEASURE_LOOP(s) {
366*a1e26a70SApple OSS Distributions uint64_t t;
367*a1e26a70SApple OSS Distributions t = mach_continuous_time_kernel();
368*a1e26a70SApple OSS Distributions }
369*a1e26a70SApple OSS Distributions dt_stat_finalize(s);
370*a1e26a70SApple OSS Distributions }
371*a1e26a70SApple OSS Distributions }
372*a1e26a70SApple OSS Distributions #endif
373