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