profile.h revision 1.5
1/* $NetBSD: profile.h,v 1.5 1996/08/21 15:53:26 cgd Exp $ */ 2 3/* 4 * Copyright (c) 1994, 1995 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, 1f 951: 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 gp, OFFSET_GP(sp) 121 ldq ra, OFFSET_RA(sp) 122 123 ldq at_reg, OFFSET_AT(sp) 124 125 lda sp, FRAME_SIZE(sp) 126 ret zero, (at_reg), 1 127 128 END(_mcount) 129#endif /* 0 */ 130 131#define MCOUNT asm(" \ 132 .globl _mcount; \ 133 .ent _mcount 0; \ 134_mcount:; \ 135 .frame $30,0,$26; \ 136 .set noat; \ 137 .set noreorder; \ 138 \ 139 lda $30, -192($30); \ 140 \ 141 stq $28, 0($30); \ 142 stq $0, 8($30); \ 143 stq $1, 16($30); \ 144 stq $2, 24($30); \ 145 stq $3, 32($30); \ 146 stq $4, 40($30); \ 147 stq $5, 48($30); \ 148 stq $6, 56($30); \ 149 stq $7, 64($30); \ 150 stq $8, 72($30); \ 151 stq $15, 80($30); \ 152 stq $16, 88($30); \ 153 stq $17, 96($30); \ 154 stq $18, 104($30); \ 155 stq $19, 112($30); \ 156 stq $20, 120($30); \ 157 stq $21, 128($30); \ 158 stq $22, 136($30); \ 159 stq $23, 144($30); \ 160 stq $24, 152($30); \ 161 stq $25, 160($30); \ 162 stq $26, 168($30); \ 163 stq $27, 176($30); \ 164 stq $29, 184($30); \ 165 \ 166 br $27, 1f; \ 1671: ldgp $29,0($27); \ 168 mov $26, $16; \ 169 mov $28, $17; \ 170 jsr $26,mcount; \ 171 ldgp $29,0($26); \ 172 \ 173 ldq $0, 8($30); \ 174 ldq $1, 16($30); \ 175 ldq $2, 24($30); \ 176 ldq $3, 32($30); \ 177 ldq $4, 40($30); \ 178 ldq $5, 48($30); \ 179 ldq $6, 56($30); \ 180 ldq $7, 64($30); \ 181 ldq $8, 72($30); \ 182 ldq $15, 80($30); \ 183 ldq $16, 88($30); \ 184 ldq $17, 96($30); \ 185 ldq $18, 104($30); \ 186 ldq $19, 112($30); \ 187 ldq $20, 120($30); \ 188 ldq $21, 128($30); \ 189 ldq $22, 136($30); \ 190 ldq $23, 144($30); \ 191 ldq $24, 152($30); \ 192 ldq $25, 160($30); \ 193 ldq $29, 184($30); \ 194 ldq $26, 168($30); \ 195 \ 196 ldq $28, 0($30); \ 197 \ 198 lda $30, 192($30); \ 199 ret $31, ($28), 1; \ 200 \ 201 .end _mcount"); 202 203#ifdef _KERNEL 204/* 205 * The following two macros do splhigh and splx respectively. 206 * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which 207 * doesn't include profiling support. 208 * 209 * XXX These macros should probably use inline assembly. 210 */ 211#define MCOUNT_ENTER \ 212 s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH) 213#define MCOUNT_EXIT \ 214 (void)_alpha_pal_swpipl(s); 215#endif 216