Annotation of sys/arch/alpha/include/profile.h, Revision 1.1.1.1
1.1 nbrk 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
CVSweb