/ duct-tape / xnu / iokit / IOKit / IOStatistics.h
IOStatistics.h
  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 */