profile.h revision 66458
1/* $FreeBSD: head/sys/ia64/include/profile.h 66458 2000-09-29 13:46:07Z dfr $ */
2/* From: NetBSD: profile.h,v 1.9 1997/04/06 08:47:37 cgd Exp */
3
4/*
5 * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
6 * All rights reserved.
7 *
8 * Author: Chris G. Demetriou
9 *
10 * Permission to use, copy, modify and distribute this software and
11 * its documentation is hereby granted, provided that both the copyright
12 * notice and this permission notice appear in all copies of the
13 * software, derivative works or modified versions, and any portions
14 * thereof, and that both notices appear in supporting documentation.
15 *
16 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19 *
20 * Carnegie Mellon requests users of this software to return to
21 *
22 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23 *  School of Computer Science
24 *  Carnegie Mellon University
25 *  Pittsburgh PA 15213-3890
26 *
27 * any improvements or extensions that they make and grant Carnegie the
28 * rights to redistribute these changes.
29 */
30
31#define	_MCOUNT_DECL	void mcount
32
33#define FUNCTION_ALIGNMENT 32
34
35typedef u_long	fptrdiff_t;
36
37#if 0
38/*
39 * XXX The definition of MCOUNT below is really the following code, run
40 * XXX through cpp, since the inline assembly isn't preprocessed.
41 */
42#define	OFFSET_AT	0
43#define OFFSET_V0	8
44#define OFFSET_T0	16
45#define OFFSET_T1	24
46#define OFFSET_T2	32
47#define OFFSET_T3	40
48#define OFFSET_T4	48
49#define OFFSET_T5	56
50#define OFFSET_T6	64
51#define OFFSET_T7	72
52#define OFFSET_S6	80
53#define OFFSET_A0	88
54#define OFFSET_A1	96
55#define OFFSET_A2	104
56#define OFFSET_A3	112
57#define OFFSET_A4	120
58#define OFFSET_A5	128
59#define OFFSET_T8	136
60#define OFFSET_T9	144
61#define OFFSET_T10	152
62#define OFFSET_T11	160
63#define OFFSET_RA	168
64#define OFFSET_T12	176
65#define OFFSET_GP	184
66#define	FRAME_SIZE	192
67
68LEAF(_mcount,0)			/* XXX */
69	.set noat
70	.set noreorder
71
72	lda	sp, -FRAME_SIZE(sp)
73
74	stq	at_reg, OFFSET_AT(sp)
75	stq	v0, OFFSET_V0(sp)
76	stq	t0, OFFSET_T0(sp)
77	stq	t1, OFFSET_T1(sp)
78	stq	t2, OFFSET_T2(sp)
79	stq	t3, OFFSET_T3(sp)
80	stq	t4, OFFSET_T4(sp)
81	stq	t5, OFFSET_T5(sp)
82	stq	t6, OFFSET_T6(sp)
83	stq	t7, OFFSET_T7(sp)
84	stq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
85	stq	a0, OFFSET_A0(sp)
86	stq	a1, OFFSET_A1(sp)
87	stq	a2, OFFSET_A2(sp)
88	stq	a3, OFFSET_A3(sp)
89	stq	a4, OFFSET_A4(sp)
90	stq	a5, OFFSET_A5(sp)
91	stq	t8, OFFSET_T8(sp)
92	stq	t9, OFFSET_T9(sp)
93	stq	t10, OFFSET_T10(sp)
94	stq	t11, OFFSET_T11(sp)
95	stq	ra, OFFSET_RA(sp)
96	stq	t12, OFFSET_T12(sp)
97	stq	gp, OFFSET_GP(sp)
98
99	br	pv, LX99
100LX99:	SETGP(pv)
101	mov	ra, a0
102	mov	at_reg, a1
103	CALL(mcount)
104
105	ldq	v0, OFFSET_V0(sp)
106	ldq	t0, OFFSET_T0(sp)
107	ldq	t1, OFFSET_T1(sp)
108	ldq	t2, OFFSET_T2(sp)
109	ldq	t3, OFFSET_T3(sp)
110	ldq	t4, OFFSET_T4(sp)
111	ldq	t5, OFFSET_T5(sp)
112	ldq	t6, OFFSET_T6(sp)
113	ldq	t7, OFFSET_T7(sp)
114	ldq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
115	ldq	a0, OFFSET_A0(sp)
116	ldq	a1, OFFSET_A1(sp)
117	ldq	a2, OFFSET_A2(sp)
118	ldq	a3, OFFSET_A3(sp)
119	ldq	a4, OFFSET_A4(sp)
120	ldq	a5, OFFSET_A5(sp)
121	ldq	t8, OFFSET_T8(sp)
122	ldq	t9, OFFSET_T9(sp)
123	ldq	t10, OFFSET_T10(sp)
124	ldq	t11, OFFSET_T11(sp)
125	ldq	ra, OFFSET_RA(sp)
126	stq	t12, OFFSET_T12(sp)
127	ldq	gp, OFFSET_GP(sp)
128
129	ldq	at_reg, OFFSET_AT(sp)
130
131	lda	sp, FRAME_SIZE(sp)
132	ret	zero, (at_reg), 1
133
134	END(_mcount)
135#endif /* 0 */
136
137#define MCOUNT __asm ("		\
138	.globl	_mcount;	\
139	.ent	_mcount 0;	\
140_mcount:;			\
141	.frame	$30,0,$26;	\
142	.set noat;		\
143	.set noreorder;		\
144				\
145	lda	$30, -192($30);	\
146				\
147	stq	$28, 0($30);	\
148	stq	$0, 8($30);	\
149	stq	$1, 16($30);	\
150	stq	$2, 24($30);	\
151	stq	$3, 32($30);	\
152	stq	$4, 40($30);	\
153	stq	$5, 48($30);	\
154	stq	$6, 56($30);	\
155	stq	$7, 64($30);	\
156	stq	$8, 72($30);	\
157	stq	$15, 80($30);	\
158	stq	$16, 88($30);	\
159	stq	$17, 96($30);	\
160	stq	$18, 104($30);	\
161	stq	$19, 112($30);	\
162	stq	$20, 120($30);	\
163	stq	$21, 128($30);	\
164	stq	$22, 136($30);	\
165	stq	$23, 144($30);	\
166	stq	$24, 152($30);	\
167	stq	$25, 160($30);	\
168	stq	$26, 168($30);	\
169	stq	$27, 176($30);	\
170	stq	$29, 184($30);	\
171				\
172	br	$27, LX98;	\
173LX98:	ldgp	$29,0($27);	\
174	mov	$26, $16;	\
175	mov	$28, $17;	\
176	jsr	$26,mcount;	\
177	ldgp	$29,0($26);	\
178				\
179	ldq	$0, 8($30);	\
180	ldq	$1, 16($30);	\
181	ldq	$2, 24($30);	\
182	ldq	$3, 32($30);	\
183	ldq	$4, 40($30);	\
184	ldq	$5, 48($30);	\
185	ldq	$6, 56($30);	\
186	ldq	$7, 64($30);	\
187	ldq	$8, 72($30);	\
188	ldq	$15, 80($30);	\
189	ldq	$16, 88($30);	\
190	ldq	$17, 96($30);	\
191	ldq	$18, 104($30);	\
192	ldq	$19, 112($30);	\
193	ldq	$20, 120($30);	\
194	ldq	$21, 128($30);	\
195	ldq	$22, 136($30);	\
196	ldq	$23, 144($30);	\
197	ldq	$24, 152($30);	\
198	ldq	$25, 160($30);	\
199	ldq	$26, 168($30);	\
200	ldq	$27, 176($30);	\
201	ldq	$29, 184($30);	\
202				\
203	ldq	$28, 0($30);	\
204				\
205	lda	$30, 192($30);	\
206	ret	$31, ($28), 1;	\
207				\
208	.end	_mcount");
209
210#ifdef _KERNEL
211/*
212 * The following two macros do splhigh and splx respectively.
213 * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which
214 * doesn't include profiling support.
215 *
216 * XXX These macros should probably use inline assembly.
217 */
218#define MCOUNT_ENTER(s) \
219	s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
220#define MCOUNT_EXIT(s) \
221	(void)_alpha_pal_swpipl(s);
222#define	MCOUNT_DECL(s)	u_long s;
223#ifdef GUPROF
224struct gmonparam;
225
226void	nullfunc_loop_profiled __P((void));
227void	nullfunc_profiled __P((void));
228void	startguprof __P((struct gmonparam *p));
229void	stopguprof __P((struct gmonparam *p));
230#else
231#define startguprof(p)
232#define stopguprof(p)
233#endif /* GUPROF */
234
235#else /* !_KERNEL */
236typedef u_long	uintfptr_t;
237#endif
238