xref: /xnu-8792.81.2/tools/trace/bridgetime.lua (revision 19c3b8c28c31cb8130e034cfb5df6bf9ba342d90)
1*19c3b8c2SApple OSS Distributions#!/usr/local/bin/luatrace -s
2*19c3b8c2SApple OSS Distributions
3*19c3b8c2SApple OSS Distributionstrace_codename = function(codename, callback)
4*19c3b8c2SApple OSS Distributions	local debugid = trace.debugid(codename)
5*19c3b8c2SApple OSS Distributions	if debugid ~= 0 then
6*19c3b8c2SApple OSS Distributions		trace.single(debugid,callback)
7*19c3b8c2SApple OSS Distributions	else
8*19c3b8c2SApple OSS Distributions		printf("WARNING: Cannot locate debugid for '%s'\n", codename)
9*19c3b8c2SApple OSS Distributions	end
10*19c3b8c2SApple OSS Distributionsend
11*19c3b8c2SApple OSS Distributions
12*19c3b8c2SApple OSS Distributionsinitial_timestamp = 0
13*19c3b8c2SApple OSS Distributionsget_prefix = function(buf, char)
14*19c3b8c2SApple OSS Distributions	-- if initial_timestamp == 0 then
15*19c3b8c2SApple OSS Distributions		-- initial_timestamp = buf.timestamp
16*19c3b8c2SApple OSS Distributions	-- end
17*19c3b8c2SApple OSS Distributions	local secs = trace.convert_timestamp_to_nanoseconds(buf.timestamp - initial_timestamp) / 1000000000
18*19c3b8c2SApple OSS Distributions
19*19c3b8c2SApple OSS Distributions	return string.format("%s %6.9f %-30s",
20*19c3b8c2SApple OSS Distributions		char, secs, buf.debugname)
21*19c3b8c2SApple OSS Distributionsend
22*19c3b8c2SApple OSS Distributions
23*19c3b8c2SApple OSS Distributionsinitial_arm_timestamp = 0
24*19c3b8c2SApple OSS Distributionsformat_timestamp_arm = function(ts)
25*19c3b8c2SApple OSS Distributions	local secs = trace.convert_timestamp_to_nanoseconds(ts - initial_arm_timestamp) / 1000000000
26*19c3b8c2SApple OSS Distributions	return string.format("%6.9f", secs);
27*19c3b8c2SApple OSS Distributionsend
28*19c3b8c2SApple OSS Distributions
29*19c3b8c2SApple OSS Distributionsinitial_intel_timestamp = 0
30*19c3b8c2SApple OSS Distributionsformat_timestamp_intel = function(ts)
31*19c3b8c2SApple OSS Distributions	local secs = (ts - initial_intel_timestamp) / 1000000000
32*19c3b8c2SApple OSS Distributions	return string.format("%6.9f", secs);
33*19c3b8c2SApple OSS Distributionsend
34*19c3b8c2SApple OSS Distributions
35*19c3b8c2SApple OSS Distributionsformat_timestamp_ns = function(ts)
36*19c3b8c2SApple OSS Distributions	local secs = (ts) / 1000000000
37*19c3b8c2SApple OSS Distributions	return string.format("%6.9f", secs);
38*19c3b8c2SApple OSS Distributionsend
39*19c3b8c2SApple OSS Distributions
40*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_RESET_TS", function(buf)
41*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, "X")
42*19c3b8c2SApple OSS Distributions	local reason = "UNKNOWN";
43*19c3b8c2SApple OSS Distributions	if buf[3] == 1 then
44*19c3b8c2SApple OSS Distributions		reason = "RecvSentinel"
45*19c3b8c2SApple OSS Distributions	elseif buf[3] == 2 then
46*19c3b8c2SApple OSS Distributions		reason = "ResetTrue"
47*19c3b8c2SApple OSS Distributions	elseif buf[3] == 3 then
48*19c3b8c2SApple OSS Distributions		reason = "RateZero"
49*19c3b8c2SApple OSS Distributions	elseif buf[3] == 4 then
50*19c3b8c2SApple OSS Distributions		reason = "TSMismatch"
51*19c3b8c2SApple OSS Distributions	end
52*19c3b8c2SApple OSS Distributions	printf("%s %-15s ( %-10s %-10s ) ----------------------------------------\n",
53*19c3b8c2SApple OSS Distributions		prefix, reason, format_timestamp_arm(buf[1]), format_timestamp_intel(buf[2]))
54*19c3b8c2SApple OSS Distributions
55*19c3b8c2SApple OSS Distributions	-- initial_arm_timestamp = buf[1]
56*19c3b8c2SApple OSS Distributions	-- initial_intel_timestamp = buf[2]
57*19c3b8c2SApple OSS Distributionsend)
58*19c3b8c2SApple OSS Distributions
59*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_TS_PARAMS", function(buf)
60*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, ">")
61*19c3b8c2SApple OSS Distributions
62*19c3b8c2SApple OSS Distributions	local rate
63*19c3b8c2SApple OSS Distributions	if darwin.uint64_to_double then
64*19c3b8c2SApple OSS Distributions		rate = darwin.uint64_to_double(buf[3])
65*19c3b8c2SApple OSS Distributions	else
66*19c3b8c2SApple OSS Distributions		rate = math.nan
67*19c3b8c2SApple OSS Distributions	end
68*19c3b8c2SApple OSS Distributions
69*19c3b8c2SApple OSS Distributions	printf("%s %30s( %-10s %-10s ) rate = %f\n",
70*19c3b8c2SApple OSS Distributions		prefix, "", format_timestamp_ns(buf[1]), format_timestamp_intel(buf[2]),
71*19c3b8c2SApple OSS Distributions		rate)
72*19c3b8c2SApple OSS Distributionsend)
73*19c3b8c2SApple OSS Distributions
74*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_REMOTE_TIME", function(buf)
75*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, "-")
76*19c3b8c2SApple OSS Distributions
77*19c3b8c2SApple OSS Distributions	printf("%s ( %-10s %-10s ) @ %-20s\n",
78*19c3b8c2SApple OSS Distributions		prefix, format_timestamp_arm(buf[1]), format_timestamp_intel(buf[2]), format_timestamp_arm(buf[3]))
79*19c3b8c2SApple OSS Distributionsend)
80*19c3b8c2SApple OSS Distributions
81*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_RCV_TS", function(buf)
82*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, "<")
83*19c3b8c2SApple OSS Distributions
84*19c3b8c2SApple OSS Distributions	if buf[2] == 0xfffffffffffffffe then
85*19c3b8c2SApple OSS Distributions		printf("%s ( %-10s  Sleep )\n",
86*19c3b8c2SApple OSS Distributions			prefix, format_timestamp_arm(buf[1]), format_timestamp_intel(buf[2]))
87*19c3b8c2SApple OSS Distributions	elseif buf[2] == 0xfffffffffffffffd then
88*19c3b8c2SApple OSS Distributions		printf("%s ( %-10s Wake )\n",
89*19c3b8c2SApple OSS Distributions			prefix, format_timestamp_arm(buf[1]), format_timestamp_intel(buf[2]))
90*19c3b8c2SApple OSS Distributions	elseif buf[2] == 0xfffffffffffffffc then
91*19c3b8c2SApple OSS Distributions		printf("%s ( %-10s Reset )\n",
92*19c3b8c2SApple OSS Distributions			prefix, format_timestamp_arm(buf[1]), format_timestamp_intel(buf[2]))
93*19c3b8c2SApple OSS Distributions	else
94*19c3b8c2SApple OSS Distributions		local skip = ""
95*19c3b8c2SApple OSS Distributions		if buf[1] == 0 then
96*19c3b8c2SApple OSS Distributions			skip = "Int handler"
97*19c3b8c2SApple OSS Distributions		end
98*19c3b8c2SApple OSS Distributions		printf("%s ( %-10s %-10s ) %s\n",
99*19c3b8c2SApple OSS Distributions			prefix, format_timestamp_arm(buf[1]), format_timestamp_intel(buf[2]), skip)
100*19c3b8c2SApple OSS Distributions	end
101*19c3b8c2SApple OSS Distributions
102*19c3b8c2SApple OSS Distributionsend)
103*19c3b8c2SApple OSS Distributions
104*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_SKIP_TS", function(buf)
105*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, "*")
106*19c3b8c2SApple OSS Distributions
107*19c3b8c2SApple OSS Distributions	if buf[4] > 0 then
108*19c3b8c2SApple OSS Distributions		printf("%s SKIP_RESET:%3d (Cur: %-10s Prev:%-10s) %-10s\n",
109*19c3b8c2SApple OSS Distributions			prefix, buf[4], format_timestamp_arm(buf[1]), format_timestamp_arm(buf[3]),
110*19c3b8c2SApple OSS Distributions			format_timestamp_intel(buf[2]))
111*19c3b8c2SApple OSS Distributions	else
112*19c3b8c2SApple OSS Distributions		printf("%s SKIP_DISTANCE: (Cur: %-10s Prev: %-10s) %-10s\n",
113*19c3b8c2SApple OSS Distributions			prefix, format_timestamp_arm(buf[1]), format_timestamp_arm(buf[3]),
114*19c3b8c2SApple OSS Distributions			format_timestamp_intel(buf[2]))
115*19c3b8c2SApple OSS Distributions	end
116*19c3b8c2SApple OSS Distributions
117*19c3b8c2SApple OSS Distributionsend)
118*19c3b8c2SApple OSS Distributions
119*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_TS_MISMATCH", function(buf)
120*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, "?")
121*19c3b8c2SApple OSS Distributions
122*19c3b8c2SApple OSS Distributions	local diff = (math.abs(buf[2] - buf[3]))/1000000
123*19c3b8c2SApple OSS Distributions
124*19c3b8c2SApple OSS Distributions	printf("%s ( Cur: %-10s Pred: %-10s Diff: %5.6f ms Count: %d ) @ %-20s\n",
125*19c3b8c2SApple OSS Distributions		prefix, format_timestamp_intel(buf[2]), format_timestamp_intel(buf[3]),
126*19c3b8c2SApple OSS Distributions		diff, buf[4], format_timestamp_arm(buf[1]))
127*19c3b8c2SApple OSS Distributions
128*19c3b8c2SApple OSS Distributionsend)
129*19c3b8c2SApple OSS Distributions
130*19c3b8c2SApple OSS Distributionstrace_codename("MACH_CLOCK_BRIDGE_OBSV_RATE", function(buf)
131*19c3b8c2SApple OSS Distributions	local prefix = get_prefix(buf, "=")
132*19c3b8c2SApple OSS Distributions
133*19c3b8c2SApple OSS Distributions	local rate
134*19c3b8c2SApple OSS Distributions	if darwin.uint64_to_double then
135*19c3b8c2SApple OSS Distributions		rate = darwin.uint64_to_double(buf[1])
136*19c3b8c2SApple OSS Distributions	else
137*19c3b8c2SApple OSS Distributions		rate = math.nan
138*19c3b8c2SApple OSS Distributions	end
139*19c3b8c2SApple OSS Distributions
140*19c3b8c2SApple OSS Distributions	printf("%s obsv_rate = %f exceeded limits(0.8, 1.2)\n", prefix, rate)
141*19c3b8c2SApple OSS Distributions
142*19c3b8c2SApple OSS Distributionsend)
143