xref: /openbsd-src/sys/arch/i386/include/profile.h (revision 2df76cc2a0aee2cb2166e3799b7bb5c3f883f83d)
1*2df76cc2Sguenther /*	$OpenBSD: profile.h,v 1.12 2014/03/29 18:09:29 guenther Exp $	*/
2df930be7Sderaadt /*	$NetBSD: profile.h,v 1.6 1995/03/28 18:17:08 jtc Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Copyright (c) 1992, 1993
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
1629295d1cSmillert  * 3. Neither the name of the University nor the names of its contributors
17df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
18df930be7Sderaadt  *    without specific prior written permission.
19df930be7Sderaadt  *
20df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30df930be7Sderaadt  * SUCH DAMAGE.
31df930be7Sderaadt  *
32df930be7Sderaadt  *	@(#)profile.h	8.1 (Berkeley) 6/11/93
33df930be7Sderaadt  */
34df930be7Sderaadt 
35f2e9d91cStholo #define	_MCOUNT_DECL static __inline void _mcount
36df930be7Sderaadt 
37df930be7Sderaadt #define	MCOUNT \
3824c8058cSdrahn extern void mcount(void) __asm("__mcount");				\
3924c8058cSdrahn __weak_alias(mcount,__mcount);						\
40df930be7Sderaadt void									\
41fc6ddb77Skettenis mcount(void)								\
42df930be7Sderaadt {									\
43df930be7Sderaadt 	int selfpc, frompcindex;					\
44fc6ddb77Skettenis 	int eax, ecx, edx;						\
45fc6ddb77Skettenis 									\
46fc6ddb77Skettenis 	__asm volatile("movl %%eax,%0" : "=g" (eax));			\
47fc6ddb77Skettenis 	__asm volatile("movl %%ecx,%0" : "=g" (ecx));			\
48fc6ddb77Skettenis 	__asm volatile("movl %%edx,%0" : "=g" (edx));			\
49df930be7Sderaadt 	/*								\
50df930be7Sderaadt 	 * find the return address for mcount,				\
51df930be7Sderaadt 	 * and the return address for mcount's caller.			\
52df930be7Sderaadt 	 *								\
53df930be7Sderaadt 	 * selfpc = pc pushed by mcount call				\
54df930be7Sderaadt 	 */								\
55*2df76cc2Sguenther 	__asm volatile ("movl 4(%%ebp),%0" : "=r" (selfpc));		\
56df930be7Sderaadt 	/*								\
57df930be7Sderaadt 	 * frompcindex = pc pushed by call into self.			\
58df930be7Sderaadt 	 */								\
59*2df76cc2Sguenther 	__asm volatile ("movl (%%ebp),%0;movl 4(%0),%0" :		\
60445d8dafSmickey 	    "+r" (frompcindex));					\
61df930be7Sderaadt 	_mcount(frompcindex, selfpc);					\
62fc6ddb77Skettenis 									\
63fc6ddb77Skettenis 	__asm volatile("movl %0,%%edx" : : "g" (edx));			\
64fc6ddb77Skettenis 	__asm volatile("movl %0,%%ecx" : : "g" (ecx));			\
65fc6ddb77Skettenis 	__asm volatile("movl %0,%%eax" : : "g" (eax));			\
66df930be7Sderaadt }
67df930be7Sderaadt 
68df930be7Sderaadt #ifdef _KERNEL
69df930be7Sderaadt /*
70d0f67eb6Spascoe  * We inline the code that splhigh and splx would do here as otherwise we would
71d0f67eb6Spascoe  * call recursively into mcount() as machdep.c is compiled with -pg on a
72d0f67eb6Spascoe  * profiling build.
73df930be7Sderaadt  */
74d0f67eb6Spascoe #define	MCOUNT_ENTER	_SPLRAISE(s, IPL_HIGH); __splbarrier()
75d0f67eb6Spascoe #define	MCOUNT_EXIT	__splbarrier(); _SPLX(s)
76df930be7Sderaadt #endif /* _KERNEL */
77