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