|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_COPYRIGHT@ ! 24: * ! 25: */ ! 26: /* ! 27: * File : etap.h ! 28: * ! 29: * Contains ETAP buffer and table definitions ! 30: * ! 31: */ ! 32: ! 33: #ifndef _MACH_ETAP_H_ ! 34: #define _MACH_ETAP_H_ ! 35: ! 36: #include <mach/machine/boolean.h> ! 37: #include <mach/etap_events.h> ! 38: #include <mach/clock_types.h> ! 39: #include <mach/time_value.h> ! 40: #include <mach/kern_return.h> ! 41: ! 42: ! 43: #define ETAP_CBUFF_ENTRIES 20000 ! 44: #define ETAP_CBUFF_IBUCKETS 10 ! 45: #define ETAP_CBUFF_WIDTH 80 ! 46: ! 47: #define ETAP_MBUFF_ENTRIES 28000 ! 48: #define ETAP_MBUFF_DATASIZE 4 ! 49: ! 50: ! 51: /* =================================== ! 52: * Event & Subsystem Table Definitions ! 53: * =================================== ! 54: */ ! 55: ! 56: #define EVENT_NAME_LENGTH 20 /* max event name size */ ! 57: ! 58: struct event_table_entry { ! 59: unsigned short event; /* etap event type */ ! 60: unsigned short status; /* event trace status */ ! 61: char name [EVENT_NAME_LENGTH]; /* event text name */ ! 62: unsigned short dynamic; /* dynamic ID (0=none) */ ! 63: }; ! 64: ! 65: struct subs_table_entry { ! 66: unsigned short subs; /* etap subsystem type */ ! 67: char name [EVENT_NAME_LENGTH]; /* subsystem text name */ ! 68: }; ! 69: ! 70: typedef struct event_table_entry* event_table_t; ! 71: typedef struct subs_table_entry* subs_table_t; ! 72: typedef unsigned short etap_event_t; ! 73: ! 74: #define EVENT_TABLE_NULL ((event_table_t) 0) ! 75: ! 76: /* ========= ! 77: * ETAP Time ! 78: * ========= ! 79: */ ! 80: ! 81: typedef mach_timespec_t etap_time_t; ! 82: ! 83: /* ============================= ! 84: * Cumulative buffer definitions ! 85: * ============================= ! 86: */ ! 87: ! 88: /* ! 89: * The cbuff_data structure contains cumulative lock ! 90: * statistical information for EITHER hold operations ! 91: * OR wait operations. ! 92: */ ! 93: ! 94: struct cbuff_data { ! 95: unsigned long triggered; /* number of event occurances */ ! 96: etap_time_t time; /* sum of event durations */ ! 97: etap_time_t time_sq; /* sum of squared durations */ ! 98: etap_time_t min_time; /* min duration of event */ ! 99: etap_time_t max_time; /* max duration of event */ ! 100: }; ! 101: ! 102: /* ! 103: * The cbuff_entry contains all trace data for an event. ! 104: * The cumulative buffer consists of these entries. ! 105: */ ! 106: ! 107: struct cbuff_entry { ! 108: etap_event_t event; /* event type */ ! 109: unsigned short kind; /* read,write,or simple */ ! 110: unsigned int instance; /* & of event struct */ ! 111: struct cbuff_data hold; /* hold trace data */ ! 112: struct cbuff_data wait; /* wait trace data */ ! 113: unsigned long hold_interval[ETAP_CBUFF_IBUCKETS]; /* hold interval array */ ! 114: unsigned long wait_interval[ETAP_CBUFF_IBUCKETS]; /* wait interval array */ ! 115: }; ! 116: ! 117: typedef struct cbuff_entry* cbuff_entry_t; ! 118: ! 119: #define CBUFF_ENTRY_NULL ((cbuff_entry_t)0) ! 120: ! 121: /* ! 122: * The cumulative buffer maintains a header which is used by ! 123: * both the kernel instrumentation and the ETAP user-utilities. ! 124: */ ! 125: ! 126: struct cumulative_buffer { ! 127: unsigned long next; /* next available entry in buffer */ ! 128: unsigned short static_start; /* first static entry in buffer */ ! 129: struct cbuff_entry entry [ETAP_CBUFF_ENTRIES]; /* buffer entries */ ! 130: }; ! 131: ! 132: typedef struct cumulative_buffer* cumulative_buffer_t; ! 133: ! 134: ! 135: /* =========================== ! 136: * ETAP probe data definitions ! 137: * =========================== ! 138: */ ! 139: ! 140: typedef unsigned int etap_data_t[ETAP_MBUFF_DATASIZE]; ! 141: ! 142: #define ETAP_DATA_ENTRY sizeof(unsigned int) ! 143: #define ETAP_DATA_SIZE ETAP_DATA_ENTRY * ETAP_MBUFF_DATASIZE ! 144: #define ETAP_DATA_NULL (etap_data_t*) 0 ! 145: ! 146: /* ========================== ! 147: * Monitor buffer definitions ! 148: * ========================== ! 149: */ ! 150: ! 151: /* ! 152: * The mbuff_entry structure contains trace event instance data. ! 153: */ ! 154: ! 155: struct mbuff_entry { ! 156: unsigned short event; /* event type */ ! 157: unsigned short flags; /* event strain flags */ ! 158: unsigned int instance; /* address of event (lock, thread, etc.) */ ! 159: unsigned int pc; /* program counter */ ! 160: etap_time_t time; /* operation time */ ! 161: etap_data_t data; /* event specific data */ ! 162: }; ! 163: ! 164: typedef struct mbuff_entry* mbuff_entry_t; ! 165: ! 166: /* ! 167: * Each circular monitor buffer will contain maintanence ! 168: * information and mon_entry records. ! 169: */ ! 170: ! 171: struct monitor_buffer { ! 172: unsigned long free; /* index of next available record */ ! 173: unsigned long timestamp; /* timestamp of last wrap around */ ! 174: struct mbuff_entry entry[1]; /* buffer entries (holder) */ ! 175: }; ! 176: ! 177: typedef struct monitor_buffer* monitor_buffer_t; ! 178: ! 179: ! 180: /* =================== ! 181: * Event strains/flags ! 182: * =================== ! 183: */ /* | |t|b|e|k|u|m|s|r|w| | | | | */ ! 184: /* ----------------------------- */ ! 185: #define WRITE_LOCK 0x10 /* | | | | | | | | | |1| | | | | */ ! 186: #define READ_LOCK 0x20 /* | | | | | | | | |1| | | | | | */ ! 187: #define COMPLEX_LOCK 0x30 /* | | | | | | | | |1|1| | | | | */ ! 188: #define SPIN_LOCK 0x40 /* | | | | | | | |1| | | | | | | */ ! 189: #define MUTEX_LOCK 0x80 /* | | | | | | |1| | | | | | | | */ ! 190: #define USER_EVENT 0x100 /* | | | | | |1| | | | | | | | | */ ! 191: #define KERNEL_EVENT 0x200 /* | | | | |1| | | | | | | | | | */ ! 192: #define EVENT_END 0x400 /* | | | |1| | | | | | | | | | | */ ! 193: #define EVENT_BEGIN 0x800 /* | | |1| | | | | | | | | | | | */ ! 194: #define SYSCALL_TRAP 0x1000 /* | |1| | | | | | | | | | | | | */ ! 195: ! 196: ! 197: /* ========================= ! 198: * Event trace status values ! 199: * ========================= ! 200: */ /* | | | | | | | | | | |M|M|C|C| */ ! 201: /* | | | | | | | | | | |d|c|d|c| */ ! 202: /* ----------------------------- */ ! 203: #define CUM_CONTENTION 0x1 /* | | | | | | | | | | | | | |1| */ ! 204: #define CUM_DURATION 0x2 /* | | | | | | | | | | | | |1| | */ ! 205: #define MON_CONTENTION 0x4 /* | | | | | | | | | | | |1| | | */ ! 206: #define MON_DURATION 0x8 /* | | | | | | | | | | |1| | | | */ ! 207: ! 208: #define ETAP_TRACE_ON 0xf /* | | | | | | | | | | |1|1|1|1| */ ! 209: #define ETAP_TRACE_OFF 0x0 /* | | | | | | | | | | | | | | | */ ! 210: ! 211: ! 212: /* ================== ! 213: * ETAP trace flavors ! 214: * ================== ! 215: */ ! 216: ! 217: /* Mode */ ! 218: ! 219: #define ETAP_CUMULATIVE 0x3 /* | | | | | | | | | | | | |1|1| */ ! 220: #define ETAP_MONITORED 0xc /* | | | | | | | | | | |1|1| | | */ ! 221: #define ETAP_RESET 0xf0f0 ! 222: ! 223: /* Type */ ! 224: ! 225: #define ETAP_CONTENTION 0x5 /* | | | | | | | | | | | |1| |1| */ ! 226: #define ETAP_DURATION 0xa /* | | | | | | | | | | |1| |1| | */ ! 227: ! 228: ! 229: /* =============================== ! 230: * Buffer/Table flavor definitions ! 231: * =============================== ! 232: */ ! 233: ! 234: #define ETAP_TABLE_EVENT 0 ! 235: #define ETAP_TABLE_SUBSYSTEM 1 ! 236: #define ETAP_BUFFER_CUMULATIVE 2 ! 237: #define ETAP_BUFFER_MONITORED 3 ! 238: ! 239: /* ========================== ! 240: * ETAP function declarations ! 241: * ========================== ! 242: */ ! 243: ! 244: extern ! 245: kern_return_t etap_trace_event( ! 246: unsigned short mode, ! 247: unsigned short type, ! 248: boolean_t enable, ! 249: unsigned int nargs, ! 250: unsigned short args[]); ! 251: ! 252: extern ! 253: kern_return_t etap_probe( ! 254: unsigned short eventno, ! 255: unsigned short event_id, ! 256: unsigned int data_size, ! 257: etap_data_t *data); ! 258: ! 259: /* ================================================================= ! 260: * convienience user probe macro - only used if DO_PROBE is #defined ! 261: * ================================================================= ! 262: */ ! 263: #ifdef DO_PROBE ! 264: #define PROBE_DATA(subsys, tag, data0, data1, data2, data3) \ ! 265: { \ ! 266: etap_data_t _mmmm; \ ! 267: _mmmm[0] = (u_int)data0; \ ! 268: _mmmm[1] = (u_int)data1; \ ! 269: _mmmm[2] = (u_int)data2; \ ! 270: _mmmm[3] = (u_int)data3; \ ! 271: etap_probe(subsys, tag, sizeof (etap_data_t), &_mmmm); \ ! 272: } ! 273: #else ! 274: #define PROBE_DATA(type, tag, data0, data1, data2, data3) ! 275: #endif /* DO_PROBE */ ! 276: #endif /* _MACH_ETAP_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.