uwx_trace.h revision 115013
1115013Smarcel/*
2115013Smarcel * Copyright (c) 2002,2003 Hewlett-Packard Company
3115013Smarcel *
4115013Smarcel * Permission is hereby granted, free of charge, to any person obtaining a
5115013Smarcel * copy of this software and associated documentation files (the "Software"),
6115013Smarcel * to deal in the Software without restriction, including without limitation
7115013Smarcel * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8115013Smarcel * and/or sell copies of the Software, and to permit persons to whom the
9115013Smarcel * Software is furnished to do so, subject to the following conditions:
10115013Smarcel *
11115013Smarcel * The above copyright notice and this permission notice shall be included
12115013Smarcel * in all copies or substantial portions of the Software.
13115013Smarcel *
14115013Smarcel * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15115013Smarcel * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16115013Smarcel * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17115013Smarcel * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18115013Smarcel * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19115013Smarcel * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20115013Smarcel * DEALINGS IN THE SOFTWARE.
21115013Smarcel */
22115013Smarcel
23115013Smarcel#define UWX_TRACE_SB		1	/* UWX_TRACE=b: scoreboard mgmt */
24115013Smarcel#define UWX_TRACE_UINFO		2	/* UWX_TRACE=i: unwind info */
25115013Smarcel#define UWX_TRACE_RSTATE	4	/* UWX_TRACE=r: reg state vector */
26115013Smarcel#define UWX_TRACE_STEP		8	/* UWX_TRACE=s: step */
27115013Smarcel#define UWX_TRACE_UTABLE	16	/* UWX_TRACE=t: unwind tbl search */
28115013Smarcel#define UWX_TRACE_CONTEXT	32	/* UWX_TRACE=c: context */
29115013Smarcel#define UWX_TRACE_COPYIN	64	/* UWX_TRACE=C: copyin callback */
30115013Smarcel#define UWX_TRACE_LOOKUPIP	128	/* UWX_TRACE=L: lookupip callback */
31115013Smarcel
32115013Smarcel#ifdef DISABLE_TRACE
33115013Smarcel
34115013Smarcel#define TRACE_INIT
35115013Smarcel#define TRACE_B_REUSE(id)
36115013Smarcel#define TRACE_B_ALLOC(id)
37115013Smarcel#define TRACE_B_POP(id)
38115013Smarcel#define TRACE_B_LABEL(label)
39115013Smarcel#define TRACE_B_LABEL_COPY(id)
40115013Smarcel#define TRACE_B_LABEL_REVERSE(back, new)
41115013Smarcel#define TRACE_B_COPY(label, id)
42115013Smarcel#define TRACE_B_COPY_FREE(id)
43115013Smarcel#define TRACE_B_COPY_FOUND(id)
44115013Smarcel#define TRACE_B_COPY_COPY(id)
45115013Smarcel#define TRACE_B_COPY_REVERSE(back, new)
46115013Smarcel#define TRACE_B_FREE(id)
47115013Smarcel#define TRACE_I_DECODE_RHDR_1(name, b0)
48115013Smarcel#define TRACE_I_DECODE_RHDR_1L(name, b0, val)
49115013Smarcel#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val)
50115013Smarcel#define TRACE_I_DECODE_PROLOGUE_1(name, b0)
51115013Smarcel#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val)
52115013Smarcel#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2)
53115013Smarcel#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1)
54115013Smarcel#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1)
55115013Smarcel#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2)
56115013Smarcel#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3)
57115013Smarcel#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
58115013Smarcel#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
59115013Smarcel#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
60115013Smarcel#define TRACE_I_DECODE_BODY_1(name, b0)
61115013Smarcel#define TRACE_I_DECODE_BODY_1L(name, b0, parm1)
62115013Smarcel#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2)
63115013Smarcel#define TRACE_R_UIB(uentry, ulen)
64115013Smarcel#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
65115013Smarcel#define TRACE_S_STEP(rstate)
66115013Smarcel#define TRACE_S_RESTORE_REG(regname, rstate, val)
67115013Smarcel#define TRACE_S_RESTORE_GR(regid, rstate, val)
68115013Smarcel#define TRACE_S_RESTORE_BR(regid, rstate, val)
69115013Smarcel#define TRACE_S_RESTORE_FR(regid, rstate, val)
70115013Smarcel#define TRACE_T_SEARCH32(ip)
71115013Smarcel#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
72115013Smarcel#define TRACE_C_GET_REG(regid, bsp)
73115013Smarcel#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid)
74115013Smarcel#define TRACE_SELF_COPYIN4(rem, len, wp)
75115013Smarcel#define TRACE_SELF_COPYIN8(rem, len, dp)
76115013Smarcel#define TRACE_SELF_LOOKUP(ip)
77115013Smarcel#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base)
78115013Smarcel
79115013Smarcel#else /* not TRACE_DISABLED */
80115013Smarcel
81115013Smarcelextern void uwx_trace_init(struct uwx_env *env);
82115013Smarcel
83115013Smarcelextern void uwx_dump_rstate(int regid, uint64_t rstate);
84115013Smarcel
85115013Smarcelstruct uwx_rhdr;
86115013Smarcel
87115013Smarcelextern void uwx_dump_scoreboard(
88115013Smarcel    struct uwx_scoreboard *scoreboard,
89115013Smarcel    int nsbreg,
90115013Smarcel    struct uwx_rhdr *rhdr,
91115013Smarcel    int cur_slot,
92115013Smarcel    int ip_slot);
93115013Smarcel
94115013Smarcel#define TRACE_INIT uwx_trace_init(env);
95115013Smarcel
96115013Smarcel#define TRACE_B_REUSE(id) \
97115013Smarcel    if (env->trace & UWX_TRACE_SB) \
98115013Smarcel	printf("uwx_alloc_scoreboard: reuse id %d\n", (id));
99115013Smarcel
100115013Smarcel#define TRACE_B_ALLOC(id) \
101115013Smarcel    if (env->trace & UWX_TRACE_SB) \
102115013Smarcel	printf("uwx_alloc_scoreboard: alloc id %d\n", (id));
103115013Smarcel
104115013Smarcel#define TRACE_B_POP(id) \
105115013Smarcel    if (env->trace & UWX_TRACE_SB) \
106115013Smarcel	printf("uwx_pop_scoreboards: free id %d\n", (id));
107115013Smarcel
108115013Smarcel#define TRACE_B_LABEL(label) \
109115013Smarcel    if (env->trace & UWX_TRACE_SB) \
110115013Smarcel	printf("uwx_label_scoreboard: label %d\n", (label));
111115013Smarcel
112115013Smarcel#define TRACE_B_LABEL_COPY(id) \
113115013Smarcel    if (env->trace & UWX_TRACE_SB) \
114115013Smarcel	printf("uwx_label_scoreboard: copy id %d\n", (id));
115115013Smarcel
116115013Smarcel#define TRACE_B_LABEL_REVERSE(back, new) \
117115013Smarcel    if (env->trace & UWX_TRACE_SB) \
118115013Smarcel	printf("uwx_label_scoreboard: reverse link %d -> %d\n", \
119115013Smarcel			    (new)->id, ((back) == 0) ? -1 : (back)->id);
120115013Smarcel
121115013Smarcel#define TRACE_B_COPY(label, id) \
122115013Smarcel    if (env->trace & UWX_TRACE_SB) \
123115013Smarcel	printf("uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id));
124115013Smarcel
125115013Smarcel#define TRACE_B_COPY_FREE(id) \
126115013Smarcel    if (env->trace & UWX_TRACE_SB) \
127115013Smarcel	printf("uwx_copy_scoreboard: free id %d\n", (id));
128115013Smarcel
129115013Smarcel#define TRACE_B_COPY_FOUND(id) \
130115013Smarcel    if (env->trace & UWX_TRACE_SB) \
131115013Smarcel	printf("uwx_copy_scoreboard: found id %d\n", (id));
132115013Smarcel
133115013Smarcel#define TRACE_B_COPY_COPY(id) \
134115013Smarcel    if (env->trace & UWX_TRACE_SB) \
135115013Smarcel	printf("uwx_copy_scoreboard: copy id %d\n", (id));
136115013Smarcel
137115013Smarcel#define TRACE_B_COPY_REVERSE(back, new) \
138115013Smarcel    if (env->trace & UWX_TRACE_SB) \
139115013Smarcel	printf("uwx_copy_scoreboard: reverse link %d -> %d\n", \
140115013Smarcel			    (new)->id, ((back) == 0) ? -1 : (back)->id);
141115013Smarcel
142115013Smarcel#define TRACE_B_FREE(id) \
143115013Smarcel    if (env->trace & UWX_TRACE_SB) \
144115013Smarcel	printf("uwx_free_scoreboards: free id %d\n", (id));
145115013Smarcel
146115013Smarcel#define TRACE_I_DECODE_RHDR_1(name, b0) \
147115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
148115013Smarcel	printf("uwx_decode_rhdr:     %02x                   %s\n", \
149115013Smarcel			(b0), (name));
150115013Smarcel
151115013Smarcel#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \
152115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
153115013Smarcel	printf("uwx_decode_rhdr:     %02x %08x          %s\n", \
154115013Smarcel			(b0), (int)(val), (name));
155115013Smarcel
156115013Smarcel#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \
157115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
158115013Smarcel	printf("uwx_decode_rhdr:     %02x %02x %08x       %s\n", \
159115013Smarcel			(b0), (b1), (int)(val), (name));
160115013Smarcel
161115013Smarcel#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \
162115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
163115013Smarcel	printf("uwx_decode_prologue: %02x                   %s\n", \
164115013Smarcel			(b0), (name));
165115013Smarcel
166115013Smarcel#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \
167115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
168115013Smarcel	printf("uwx_decode_prologue: %02x %08x          %s\n", \
169115013Smarcel			(b0), (int)(val), (name));
170115013Smarcel
171115013Smarcel#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \
172115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
173115013Smarcel	printf("uwx_decode_prologue: %02x %08x %08x %s\n", \
174115013Smarcel			(b0), (int)(val1), (int)(val2), (name));
175115013Smarcel
176115013Smarcel#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \
177115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
178115013Smarcel	printf("uwx_decode_prologue: %02x %02x                %s\n", \
179115013Smarcel			(b0), (b1), (name));
180115013Smarcel
181115013Smarcel#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \
182115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
183115013Smarcel	printf("uwx_decode_prologue: %02x %02x %08x       %s\n", \
184115013Smarcel			(b0), (b1), (int)(val), (name));
185115013Smarcel
186115013Smarcel#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \
187115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
188115013Smarcel	printf("uwx_decode_prologue: %02x %02x %02x             %s\n", \
189115013Smarcel			(b0), (b1), (b2), (name));
190115013Smarcel
191115013Smarcel#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \
192115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
193115013Smarcel	printf("uwx_decode_prologue: %02x %02x %02x %02x          %s\n", \
194115013Smarcel			(b0), (b1), (b2), (b3), (name));
195115013Smarcel
196115013Smarcel#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \
197115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
198115013Smarcel	printf("uwx_decode_prologue: spill base = %08x\n", (int)(spill_base));
199115013Smarcel
200115013Smarcel#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \
201115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
202115013Smarcel	printf("uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \
203115013Smarcel			(gr_mem_mask), (gr_gr_mask));
204115013Smarcel
205115013Smarcel#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \
206115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
207115013Smarcel	printf("uwx_decode_prologue: ngr = %d\n", (ngr));
208115013Smarcel
209115013Smarcel#define TRACE_I_DECODE_BODY_1(name, b0) \
210115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
211115013Smarcel	printf("uwx_decode_body:     %02x                   %s\n", \
212115013Smarcel			(b0), (name));
213115013Smarcel
214115013Smarcel#define TRACE_I_DECODE_BODY_1L(name, b0, val) \
215115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
216115013Smarcel	printf("uwx_decode_body:     %02x %08x          %s\n", \
217115013Smarcel			(b0), (int)(val), (name));
218115013Smarcel
219115013Smarcel#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \
220115013Smarcel    if (env->trace & UWX_TRACE_UINFO) \
221115013Smarcel	printf("uwx_decode_body:     %02x %08x %08x %s\n", \
222115013Smarcel			(b0), (int)(val1), (int)(val2), (name));
223115013Smarcel
224115013Smarcel#define TRACE_R_UIB(uentry, ulen) \
225115013Smarcel    if (env->trace & UWX_TRACE_RSTATE) \
226115013Smarcel	printf("Unwind info block (flags = %08x %08x, ulen = %d)\n", \
227115013Smarcel		    (unsigned int)((uentry)->unwind_flags >> 32), \
228115013Smarcel		    (unsigned int)(uentry)->unwind_flags, \
229115013Smarcel		    (ulen));
230115013Smarcel
231115013Smarcel#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \
232115013Smarcel    if (env->trace & UWX_TRACE_RSTATE) \
233115013Smarcel	uwx_dump_scoreboard(scoreboard, env->nsbreg, \
234115013Smarcel				&(rhdr), cur_slot, ip_slot);
235115013Smarcel
236115013Smarcel#define TRACE_S_STEP(rstate) \
237115013Smarcel    if (env->trace & UWX_TRACE_STEP) { \
238115013Smarcel	printf("uwx_step:\n"); \
239115013Smarcel	uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \
240115013Smarcel	uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \
241115013Smarcel	uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \
242115013Smarcel    }
243115013Smarcel
244115013Smarcel#define TRACE_S_RESTORE_REG(regname, rstate, val) \
245115013Smarcel    if (env->trace & UWX_TRACE_STEP) \
246115013Smarcel	printf("  restore %-7s (rstate = %08x %08x) = %08x %08x\n", \
247115013Smarcel			regname, \
248115013Smarcel			(unsigned int) ((rstate) >> 32), \
249115013Smarcel			(unsigned int) (rstate), \
250115013Smarcel			(unsigned int) ((val) >> 32), \
251115013Smarcel			(unsigned int) (val));
252115013Smarcel
253115013Smarcel#define TRACE_S_RESTORE_GR(regid, rstate, val) \
254115013Smarcel    if (env->trace & UWX_TRACE_STEP) \
255115013Smarcel	printf("  restore GR%d     (rstate = %08x %08x) = %08x %08x\n", \
256115013Smarcel			(regid) + 4, \
257115013Smarcel			(unsigned int) ((rstate) >> 32), \
258115013Smarcel			(unsigned int) (rstate), \
259115013Smarcel			(unsigned int) ((val) >> 32), \
260115013Smarcel			(unsigned int) (val));
261115013Smarcel
262115013Smarcel#define TRACE_S_RESTORE_BR(regid, rstate, val) \
263115013Smarcel    if (env->trace & UWX_TRACE_STEP) \
264115013Smarcel	printf("  restore BR%d     (rstate = %08x %08x) = %08x %08x\n", \
265115013Smarcel			(regid) + 1, \
266115013Smarcel			(unsigned int) ((rstate) >> 32), \
267115013Smarcel			(unsigned int) (rstate), \
268115013Smarcel			(unsigned int) ((val) >> 32), \
269115013Smarcel			(unsigned int) (val));
270115013Smarcel
271115013Smarcel#define TRACE_S_RESTORE_FR(regid, rstate, fval) \
272115013Smarcel    if (env->trace & UWX_TRACE_STEP) \
273115013Smarcel	printf("  restore FR%d     (rstate = %08x %08x) = %08x %08x %08x %08x\n", \
274115013Smarcel			(regid) + 1, \
275115013Smarcel			(unsigned int) ((rstate) >> 32), \
276115013Smarcel			(unsigned int) (rstate), \
277115013Smarcel			(unsigned int) ((fval[0]) >> 32), \
278115013Smarcel			(unsigned int) (fval[0]), \
279115013Smarcel			(unsigned int) ((fval[1]) >> 32), \
280115013Smarcel			(unsigned int) (fval[1]));
281115013Smarcel
282115013Smarcel#define TRACE_T_SEARCH32(ip) \
283115013Smarcel    if (env->trace & UWX_TRACE_UTABLE) \
284115013Smarcel	printf("uwx_search_utable32 (relative ip = %08x)\n", (ip));
285115013Smarcel
286115013Smarcel#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \
287115013Smarcel    if (env->trace & UWX_TRACE_UTABLE) \
288115013Smarcel	printf("    lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \
289115013Smarcel			    lb, ub, mid, code_start, code_end);
290115013Smarcel
291115013Smarcel#define TRACE_C_GET_REG(regid, bsp) \
292115013Smarcel	if (env->trace & UWX_TRACE_CONTEXT) \
293115013Smarcel	    printf("uwx_get_reg (gr%d, bsp = %08x %08x)\n", \
294115013Smarcel			(regid) - UWX_REG_GR(0), \
295115013Smarcel			(unsigned int) ((bsp) >> 32), \
296115013Smarcel			(unsigned int) (bsp));
297115013Smarcel
298115013Smarcel#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \
299115013Smarcel	if (env->trace & UWX_TRACE_CONTEXT) \
300115013Smarcel	    printf("uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \
301115013Smarcel			(regid) + 32, \
302115013Smarcel			(sor), \
303115013Smarcel			(rrb_gr), \
304115013Smarcel			(newregid) + 32);
305115013Smarcel
306115013Smarcel#define TRACE_SELF_COPYIN4(rem, len, wp) \
307115013Smarcel    if (info->trace & UWX_TRACE_COPYIN) \
308115013Smarcel	printf("copyin (rem = %08x %08x, len = %d, val = %08x)\n", \
309115013Smarcel			(unsigned int) ((rem) >> 32), \
310115013Smarcel			(unsigned int) (rem), \
311115013Smarcel			(len), *(wp));
312115013Smarcel
313115013Smarcel#define TRACE_SELF_COPYIN8(rem, len, dp) \
314115013Smarcel    if (info->trace & UWX_TRACE_COPYIN) \
315115013Smarcel	printf("copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \
316115013Smarcel			(unsigned int) ((rem) >> 32), \
317115013Smarcel			(unsigned int) (rem), \
318115013Smarcel			(len), \
319115013Smarcel			((unsigned int *)(dp))[0], \
320115013Smarcel			((unsigned int *)(dp))[1]);
321115013Smarcel
322115013Smarcel#define TRACE_SELF_LOOKUP(ip) \
323115013Smarcel    if (info->trace & UWX_TRACE_LOOKUPIP) \
324115013Smarcel	printf("Lookup IP callback: ip = %08x %08x\n", \
325115013Smarcel			(unsigned int) ((ip) >> 32), \
326115013Smarcel			(unsigned int) (ip));
327115013Smarcel
328115013Smarcel#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) \
329115013Smarcel	if (info->trace & UWX_TRACE_LOOKUPIP) { \
330115013Smarcel	    printf("  text base:    %08x %08x\n", \
331115013Smarcel			(unsigned int) ((text_base) >> 32), \
332115013Smarcel			(unsigned int) (text_base)); \
333115013Smarcel	    printf("  unwind base:  %08x %08x\n", \
334115013Smarcel			(unsigned int) ((uint64_t)(unwind_base) >> 32), \
335115013Smarcel			(unsigned int) (unwind_base)); \
336115013Smarcel	    printf("  unwind flags: %08x %08x\n", \
337115013Smarcel			(unsigned int) ((unwind_base)[0] >> 32), \
338115013Smarcel			(unsigned int) (unwind_base)[0]); \
339115013Smarcel	    printf("  unwind start: %08x %08x\n", \
340115013Smarcel			(unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \
341115013Smarcel			(unsigned int) ((text_base)+(unwind_base)[1])); \
342115013Smarcel	    printf("  unwind end:   %08x %08x\n", \
343115013Smarcel			(unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \
344115013Smarcel			(unsigned int) ((text_base)+(unwind_base)[2])); \
345115013Smarcel	}
346115013Smarcel
347115013Smarcel#endif /* TRACE_DISABLED */
348115013Smarcel
349