1 /* $OpenBSD: profile.h,v 1.5 1997/01/24 19:57:17 niklas Exp $ */ 2 /* $NetBSD: profile.h,v 1.7 1996/11/13 22:21:01 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 #if 0 34 /* 35 * XXX The definition of MCOUNT below is really the following code, run 36 * XXX through cpp, since the inline assembly isn't preprocessed. 37 */ 38 #define OFFSET_AT 0 39 #define OFFSET_V0 8 40 #define OFFSET_T0 16 41 #define OFFSET_T1 24 42 #define OFFSET_T2 32 43 #define OFFSET_T3 40 44 #define OFFSET_T4 48 45 #define OFFSET_T5 56 46 #define OFFSET_T6 64 47 #define OFFSET_T7 72 48 #define OFFSET_S6 80 49 #define OFFSET_A0 88 50 #define OFFSET_A1 96 51 #define OFFSET_A2 104 52 #define OFFSET_A3 112 53 #define OFFSET_A4 120 54 #define OFFSET_A5 128 55 #define OFFSET_T8 136 56 #define OFFSET_T9 144 57 #define OFFSET_T10 152 58 #define OFFSET_T11 160 59 #define OFFSET_RA 168 60 #define OFFSET_T12 176 61 #define OFFSET_GP 184 62 #define FRAME_SIZE 192 63 64 LEAF(_mcount,0) /* XXX */ 65 .set noat 66 .set noreorder 67 68 lda sp, -FRAME_SIZE(sp) 69 70 stq at_reg, OFFSET_AT(sp) 71 stq v0, OFFSET_V0(sp) 72 stq t0, OFFSET_T0(sp) 73 stq t1, OFFSET_T1(sp) 74 stq t2, OFFSET_T2(sp) 75 stq t3, OFFSET_T3(sp) 76 stq t4, OFFSET_T4(sp) 77 stq t5, OFFSET_T5(sp) 78 stq t6, OFFSET_T6(sp) 79 stq t7, OFFSET_T7(sp) 80 stq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */ 81 stq a0, OFFSET_A0(sp) 82 stq a1, OFFSET_A1(sp) 83 stq a2, OFFSET_A2(sp) 84 stq a3, OFFSET_A3(sp) 85 stq a4, OFFSET_A4(sp) 86 stq a5, OFFSET_A5(sp) 87 stq t8, OFFSET_T8(sp) 88 stq t9, OFFSET_T9(sp) 89 stq t10, OFFSET_T10(sp) 90 stq t11, OFFSET_T11(sp) 91 stq ra, OFFSET_RA(sp) 92 stq t12, OFFSET_T12(sp) 93 stq gp, OFFSET_GP(sp) 94 95 br pv, LX99 96 LX99: SETGP(pv) 97 mov ra, a0 98 mov at_reg, a1 99 CALL(mcount) 100 101 ldq v0, OFFSET_V0(sp) 102 ldq t0, OFFSET_T0(sp) 103 ldq t1, OFFSET_T1(sp) 104 ldq t2, OFFSET_T2(sp) 105 ldq t3, OFFSET_T3(sp) 106 ldq t4, OFFSET_T4(sp) 107 ldq t5, OFFSET_T5(sp) 108 ldq t6, OFFSET_T6(sp) 109 ldq t7, OFFSET_T7(sp) 110 ldq s6, OFFSET_S6(sp) /* XXX because run _after_ prologue. */ 111 ldq a0, OFFSET_A0(sp) 112 ldq a1, OFFSET_A1(sp) 113 ldq a2, OFFSET_A2(sp) 114 ldq a3, OFFSET_A3(sp) 115 ldq a4, OFFSET_A4(sp) 116 ldq a5, OFFSET_A5(sp) 117 ldq t8, OFFSET_T8(sp) 118 ldq t9, OFFSET_T9(sp) 119 ldq t10, OFFSET_T10(sp) 120 ldq t11, OFFSET_T11(sp) 121 ldq ra, OFFSET_RA(sp) 122 stq t12, OFFSET_T12(sp) 123 ldq gp, OFFSET_GP(sp) 124 125 ldq at_reg, OFFSET_AT(sp) 126 127 lda sp, FRAME_SIZE(sp) 128 ret zero, (at_reg), 1 129 130 END(_mcount) 131 #endif /* 0 */ 132 133 #define MCOUNT asm(" \ 134 .globl _mcount; \ 135 .ent _mcount 0; \ 136 _mcount:; \ 137 .frame $30,0,$26; \ 138 .set noat; \ 139 .set noreorder; \ 140 \ 141 lda $30, -192($30); \ 142 \ 143 stq $28, 0($30); \ 144 stq $0, 8($30); \ 145 stq $1, 16($30); \ 146 stq $2, 24($30); \ 147 stq $3, 32($30); \ 148 stq $4, 40($30); \ 149 stq $5, 48($30); \ 150 stq $6, 56($30); \ 151 stq $7, 64($30); \ 152 stq $8, 72($30); \ 153 stq $15, 80($30); \ 154 stq $16, 88($30); \ 155 stq $17, 96($30); \ 156 stq $18, 104($30); \ 157 stq $19, 112($30); \ 158 stq $20, 120($30); \ 159 stq $21, 128($30); \ 160 stq $22, 136($30); \ 161 stq $23, 144($30); \ 162 stq $24, 152($30); \ 163 stq $25, 160($30); \ 164 stq $26, 168($30); \ 165 stq $27, 176($30); \ 166 stq $29, 184($30); \ 167 \ 168 br $27, LX98; \ 169 LX98: ldgp $29,0($27); \ 170 mov $26, $16; \ 171 mov $28, $17; \ 172 jsr $26,mcount; \ 173 ldgp $29,0($26); \ 174 \ 175 ldq $0, 8($30); \ 176 ldq $1, 16($30); \ 177 ldq $2, 24($30); \ 178 ldq $3, 32($30); \ 179 ldq $4, 40($30); \ 180 ldq $5, 48($30); \ 181 ldq $6, 56($30); \ 182 ldq $7, 64($30); \ 183 ldq $8, 72($30); \ 184 ldq $15, 80($30); \ 185 ldq $16, 88($30); \ 186 ldq $17, 96($30); \ 187 ldq $18, 104($30); \ 188 ldq $19, 112($30); \ 189 ldq $20, 120($30); \ 190 ldq $21, 128($30); \ 191 ldq $22, 136($30); \ 192 ldq $23, 144($30); \ 193 ldq $24, 152($30); \ 194 ldq $25, 160($30); \ 195 ldq $25, 160($30); \ 196 ldq $26, 168($30); \ 197 ldq $27, 176($30); \ 198 ldq $29, 184($30); \ 199 \ 200 lda $30, 192($30); \ 201 ret $31, ($28), 1; \ 202 \ 203 .end _mcount"); 204 205 #ifdef _KERNEL 206 /* 207 * The following two macros do splhigh and splx respectively. 208 * _alpha_pal_swpipl is a special version of alpha_pal_swpipl which 209 * doesn't include profiling support. 210 * 211 * XXX These macros should probably use inline assembly. 212 */ 213 #define MCOUNT_ENTER \ 214 s = _alpha_pal_swpipl(ALPHA_PSL_IPL_HIGH) 215 #define MCOUNT_EXIT \ 216 (void)_alpha_pal_swpipl(s); 217 #endif 218