profile.h revision 129444
1221337Sdim/* $FreeBSD: head/sys/ia64/include/profile.h 129444 2004-05-19 15:41:26Z bde $ */
2221337Sdim/* From: NetBSD: profile.h,v 1.9 1997/04/06 08:47:37 cgd Exp */
3221337Sdim
4221337Sdim/*
5221337Sdim * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
6221337Sdim * All rights reserved.
7221337Sdim *
8221337Sdim * Author: Chris G. Demetriou
9221337Sdim *
10221337Sdim * Permission to use, copy, modify and distribute this software and
11221337Sdim * its documentation is hereby granted, provided that both the copyright
12221337Sdim * notice and this permission notice appear in all copies of the
13221337Sdim * software, derivative works or modified versions, and any portions
14249423Sdim * thereof, and that both notices appear in supporting documentation.
15249423Sdim *
16221337Sdim * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17221337Sdim * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18243830Sdim * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19263508Sdim *
20221337Sdim * Carnegie Mellon requests users of this software to return to
21221337Sdim *
22221337Sdim *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23221337Sdim *  School of Computer Science
24221337Sdim *  Carnegie Mellon University
25243830Sdim *  Pittsburgh PA 15213-3890
26221337Sdim *
27221337Sdim * any improvements or extensions that they make and grant Carnegie the
28243830Sdim * rights to redistribute these changes.
29243830Sdim */
30221337Sdim
31221337Sdim#define	_MCOUNT_DECL	void mcount
32221337Sdim
33221337Sdim#define FUNCTION_ALIGNMENT 32
34224145Sdim
35234353Sdimtypedef u_long	fptrdiff_t;
36234353Sdim
37234353Sdim#define MCOUNT __asm ("							\n\
38234353Sdim	.globl	_mcount							\n\
39221337Sdim	.proc	_mcount							\n\
40243830Sdim_mcount:								\n\
41221337Sdim	alloc	loc0=ar.pfs,8,7,2,0	// space to save r8-r11,rp,b7	\n\
42221337Sdim	add	sp=-8*16,sp		// space to save f8-f15		\n\
43249423Sdim	mov	loc1=rp			// caller's return address	\n\
44249423Sdim	mov	loc2=b7			// our return back to caller	\n\
45249423Sdim	;;								\n\
46249423Sdim	add	r17=16,sp		// leave 16 bytes for mcount	\n\
47243830Sdim	add	r18=32,sp						\n\
48239462Sdim	;;								\n\
49239462Sdim	mov	loc3=r8			// structure return address	\n\
50239462Sdim	mov	loc4=r9			// language specific		\n\
51239462Sdim	mov	loc5=r10		// language specific		\n\
52221337Sdim	mov	loc6=r11		// language specific		\n\
53239462Sdim	;;								\n\
54243830Sdim	stf.spill [r17]=f8,32		// save float arguments		\n\
55243830Sdim	stf.spill [r18]=f9,32						\n\
56243830Sdim	mov	out0=rp			// frompc			\n\
57243830Sdim	;;								\n\
58239462Sdim	stf.spill [r17]=f10,32						\n\
59221337Sdim	stf.spill [r18]=f11,32						\n\
60234353Sdim	mov	out1=b7			// selfpc			\n\
61249423Sdim	;;								\n\
62234353Sdim	stf.spill [r17]=f12,32						\n\
63234353Sdim	stf.spill [r18]=f13,32						\n\
64234353Sdim	;;								\n\
65243830Sdim	stf.spill [r17]=f14,32						\n\
66234353Sdim	stf.spill [r18]=f15,32						\n\
67263508Sdim	;;								\n\
68263508Sdim	br.call.sptk.many rp=mcount					\n\
69263508Sdim	;;								\n\
70263508Sdim	add	r17=16,sp						\n\
71263508Sdim	add	r18=32,sp						\n\
72263508Sdim	;;								\n\
73263508Sdim	ldf.fill f8=[r17],32						\n\
74263508Sdim	ldf.fill f9=[r18],32						\n\
75263508Sdim	mov	r8=loc3			// restore structure pointer	\n\
76221337Sdim	;;								\n\
77221337Sdim	ldf.fill f10=[r17],32		// restore float arguments	\n\
78221337Sdim	ldf.fill f11=[r18],32						\n\
79221337Sdim	mov	r9=loc4							\n\
80221337Sdim	;;								\n\
81221337Sdim	ldf.fill f12=[r17],32		// etc.				\n\
82	ldf.fill f13=[r18],32						\n\
83	mov	r10=loc5						\n\
84	;;								\n\
85	ldf.fill f14=[r17],32						\n\
86	ldf.fill f15=[r18],32						\n\
87	mov	r11=loc6						\n\
88	;;								\n\
89	mov	b7=loc2			// clean up			\n\
90	mov	rp=loc1							\n\
91	mov	ar.pfs=loc0						\n\
92	;;								\n\
93	alloc	r14=ar.pfs,0,0,8,0	// drop our register frame	\n\
94	br.sptk.many b7			// back to caller		\n\
95									\n\
96	.end	_mcount");
97
98#ifdef _KERNEL
99/*
100 * The following two macros do splhigh and splx respectively.
101 */
102#define MCOUNT_ENTER(s) \n\
103	_c = intr_disable()
104#define MCOUNT_EXIT(s) \n\
105	intr_restore(_c)
106#define	MCOUNT_DECL(s)	register_t c;
107#else /* !_KERNEL */
108typedef u_long	uintfptr_t;
109#endif
110