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