profile.h revision 1.5
11.5Scgd/*	$NetBSD: profile.h,v 1.5 1996/08/21 15:53:26 cgd Exp $	*/
21.1Scgd
31.1Scgd/*
41.1Scgd * Copyright (c) 1994, 1995 Carnegie-Mellon University.
51.1Scgd * All rights reserved.
61.1Scgd *
71.1Scgd * Author: Chris G. Demetriou
81.1Scgd *
91.1Scgd * Permission to use, copy, modify and distribute this software and
101.1Scgd * its documentation is hereby granted, provided that both the copyright
111.1Scgd * notice and this permission notice appear in all copies of the
121.1Scgd * software, derivative works or modified versions, and any portions
131.1Scgd * thereof, and that both notices appear in supporting documentation.
141.1Scgd *
151.1Scgd * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
161.1Scgd * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
171.1Scgd * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
181.1Scgd *
191.1Scgd * Carnegie Mellon requests users of this software to return to
201.1Scgd *
211.1Scgd *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
221.1Scgd *  School of Computer Science
231.1Scgd *  Carnegie Mellon University
241.1Scgd *  Pittsburgh PA 15213-3890
251.1Scgd *
261.1Scgd * any improvements or extensions that they make and grant Carnegie the
271.1Scgd * rights to redistribute these changes.
281.1Scgd */
291.1Scgd
301.3Scgd#define	_MCOUNT_DECL	void mcount
311.1Scgd
321.3Scgd#if 0
331.3Scgd/*
341.3Scgd * XXX The definition of MCOUNT below is really the following code, run
351.3Scgd * XXX through cpp, since the inline assembly isn't preprocessed.
361.3Scgd */
371.3Scgd#define	OFFSET_AT	0
381.3Scgd#define OFFSET_V0	8
391.3Scgd#define OFFSET_T0	16
401.3Scgd#define OFFSET_T1	24
411.3Scgd#define OFFSET_T2	32
421.3Scgd#define OFFSET_T3	40
431.3Scgd#define OFFSET_T4	48
441.3Scgd#define OFFSET_T5	56
451.3Scgd#define OFFSET_T6	64
461.3Scgd#define OFFSET_T7	72
471.3Scgd#define OFFSET_S6	80
481.3Scgd#define OFFSET_A0	88
491.3Scgd#define OFFSET_A1	96
501.3Scgd#define OFFSET_A2	104
511.3Scgd#define OFFSET_A3	112
521.3Scgd#define OFFSET_A4	120
531.3Scgd#define OFFSET_A5	128
541.3Scgd#define OFFSET_T8	136
551.3Scgd#define OFFSET_T9	144
561.3Scgd#define OFFSET_T10	152
571.3Scgd#define OFFSET_T11	160
581.3Scgd#define OFFSET_RA	168
591.3Scgd#define OFFSET_T12	176
601.3Scgd#define OFFSET_GP	184
611.3Scgd#define	FRAME_SIZE	192
621.3Scgd
631.3ScgdLEAF(_mcount,0)			/* XXX */
641.3Scgd	.set noat
651.3Scgd	.set noreorder
661.3Scgd
671.3Scgd	lda	sp, -FRAME_SIZE(sp)
681.3Scgd
691.3Scgd	stq	at_reg, OFFSET_AT(sp)
701.3Scgd	stq	v0, OFFSET_V0(sp)
711.3Scgd	stq	t0, OFFSET_T0(sp)
721.3Scgd	stq	t1, OFFSET_T1(sp)
731.3Scgd	stq	t2, OFFSET_T2(sp)
741.3Scgd	stq	t3, OFFSET_T3(sp)
751.3Scgd	stq	t4, OFFSET_T4(sp)
761.3Scgd	stq	t5, OFFSET_T5(sp)
771.3Scgd	stq	t6, OFFSET_T6(sp)
781.3Scgd	stq	t7, OFFSET_T7(sp)
791.3Scgd	stq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
801.3Scgd	stq	a0, OFFSET_A0(sp)
811.3Scgd	stq	a1, OFFSET_A1(sp)
821.3Scgd	stq	a2, OFFSET_A2(sp)
831.3Scgd	stq	a3, OFFSET_A3(sp)
841.3Scgd	stq	a4, OFFSET_A4(sp)
851.3Scgd	stq	a5, OFFSET_A5(sp)
861.3Scgd	stq	t8, OFFSET_T8(sp)
871.3Scgd	stq	t9, OFFSET_T9(sp)
881.3Scgd	stq	t10, OFFSET_T10(sp)
891.3Scgd	stq	t11, OFFSET_T11(sp)
901.3Scgd	stq	ra, OFFSET_RA(sp)
911.3Scgd	stq	t12, OFFSET_T12(sp)
921.3Scgd	stq	gp, OFFSET_GP(sp)
931.3Scgd
941.3Scgd	br	pv, 1f
951.3Scgd1:	SETGP(pv)
961.3Scgd	mov	ra, a0
971.3Scgd	mov	at_reg, a1
981.3Scgd	CALL(mcount)
991.3Scgd
1001.3Scgd	ldq	v0, OFFSET_V0(sp)
1011.3Scgd	ldq	t0, OFFSET_T0(sp)
1021.3Scgd	ldq	t1, OFFSET_T1(sp)
1031.3Scgd	ldq	t2, OFFSET_T2(sp)
1041.3Scgd	ldq	t3, OFFSET_T3(sp)
1051.3Scgd	ldq	t4, OFFSET_T4(sp)
1061.3Scgd	ldq	t5, OFFSET_T5(sp)
1071.3Scgd	ldq	t6, OFFSET_T6(sp)
1081.3Scgd	ldq	t7, OFFSET_T7(sp)
1091.3Scgd	ldq	s6, OFFSET_S6(sp)	/* XXX because run _after_ prologue. */
1101.3Scgd	ldq	a0, OFFSET_A0(sp)
1111.3Scgd	ldq	a1, OFFSET_A1(sp)
1121.3Scgd	ldq	a2, OFFSET_A2(sp)
1131.3Scgd	ldq	a3, OFFSET_A3(sp)
1141.3Scgd	ldq	a4, OFFSET_A4(sp)
1151.3Scgd	ldq	a5, OFFSET_A5(sp)
1161.3Scgd	ldq	t8, OFFSET_T8(sp)
1171.3Scgd	ldq	t9, OFFSET_T9(sp)
1181.3Scgd	ldq	t10, OFFSET_T10(sp)
1191.3Scgd	ldq	t11, OFFSET_T11(sp)
1201.3Scgd	ldq	gp, OFFSET_GP(sp)
1211.3Scgd	ldq	ra, OFFSET_RA(sp)
1221.3Scgd
1231.3Scgd	ldq	at_reg, OFFSET_AT(sp)
1241.3Scgd
1251.3Scgd	lda	sp, FRAME_SIZE(sp)
1261.3Scgd	ret	zero, (at_reg), 1
1271.3Scgd
1281.3Scgd	END(_mcount)
1291.3Scgd#endif /* 0 */
1301.3Scgd
1311.3Scgd#define MCOUNT asm("		\
1321.3Scgd	.globl	_mcount;	\
1331.3Scgd	.ent	_mcount 0;	\
1341.3Scgd_mcount:;			\
1351.3Scgd	.frame	$30,0,$26;	\
1361.3Scgd	.set noat;		\
1371.3Scgd	.set noreorder;		\
1381.3Scgd				\
1391.3Scgd	lda	$30, -192($30);	\
1401.3Scgd				\
1411.3Scgd	stq	$28, 0($30);	\
1421.3Scgd	stq	$0, 8($30);	\
1431.3Scgd	stq	$1, 16($30);	\
1441.3Scgd	stq	$2, 24($30);	\
1451.3Scgd	stq	$3, 32($30);	\
1461.3Scgd	stq	$4, 40($30);	\
1471.3Scgd	stq	$5, 48($30);	\
1481.3Scgd	stq	$6, 56($30);	\
1491.3Scgd	stq	$7, 64($30);	\
1501.3Scgd	stq	$8, 72($30);	\
1511.3Scgd	stq	$15, 80($30);	\
1521.3Scgd	stq	$16, 88($30);	\
1531.3Scgd	stq	$17, 96($30);	\
1541.3Scgd	stq	$18, 104($30);	\
1551.3Scgd	stq	$19, 112($30);	\
1561.3Scgd	stq	$20, 120($30);	\
1571.3Scgd	stq	$21, 128($30);	\
1581.3Scgd	stq	$22, 136($30);	\
1591.3Scgd	stq	$23, 144($30);	\
1601.3Scgd	stq	$24, 152($30);	\
1611.3Scgd	stq	$25, 160($30);	\
1621.3Scgd	stq	$26, 168($30);	\
1631.3Scgd	stq	$27, 176($30);	\
1641.3Scgd	stq	$29, 184($30);	\
1651.3Scgd				\
1661.3Scgd	br	$27, 1f;	\
1671.3Scgd1:	ldgp	$29,0($27);	\
1681.3Scgd	mov	$26, $16;	\
1691.3Scgd	mov	$28, $17;	\
1701.3Scgd	jsr	$26,mcount;	\
1711.3Scgd	ldgp	$29,0($26);	\
1721.3Scgd				\
1731.3Scgd	ldq	$0, 8($30);	\
1741.3Scgd	ldq	$1, 16($30);	\
1751.3Scgd	ldq	$2, 24($30);	\
1761.3Scgd	ldq	$3, 32($30);	\
1771.3Scgd	ldq	$4, 40($30);	\
1781.3Scgd	ldq	$5, 48($30);	\
1791.3Scgd	ldq	$6, 56($30);	\
1801.3Scgd	ldq	$7, 64($30);	\
1811.3Scgd	ldq	$8, 72($30);	\
1821.3Scgd	ldq	$15, 80($30);	\
1831.3Scgd	ldq	$16, 88($30);	\
1841.3Scgd	ldq	$17, 96($30);	\
1851.3Scgd	ldq	$18, 104($30);	\
1861.3Scgd	ldq	$19, 112($30);	\
1871.3Scgd	ldq	$20, 120($30);	\
1881.3Scgd	ldq	$21, 128($30);	\
1891.3Scgd	ldq	$22, 136($30);	\
1901.3Scgd	ldq	$23, 144($30);	\
1911.3Scgd	ldq	$24, 152($30);	\
1921.3Scgd	ldq	$25, 160($30);	\
1931.3Scgd	ldq	$29, 184($30);	\
1941.3Scgd	ldq	$26, 168($30);	\
1951.3Scgd				\
1961.3Scgd	ldq	$28, 0($30);	\
1971.3Scgd				\
1981.3Scgd	lda	$30, 192($30);	\
1991.3Scgd	ret	$31, ($28), 1;	\
2001.3Scgd				\
2011.3Scgd	.end	_mcount");
2021.1Scgd
2031.2Sjtc#ifdef _KERNEL
2041.3Scgd/*
2051.3Scgd * The following two macros do splhigh and splx respectively.
2061.4Scgd * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which
2071.3Scgd * doesn't include profiling support.
2081.3Scgd *
2091.3Scgd * XXX These macros should probably use inline assembly.
2101.3Scgd */
2111.3Scgd#define MCOUNT_ENTER \
2121.5Scgd	s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
2131.3Scgd#define MCOUNT_EXIT \
2141.4Scgd	(void)_alpha_pal_swpipl(s);
2151.1Scgd#endif
216