profile.h revision 66458
1/* $FreeBSD: head/sys/ia64/include/profile.h 66458 2000-09-29 13:46:07Z dfr $ */ 2/* From: NetBSD: profile.h,v 1.9 1997/04/06 08:47:37 cgd Exp */ 3 4/* 5 * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. 6 * All rights reserved. 7 * 8 * Author: Chris G. Demetriou 9 * 10 * Permission to use, copy, modify and distribute this software and 11 * its documentation is hereby granted, provided that both the copyright 12 * notice and this permission notice appear in all copies of the 13 * software, derivative works or modified versions, and any portions 14 * thereof, and that both notices appear in supporting documentation. 15 * 16 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 17 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 18 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 19 * 20 * Carnegie Mellon requests users of this software to return to 21 * 22 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 23 * School of Computer Science 24 * Carnegie Mellon University 25 * Pittsburgh PA 15213-3890 26 * 27 * any improvements or extensions that they make and grant Carnegie the 28 * rights to redistribute these changes. 29 */ 30 31#define _MCOUNT_DECL void mcount 32 33#define FUNCTION_ALIGNMENT 32 34 35typedef u_long fptrdiff_t; 36 37#if 0 38/* 39 * XXX The definition of MCOUNT below is really the following code, run 40 * XXX through cpp, since the inline assembly isn't preprocessed. 41 */ 42#define OFFSET_AT 0 43#define OFFSET_V0 8 44#define OFFSET_T0 16 45#define OFFSET_T1 24 46#define OFFSET_T2 32 47#define OFFSET_T3 40 48#define OFFSET_T4 48 49#define OFFSET_T5 56 50#define OFFSET_T6 64 51#define OFFSET_T7 72 52#define OFFSET_S6 80 53#define OFFSET_A0 88 54#define OFFSET_A1 96 55#define OFFSET_A2 104 56#define OFFSET_A3 112 57#define OFFSET_A4 120 58#define OFFSET_A5 128 59#define OFFSET_T8 136 60#define OFFSET_T9 144 61#define OFFSET_T10 152 62#define OFFSET_T11 160 63#define OFFSET_RA 168 64#define OFFSET_T12 176 65#define OFFSET_GP 184 66#define FRAME_SIZE 192 67 68LEAF(_mcount,0) /* XXX */ 69 .set noat 70 .set noreorder 71 72 lda sp, -FRAME_SIZE(sp) 73 74 stq at_reg, OFFSET_AT(sp) 75 stq v0, OFFSET_V0(sp) 76 stq t0, OFFSET_T0(sp) 77 stq t1, OFFSET_T1(sp) 78 stq t2, OFFSET_T2(sp) 79 stq t3, OFFSET_T3(sp) 80 stq t4, OFFSET_T4(sp) 81 stq t5, OFFSET_T5(sp) 82 stq t6, OFFSET_T6(sp) 83 stq t7, OFFSET_T7(sp) 84 stq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */ 85 stq a0, OFFSET_A0(sp) 86 stq a1, OFFSET_A1(sp) 87 stq a2, OFFSET_A2(sp) 88 stq a3, OFFSET_A3(sp) 89 stq a4, OFFSET_A4(sp) 90 stq a5, OFFSET_A5(sp) 91 stq t8, OFFSET_T8(sp) 92 stq t9, OFFSET_T9(sp) 93 stq t10, OFFSET_T10(sp) 94 stq t11, OFFSET_T11(sp) 95 stq ra, OFFSET_RA(sp) 96 stq t12, OFFSET_T12(sp) 97 stq gp, OFFSET_GP(sp) 98 99 br pv, LX99 100LX99: SETGP(pv) 101 mov ra, a0 102 mov at_reg, a1 103 CALL(mcount) 104 105 ldq v0, OFFSET_V0(sp) 106 ldq t0, OFFSET_T0(sp) 107 ldq t1, OFFSET_T1(sp) 108 ldq t2, OFFSET_T2(sp) 109 ldq t3, OFFSET_T3(sp) 110 ldq t4, OFFSET_T4(sp) 111 ldq t5, OFFSET_T5(sp) 112 ldq t6, OFFSET_T6(sp) 113 ldq t7, OFFSET_T7(sp) 114 ldq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */ 115 ldq a0, OFFSET_A0(sp) 116 ldq a1, OFFSET_A1(sp) 117 ldq a2, OFFSET_A2(sp) 118 ldq a3, OFFSET_A3(sp) 119 ldq a4, OFFSET_A4(sp) 120 ldq a5, OFFSET_A5(sp) 121 ldq t8, OFFSET_T8(sp) 122 ldq t9, OFFSET_T9(sp) 123 ldq t10, OFFSET_T10(sp) 124 ldq t11, OFFSET_T11(sp) 125 ldq ra, OFFSET_RA(sp) 126 stq t12, OFFSET_T12(sp) 127 ldq gp, OFFSET_GP(sp) 128 129 ldq at_reg, OFFSET_AT(sp) 130 131 lda sp, FRAME_SIZE(sp) 132 ret zero, (at_reg), 1 133 134 END(_mcount) 135#endif /* 0 */ 136 137#define MCOUNT __asm (" \ 138 .globl _mcount; \ 139 .ent _mcount 0; \ 140_mcount:; \ 141 .frame $30,0,$26; \ 142 .set noat; \ 143 .set noreorder; \ 144 \ 145 lda $30, -192($30); \ 146 \ 147 stq $28, 0($30); \ 148 stq $0, 8($30); \ 149 stq $1, 16($30); \ 150 stq $2, 24($30); \ 151 stq $3, 32($30); \ 152 stq $4, 40($30); \ 153 stq $5, 48($30); \ 154 stq $6, 56($30); \ 155 stq $7, 64($30); \ 156 stq $8, 72($30); \ 157 stq $15, 80($30); \ 158 stq $16, 88($30); \ 159 stq $17, 96($30); \ 160 stq $18, 104($30); \ 161 stq $19, 112($30); \ 162 stq $20, 120($30); \ 163 stq $21, 128($30); \ 164 stq $22, 136($30); \ 165 stq $23, 144($30); \ 166 stq $24, 152($30); \ 167 stq $25, 160($30); \ 168 stq $26, 168($30); \ 169 stq $27, 176($30); \ 170 stq $29, 184($30); \ 171 \ 172 br $27, LX98; \ 173LX98: ldgp $29,0($27); \ 174 mov $26, $16; \ 175 mov $28, $17; \ 176 jsr $26,mcount; \ 177 ldgp $29,0($26); \ 178 \ 179 ldq $0, 8($30); \ 180 ldq $1, 16($30); \ 181 ldq $2, 24($30); \ 182 ldq $3, 32($30); \ 183 ldq $4, 40($30); \ 184 ldq $5, 48($30); \ 185 ldq $6, 56($30); \ 186 ldq $7, 64($30); \ 187 ldq $8, 72($30); \ 188 ldq $15, 80($30); \ 189 ldq $16, 88($30); \ 190 ldq $17, 96($30); \ 191 ldq $18, 104($30); \ 192 ldq $19, 112($30); \ 193 ldq $20, 120($30); \ 194 ldq $21, 128($30); \ 195 ldq $22, 136($30); \ 196 ldq $23, 144($30); \ 197 ldq $24, 152($30); \ 198 ldq $25, 160($30); \ 199 ldq $26, 168($30); \ 200 ldq $27, 176($30); \ 201 ldq $29, 184($30); \ 202 \ 203 ldq $28, 0($30); \ 204 \ 205 lda $30, 192($30); \ 206 ret $31, ($28), 1; \ 207 \ 208 .end _mcount"); 209 210#ifdef _KERNEL 211/* 212 * The following two macros do splhigh and splx respectively. 213 * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which 214 * doesn't include profiling support. 215 * 216 * XXX These macros should probably use inline assembly. 217 */ 218#define MCOUNT_ENTER(s) \ 219 s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH) 220#define MCOUNT_EXIT(s) \ 221 (void)_alpha_pal_swpipl(s); 222#define MCOUNT_DECL(s) u_long s; 223#ifdef GUPROF 224struct gmonparam; 225 226void nullfunc_loop_profiled __P((void)); 227void nullfunc_profiled __P((void)); 228void startguprof __P((struct gmonparam *p)); 229void stopguprof __P((struct gmonparam *p)); 230#else 231#define startguprof(p) 232#define stopguprof(p) 233#endif /* GUPROF */ 234 235#else /* !_KERNEL */ 236typedef u_long uintfptr_t; 237#endif 238