Changeset View
Changeset View
Standalone View
Standalone View
sys/i386/include/profile.h
Show All 29 Lines | |||||
* | * | ||||
* @(#)profile.h 8.1 (Berkeley) 6/11/93 | * @(#)profile.h 8.1 (Berkeley) 6/11/93 | ||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#ifndef _MACHINE_PROFILE_H_ | #ifndef _MACHINE_PROFILE_H_ | ||||
#define _MACHINE_PROFILE_H_ | #define _MACHINE_PROFILE_H_ | ||||
#ifndef _SYS_CDEFS_H_ | #ifndef _KERNEL | ||||
#error this file needs sys/cdefs.h as a prerequisite | |||||
#endif | |||||
#ifdef _KERNEL | #include <sys/cdefs.h> | ||||
/* | |||||
* Config generates something to tell the compiler to align functions on 16 | |||||
* byte boundaries. A strict alignment is good for keeping the tables small. | |||||
*/ | |||||
#define FUNCTION_ALIGNMENT 16 | |||||
/* | |||||
* The kernel uses assembler stubs instead of unportable inlines. | |||||
* This is mainly to save a little time when profiling is not enabled, | |||||
* which is the usual case for the kernel. | |||||
*/ | |||||
#define _MCOUNT_DECL void mcount | |||||
#define MCOUNT | |||||
#ifdef GUPROF | |||||
#define MCOUNT_DECL(s) | |||||
#define MCOUNT_ENTER(s) | |||||
#define MCOUNT_EXIT(s) | |||||
#ifdef __GNUCLIKE_ASM | |||||
#define MCOUNT_OVERHEAD(label) \ | |||||
__asm __volatile("pushl %0; call __mcount; popl %%ecx" \ | |||||
: \ | |||||
: "i" (label) \ | |||||
: "ax", "dx", "cx", "memory") | |||||
#define MEXITCOUNT_OVERHEAD() \ | |||||
__asm __volatile("call .mexitcount; 1:" \ | |||||
: : \ | |||||
: "cx", "memory") | |||||
#define MEXITCOUNT_OVERHEAD_GETLABEL(labelp) \ | |||||
__asm __volatile("movl $1b,%0" : "=rm" (labelp)) | |||||
#else | |||||
#error | |||||
#endif /* !__GNUCLIKE_ASM */ | |||||
#else /* !GUPROF */ | |||||
#define MCOUNT_DECL(s) register_t s; | |||||
#ifdef SMP | |||||
extern int mcount_lock; | |||||
#define MCOUNT_ENTER(s) { s = intr_disable(); \ | |||||
while (!atomic_cmpset_acq_int(&mcount_lock, 0, 1)) \ | |||||
/* nothing */ ; } | |||||
#define MCOUNT_EXIT(s) { atomic_store_rel_int(&mcount_lock, 0); \ | |||||
intr_restore(s); } | |||||
#else | |||||
#define MCOUNT_ENTER(s) { s = intr_disable(); } | |||||
#define MCOUNT_EXIT(s) (intr_restore(s)) | |||||
#endif | |||||
#endif /* GUPROF */ | |||||
void bintr(void); | |||||
void btrap(void); | |||||
void eintr(void); | |||||
#if 0 | |||||
void end_exceptions(void); | |||||
void start_exceptions(void); | |||||
#else | |||||
#include <machine/pmc_mdep.h> /* XXX */ | |||||
#endif | |||||
void user(void); | |||||
#include <machine/md_var.h> /* XXX for setidt_disp */ | |||||
#define MCOUNT_DETRAMP(pc) do { \ | |||||
if ((pc) >= (uintfptr_t)start_exceptions + setidt_disp && \ | |||||
(pc) < (uintfptr_t)end_exceptions + setidt_disp) \ | |||||
(pc) -= setidt_disp; \ | |||||
} while (0) | |||||
#define MCOUNT_FROMPC_INTR(pc) \ | |||||
((pc >= (uintfptr_t)btrap && pc < (uintfptr_t)eintr) ? \ | |||||
((pc >= (uintfptr_t)bintr) ? (uintfptr_t)bintr : \ | |||||
(uintfptr_t)btrap) : ~0U) | |||||
#define MCOUNT_USERPC ((uintfptr_t)user) | |||||
#else /* !_KERNEL */ | |||||
#define FUNCTION_ALIGNMENT 4 | #define FUNCTION_ALIGNMENT 4 | ||||
#define _MCOUNT_DECL static __inline void _mcount | #define _MCOUNT_DECL static __inline void _mcount | ||||
#ifdef __GNUCLIKE_ASM | #ifdef __GNUCLIKE_ASM | ||||
#define MCOUNT \ | #define MCOUNT \ | ||||
void \ | void \ | ||||
mcount() \ | mcount() \ | ||||
Show All 26 Lines | mcount() \ | ||||
__asm("" : : "c" (ecx)); \ | __asm("" : : "c" (ecx)); \ | ||||
} | } | ||||
#else /* !__GNUCLIKE_ASM */ | #else /* !__GNUCLIKE_ASM */ | ||||
#define MCOUNT | #define MCOUNT | ||||
#endif /* __GNUCLIKE_ASM */ | #endif /* __GNUCLIKE_ASM */ | ||||
typedef u_int uintfptr_t; | typedef u_int uintfptr_t; | ||||
#endif /* _KERNEL */ | |||||
/* | /* | ||||
* An unsigned integral type that can hold non-negative difference between | * An unsigned integral type that can hold non-negative difference between | ||||
* function pointers. | * function pointers. | ||||
*/ | */ | ||||
typedef u_int fptrdiff_t; | typedef u_int fptrdiff_t; | ||||
#ifdef _KERNEL | |||||
void mcount(uintfptr_t frompc, uintfptr_t selfpc); | |||||
#else /* !_KERNEL */ | |||||
#include <sys/cdefs.h> | |||||
__BEGIN_DECLS | __BEGIN_DECLS | ||||
#ifdef __GNUCLIKE_ASM | #ifdef __GNUCLIKE_ASM | ||||
void mcount(void) __asm(".mcount"); | void mcount(void) __asm(".mcount"); | ||||
#endif | #endif | ||||
__END_DECLS | __END_DECLS | ||||
#endif /* _KERNEL */ | #endif /* !_KERNEL */ | ||||
#endif /* !_MACHINE_PROFILE_H_ */ | #endif /* !_MACHINE_PROFILE_H_ */ |