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