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