Source to osfmk/mach/etap.h
/*
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
/*
* @OSF_COPYRIGHT@
*
*/
/*
* File : etap.h
*
* Contains ETAP buffer and table definitions
*
*/
#ifndef _MACH_ETAP_H_
#define _MACH_ETAP_H_
#include <mach/machine/boolean.h>
#include <mach/etap_events.h>
#include <mach/clock_types.h>
#include <mach/time_value.h>
#include <mach/kern_return.h>
#define ETAP_CBUFF_ENTRIES 20000
#define ETAP_CBUFF_IBUCKETS 10
#define ETAP_CBUFF_WIDTH 80
#define ETAP_MBUFF_ENTRIES 28000
#define ETAP_MBUFF_DATASIZE 4
/* ===================================
* Event & Subsystem Table Definitions
* ===================================
*/
#define EVENT_NAME_LENGTH 20 /* max event name size */
struct event_table_entry {
unsigned short event; /* etap event type */
unsigned short status; /* event trace status */
char name [EVENT_NAME_LENGTH]; /* event text name */
unsigned short dynamic; /* dynamic ID (0=none) */
};
struct subs_table_entry {
unsigned short subs; /* etap subsystem type */
char name [EVENT_NAME_LENGTH]; /* subsystem text name */
};
typedef struct event_table_entry* event_table_t;
typedef struct subs_table_entry* subs_table_t;
typedef unsigned short etap_event_t;
#define EVENT_TABLE_NULL ((event_table_t) 0)
/* =========
* ETAP Time
* =========
*/
typedef mach_timespec_t etap_time_t;
/* =============================
* Cumulative buffer definitions
* =============================
*/
/*
* The cbuff_data structure contains cumulative lock
* statistical information for EITHER hold operations
* OR wait operations.
*/
struct cbuff_data {
unsigned long triggered; /* number of event occurances */
etap_time_t time; /* sum of event durations */
etap_time_t time_sq; /* sum of squared durations */
etap_time_t min_time; /* min duration of event */
etap_time_t max_time; /* max duration of event */
};
/*
* The cbuff_entry contains all trace data for an event.
* The cumulative buffer consists of these entries.
*/
struct cbuff_entry {
etap_event_t event; /* event type */
unsigned short kind; /* read,write,or simple */
unsigned int instance; /* & of event struct */
struct cbuff_data hold; /* hold trace data */
struct cbuff_data wait; /* wait trace data */
unsigned long hold_interval[ETAP_CBUFF_IBUCKETS]; /* hold interval array */
unsigned long wait_interval[ETAP_CBUFF_IBUCKETS]; /* wait interval array */
};
typedef struct cbuff_entry* cbuff_entry_t;
#define CBUFF_ENTRY_NULL ((cbuff_entry_t)0)
/*
* The cumulative buffer maintains a header which is used by
* both the kernel instrumentation and the ETAP user-utilities.
*/
struct cumulative_buffer {
unsigned long next; /* next available entry in buffer */
unsigned short static_start; /* first static entry in buffer */
struct cbuff_entry entry [ETAP_CBUFF_ENTRIES]; /* buffer entries */
};
typedef struct cumulative_buffer* cumulative_buffer_t;
/* ===========================
* ETAP probe data definitions
* ===========================
*/
typedef unsigned int etap_data_t[ETAP_MBUFF_DATASIZE];
#define ETAP_DATA_ENTRY sizeof(unsigned int)
#define ETAP_DATA_SIZE ETAP_DATA_ENTRY * ETAP_MBUFF_DATASIZE
#define ETAP_DATA_NULL (etap_data_t*) 0
/* ==========================
* Monitor buffer definitions
* ==========================
*/
/*
* The mbuff_entry structure contains trace event instance data.
*/
struct mbuff_entry {
unsigned short event; /* event type */
unsigned short flags; /* event strain flags */
unsigned int instance; /* address of event (lock, thread, etc.) */
unsigned int pc; /* program counter */
etap_time_t time; /* operation time */
etap_data_t data; /* event specific data */
};
typedef struct mbuff_entry* mbuff_entry_t;
/*
* Each circular monitor buffer will contain maintanence
* information and mon_entry records.
*/
struct monitor_buffer {
unsigned long free; /* index of next available record */
unsigned long timestamp; /* timestamp of last wrap around */
struct mbuff_entry entry[1]; /* buffer entries (holder) */
};
typedef struct monitor_buffer* monitor_buffer_t;
/* ===================
* Event strains/flags
* ===================
*/ /* | |t|b|e|k|u|m|s|r|w| | | | | */
/* ----------------------------- */
#define WRITE_LOCK 0x10 /* | | | | | | | | | |1| | | | | */
#define READ_LOCK 0x20 /* | | | | | | | | |1| | | | | | */
#define COMPLEX_LOCK 0x30 /* | | | | | | | | |1|1| | | | | */
#define SPIN_LOCK 0x40 /* | | | | | | | |1| | | | | | | */
#define MUTEX_LOCK 0x80 /* | | | | | | |1| | | | | | | | */
#define USER_EVENT 0x100 /* | | | | | |1| | | | | | | | | */
#define KERNEL_EVENT 0x200 /* | | | | |1| | | | | | | | | | */
#define EVENT_END 0x400 /* | | | |1| | | | | | | | | | | */
#define EVENT_BEGIN 0x800 /* | | |1| | | | | | | | | | | | */
#define SYSCALL_TRAP 0x1000 /* | |1| | | | | | | | | | | | | */
/* =========================
* Event trace status values
* =========================
*/ /* | | | | | | | | | | |M|M|C|C| */
/* | | | | | | | | | | |d|c|d|c| */
/* ----------------------------- */
#define CUM_CONTENTION 0x1 /* | | | | | | | | | | | | | |1| */
#define CUM_DURATION 0x2 /* | | | | | | | | | | | | |1| | */
#define MON_CONTENTION 0x4 /* | | | | | | | | | | | |1| | | */
#define MON_DURATION 0x8 /* | | | | | | | | | | |1| | | | */
#define ETAP_TRACE_ON 0xf /* | | | | | | | | | | |1|1|1|1| */
#define ETAP_TRACE_OFF 0x0 /* | | | | | | | | | | | | | | | */
/* ==================
* ETAP trace flavors
* ==================
*/
/* Mode */
#define ETAP_CUMULATIVE 0x3 /* | | | | | | | | | | | | |1|1| */
#define ETAP_MONITORED 0xc /* | | | | | | | | | | |1|1| | | */
#define ETAP_RESET 0xf0f0
/* Type */
#define ETAP_CONTENTION 0x5 /* | | | | | | | | | | | |1| |1| */
#define ETAP_DURATION 0xa /* | | | | | | | | | | |1| |1| | */
/* ===============================
* Buffer/Table flavor definitions
* ===============================
*/
#define ETAP_TABLE_EVENT 0
#define ETAP_TABLE_SUBSYSTEM 1
#define ETAP_BUFFER_CUMULATIVE 2
#define ETAP_BUFFER_MONITORED 3
/* ==========================
* ETAP function declarations
* ==========================
*/
extern
kern_return_t etap_trace_event(
unsigned short mode,
unsigned short type,
boolean_t enable,
unsigned int nargs,
unsigned short args[]);
extern
kern_return_t etap_probe(
unsigned short eventno,
unsigned short event_id,
unsigned int data_size,
etap_data_t *data);
/* =================================================================
* convienience user probe macro - only used if DO_PROBE is #defined
* =================================================================
*/
#ifdef DO_PROBE
#define PROBE_DATA(subsys, tag, data0, data1, data2, data3) \
{ \
etap_data_t _mmmm; \
_mmmm[0] = (u_int)data0; \
_mmmm[1] = (u_int)data1; \
_mmmm[2] = (u_int)data2; \
_mmmm[3] = (u_int)data3; \
etap_probe(subsys, tag, sizeof (etap_data_t), &_mmmm); \
}
#else
#define PROBE_DATA(type, tag, data0, data1, data2, data3)
#endif /* DO_PROBE */
#endif /* _MACH_ETAP_H_ */