profile.h revision 28921
11543Srgrimes/* 21543Srgrimes * Copyright (c) 1992, 1993 31543Srgrimes * The Regents of the University of California. All rights reserved. 41543Srgrimes * 51543Srgrimes * Redistribution and use in source and binary forms, with or without 61543Srgrimes * modification, are permitted provided that the following conditions 71543Srgrimes * are met: 81543Srgrimes * 1. Redistributions of source code must retain the above copyright 91543Srgrimes * notice, this list of conditions and the following disclaimer. 101543Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111543Srgrimes * notice, this list of conditions and the following disclaimer in the 121543Srgrimes * documentation and/or other materials provided with the distribution. 131543Srgrimes * 3. All advertising materials mentioning features or use of this software 141543Srgrimes * must display the following acknowledgement: 151543Srgrimes * This product includes software developed by the University of 161543Srgrimes * California, Berkeley and its contributors. 171543Srgrimes * 4. Neither the name of the University nor the names of its contributors 181543Srgrimes * may be used to endorse or promote products derived from this software 191543Srgrimes * without specific prior written permission. 201543Srgrimes * 211543Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221543Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231543Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241543Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251543Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261543Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271543Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281543Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291543Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301543Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311543Srgrimes * SUCH DAMAGE. 321543Srgrimes * 331543Srgrimes * @(#)profile.h 8.1 (Berkeley) 6/11/93 3428921Sfsmp * $Id: profile.h,v 1.11 1997/02/22 09:35:01 peter Exp $ 351543Srgrimes */ 361543Srgrimes 3713107Sbde#ifndef _MACHINE_PROFILE_H_ 3813107Sbde#define _MACHINE_PROFILE_H_ 392166Spaul 4013157Sbde#ifdef KERNEL 4113157Sbde/* 4222639Sbde * Config generates something to tell the compiler to align functions on 16 4322639Sbde * byte boundaries. A strict alignment is good for keeping the tables small. 4422639Sbde */ 4522639Sbde#define FUNCTION_ALIGNMENT 16 4622639Sbde 4722639Sbde/* 4813157Sbde * The kernel uses assembler stubs instead of unportable inlines. 4913157Sbde * This is mainly to save a little time when profiling is not enabled, 5013157Sbde * which is the usual case for the kernel. 5113157Sbde */ 5213157Sbde#define _MCOUNT_DECL void mcount 5313157Sbde#define MCOUNT 541543Srgrimes 5517879Sbde#ifdef GUPROF 5617879Sbde#define CALIB_SCALE 1000 5717879Sbde#define KCOUNT(p,index) ((p)->kcount[(index) \ 5822639Sbde / (HISTFRACTION * sizeof(HISTCOUNTER))]) 5917879Sbde#define MCOUNT_DECL(s) 6017879Sbde#define MCOUNT_ENTER(s) 6117879Sbde#define MCOUNT_EXIT(s) 6217879Sbde#define PC_TO_I(p, pc) ((fptrint_t)(pc) - (fptrint_t)(p)->lowpc) 6317879Sbde#else 6417879Sbde#define MCOUNT_DECL(s) u_long s; 6517879Sbde#define MCOUNT_ENTER(s) { s = read_eflags(); disable_intr(); } 6628921Sfsmp#ifdef SMP 6728921Sfsmp#define MCOUNT_EXIT(s) { MPINTR_UNLOCK(); write_eflags(s); } 6828921Sfsmp#else 6917879Sbde#define MCOUNT_EXIT(s) (write_eflags(s)) 7028921Sfsmp#endif 7117879Sbde#endif /* GUPROF */ 7217879Sbde 7313157Sbde#else /* !KERNEL */ 7413157Sbde 7522639Sbde#define FUNCTION_ALIGNMENT 4 7622639Sbde 7713157Sbde#define _MCOUNT_DECL static __inline void _mcount 7813157Sbde 791543Srgrimes#define MCOUNT \ 8013157Sbdevoid \ 8113157Sbdemcount() \ 8213157Sbde{ \ 8313107Sbde fptrint_t selfpc, frompc; \ 841543Srgrimes /* \ 8513107Sbde * Find the return address for mcount, \ 861543Srgrimes * and the return address for mcount's caller. \ 871543Srgrimes * \ 8813107Sbde * selfpc = pc pushed by call to mcount \ 891543Srgrimes */ \ 901543Srgrimes asm("movl 4(%%ebp),%0" : "=r" (selfpc)); \ 911543Srgrimes /* \ 9213107Sbde * frompc = pc pushed by call to mcount's caller. \ 9313107Sbde * The caller's stack frame has already been built, so %ebp is \ 9413107Sbde * the caller's frame pointer. The caller's raddr is in the \ 9513107Sbde * caller's frame following the caller's caller's frame pointer. \ 961543Srgrimes */ \ 9713107Sbde asm("movl (%%ebp),%0" : "=r" (frompc)); \ 9813107Sbde frompc = ((fptrint_t *)frompc)[1]; \ 9913107Sbde _mcount(frompc, selfpc); \ 1001543Srgrimes} 10113157Sbde#endif /* KERNEL */ 1022166Spaul 10313107Sbde/* An unsigned integral type that can hold function pointers. */ 10413107Sbdetypedef u_int fptrint_t; 10513107Sbde 10613107Sbde/* 10713107Sbde * An unsigned integral type that can hold non-negative difference between 10813107Sbde * function pointers. 10913107Sbde */ 11013107Sbdetypedef int fptrdiff_t; 11113107Sbde 11213157Sbde#ifdef KERNEL 11319000Sbde 11413157Sbdevoid mcount __P((fptrint_t frompc, fptrint_t selfpc)); 11519000Sbde 11619000Sbde#ifdef GUPROF 11719000Sbdestruct gmonparam; 11819000Sbde 11919000Sbdevoid nullfunc_loop_profiled __P((void)); 12019000Sbdevoid nullfunc_profiled __P((void)); 12119000Sbdevoid startguprof __P((struct gmonparam *p)); 12219000Sbdevoid stopguprof __P((struct gmonparam *p)); 12313157Sbde#else 12419000Sbde#define startguprof(p) 12519000Sbde#define stopguprof(p) 12619000Sbde#endif /* GUPROF */ 12719000Sbde 12819000Sbde#else /* !KERNEL */ 12919000Sbde 13019000Sbde#include <sys/cdefs.h> 13119000Sbde 13219000Sbde__BEGIN_DECLS 13313157Sbdevoid mcount __P((void)) __asm("mcount"); 13413157Sbdestatic void _mcount __P((fptrint_t frompc, fptrint_t selfpc)); 13519000Sbde__END_DECLS 13613157Sbde 13719000Sbde#endif /* KERNEL */ 13819000Sbde 13913157Sbde#ifdef GUPROF 14019000Sbde/* XXX doesn't quite work outside kernel yet. */ 14119000Sbdeextern int cputime_bias; 14219000Sbde 14319000Sbde__BEGIN_DECLS 14419000Sbdeint cputime __P((void)); 14519000Sbdevoid empty_loop __P((void)); 14613107Sbdevoid mexitcount __P((fptrint_t selfpc)); 14719000Sbdevoid nullfunc __P((void)); 14819000Sbdevoid nullfunc_loop __P((void)); 14919000Sbde__END_DECLS 15013157Sbde#endif 15113107Sbde 15213157Sbde#endif /* !_MACHINE_PROFILE_H_ */ 153