xref: /NextBSD/sys/mips/include/profile.h (revision eb1a5f8de9f7ea602c373a710f531abbf81141c4)
1 /*	$OpenBSD: profile.h,v 1.2 1999/01/27 04:46:05 imp Exp $ */
2 /*-
3  * Copyright (c) 1992, 1993
4  *	The Regents of the University of California.  All rights reserved.
5  *
6  * This code is derived from software contributed to Berkeley by
7  * Ralph Campbell.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *	from: @(#)profile.h	8.1 (Berkeley) 6/10/93
34  *	JNPR: profile.h,v 1.4 2006/12/02 09:53:41 katta
35  * $FreeBSD$
36  */
37 #ifndef _MACHINE_PROFILE_H_
38 #define	_MACHINE_PROFILE_H_
39 
40 #define	_MCOUNT_DECL void ___mcount
41 
42 /*XXX The cprestore instruction is a "dummy" to shut up as(1). */
43 
44 /*XXX This is not MIPS64 safe. */
45 
46 #define	MCOUNT \
47 	__asm(".globl _mcount;"		\
48 	".type _mcount,@function;"	\
49 	"_mcount:;"			\
50 	".set noreorder;"		\
51 	".set noat;"			\
52 	".cpload $25;"			\
53 	".cprestore 4;"			\
54 	"sw $4,8($29);"			\
55 	"sw $5,12($29);"		\
56 	"sw $6,16($29);"		\
57 	"sw $7,20($29);"		\
58 	"sw $1,0($29);"			\
59 	"sw $31,4($29);"		\
60 	"move $5,$31;"			\
61 	"jal ___mcount;"		\
62 	"move $4,$1;"			\
63 	"lw $4,8($29);"			\
64 	"lw $5,12($29);"		\
65 	"lw $6,16($29);"		\
66 	"lw $7,20($29);"		\
67 	"lw $31,4($29);"		\
68 	"lw $1,0($29);"			\
69 	"addu $29,$29,8;"		\
70 	"j $31;"			\
71 	"move $31,$1;"			\
72 	".set reorder;"			\
73 	".set at");
74 
75 #ifdef _KERNEL
76 /*
77  * The following two macros do splhigh and splx respectively.
78  * They have to be defined this way because these are real
79  * functions on the MIPS, and we do not want to invoke mcount
80  * recursively.
81  */
82 
83 #define	MCOUNT_DECL(s)	u_long s;
84 #ifdef SMP
85 extern int	mcount_lock;
86 #define	MCOUNT_ENTER(s)	{					\
87 	s = intr_disable();					\
88 	while (!atomic_cmpset_acq_int(&mcount_lock, 0, 1))	\
89 		/* nothing */ ;					\
90 }
91 #define	MCOUNT_EXIT(s)	{					\
92 	atomic_store_rel_int(&mcount_lock, 0);			\
93 	intr_restore(s);						\
94 }
95 #else
96 #define	MCOUNT_ENTER(s)	{ s = intr_disable(); }
97 #define	MCOUNT_EXIT(s)	(intr_restore(s))
98 #endif
99 
100 /* REVISIT for mips */
101 /*
102  * Config generates something to tell the compiler to align functions on 16
103  * byte boundaries.  A strict alignment is good for keeping the tables small.
104  */
105 #define	FUNCTION_ALIGNMENT	16
106 
107 #ifdef GUPROF
108 struct gmonparam;
109 void	stopguprof __P((struct gmonparam *p));
110 #else
111 #define	stopguprof(p)
112 #endif /* GUPROF */
113 
114 #else	/* !_KERNEL */
115 
116 #define	FUNCTION_ALIGNMENT	4
117 
118 #ifdef __mips_n64
119 typedef u_long	uintfptr_t;
120 #else
121 typedef u_int	uintfptr_t;
122 #endif
123 
124 #endif /* _KERNEL */
125 
126 /*
127  * An unsigned integral type that can hold non-negative difference between
128  * function pointers.
129  */
130 #ifdef __mips_n64
131 typedef u_long	fptrdiff_t;
132 #else
133 typedef u_int	fptrdiff_t;
134 #endif
135 
136 #ifdef _KERNEL
137 
138 void	mcount(uintfptr_t frompc, uintfptr_t selfpc);
139 
140 #ifdef GUPROF
141 struct gmonparam;
142 
143 void	nullfunc_loop_profiled(void);
144 void	nullfunc_profiled(void);
145 void	startguprof(struct gmonparam *p);
146 void	stopguprof(struct gmonparam *p);
147 #else
148 #define	startguprof(p)
149 #define	stopguprof(p)
150 #endif /* GUPROF */
151 
152 #else /* !_KERNEL */
153 
154 #include <sys/cdefs.h>
155 
156 __BEGIN_DECLS
157 #ifdef __GNUC__
158 #ifdef __ELF__
159 void	mcount(void) __asm(".mcount");
160 #else
161 void	mcount(void) __asm("mcount");
162 #endif
163 #endif
164 void	_mcount(uintfptr_t frompc, uintfptr_t selfpc);
165 __END_DECLS
166 
167 #endif /* _KERNEL */
168 
169 #ifdef GUPROF
170 /* XXX doesn't quite work outside kernel yet. */
171 extern int	cputime_bias;
172 
173 __BEGIN_DECLS
174 int	cputime(void);
175 void	empty_loop(void);
176 void	mexitcount(uintfptr_t selfpc);
177 void	nullfunc(void);
178 void	nullfunc_loop(void);
179 __END_DECLS
180 #endif
181 
182 #endif /* !_MACHINE_PROFILE_H_ */
183