xref: /openbsd-src/sys/arch/alpha/include/profile.h (revision 3a630e3f5de3bef31e4e8da599de955c4101a679)
1*3a630e3fSniklas /*	$OpenBSD: profile.h,v 1.5 1997/01/24 19:57:17 niklas Exp $	*/
2*3a630e3fSniklas /*	$NetBSD: profile.h,v 1.7 1996/11/13 22:21:01 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5*3a630e3fSniklas  * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
6df930be7Sderaadt  * All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Author: Chris G. Demetriou
9df930be7Sderaadt  *
10df930be7Sderaadt  * Permission to use, copy, modify and distribute this software and
11df930be7Sderaadt  * its documentation is hereby granted, provided that both the copyright
12df930be7Sderaadt  * notice and this permission notice appear in all copies of the
13df930be7Sderaadt  * software, derivative works or modified versions, and any portions
14df930be7Sderaadt  * thereof, and that both notices appear in supporting documentation.
15df930be7Sderaadt  *
16df930be7Sderaadt  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17df930be7Sderaadt  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18df930be7Sderaadt  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19df930be7Sderaadt  *
20df930be7Sderaadt  * Carnegie Mellon requests users of this software to return to
21df930be7Sderaadt  *
22df930be7Sderaadt  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23df930be7Sderaadt  *  School of Computer Science
24df930be7Sderaadt  *  Carnegie Mellon University
25df930be7Sderaadt  *  Pittsburgh PA 15213-3890
26df930be7Sderaadt  *
27df930be7Sderaadt  * any improvements or extensions that they make and grant Carnegie the
28df930be7Sderaadt  * rights to redistribute these changes.
29df930be7Sderaadt  */
30df930be7Sderaadt 
3134fbf6deSderaadt #define	_MCOUNT_DECL	void mcount
32df930be7Sderaadt 
3334fbf6deSderaadt #if 0
3434fbf6deSderaadt /*
3534fbf6deSderaadt  * XXX The definition of MCOUNT below is really the following code, run
3634fbf6deSderaadt  * XXX through cpp, since the inline assembly isn't preprocessed.
3734fbf6deSderaadt  */
3834fbf6deSderaadt #define	OFFSET_AT	0
3934fbf6deSderaadt #define OFFSET_V0	8
4034fbf6deSderaadt #define OFFSET_T0	16
4134fbf6deSderaadt #define OFFSET_T1	24
4234fbf6deSderaadt #define OFFSET_T2	32
4334fbf6deSderaadt #define OFFSET_T3	40
4434fbf6deSderaadt #define OFFSET_T4	48
4534fbf6deSderaadt #define OFFSET_T5	56
4634fbf6deSderaadt #define OFFSET_T6	64
4734fbf6deSderaadt #define OFFSET_T7	72
4834fbf6deSderaadt #define OFFSET_S6	80
4934fbf6deSderaadt #define OFFSET_A0	88
5034fbf6deSderaadt #define OFFSET_A1	96
5134fbf6deSderaadt #define OFFSET_A2	104
5234fbf6deSderaadt #define OFFSET_A3	112
5334fbf6deSderaadt #define OFFSET_A4	120
5434fbf6deSderaadt #define OFFSET_A5	128
5534fbf6deSderaadt #define OFFSET_T8	136
5634fbf6deSderaadt #define OFFSET_T9	144
5734fbf6deSderaadt #define OFFSET_T10	152
5834fbf6deSderaadt #define OFFSET_T11	160
5934fbf6deSderaadt #define OFFSET_RA	168
6034fbf6deSderaadt #define OFFSET_T12	176
6134fbf6deSderaadt #define OFFSET_GP	184
6234fbf6deSderaadt #define	FRAME_SIZE	192
6334fbf6deSderaadt 
6434fbf6deSderaadt LEAF(_mcount,0)			/* XXX */
6534fbf6deSderaadt 	.set noat
6634fbf6deSderaadt 	.set noreorder
6734fbf6deSderaadt 
6834fbf6deSderaadt 	lda	sp, -FRAME_SIZE(sp)
6934fbf6deSderaadt 
7034fbf6deSderaadt 	stq	at_reg, OFFSET_AT(sp)
7134fbf6deSderaadt 	stq	v0, OFFSET_V0(sp)
7234fbf6deSderaadt 	stq	t0, OFFSET_T0(sp)
7334fbf6deSderaadt 	stq	t1, OFFSET_T1(sp)
7434fbf6deSderaadt 	stq	t2, OFFSET_T2(sp)
7534fbf6deSderaadt 	stq	t3, OFFSET_T3(sp)
7634fbf6deSderaadt 	stq	t4, OFFSET_T4(sp)
7734fbf6deSderaadt 	stq	t5, OFFSET_T5(sp)
7834fbf6deSderaadt 	stq	t6, OFFSET_T6(sp)
7934fbf6deSderaadt 	stq	t7, OFFSET_T7(sp)
8034fbf6deSderaadt 	stq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
8134fbf6deSderaadt 	stq	a0, OFFSET_A0(sp)
8234fbf6deSderaadt 	stq	a1, OFFSET_A1(sp)
8334fbf6deSderaadt 	stq	a2, OFFSET_A2(sp)
8434fbf6deSderaadt 	stq	a3, OFFSET_A3(sp)
8534fbf6deSderaadt 	stq	a4, OFFSET_A4(sp)
8634fbf6deSderaadt 	stq	a5, OFFSET_A5(sp)
8734fbf6deSderaadt 	stq	t8, OFFSET_T8(sp)
8834fbf6deSderaadt 	stq	t9, OFFSET_T9(sp)
8934fbf6deSderaadt 	stq	t10, OFFSET_T10(sp)
9034fbf6deSderaadt 	stq	t11, OFFSET_T11(sp)
9134fbf6deSderaadt 	stq	ra, OFFSET_RA(sp)
9234fbf6deSderaadt 	stq	t12, OFFSET_T12(sp)
9334fbf6deSderaadt 	stq	gp, OFFSET_GP(sp)
9434fbf6deSderaadt 
9550ce9ee0Sniklas 	br	pv, LX99
9650ce9ee0Sniklas LX99:	SETGP(pv)
9734fbf6deSderaadt 	mov	ra, a0
9834fbf6deSderaadt 	mov	at_reg, a1
9934fbf6deSderaadt 	CALL(mcount)
10034fbf6deSderaadt 
10134fbf6deSderaadt 	ldq	v0, OFFSET_V0(sp)
10234fbf6deSderaadt 	ldq	t0, OFFSET_T0(sp)
10334fbf6deSderaadt 	ldq	t1, OFFSET_T1(sp)
10434fbf6deSderaadt 	ldq	t2, OFFSET_T2(sp)
10534fbf6deSderaadt 	ldq	t3, OFFSET_T3(sp)
10634fbf6deSderaadt 	ldq	t4, OFFSET_T4(sp)
10734fbf6deSderaadt 	ldq	t5, OFFSET_T5(sp)
10834fbf6deSderaadt 	ldq	t6, OFFSET_T6(sp)
10934fbf6deSderaadt 	ldq	t7, OFFSET_T7(sp)
11034fbf6deSderaadt 	ldq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
11134fbf6deSderaadt 	ldq	a0, OFFSET_A0(sp)
11234fbf6deSderaadt 	ldq	a1, OFFSET_A1(sp)
11334fbf6deSderaadt 	ldq	a2, OFFSET_A2(sp)
11434fbf6deSderaadt 	ldq	a3, OFFSET_A3(sp)
11534fbf6deSderaadt 	ldq	a4, OFFSET_A4(sp)
11634fbf6deSderaadt 	ldq	a5, OFFSET_A5(sp)
11734fbf6deSderaadt 	ldq	t8, OFFSET_T8(sp)
11834fbf6deSderaadt 	ldq	t9, OFFSET_T9(sp)
11934fbf6deSderaadt 	ldq	t10, OFFSET_T10(sp)
12034fbf6deSderaadt 	ldq	t11, OFFSET_T11(sp)
12134fbf6deSderaadt 	ldq	ra, OFFSET_RA(sp)
12250ce9ee0Sniklas 	stq	t12, OFFSET_T12(sp)
12350ce9ee0Sniklas 	ldq	gp, OFFSET_GP(sp)
12434fbf6deSderaadt 
12534fbf6deSderaadt 	ldq	at_reg, OFFSET_AT(sp)
12634fbf6deSderaadt 
12734fbf6deSderaadt 	lda	sp, FRAME_SIZE(sp)
12834fbf6deSderaadt 	ret	zero, (at_reg), 1
12934fbf6deSderaadt 
13034fbf6deSderaadt 	END(_mcount)
13134fbf6deSderaadt #endif /* 0 */
13234fbf6deSderaadt 
13334fbf6deSderaadt #define MCOUNT asm("		\
13434fbf6deSderaadt 	.globl	_mcount;	\
13534fbf6deSderaadt 	.ent	_mcount 0;	\
13634fbf6deSderaadt _mcount:;			\
13734fbf6deSderaadt 	.frame	$30,0,$26;	\
13834fbf6deSderaadt 	.set noat;		\
13934fbf6deSderaadt 	.set noreorder;		\
14034fbf6deSderaadt 				\
14134fbf6deSderaadt 	lda	$30, -192($30);	\
14234fbf6deSderaadt 				\
14334fbf6deSderaadt 	stq	$28, 0($30);	\
14434fbf6deSderaadt 	stq	$0, 8($30);	\
14534fbf6deSderaadt 	stq	$1, 16($30);	\
14634fbf6deSderaadt 	stq	$2, 24($30);	\
14734fbf6deSderaadt 	stq	$3, 32($30);	\
14834fbf6deSderaadt 	stq	$4, 40($30);	\
14934fbf6deSderaadt 	stq	$5, 48($30);	\
15034fbf6deSderaadt 	stq	$6, 56($30);	\
15134fbf6deSderaadt 	stq	$7, 64($30);	\
15234fbf6deSderaadt 	stq	$8, 72($30);	\
15334fbf6deSderaadt 	stq	$15, 80($30);	\
15434fbf6deSderaadt 	stq	$16, 88($30);	\
15534fbf6deSderaadt 	stq	$17, 96($30);	\
15634fbf6deSderaadt 	stq	$18, 104($30);	\
15734fbf6deSderaadt 	stq	$19, 112($30);	\
15834fbf6deSderaadt 	stq	$20, 120($30);	\
15934fbf6deSderaadt 	stq	$21, 128($30);	\
16034fbf6deSderaadt 	stq	$22, 136($30);	\
16134fbf6deSderaadt 	stq	$23, 144($30);	\
16234fbf6deSderaadt 	stq	$24, 152($30);	\
16334fbf6deSderaadt 	stq	$25, 160($30);	\
16434fbf6deSderaadt 	stq	$26, 168($30);	\
16534fbf6deSderaadt 	stq	$27, 176($30);	\
16634fbf6deSderaadt 	stq	$29, 184($30);	\
16734fbf6deSderaadt 				\
16850ce9ee0Sniklas 	br	$27, LX98;	\
16950ce9ee0Sniklas LX98:	ldgp	$29,0($27);	\
17034fbf6deSderaadt 	mov	$26, $16;	\
17134fbf6deSderaadt 	mov	$28, $17;	\
17234fbf6deSderaadt 	jsr	$26,mcount;	\
17334fbf6deSderaadt 	ldgp	$29,0($26);	\
17434fbf6deSderaadt 				\
17534fbf6deSderaadt 	ldq	$0, 8($30);	\
17634fbf6deSderaadt 	ldq	$1, 16($30);	\
17734fbf6deSderaadt 	ldq	$2, 24($30);	\
17834fbf6deSderaadt 	ldq	$3, 32($30);	\
17934fbf6deSderaadt 	ldq	$4, 40($30);	\
18034fbf6deSderaadt 	ldq	$5, 48($30);	\
18134fbf6deSderaadt 	ldq	$6, 56($30);	\
18234fbf6deSderaadt 	ldq	$7, 64($30);	\
18334fbf6deSderaadt 	ldq	$8, 72($30);	\
18434fbf6deSderaadt 	ldq	$15, 80($30);	\
18534fbf6deSderaadt 	ldq	$16, 88($30);	\
18634fbf6deSderaadt 	ldq	$17, 96($30);	\
18734fbf6deSderaadt 	ldq	$18, 104($30);	\
18834fbf6deSderaadt 	ldq	$19, 112($30);	\
18934fbf6deSderaadt 	ldq	$20, 120($30);	\
19034fbf6deSderaadt 	ldq	$21, 128($30);	\
19134fbf6deSderaadt 	ldq	$22, 136($30);	\
19234fbf6deSderaadt 	ldq	$23, 144($30);	\
19334fbf6deSderaadt 	ldq	$24, 152($30);	\
19434fbf6deSderaadt 	ldq	$25, 160($30);	\
19550ce9ee0Sniklas 	ldq	$25, 160($30);	\
19634fbf6deSderaadt 	ldq	$26, 168($30);	\
19750ce9ee0Sniklas 	ldq	$27, 176($30);	\
19850ce9ee0Sniklas 	ldq	$29, 184($30);	\
19934fbf6deSderaadt 				\
20034fbf6deSderaadt 	lda	$30, 192($30);	\
20134fbf6deSderaadt 	ret	$31, ($28), 1;	\
20234fbf6deSderaadt 				\
20334fbf6deSderaadt 	.end	_mcount");
204df930be7Sderaadt 
205df930be7Sderaadt #ifdef _KERNEL
20634fbf6deSderaadt /*
20734fbf6deSderaadt  * The following two macros do splhigh and splx respectively.
20850ce9ee0Sniklas  * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which
20934fbf6deSderaadt  * doesn't include profiling support.
21034fbf6deSderaadt  *
21134fbf6deSderaadt  * XXX These macros should probably use inline assembly.
21234fbf6deSderaadt  */
21334fbf6deSderaadt #define MCOUNT_ENTER \
21450ce9ee0Sniklas 	s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
21534fbf6deSderaadt #define MCOUNT_EXIT \
21650ce9ee0Sniklas 	(void)_alpha_pal_swpipl(s);
217df930be7Sderaadt #endif
218