uwx_trace.h revision 120925
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 UWX_TRACE_ENABLE
33
34extern void uwx_trace_init(struct uwx_env *env);
35
36extern void uwx_dump_rstate(int regid, uint64_t rstate);
37
38struct uwx_rhdr;
39
40extern void uwx_dump_scoreboard(
41    struct uwx_scoreboard *scoreboard,
42    int nsbreg,
43    struct uwx_rhdr *rhdr,
44    int cur_slot,
45    int ip_slot);
46
47#define TRACE_INIT uwx_trace_init(env);
48
49#define TRACE_B_REUSE(id) \
50    if (env->trace & UWX_TRACE_SB) \
51	printf("uwx_alloc_scoreboard: reuse id %d\n", (id));
52
53#define TRACE_B_ALLOC(id) \
54    if (env->trace & UWX_TRACE_SB) \
55	printf("uwx_alloc_scoreboard: alloc id %d\n", (id));
56
57#define TRACE_B_POP(id) \
58    if (env->trace & UWX_TRACE_SB) \
59	printf("uwx_pop_scoreboards: free id %d\n", (id));
60
61#define TRACE_B_LABEL(label) \
62    if (env->trace & UWX_TRACE_SB) \
63	printf("uwx_label_scoreboard: label %d\n", (label));
64
65#define TRACE_B_LABEL_COPY(id) \
66    if (env->trace & UWX_TRACE_SB) \
67	printf("uwx_label_scoreboard: copy id %d\n", (id));
68
69#define TRACE_B_LABEL_REVERSE(back, new) \
70    if (env->trace & UWX_TRACE_SB) \
71	printf("uwx_label_scoreboard: reverse link %d -> %d\n", \
72			    (new)->id, ((back) == 0) ? -1 : (back)->id);
73
74#define TRACE_B_COPY(label, id) \
75    if (env->trace & UWX_TRACE_SB) \
76	printf("uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id));
77
78#define TRACE_B_COPY_FREE(id) \
79    if (env->trace & UWX_TRACE_SB) \
80	printf("uwx_copy_scoreboard: free id %d\n", (id));
81
82#define TRACE_B_COPY_FOUND(id) \
83    if (env->trace & UWX_TRACE_SB) \
84	printf("uwx_copy_scoreboard: found id %d\n", (id));
85
86#define TRACE_B_COPY_COPY(id) \
87    if (env->trace & UWX_TRACE_SB) \
88	printf("uwx_copy_scoreboard: copy id %d\n", (id));
89
90#define TRACE_B_COPY_REVERSE(back, new) \
91    if (env->trace & UWX_TRACE_SB) \
92	printf("uwx_copy_scoreboard: reverse link %d -> %d\n", \
93			    (new)->id, ((back) == 0) ? -1 : (back)->id);
94
95#define TRACE_B_FREE(id) \
96    if (env->trace & UWX_TRACE_SB) \
97	printf("uwx_free_scoreboards: free id %d\n", (id));
98
99#define TRACE_I_DECODE_RHDR_1(name, b0) \
100    if (env->trace & UWX_TRACE_UINFO) \
101	printf("uwx_decode_rhdr:     %02x                   %s\n", \
102			(b0), (name));
103
104#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \
105    if (env->trace & UWX_TRACE_UINFO) \
106	printf("uwx_decode_rhdr:     %02x %08x          %s\n", \
107			(b0), (int)(val), (name));
108
109#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \
110    if (env->trace & UWX_TRACE_UINFO) \
111	printf("uwx_decode_rhdr:     %02x %02x %08x       %s\n", \
112			(b0), (b1), (int)(val), (name));
113
114#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \
115    if (env->trace & UWX_TRACE_UINFO) \
116	printf("uwx_decode_prologue: %02x                   %s\n", \
117			(b0), (name));
118
119#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \
120    if (env->trace & UWX_TRACE_UINFO) \
121	printf("uwx_decode_prologue: %02x %08x          %s\n", \
122			(b0), (int)(val), (name));
123
124#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \
125    if (env->trace & UWX_TRACE_UINFO) \
126	printf("uwx_decode_prologue: %02x %08x %08x %s\n", \
127			(b0), (int)(val1), (int)(val2), (name));
128
129#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \
130    if (env->trace & UWX_TRACE_UINFO) \
131	printf("uwx_decode_prologue: %02x %02x                %s\n", \
132			(b0), (b1), (name));
133
134#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \
135    if (env->trace & UWX_TRACE_UINFO) \
136	printf("uwx_decode_prologue: %02x %02x %08x       %s\n", \
137			(b0), (b1), (int)(val), (name));
138
139#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \
140    if (env->trace & UWX_TRACE_UINFO) \
141	printf("uwx_decode_prologue: %02x %02x %02x             %s\n", \
142			(b0), (b1), (b2), (name));
143
144#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \
145    if (env->trace & UWX_TRACE_UINFO) \
146	printf("uwx_decode_prologue: %02x %02x %02x %02x          %s\n", \
147			(b0), (b1), (b2), (b3), (name));
148
149#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \
150    if (env->trace & UWX_TRACE_UINFO) \
151	printf("uwx_decode_prologue: spill base = %08x\n", (int)(spill_base));
152
153#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \
154    if (env->trace & UWX_TRACE_UINFO) \
155	printf("uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \
156			(gr_mem_mask), (gr_gr_mask));
157
158#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \
159    if (env->trace & UWX_TRACE_UINFO) \
160	printf("uwx_decode_prologue: ngr = %d\n", (ngr));
161
162#define TRACE_I_DECODE_BODY_1(name, b0) \
163    if (env->trace & UWX_TRACE_UINFO) \
164	printf("uwx_decode_body:     %02x                   %s\n", \
165			(b0), (name));
166
167#define TRACE_I_DECODE_BODY_1L(name, b0, val) \
168    if (env->trace & UWX_TRACE_UINFO) \
169	printf("uwx_decode_body:     %02x %08x          %s\n", \
170			(b0), (int)(val), (name));
171
172#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \
173    if (env->trace & UWX_TRACE_UINFO) \
174	printf("uwx_decode_body:     %02x %08x %08x %s\n", \
175			(b0), (int)(val1), (int)(val2), (name));
176
177#define TRACE_R_UIB(uentry, ulen) \
178    if (env->trace & UWX_TRACE_RSTATE) \
179	printf("Unwind info block (flags = %08x %08x, ulen = %d)\n", \
180		    (unsigned int)((uentry)->unwind_flags >> 32), \
181		    (unsigned int)(uentry)->unwind_flags, \
182		    (ulen));
183
184#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \
185    if (env->trace & UWX_TRACE_RSTATE) \
186	uwx_dump_scoreboard(scoreboard, env->nsbreg, \
187				&(rhdr), cur_slot, ip_slot);
188
189#define TRACE_S_STEP(rstate) \
190    if (env->trace & UWX_TRACE_STEP) { \
191	printf("uwx_restore_markers:\n"); \
192	uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \
193	uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \
194	uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \
195    }
196
197#define TRACE_S_RESTORE_REG(regname, rstate, val) \
198    if (env->trace & UWX_TRACE_STEP) \
199	printf("  restore %-7s (rstate = %08x %08x) = %08x %08x\n", \
200			regname, \
201			(unsigned int) ((rstate) >> 32), \
202			(unsigned int) (rstate), \
203			(unsigned int) ((val) >> 32), \
204			(unsigned int) (val));
205
206#define TRACE_S_RESTORE_GR(regid, rstate, val) \
207    if (env->trace & UWX_TRACE_STEP) \
208	printf("  restore GR%d     (rstate = %08x %08x) = %08x %08x\n", \
209			(regid) + 4, \
210			(unsigned int) ((rstate) >> 32), \
211			(unsigned int) (rstate), \
212			(unsigned int) ((val) >> 32), \
213			(unsigned int) (val));
214
215#define TRACE_S_RESTORE_BR(regid, rstate, val) \
216    if (env->trace & UWX_TRACE_STEP) \
217	printf("  restore BR%d     (rstate = %08x %08x) = %08x %08x\n", \
218			(regid) + 1, \
219			(unsigned int) ((rstate) >> 32), \
220			(unsigned int) (rstate), \
221			(unsigned int) ((val) >> 32), \
222			(unsigned int) (val));
223
224#define TRACE_S_RESTORE_FR(regid, rstate, fval) \
225    if (env->trace & UWX_TRACE_STEP) \
226	printf("  restore FR%d     (rstate = %08x %08x) = %08x %08x %08x %08x\n", \
227			(regid) + 1, \
228			(unsigned int) ((rstate) >> 32), \
229			(unsigned int) (rstate), \
230			(unsigned int) ((fval[0]) >> 32), \
231			(unsigned int) (fval[0]), \
232			(unsigned int) ((fval[1]) >> 32), \
233			(unsigned int) (fval[1]));
234
235#define TRACE_T_SEARCH32(ip) \
236    if (env->trace & UWX_TRACE_UTABLE) \
237	printf("uwx_search_utable32 (relative ip = %08x)\n", (ip));
238
239#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \
240    if (env->trace & UWX_TRACE_UTABLE) \
241	printf("    lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \
242			    lb, ub, mid, code_start, code_end);
243
244#define TRACE_C_GET_REG(regid, bsp) \
245	if (env->trace & UWX_TRACE_CONTEXT) \
246	    printf("uwx_get_reg (gr%d, bsp = %08x %08x)\n", \
247			(regid) - UWX_REG_GR(0), \
248			(unsigned int) ((bsp) >> 32), \
249			(unsigned int) (bsp));
250
251#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \
252	if (env->trace & UWX_TRACE_CONTEXT) \
253	    printf("uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \
254			(regid) + 32, \
255			(sor), \
256			(rrb_gr), \
257			(newregid) + 32);
258
259#define TRACE_SELF_COPYIN4(rem, len, wp) \
260    if (info->trace & UWX_TRACE_COPYIN) \
261	printf("copyin (rem = %08x %08x, len = %d, val = %08x)\n", \
262			(unsigned int) ((rem) >> 32), \
263			(unsigned int) (rem), \
264			(len), *(wp));
265
266#define TRACE_SELF_COPYIN8(rem, len, dp) \
267    if (info->trace & UWX_TRACE_COPYIN) \
268	printf("copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \
269			(unsigned int) ((rem) >> 32), \
270			(unsigned int) (rem), \
271			(len), \
272			((unsigned int *)(dp))[0], \
273			((unsigned int *)(dp))[1]);
274
275#define TRACE_SELF_LOOKUP(ip) \
276    if (info->trace & UWX_TRACE_LOOKUPIP) \
277	printf("Lookup IP callback: ip = %08x %08x\n", \
278			(unsigned int) ((ip) >> 32), \
279			(unsigned int) (ip));
280
281#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) \
282	if (info->trace & UWX_TRACE_LOOKUPIP) { \
283	    printf("  text base:    %08x %08x\n", \
284			(unsigned int) ((text_base) >> 32), \
285			(unsigned int) (text_base)); \
286	    printf("  unwind base:  %08x %08x\n", \
287			(unsigned int) ((uint64_t)(unwind_base) >> 32), \
288			(unsigned int) (unwind_base)); \
289	    printf("  unwind flags: %08x %08x\n", \
290			(unsigned int) ((unwind_base)[0] >> 32), \
291			(unsigned int) (unwind_base)[0]); \
292	    printf("  unwind start: %08x %08x\n", \
293			(unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \
294			(unsigned int) ((text_base)+(unwind_base)[1])); \
295	    printf("  unwind end:   %08x %08x\n", \
296			(unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \
297			(unsigned int) ((text_base)+(unwind_base)[2])); \
298	}
299
300#else /* !UWX_TRACE_ENABLE */
301
302#define TRACE_INIT
303#define TRACE_B_REUSE(id)
304#define TRACE_B_ALLOC(id)
305#define TRACE_B_POP(id)
306#define TRACE_B_LABEL(label)
307#define TRACE_B_LABEL_COPY(id)
308#define TRACE_B_LABEL_REVERSE(back, new)
309#define TRACE_B_COPY(label, id)
310#define TRACE_B_COPY_FREE(id)
311#define TRACE_B_COPY_FOUND(id)
312#define TRACE_B_COPY_COPY(id)
313#define TRACE_B_COPY_REVERSE(back, new)
314#define TRACE_B_FREE(id)
315#define TRACE_I_DECODE_RHDR_1(name, b0)
316#define TRACE_I_DECODE_RHDR_1L(name, b0, val)
317#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val)
318#define TRACE_I_DECODE_PROLOGUE_1(name, b0)
319#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val)
320#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2)
321#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1)
322#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1)
323#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2)
324#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3)
325#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
326#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
327#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
328#define TRACE_I_DECODE_BODY_1(name, b0)
329#define TRACE_I_DECODE_BODY_1L(name, b0, parm1)
330#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2)
331#define TRACE_R_UIB(uentry, ulen)
332#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
333#define TRACE_S_STEP(rstate)
334#define TRACE_S_RESTORE_REG(regname, rstate, val)
335#define TRACE_S_RESTORE_GR(regid, rstate, val)
336#define TRACE_S_RESTORE_BR(regid, rstate, val)
337#define TRACE_S_RESTORE_FR(regid, rstate, val)
338#define TRACE_T_SEARCH32(ip)
339#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
340#define TRACE_C_GET_REG(regid, bsp)
341#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid)
342#define TRACE_SELF_COPYIN4(rem, len, wp)
343#define TRACE_SELF_COPYIN8(rem, len, dp)
344#define TRACE_SELF_LOOKUP(ip)
345#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base)
346
347#endif /* UWX_TRACE_ENABLE */
348
349