freebsd-dev/sys/ia64/include/profile.h
Doug Rabson 1ebcad5720 This is the first snapshot of the FreeBSD/ia64 kernel. This kernel will
not work on any real hardware (or fully work on any simulator). Much more
needs to happen before this is actually functional but its nice to see
the FreeBSD copyright message appear in the ia64 simulator.
2000-09-29 13:46:07 +00:00

238 lines
5.3 KiB
C

/* $FreeBSD$ */
/* From: NetBSD: profile.h,v 1.9 1997/04/06 08:47:37 cgd Exp */
/*
* Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University.
* All rights reserved.
*
* Author: Chris G. Demetriou
*
* Permission to use, copy, modify and distribute this software and
* its documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
* FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/
#define _MCOUNT_DECL void mcount
#define FUNCTION_ALIGNMENT 32
typedef u_long fptrdiff_t;
#if 0
/*
* XXX The definition of MCOUNT below is really the following code, run
* XXX through cpp, since the inline assembly isn't preprocessed.
*/
#define OFFSET_AT 0
#define OFFSET_V0 8
#define OFFSET_T0 16
#define OFFSET_T1 24
#define OFFSET_T2 32
#define OFFSET_T3 40
#define OFFSET_T4 48
#define OFFSET_T5 56
#define OFFSET_T6 64
#define OFFSET_T7 72
#define OFFSET_S6 80
#define OFFSET_A0 88
#define OFFSET_A1 96
#define OFFSET_A2 104
#define OFFSET_A3 112
#define OFFSET_A4 120
#define OFFSET_A5 128
#define OFFSET_T8 136
#define OFFSET_T9 144
#define OFFSET_T10 152
#define OFFSET_T11 160
#define OFFSET_RA 168
#define OFFSET_T12 176
#define OFFSET_GP 184
#define FRAME_SIZE 192
LEAF(_mcount,0) /* XXX */
.set noat
.set noreorder
lda sp, -FRAME_SIZE(sp)
stq at_reg, OFFSET_AT(sp)
stq v0, OFFSET_V0(sp)
stq t0, OFFSET_T0(sp)
stq t1, OFFSET_T1(sp)
stq t2, OFFSET_T2(sp)
stq t3, OFFSET_T3(sp)
stq t4, OFFSET_T4(sp)
stq t5, OFFSET_T5(sp)
stq t6, OFFSET_T6(sp)
stq t7, OFFSET_T7(sp)
stq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */
stq a0, OFFSET_A0(sp)
stq a1, OFFSET_A1(sp)
stq a2, OFFSET_A2(sp)
stq a3, OFFSET_A3(sp)
stq a4, OFFSET_A4(sp)
stq a5, OFFSET_A5(sp)
stq t8, OFFSET_T8(sp)
stq t9, OFFSET_T9(sp)
stq t10, OFFSET_T10(sp)
stq t11, OFFSET_T11(sp)
stq ra, OFFSET_RA(sp)
stq t12, OFFSET_T12(sp)
stq gp, OFFSET_GP(sp)
br pv, LX99
LX99: SETGP(pv)
mov ra, a0
mov at_reg, a1
CALL(mcount)
ldq v0, OFFSET_V0(sp)
ldq t0, OFFSET_T0(sp)
ldq t1, OFFSET_T1(sp)
ldq t2, OFFSET_T2(sp)
ldq t3, OFFSET_T3(sp)
ldq t4, OFFSET_T4(sp)
ldq t5, OFFSET_T5(sp)
ldq t6, OFFSET_T6(sp)
ldq t7, OFFSET_T7(sp)
ldq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */
ldq a0, OFFSET_A0(sp)
ldq a1, OFFSET_A1(sp)
ldq a2, OFFSET_A2(sp)
ldq a3, OFFSET_A3(sp)
ldq a4, OFFSET_A4(sp)
ldq a5, OFFSET_A5(sp)
ldq t8, OFFSET_T8(sp)
ldq t9, OFFSET_T9(sp)
ldq t10, OFFSET_T10(sp)
ldq t11, OFFSET_T11(sp)
ldq ra, OFFSET_RA(sp)
stq t12, OFFSET_T12(sp)
ldq gp, OFFSET_GP(sp)
ldq at_reg, OFFSET_AT(sp)
lda sp, FRAME_SIZE(sp)
ret zero, (at_reg), 1
END(_mcount)
#endif /* 0 */
#define MCOUNT __asm (" \
.globl _mcount; \
.ent _mcount 0; \
_mcount:; \
.frame $30,0,$26; \
.set noat; \
.set noreorder; \
\
lda $30, -192($30); \
\
stq $28, 0($30); \
stq $0, 8($30); \
stq $1, 16($30); \
stq $2, 24($30); \
stq $3, 32($30); \
stq $4, 40($30); \
stq $5, 48($30); \
stq $6, 56($30); \
stq $7, 64($30); \
stq $8, 72($30); \
stq $15, 80($30); \
stq $16, 88($30); \
stq $17, 96($30); \
stq $18, 104($30); \
stq $19, 112($30); \
stq $20, 120($30); \
stq $21, 128($30); \
stq $22, 136($30); \
stq $23, 144($30); \
stq $24, 152($30); \
stq $25, 160($30); \
stq $26, 168($30); \
stq $27, 176($30); \
stq $29, 184($30); \
\
br $27, LX98; \
LX98: ldgp $29,0($27); \
mov $26, $16; \
mov $28, $17; \
jsr $26,mcount; \
ldgp $29,0($26); \
\
ldq $0, 8($30); \
ldq $1, 16($30); \
ldq $2, 24($30); \
ldq $3, 32($30); \
ldq $4, 40($30); \
ldq $5, 48($30); \
ldq $6, 56($30); \
ldq $7, 64($30); \
ldq $8, 72($30); \
ldq $15, 80($30); \
ldq $16, 88($30); \
ldq $17, 96($30); \
ldq $18, 104($30); \
ldq $19, 112($30); \
ldq $20, 120($30); \
ldq $21, 128($30); \
ldq $22, 136($30); \
ldq $23, 144($30); \
ldq $24, 152($30); \
ldq $25, 160($30); \
ldq $26, 168($30); \
ldq $27, 176($30); \
ldq $29, 184($30); \
\
ldq $28, 0($30); \
\
lda $30, 192($30); \
ret $31, ($28), 1; \
\
.end _mcount");
#ifdef _KERNEL
/*
* The following two macros do splhigh and splx respectively.
* _alpha_pal_swpipl is a special version of alpha_pal_swpipl which
* doesn't include profiling support.
*
* XXX These macros should probably use inline assembly.
*/
#define MCOUNT_ENTER(s) \
s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH)
#define MCOUNT_EXIT(s) \
(void)_alpha_pal_swpipl(s);
#define MCOUNT_DECL(s) u_long s;
#ifdef GUPROF
struct gmonparam;
void nullfunc_loop_profiled __P((void));
void nullfunc_profiled __P((void));
void startguprof __P((struct gmonparam *p));
void stopguprof __P((struct gmonparam *p));
#else
#define startguprof(p)
#define stopguprof(p)
#endif /* GUPROF */
#else /* !_KERNEL */
typedef u_long uintfptr_t;
#endif