xref: /openbsd/sys/arch/alpha/include/profile.h (revision 3cab2bb3)
1 /*	$OpenBSD: profile.h,v 1.5 1997/01/24 19:57:17 niklas Exp $	*/
2 /*	$NetBSD: profile.h,v 1.7 1996/11/13 22:21:01 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 #if 0
34 /*
35  * XXX The definition of MCOUNT below is really the following code, run
36  * XXX through cpp, since the inline assembly isn't preprocessed.
37  */
38 #define	OFFSET_AT	0
39 #define OFFSET_V0	8
40 #define OFFSET_T0	16
41 #define OFFSET_T1	24
42 #define OFFSET_T2	32
43 #define OFFSET_T3	40
44 #define OFFSET_T4	48
45 #define OFFSET_T5	56
46 #define OFFSET_T6	64
47 #define OFFSET_T7	72
48 #define OFFSET_S6	80
49 #define OFFSET_A0	88
50 #define OFFSET_A1	96
51 #define OFFSET_A2	104
52 #define OFFSET_A3	112
53 #define OFFSET_A4	120
54 #define OFFSET_A5	128
55 #define OFFSET_T8	136
56 #define OFFSET_T9	144
57 #define OFFSET_T10	152
58 #define OFFSET_T11	160
59 #define OFFSET_RA	168
60 #define OFFSET_T12	176
61 #define OFFSET_GP	184
62 #define	FRAME_SIZE	192
63 
64 LEAF(_mcount,0)			/* XXX */
65 	.set noat
66 	.set noreorder
67 
68 	lda	sp, -FRAME_SIZE(sp)
69 
70 	stq	at_reg, OFFSET_AT(sp)
71 	stq	v0, OFFSET_V0(sp)
72 	stq	t0, OFFSET_T0(sp)
73 	stq	t1, OFFSET_T1(sp)
74 	stq	t2, OFFSET_T2(sp)
75 	stq	t3, OFFSET_T3(sp)
76 	stq	t4, OFFSET_T4(sp)
77 	stq	t5, OFFSET_T5(sp)
78 	stq	t6, OFFSET_T6(sp)
79 	stq	t7, OFFSET_T7(sp)
80 	stq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
81 	stq	a0, OFFSET_A0(sp)
82 	stq	a1, OFFSET_A1(sp)
83 	stq	a2, OFFSET_A2(sp)
84 	stq	a3, OFFSET_A3(sp)
85 	stq	a4, OFFSET_A4(sp)
86 	stq	a5, OFFSET_A5(sp)
87 	stq	t8, OFFSET_T8(sp)
88 	stq	t9, OFFSET_T9(sp)
89 	stq	t10, OFFSET_T10(sp)
90 	stq	t11, OFFSET_T11(sp)
91 	stq	ra, OFFSET_RA(sp)
92 	stq	t12, OFFSET_T12(sp)
93 	stq	gp, OFFSET_GP(sp)
94 
95 	br	pv, LX99
96 LX99:	SETGP(pv)
97 	mov	ra, a0
98 	mov	at_reg, a1
99 	CALL(mcount)
100 
101 	ldq	v0, OFFSET_V0(sp)
102 	ldq	t0, OFFSET_T0(sp)
103 	ldq	t1, OFFSET_T1(sp)
104 	ldq	t2, OFFSET_T2(sp)
105 	ldq	t3, OFFSET_T3(sp)
106 	ldq	t4, OFFSET_T4(sp)
107 	ldq	t5, OFFSET_T5(sp)
108 	ldq	t6, OFFSET_T6(sp)
109 	ldq	t7, OFFSET_T7(sp)
110 	ldq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
111 	ldq	a0, OFFSET_A0(sp)
112 	ldq	a1, OFFSET_A1(sp)
113 	ldq	a2, OFFSET_A2(sp)
114 	ldq	a3, OFFSET_A3(sp)
115 	ldq	a4, OFFSET_A4(sp)
116 	ldq	a5, OFFSET_A5(sp)
117 	ldq	t8, OFFSET_T8(sp)
118 	ldq	t9, OFFSET_T9(sp)
119 	ldq	t10, OFFSET_T10(sp)
120 	ldq	t11, OFFSET_T11(sp)
121 	ldq	ra, OFFSET_RA(sp)
122 	stq	t12, OFFSET_T12(sp)
123 	ldq	gp, OFFSET_GP(sp)
124 
125 	ldq	at_reg, OFFSET_AT(sp)
126 
127 	lda	sp, FRAME_SIZE(sp)
128 	ret	zero, (at_reg), 1
129 
130 	END(_mcount)
131 #endif /* 0 */
132 
133 #define MCOUNT asm("		\
134 	.globl	_mcount;	\
135 	.ent	_mcount 0;	\
136 _mcount:;			\
137 	.frame	$30,0,$26;	\
138 	.set noat;		\
139 	.set noreorder;		\
140 				\
141 	lda	$30, -192($30);	\
142 				\
143 	stq	$28, 0($30);	\
144 	stq	$0, 8($30);	\
145 	stq	$1, 16($30);	\
146 	stq	$2, 24($30);	\
147 	stq	$3, 32($30);	\
148 	stq	$4, 40($30);	\
149 	stq	$5, 48($30);	\
150 	stq	$6, 56($30);	\
151 	stq	$7, 64($30);	\
152 	stq	$8, 72($30);	\
153 	stq	$15, 80($30);	\
154 	stq	$16, 88($30);	\
155 	stq	$17, 96($30);	\
156 	stq	$18, 104($30);	\
157 	stq	$19, 112($30);	\
158 	stq	$20, 120($30);	\
159 	stq	$21, 128($30);	\
160 	stq	$22, 136($30);	\
161 	stq	$23, 144($30);	\
162 	stq	$24, 152($30);	\
163 	stq	$25, 160($30);	\
164 	stq	$26, 168($30);	\
165 	stq	$27, 176($30);	\
166 	stq	$29, 184($30);	\
167 				\
168 	br	$27, LX98;	\
169 LX98:	ldgp	$29,0($27);	\
170 	mov	$26, $16;	\
171 	mov	$28, $17;	\
172 	jsr	$26,mcount;	\
173 	ldgp	$29,0($26);	\
174 				\
175 	ldq	$0, 8($30);	\
176 	ldq	$1, 16($30);	\
177 	ldq	$2, 24($30);	\
178 	ldq	$3, 32($30);	\
179 	ldq	$4, 40($30);	\
180 	ldq	$5, 48($30);	\
181 	ldq	$6, 56($30);	\
182 	ldq	$7, 64($30);	\
183 	ldq	$8, 72($30);	\
184 	ldq	$15, 80($30);	\
185 	ldq	$16, 88($30);	\
186 	ldq	$17, 96($30);	\
187 	ldq	$18, 104($30);	\
188 	ldq	$19, 112($30);	\
189 	ldq	$20, 120($30);	\
190 	ldq	$21, 128($30);	\
191 	ldq	$22, 136($30);	\
192 	ldq	$23, 144($30);	\
193 	ldq	$24, 152($30);	\
194 	ldq	$25, 160($30);	\
195 	ldq	$25, 160($30);	\
196 	ldq	$26, 168($30);	\
197 	ldq	$27, 176($30);	\
198 	ldq	$29, 184($30);	\
199 				\
200 	lda	$30, 192($30);	\
201 	ret	$31, ($28), 1;	\
202 				\
203 	.end	_mcount");
204 
205 #ifdef _KERNEL
206 /*
207  * The following two macros do splhigh and splx respectively.
208  * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which
209  * doesn't include profiling support.
210  *
211  * XXX These macros should probably use inline assembly.
212  */
213 #define MCOUNT_ENTER \
214 	s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
215 #define MCOUNT_EXIT \
216 	(void)_alpha_pal_swpipl(s);
217 #endif
218