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
39enum {
40 kIOStatisticsDriverNameLength = 64,
41 kIOStatisticsClassNameLength = 64,
42 kIOStatisticsProcessNameLength = 20
43};
44
45enum {
46 kIOStatisticsDerivedEventSourceCounter = 0,
47 kIOStatisticsTimerEventSourceCounter,
48 kIOStatisticsCommandGateCounter,
49 kIOStatisticsCommandQueueCounter,
50 kIOStatisticsInterruptEventSourceCounter,
51 kIOStatisticsFilterInterruptEventSourceCounter
52};
53
54typedef uint32_t IOStatisticsCounterType;
55
56enum {
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
68typedef struct IOStatisticsInterruptEventSources {
69 uint32_t created;
70 uint32_t produced;
71 uint32_t checksForWork;
72} IOStatisticsInterruptEventSources;
73
74typedef 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
83typedef struct IOStatisticsDerivedEventSources {
84 uint32_t created;
85 uint32_t openGateCalls;
86 uint32_t closeGateCalls;
87 uint64_t timeOnGate;
88} IOStatisticsDerivedEventSources;
89
90typedef 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
98typedef struct IOStatisticsCommandQueues {
99 uint32_t created;
100 uint32_t actionCalls;
101} IOStatisticsCommandQueues;
102
103typedef struct IOStatisticsUserClients {
104 uint32_t created;
105 uint32_t clientCalls;
106} IOStatisticsUserClients;
107
108/* General mode */
109
110typedef 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
133typedef struct IOStatisticsGlobal {
134 uint32_t kextCount;
135 uint32_t classCount;
136 uint32_t workloops;
137} IOStatisticsGlobal;
138
139typedef 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
147typedef 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
158typedef struct IOStatisticsClass {
159 uint32_t classID;
160 uint32_t superClassID;
161 uint32_t classSize;
162} IOStatisticsClass;
163
164typedef 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
176typedef struct IOStatisticsKextIdentifier {
177 char identifier[kIOStatisticsDriverNameLength];
178} IOStatisticsKextIdentifier;
179
180typedef struct IOStatisticsClassName {
181 char name[kIOStatisticsClassNameLength];
182} IOStatisticsClassName;
183
184/* WorkLoop mode */
185
186typedef 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
194typedef 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
204typedef struct IOStatisticsUserClientCall {
205 char processName[kIOStatisticsProcessNameLength];
206 int32_t pid;
207 uint32_t calls;
208} IOStatisticsUserClientCall;
209
210typedef 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