xref: /xnu-11215/iokit/IOKit/IOStatistics.h (revision a5e72196)
1 /*
2  * Copyright (c) 2010 Apple Computer, 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 #ifndef _IOKIT_STATISTICS_H
30 #define _IOKIT_STATISTICS_H
31 
32 #define IOSTATISTICS_SIG            'IOST'
33 #define IOSTATISTICS_SIG_USERCLIENT 'IOSU'
34 #define IOSTATISTICS_SIG_WORKLOOP   'IOSW'
35 
36 /* Update when the binary format changes */
37 #define IOSTATISTICS_VER                        0x2
38 
39 enum {
40 	kIOStatisticsDriverNameLength  = 64,
41 	kIOStatisticsClassNameLength   = 64,
42 	kIOStatisticsProcessNameLength = 20
43 };
44 
45 enum {
46 	kIOStatisticsDerivedEventSourceCounter = 0,
47 	kIOStatisticsTimerEventSourceCounter,
48 	kIOStatisticsCommandGateCounter,
49 	kIOStatisticsCommandQueueCounter,
50 	kIOStatisticsInterruptEventSourceCounter,
51 	kIOStatisticsFilterInterruptEventSourceCounter
52 };
53 
54 typedef uint32_t IOStatisticsCounterType;
55 
56 enum {
57 	kIOStatisticsGeneral = 0,
58 	kIOStatisticsWorkLoop,
59 	kIOStatisticsUserClient
60 };
61 
62 /* Keep our alignments as intended */
63 
64 #pragma pack(4)
65 
66 /* Event Counters */
67 
68 typedef struct IOStatisticsInterruptEventSources {
69 	uint32_t created;
70 	uint32_t produced;
71 	uint32_t checksForWork;
72 } IOStatisticsInterruptEventSources;
73 
74 typedef struct IOStatisticsTimerEventSources {
75 	uint32_t created;
76 	uint32_t openGateCalls;
77 	uint32_t closeGateCalls;
78 	uint64_t timeOnGate;
79 	uint32_t timeouts;
80 	uint32_t checksForWork;
81 } IOStatisticsTimerEventSources;
82 
83 typedef struct IOStatisticsDerivedEventSources {
84 	uint32_t created;
85 	uint32_t openGateCalls;
86 	uint32_t closeGateCalls;
87 	uint64_t timeOnGate;
88 } IOStatisticsDerivedEventSources;
89 
90 typedef struct IOStatisticsCommandGates {
91 	uint32_t created;
92 	uint32_t openGateCalls;
93 	uint32_t closeGateCalls;
94 	uint64_t timeOnGate;
95 	uint32_t actionCalls;
96 } IOStatisticsCommandGates;
97 
98 typedef struct IOStatisticsCommandQueues {
99 	uint32_t created;
100 	uint32_t actionCalls;
101 } IOStatisticsCommandQueues;
102 
103 typedef struct IOStatisticsUserClients {
104 	uint32_t created;
105 	uint32_t clientCalls;
106 } IOStatisticsUserClients;
107 
108 /* General mode */
109 
110 typedef struct IOStatisticsHeader {
111 	uint32_t sig; /* 'IOST' */
112 	uint32_t ver; /* incremented with every data revision */
113 
114 	uint32_t seq; /* sequence ID */
115 
116 	uint32_t globalStatsOffset;
117 	uint32_t kextStatsOffset;
118 	uint32_t memoryStatsOffset;
119 	uint32_t classStatsOffset;
120 	uint32_t counterStatsOffset;
121 	uint32_t kextIdentifiersOffset;
122 	uint32_t classNamesOffset;
123 
124 	/* struct IOStatisticsGlobal */
125 	/* struct IOStatisticsKext */
126 	/* struct IOStatisticsMemory */
127 	/* struct IOStatisticsClass */
128 	/* struct IOStatisticsCounter */
129 	/* struct IOStatisticsKextIdentifier */
130 	/* struct IOStatisticsClassName */
131 } IOStatisticsHeader;
132 
133 typedef struct IOStatisticsGlobal {
134 	uint32_t kextCount;
135 	uint32_t classCount;
136 	uint32_t workloops;
137 } IOStatisticsGlobal;
138 
139 typedef struct IOStatisticsKext {
140 	uint32_t loadTag;
141 	uint32_t loadSize;
142 	uint32_t wiredSize;
143 	uint32_t classes; /* Number of classes owned */
144 	uint32_t classIndexes[]; /* Variable length array of owned class indexes */
145 } IOStatisticsKext;
146 
147 typedef struct IOStatisticsMemory {
148 	uint32_t allocatedSize;
149 	uint32_t freedSize;
150 	uint32_t allocatedAlignedSize;
151 	uint32_t freedAlignedSize;
152 	uint32_t allocatedContiguousSize;
153 	uint32_t freedContiguousSize;
154 	uint32_t allocatedPageableSize;
155 	uint32_t freedPageableSize;
156 } IOStatisticsMemory;
157 
158 typedef struct IOStatisticsClass {
159 	uint32_t classID;
160 	uint32_t superClassID;
161 	uint32_t classSize;
162 } IOStatisticsClass;
163 
164 typedef struct IOStatisticsCounter {
165 	uint32_t classID;
166 	uint32_t classInstanceCount;
167 	struct IOStatisticsUserClients userClientStatistics;
168 	struct IOStatisticsInterruptEventSources interruptEventSourceStatistics;
169 	struct IOStatisticsInterruptEventSources filterInterruptEventSourceStatistics;
170 	struct IOStatisticsTimerEventSources timerEventSourceStatistics;
171 	struct IOStatisticsCommandGates commandGateStatistics;
172 	struct IOStatisticsCommandQueues commandQueueStatistics;
173 	struct IOStatisticsDerivedEventSources derivedEventSourceStatistics;
174 } IOStatisticsCounter;
175 
176 typedef struct IOStatisticsKextIdentifier {
177 	char identifier[kIOStatisticsDriverNameLength];
178 } IOStatisticsKextIdentifier;
179 
180 typedef struct IOStatisticsClassName {
181 	char name[kIOStatisticsClassNameLength];
182 } IOStatisticsClassName;
183 
184 /* WorkLoop mode */
185 
186 typedef struct IOStatisticsWorkLoop {
187 	uint32_t attachedEventSources;
188 	uint64_t timeOnGate;
189 	uint32_t kextLoadTag;
190 	uint32_t dependentKexts;
191 	uint32_t dependentKextLoadTags[];
192 } IOStatisticsWorkLoop;
193 
194 typedef struct IOStatisticsWorkLoopHeader {
195 	uint32_t sig; /* 'IOSW */
196 	uint32_t ver; /* incremented with every data revision */
197 	uint32_t seq; /* sequence ID */
198 	uint32_t workloopCount;
199 	struct IOStatisticsWorkLoop workLoopStats;
200 } IOStatisticsWorkLoopHeader;
201 
202 /* UserClient mode */
203 
204 typedef struct IOStatisticsUserClientCall {
205 	char processName[kIOStatisticsProcessNameLength];
206 	int32_t pid;
207 	uint32_t calls;
208 } IOStatisticsUserClientCall;
209 
210 typedef struct IOStatisticsUserClientHeader {
211 	uint32_t sig; /* 'IOSU */
212 	uint32_t ver; /* incremented with every data revision */
213 	uint32_t seq; /* sequence ID */
214 	uint32_t processes;
215 	struct IOStatisticsUserClientCall userClientCalls[];
216 } IOStatisticsUserClientHeader;
217 
218 #pragma pack()
219 
220 #endif /* _IOKIT_STATISTICS_H */
221