]> git.saurik.com Git - apple/xnu.git/blame - osfmk/kern/profile.h
xnu-792.13.8.tar.gz
[apple/xnu.git] / osfmk / kern / profile.h
CommitLineData
1c79356b 1/*
91447636 2 * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved.
1c79356b 3 *
8ad349bb 4 * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
1c79356b 5 *
8ad349bb
A
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
10 * License may not be used to create, or enable the creation or
11 * redistribution of, unlawful or unlicensed copies of an Apple operating
12 * system, or to circumvent, violate, or enable the circumvention or
13 * violation of, any terms of an Apple operating system software license
14 * agreement.
15 *
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
18 * file.
19 *
20 * The Original Code and all software distributed under the License are
21 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
22 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
23 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
25 * Please see the License for the specific language governing rights and
26 * limitations under the License.
27 *
28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
1c79356b
A
29 */
30/*
31 * @OSF_COPYRIGHT@
32 */
33/*
34 * Mach Operating System
35 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
36 * All Rights Reserved.
37 *
38 * Permission to use, copy, modify and distribute this software and its
39 * documentation is hereby granted, provided that both the copyright
40 * notice and this permission notice appear in all copies of the
41 * software, derivative works or modified versions, and any portions
42 * thereof, and that both notices appear in supporting documentation.
43 *
44 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
45 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
46 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
47 *
48 * Carnegie Mellon requests users of this software to return to
49 *
50 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
51 * School of Computer Science
52 * Carnegie Mellon University
53 * Pittsburgh PA 15213-3890
54 *
55 * any improvements or extensions that they make and grant Carnegie Mellon
56 * the rights to redistribute these changes.
57 */
58
59/*
60 */
61
62#ifndef _KERN_PROFILE_H
63#define _KERN_PROFILE_H
64
65#include <mach/boolean.h>
66#include <vm/vm_kern.h>
67
68#define NB_PROF_BUFFER 4 /* number of buffers servicing a */
69#define SIZE_PROF_BUFFER 200 /* size of a profil buffer (in natural_t) */
70 /* -> at most 1 packet every 2 secs */
71 /* profiled thread */
72
73struct prof_data {
74 struct ipc_port *prof_port; /* where to send a full buffer */
75
76 struct buffer {
77 queue_chain_t p_list;
78 natural_t *p_zone; /* points to the actual storage area */
79 int p_index; /* next slot to be filled */
80 int p_dropped; /* # dropped samples when full */
81 boolean_t p_full; /* is the current buffer full ? */
82 struct prof_data *p_prof; /* base to get prof_port */
83 char p_wakeme; /* do wakeup when sent */
84 } prof_area[NB_PROF_BUFFER];
85
86 int prof_index; /* index of the buffer structure */
87 /* currently in use */
88
89};
90
91typedef struct prof_data *prof_data_t;
92#define NULLPROFDATA ((prof_data_t) 0)
93typedef struct buffer *buffer_t;
94#define NULLPBUF ((buffer_t) 0)
95
96/* Macros */
97
98#define set_pbuf_nb(pbuf, nb) \
99 (((nb) >= 0 && (nb) < NB_PROF_BUFFER) \
100 ? (pbuf)->prof_index = (nb), 1 \
101 : 0)
102
103
104#define get_pbuf_nb(pbuf) \
105 (pbuf)->prof_index
106
107
1c79356b
A
108/* MACRO set_pbuf_value
109**
110** enters the value 'val' in the buffer 'pbuf' and returns the following
91447636 111** indications: 0: means that a fatal error occurred: the buffer was full
1c79356b
A
112** (it hasn't been sent yet)
113** 1: means that a value has been inserted successfully
114** 2: means that we'v just entered the last value causing
115** the current buffer to be full.(must switch to
116** another buffer and signal the sender to send it)
117*/
118
119#if MACH_PROF
120
121#define set_pbuf_value(pbuf, val) \
122 { \
123 register buffer_t a = &((pbuf)->prof_area[(pbuf)->prof_index]); \
124 register int i ;\
125 register boolean_t f = a->p_full; \
126 \
127 if (f == TRUE ) {\
128 a->p_dropped++; \
129 *(val) = 0L; \
130 } else { \
131 i = a->p_index++; \
132 a->p_zone[i] = *(val); \
133 if (i == SIZE_PROF_BUFFER-1) { \
134 a->p_full = TRUE; \
135 *(val) = 2; \
136 } \
137 else \
138 *(val) = 1; \
139 } \
140 }
141
142#define reset_pbuf_area(pbuf) \
143 { \
144 int i; \
145 (pbuf)->prof_index = ((pbuf)->prof_index + 1) % NB_PROF_BUFFER; \
146 i = (pbuf)->prof_index; \
147 (pbuf)->prof_area[i].p_index = 0; \
148 (pbuf)->prof_area[i].p_dropped = 0; \
149 }
150
151#endif /* MACH_PROF */
152
153/*
154** Global variable: the head of the queue of buffers to send
155** It is a queue with locks (uses macros from queue.h) and it
156** is shared by hardclock() and the sender_thread()
157*/
158
159mpqueue_head_t prof_queue;
160
161extern void profile(
162 natural_t pc, /* program counter */
163 prof_data_t pbuf); /* trace/prof data area */
164
165#if MACH_PROF
166
167#define task_prof_init(task) \
168 task->task_profiled = FALSE; \
169 task->profil_buffer = NULLPROFDATA;
170
91447636
A
171#define thread_prof_init(thread, task) \
172 thread->profiled = task->profiled; \
173 thread->profil_buffer = task->profil_buffer;
1c79356b
A
174
175#define task_prof_deallocate(task) \
176 if (task->profil_buffer) \
177 task_sample(task, MACH_PORT_NULL); \
178
91447636
A
179#define thread_prof_deallocate(thread) \
180 if (thread->profiled_own && thread->profil_buffer) \
181 thread_sample(thread, MACH_PORT_NULL); \
1c79356b 182
91447636 183extern kern_return_t thread_sample(thread_t, ipc_port_t);
1c79356b
A
184extern kern_return_t task_sample(task_t, ipc_port_t);
185
186#else /* !MACH_PROT */
187
188#define task_prof_init(task)
91447636 189#define thread_prof_init(thread, task)
1c79356b 190#define task_prof_deallocate(task)
91447636 191#define thread_prof_deallocate(thread)
1c79356b
A
192
193#endif /* !MACH_PROF */
194
195#endif /* _KERN_PROFILE_H */