uwx_trace.h revision 115013
1/*
2 * Copyright (c) 2002,2003 Hewlett-Packard Company
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 */
22
23#define UWX_TRACE_SB		1	/* UWX_TRACE=b: scoreboard mgmt */
24#define UWX_TRACE_UINFO		2	/* UWX_TRACE=i: unwind info */
25#define UWX_TRACE_RSTATE	4	/* UWX_TRACE=r: reg state vector */
26#define UWX_TRACE_STEP		8	/* UWX_TRACE=s: step */
27#define UWX_TRACE_UTABLE	16	/* UWX_TRACE=t: unwind tbl search */
28#define UWX_TRACE_CONTEXT	32	/* UWX_TRACE=c: context */
29#define UWX_TRACE_COPYIN	64	/* UWX_TRACE=C: copyin callback */
30#define UWX_TRACE_LOOKUPIP	128	/* UWX_TRACE=L: lookupip callback */
31
32#ifdef DISABLE_TRACE
33
34#define TRACE_INIT
35#define TRACE_B_REUSE(id)
36#define TRACE_B_ALLOC(id)
37#define TRACE_B_POP(id)
38#define TRACE_B_LABEL(label)
39#define TRACE_B_LABEL_COPY(id)
40#define TRACE_B_LABEL_REVERSE(back, new)
41#define TRACE_B_COPY(label, id)
42#define TRACE_B_COPY_FREE(id)
43#define TRACE_B_COPY_FOUND(id)
44#define TRACE_B_COPY_COPY(id)
45#define TRACE_B_COPY_REVERSE(back, new)
46#define TRACE_B_FREE(id)
47#define TRACE_I_DECODE_RHDR_1(name, b0)
48#define TRACE_I_DECODE_RHDR_1L(name, b0, val)
49#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val)
50#define TRACE_I_DECODE_PROLOGUE_1(name, b0)
51#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val)
52#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2)
53#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1)
54#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1)
55#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2)
56#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3)
57#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
58#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
59#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
60#define TRACE_I_DECODE_BODY_1(name, b0)
61#define TRACE_I_DECODE_BODY_1L(name, b0, parm1)
62#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2)
63#define TRACE_R_UIB(uentry, ulen)
64#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
65#define TRACE_S_STEP(rstate)
66#define TRACE_S_RESTORE_REG(regname, rstate, val)
67#define TRACE_S_RESTORE_GR(regid, rstate, val)
68#define TRACE_S_RESTORE_BR(regid, rstate, val)
69#define TRACE_S_RESTORE_FR(regid, rstate, val)
70#define TRACE_T_SEARCH32(ip)
71#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
72#define TRACE_C_GET_REG(regid, bsp)
73#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid)
74#define TRACE_SELF_COPYIN4(rem, len, wp)
75#define TRACE_SELF_COPYIN8(rem, len, dp)
76#define TRACE_SELF_LOOKUP(ip)
77#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base)
78
79#else /* not TRACE_DISABLED */
80
81extern void uwx_trace_init(struct uwx_env *env);
82
83extern void uwx_dump_rstate(int regid, uint64_t rstate);
84
85struct uwx_rhdr;
86
87extern void uwx_dump_scoreboard(
88    struct uwx_scoreboard *scoreboard,
89    int nsbreg,
90    struct uwx_rhdr *rhdr,
91    int cur_slot,
92    int ip_slot);
93
94#define TRACE_INIT uwx_trace_init(env);
95
96#define TRACE_B_REUSE(id) \
97    if (env->trace & UWX_TRACE_SB) \
98	printf("uwx_alloc_scoreboard: reuse id %d\n", (id));
99
100#define TRACE_B_ALLOC(id) \
101    if (env->trace & UWX_TRACE_SB) \
102	printf("uwx_alloc_scoreboard: alloc id %d\n", (id));
103
104#define TRACE_B_POP(id) \
105    if (env->trace & UWX_TRACE_SB) \
106	printf("uwx_pop_scoreboards: free id %d\n", (id));
107
108#define TRACE_B_LABEL(label) \
109    if (env->trace & UWX_TRACE_SB) \
110	printf("uwx_label_scoreboard: label %d\n", (label));
111
112#define TRACE_B_LABEL_COPY(id) \
113    if (env->trace & UWX_TRACE_SB) \
114	printf("uwx_label_scoreboard: copy id %d\n", (id));
115
116#define TRACE_B_LABEL_REVERSE(back, new) \
117    if (env->trace & UWX_TRACE_SB) \
118	printf("uwx_label_scoreboard: reverse link %d -> %d\n", \
119			    (new)->id, ((back) == 0) ? -1 : (back)->id);
120
121#define TRACE_B_COPY(label, id) \
122    if (env->trace & UWX_TRACE_SB) \
123	printf("uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id));
124
125#define TRACE_B_COPY_FREE(id) \
126    if (env->trace & UWX_TRACE_SB) \
127	printf("uwx_copy_scoreboard: free id %d\n", (id));
128
129#define TRACE_B_COPY_FOUND(id) \
130    if (env->trace & UWX_TRACE_SB) \
131	printf("uwx_copy_scoreboard: found id %d\n", (id));
132
133#define TRACE_B_COPY_COPY(id) \
134    if (env->trace & UWX_TRACE_SB) \
135	printf("uwx_copy_scoreboard: copy id %d\n", (id));
136
137#define TRACE_B_COPY_REVERSE(back, new) \
138    if (env->trace & UWX_TRACE_SB) \
139	printf("uwx_copy_scoreboard: reverse link %d -> %d\n", \
140			    (new)->id, ((back) == 0) ? -1 : (back)->id);
141
142#define TRACE_B_FREE(id) \
143    if (env->trace & UWX_TRACE_SB) \
144	printf("uwx_free_scoreboards: free id %d\n", (id));
145
146#define TRACE_I_DECODE_RHDR_1(name, b0) \
147    if (env->trace & UWX_TRACE_UINFO) \
148	printf("uwx_decode_rhdr:     %02x                   %s\n", \
149			(b0), (name));
150
151#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \
152    if (env->trace & UWX_TRACE_UINFO) \
153	printf("uwx_decode_rhdr:     %02x %08x          %s\n", \
154			(b0), (int)(val), (name));
155
156#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \
157    if (env->trace & UWX_TRACE_UINFO) \
158	printf("uwx_decode_rhdr:     %02x %02x %08x       %s\n", \
159			(b0), (b1), (int)(val), (name));
160
161#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \
162    if (env->trace & UWX_TRACE_UINFO) \
163	printf("uwx_decode_prologue: %02x                   %s\n", \
164			(b0), (name));
165
166#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \
167    if (env->trace & UWX_TRACE_UINFO) \
168	printf("uwx_decode_prologue: %02x %08x          %s\n", \
169			(b0), (int)(val), (name));
170
171#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \
172    if (env->trace & UWX_TRACE_UINFO) \
173	printf("uwx_decode_prologue: %02x %08x %08x %s\n", \
174			(b0), (int)(val1), (int)(val2), (name));
175
176#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \
177    if (env->trace & UWX_TRACE_UINFO) \
178	printf("uwx_decode_prologue: %02x %02x                %s\n", \
179			(b0), (b1), (name));
180
181#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \
182    if (env->trace & UWX_TRACE_UINFO) \
183	printf("uwx_decode_prologue: %02x %02x %08x       %s\n", \
184			(b0), (b1), (int)(val), (name));
185
186#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \
187    if (env->trace & UWX_TRACE_UINFO) \
188	printf("uwx_decode_prologue: %02x %02x %02x             %s\n", \
189			(b0), (b1), (b2), (name));
190
191#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \
192    if (env->trace & UWX_TRACE_UINFO) \
193	printf("uwx_decode_prologue: %02x %02x %02x %02x          %s\n", \
194			(b0), (b1), (b2), (b3), (name));
195
196#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \
197    if (env->trace & UWX_TRACE_UINFO) \
198	printf("uwx_decode_prologue: spill base = %08x\n", (int)(spill_base));
199
200#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \
201    if (env->trace & UWX_TRACE_UINFO) \
202	printf("uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \
203			(gr_mem_mask), (gr_gr_mask));
204
205#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \
206    if (env->trace & UWX_TRACE_UINFO) \
207	printf("uwx_decode_prologue: ngr = %d\n", (ngr));
208
209#define TRACE_I_DECODE_BODY_1(name, b0) \
210    if (env->trace & UWX_TRACE_UINFO) \
211	printf("uwx_decode_body:     %02x                   %s\n", \
212			(b0), (name));
213
214#define TRACE_I_DECODE_BODY_1L(name, b0, val) \
215    if (env->trace & UWX_TRACE_UINFO) \
216	printf("uwx_decode_body:     %02x %08x          %s\n", \
217			(b0), (int)(val), (name));
218
219#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \
220    if (env->trace & UWX_TRACE_UINFO) \
221	printf("uwx_decode_body:     %02x %08x %08x %s\n", \
222			(b0), (int)(val1), (int)(val2), (name));
223
224#define TRACE_R_UIB(uentry, ulen) \
225    if (env->trace & UWX_TRACE_RSTATE) \
226	printf("Unwind info block (flags = %08x %08x, ulen = %d)\n", \
227		    (unsigned int)((uentry)->unwind_flags >> 32), \
228		    (unsigned int)(uentry)->unwind_flags, \
229		    (ulen));
230
231#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \
232    if (env->trace & UWX_TRACE_RSTATE) \
233	uwx_dump_scoreboard(scoreboard, env->nsbreg, \
234				&(rhdr), cur_slot, ip_slot);
235
236#define TRACE_S_STEP(rstate) \
237    if (env->trace & UWX_TRACE_STEP) { \
238	printf("uwx_step:\n"); \
239	uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \
240	uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \
241	uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \
242    }
243
244#define TRACE_S_RESTORE_REG(regname, rstate, val) \
245    if (env->trace & UWX_TRACE_STEP) \
246	printf("  restore %-7s (rstate = %08x %08x) = %08x %08x\n", \
247			regname, \
248			(unsigned int) ((rstate) >> 32), \
249			(unsigned int) (rstate), \
250			(unsigned int) ((val) >> 32), \
251			(unsigned int) (val));
252
253#define TRACE_S_RESTORE_GR(regid, rstate, val) \
254    if (env->trace & UWX_TRACE_STEP) \
255	printf("  restore GR%d     (rstate = %08x %08x) = %08x %08x\n", \
256			(regid) + 4, \
257			(unsigned int) ((rstate) >> 32), \
258			(unsigned int) (rstate), \
259			(unsigned int) ((val) >> 32), \
260			(unsigned int) (val));
261
262#define TRACE_S_RESTORE_BR(regid, rstate, val) \
263    if (env->trace & UWX_TRACE_STEP) \
264	printf("  restore BR%d     (rstate = %08x %08x) = %08x %08x\n", \
265			(regid) + 1, \
266			(unsigned int) ((rstate) >> 32), \
267			(unsigned int) (rstate), \
268			(unsigned int) ((val) >> 32), \
269			(unsigned int) (val));
270
271#define TRACE_S_RESTORE_FR(regid, rstate, fval) \
272    if (env->trace & UWX_TRACE_STEP) \
273	printf("  restore FR%d     (rstate = %08x %08x) = %08x %08x %08x %08x\n", \
274			(regid) + 1, \
275			(unsigned int) ((rstate) >> 32), \
276			(unsigned int) (rstate), \
277			(unsigned int) ((fval[0]) >> 32), \
278			(unsigned int) (fval[0]), \
279			(unsigned int) ((fval[1]) >> 32), \
280			(unsigned int) (fval[1]));
281
282#define TRACE_T_SEARCH32(ip) \
283    if (env->trace & UWX_TRACE_UTABLE) \
284	printf("uwx_search_utable32 (relative ip = %08x)\n", (ip));
285
286#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \
287    if (env->trace & UWX_TRACE_UTABLE) \
288	printf("    lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \
289			    lb, ub, mid, code_start, code_end);
290
291#define TRACE_C_GET_REG(regid, bsp) \
292	if (env->trace & UWX_TRACE_CONTEXT) \
293	    printf("uwx_get_reg (gr%d, bsp = %08x %08x)\n", \
294			(regid) - UWX_REG_GR(0), \
295			(unsigned int) ((bsp) >> 32), \
296			(unsigned int) (bsp));
297
298#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \
299	if (env->trace & UWX_TRACE_CONTEXT) \
300	    printf("uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \
301			(regid) + 32, \
302			(sor), \
303			(rrb_gr), \
304			(newregid) + 32);
305
306#define TRACE_SELF_COPYIN4(rem, len, wp) \
307    if (info->trace & UWX_TRACE_COPYIN) \
308	printf("copyin (rem = %08x %08x, len = %d, val = %08x)\n", \
309			(unsigned int) ((rem) >> 32), \
310			(unsigned int) (rem), \
311			(len), *(wp));
312
313#define TRACE_SELF_COPYIN8(rem, len, dp) \
314    if (info->trace & UWX_TRACE_COPYIN) \
315	printf("copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \
316			(unsigned int) ((rem) >> 32), \
317			(unsigned int) (rem), \
318			(len), \
319			((unsigned int *)(dp))[0], \
320			((unsigned int *)(dp))[1]);
321
322#define TRACE_SELF_LOOKUP(ip) \
323    if (info->trace & UWX_TRACE_LOOKUPIP) \
324	printf("Lookup IP callback: ip = %08x %08x\n", \
325			(unsigned int) ((ip) >> 32), \
326			(unsigned int) (ip));
327
328#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) \
329	if (info->trace & UWX_TRACE_LOOKUPIP) { \
330	    printf("  text base:    %08x %08x\n", \
331			(unsigned int) ((text_base) >> 32), \
332			(unsigned int) (text_base)); \
333	    printf("  unwind base:  %08x %08x\n", \
334			(unsigned int) ((uint64_t)(unwind_base) >> 32), \
335			(unsigned int) (unwind_base)); \
336	    printf("  unwind flags: %08x %08x\n", \
337			(unsigned int) ((unwind_base)[0] >> 32), \
338			(unsigned int) (unwind_base)[0]); \
339	    printf("  unwind start: %08x %08x\n", \
340			(unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \
341			(unsigned int) ((text_base)+(unwind_base)[1])); \
342	    printf("  unwind end:   %08x %08x\n", \
343			(unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \
344			(unsigned int) ((text_base)+(unwind_base)[2])); \
345	}
346
347#endif /* TRACE_DISABLED */
348
349