uwx_trace.h revision 120925
189857Sobrien/*
289857Sobrien * Copyright (c) 2002,2003 Hewlett-Packard Company
389857Sobrien *
489857Sobrien * Permission is hereby granted, free of charge, to any person obtaining a
5218822Sdim * copy of this software and associated documentation files (the "Software"),
6218822Sdim * to deal in the Software without restriction, including without limitation
7218822Sdim * the rights to use, copy, modify, merge, publish, distribute, sublicense,
889857Sobrien * and/or sell copies of the Software, and to permit persons to whom the
989857Sobrien * Software is furnished to do so, subject to the following conditions:
1089857Sobrien *
1189857Sobrien * The above copyright notice and this permission notice shall be included
1289857Sobrien * in all copies or substantial portions of the Software.
1389857Sobrien *
1489857Sobrien * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1589857Sobrien * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1689857Sobrien * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1789857Sobrien * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1889857Sobrien * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1989857Sobrien * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2089857Sobrien * DEALINGS IN THE SOFTWARE.
2189857Sobrien */
22218822Sdim
23218822Sdim#define UWX_TRACE_SB		1	/* UWX_TRACE=b: scoreboard mgmt */
2489857Sobrien#define UWX_TRACE_UINFO		2	/* UWX_TRACE=i: unwind info */
2589857Sobrien#define UWX_TRACE_RSTATE	4	/* UWX_TRACE=r: reg state vector */
2689857Sobrien#define UWX_TRACE_STEP		8	/* UWX_TRACE=s: step */
2789857Sobrien#define UWX_TRACE_UTABLE	16	/* UWX_TRACE=t: unwind tbl search */
2889857Sobrien#define UWX_TRACE_CONTEXT	32	/* UWX_TRACE=c: context */
2989857Sobrien#define UWX_TRACE_COPYIN	64	/* UWX_TRACE=C: copyin callback */
30130561Sobrien#define UWX_TRACE_LOOKUPIP	128	/* UWX_TRACE=L: lookupip callback */
3189857Sobrien
3289857Sobrien#ifdef UWX_TRACE_ENABLE
3389857Sobrien
3489857Sobrienextern void uwx_trace_init(struct uwx_env *env);
3589857Sobrien
3689857Sobrienextern void uwx_dump_rstate(int regid, uint64_t rstate);
37218822Sdim
38218822Sdimstruct uwx_rhdr;
39218822Sdim
40218822Sdimextern void uwx_dump_scoreboard(
4189857Sobrien    struct uwx_scoreboard *scoreboard,
4289857Sobrien    int nsbreg,
43130561Sobrien    struct uwx_rhdr *rhdr,
44130561Sobrien    int cur_slot,
4589857Sobrien    int ip_slot);
4689857Sobrien
4789857Sobrien#define TRACE_INIT uwx_trace_init(env);
4889857Sobrien
4989857Sobrien#define TRACE_B_REUSE(id) \
5089857Sobrien    if (env->trace & UWX_TRACE_SB) \
5189857Sobrien	printf("uwx_alloc_scoreboard: reuse id %d\n", (id));
5289857Sobrien
5389857Sobrien#define TRACE_B_ALLOC(id) \
5489857Sobrien    if (env->trace & UWX_TRACE_SB) \
5589857Sobrien	printf("uwx_alloc_scoreboard: alloc id %d\n", (id));
5689857Sobrien
5789857Sobrien#define TRACE_B_POP(id) \
5889857Sobrien    if (env->trace & UWX_TRACE_SB) \
5989857Sobrien	printf("uwx_pop_scoreboards: free id %d\n", (id));
6089857Sobrien
6189857Sobrien#define TRACE_B_LABEL(label) \
6289857Sobrien    if (env->trace & UWX_TRACE_SB) \
6389857Sobrien	printf("uwx_label_scoreboard: label %d\n", (label));
6489857Sobrien
6589857Sobrien#define TRACE_B_LABEL_COPY(id) \
6689857Sobrien    if (env->trace & UWX_TRACE_SB) \
6789857Sobrien	printf("uwx_label_scoreboard: copy id %d\n", (id));
6889857Sobrien
6989857Sobrien#define TRACE_B_LABEL_REVERSE(back, new) \
7089857Sobrien    if (env->trace & UWX_TRACE_SB) \
7189857Sobrien	printf("uwx_label_scoreboard: reverse link %d -> %d\n", \
7289857Sobrien			    (new)->id, ((back) == 0) ? -1 : (back)->id);
7389857Sobrien
7489857Sobrien#define TRACE_B_COPY(label, id) \
7589857Sobrien    if (env->trace & UWX_TRACE_SB) \
7689857Sobrien	printf("uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id));
7789857Sobrien
7889857Sobrien#define TRACE_B_COPY_FREE(id) \
7989857Sobrien    if (env->trace & UWX_TRACE_SB) \
8089857Sobrien	printf("uwx_copy_scoreboard: free id %d\n", (id));
8189857Sobrien
8289857Sobrien#define TRACE_B_COPY_FOUND(id) \
8389857Sobrien    if (env->trace & UWX_TRACE_SB) \
8489857Sobrien	printf("uwx_copy_scoreboard: found id %d\n", (id));
8589857Sobrien
8689857Sobrien#define TRACE_B_COPY_COPY(id) \
8789857Sobrien    if (env->trace & UWX_TRACE_SB) \
8889857Sobrien	printf("uwx_copy_scoreboard: copy id %d\n", (id));
8989857Sobrien
9089857Sobrien#define TRACE_B_COPY_REVERSE(back, new) \
9189857Sobrien    if (env->trace & UWX_TRACE_SB) \
9289857Sobrien	printf("uwx_copy_scoreboard: reverse link %d -> %d\n", \
9389857Sobrien			    (new)->id, ((back) == 0) ? -1 : (back)->id);
9489857Sobrien
9589857Sobrien#define TRACE_B_FREE(id) \
9689857Sobrien    if (env->trace & UWX_TRACE_SB) \
9789857Sobrien	printf("uwx_free_scoreboards: free id %d\n", (id));
9889857Sobrien
9989857Sobrien#define TRACE_I_DECODE_RHDR_1(name, b0) \
10089857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
10189857Sobrien	printf("uwx_decode_rhdr:     %02x                   %s\n", \
10289857Sobrien			(b0), (name));
10389857Sobrien
10489857Sobrien#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \
10589857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
10689857Sobrien	printf("uwx_decode_rhdr:     %02x %08x          %s\n", \
10789857Sobrien			(b0), (int)(val), (name));
10889857Sobrien
10989857Sobrien#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \
11089857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
11189857Sobrien	printf("uwx_decode_rhdr:     %02x %02x %08x       %s\n", \
11289857Sobrien			(b0), (b1), (int)(val), (name));
11389857Sobrien
11489857Sobrien#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \
11589857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
11689857Sobrien	printf("uwx_decode_prologue: %02x                   %s\n", \
11789857Sobrien			(b0), (name));
11889857Sobrien
11989857Sobrien#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \
12089857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
12189857Sobrien	printf("uwx_decode_prologue: %02x %08x          %s\n", \
12289857Sobrien			(b0), (int)(val), (name));
12389857Sobrien
12489857Sobrien#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \
12589857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
12689857Sobrien	printf("uwx_decode_prologue: %02x %08x %08x %s\n", \
12789857Sobrien			(b0), (int)(val1), (int)(val2), (name));
12889857Sobrien
12989857Sobrien#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \
13089857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
13189857Sobrien	printf("uwx_decode_prologue: %02x %02x                %s\n", \
13289857Sobrien			(b0), (b1), (name));
13389857Sobrien
13489857Sobrien#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \
13589857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
13689857Sobrien	printf("uwx_decode_prologue: %02x %02x %08x       %s\n", \
13789857Sobrien			(b0), (b1), (int)(val), (name));
13889857Sobrien
13989857Sobrien#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \
14089857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
14189857Sobrien	printf("uwx_decode_prologue: %02x %02x %02x             %s\n", \
14289857Sobrien			(b0), (b1), (b2), (name));
14389857Sobrien
14489857Sobrien#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \
14589857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
14689857Sobrien	printf("uwx_decode_prologue: %02x %02x %02x %02x          %s\n", \
14789857Sobrien			(b0), (b1), (b2), (b3), (name));
14889857Sobrien
14989857Sobrien#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \
15089857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
15189857Sobrien	printf("uwx_decode_prologue: spill base = %08x\n", (int)(spill_base));
15289857Sobrien
15389857Sobrien#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \
15489857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
15589857Sobrien	printf("uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \
15689857Sobrien			(gr_mem_mask), (gr_gr_mask));
15789857Sobrien
15889857Sobrien#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \
15989857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
16089857Sobrien	printf("uwx_decode_prologue: ngr = %d\n", (ngr));
16189857Sobrien
16289857Sobrien#define TRACE_I_DECODE_BODY_1(name, b0) \
16389857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
16489857Sobrien	printf("uwx_decode_body:     %02x                   %s\n", \
16589857Sobrien			(b0), (name));
16689857Sobrien
16789857Sobrien#define TRACE_I_DECODE_BODY_1L(name, b0, val) \
16889857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
16989857Sobrien	printf("uwx_decode_body:     %02x %08x          %s\n", \
17089857Sobrien			(b0), (int)(val), (name));
17189857Sobrien
17289857Sobrien#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \
17389857Sobrien    if (env->trace & UWX_TRACE_UINFO) \
17489857Sobrien	printf("uwx_decode_body:     %02x %08x %08x %s\n", \
17589857Sobrien			(b0), (int)(val1), (int)(val2), (name));
17689857Sobrien
17789857Sobrien#define TRACE_R_UIB(uentry, ulen) \
17889857Sobrien    if (env->trace & UWX_TRACE_RSTATE) \
17989857Sobrien	printf("Unwind info block (flags = %08x %08x, ulen = %d)\n", \
18089857Sobrien		    (unsigned int)((uentry)->unwind_flags >> 32), \
18189857Sobrien		    (unsigned int)(uentry)->unwind_flags, \
18289857Sobrien		    (ulen));
18389857Sobrien
18489857Sobrien#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \
18589857Sobrien    if (env->trace & UWX_TRACE_RSTATE) \
18689857Sobrien	uwx_dump_scoreboard(scoreboard, env->nsbreg, \
18789857Sobrien				&(rhdr), cur_slot, ip_slot);
18889857Sobrien
18989857Sobrien#define TRACE_S_STEP(rstate) \
19089857Sobrien    if (env->trace & UWX_TRACE_STEP) { \
19189857Sobrien	printf("uwx_restore_markers:\n"); \
19289857Sobrien	uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \
19389857Sobrien	uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \
19489857Sobrien	uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \
19589857Sobrien    }
19689857Sobrien
19789857Sobrien#define TRACE_S_RESTORE_REG(regname, rstate, val) \
19889857Sobrien    if (env->trace & UWX_TRACE_STEP) \
19989857Sobrien	printf("  restore %-7s (rstate = %08x %08x) = %08x %08x\n", \
20089857Sobrien			regname, \
20189857Sobrien			(unsigned int) ((rstate) >> 32), \
20289857Sobrien			(unsigned int) (rstate), \
20389857Sobrien			(unsigned int) ((val) >> 32), \
20489857Sobrien			(unsigned int) (val));
20589857Sobrien
20689857Sobrien#define TRACE_S_RESTORE_GR(regid, rstate, val) \
20789857Sobrien    if (env->trace & UWX_TRACE_STEP) \
20889857Sobrien	printf("  restore GR%d     (rstate = %08x %08x) = %08x %08x\n", \
20989857Sobrien			(regid) + 4, \
21089857Sobrien			(unsigned int) ((rstate) >> 32), \
21189857Sobrien			(unsigned int) (rstate), \
21289857Sobrien			(unsigned int) ((val) >> 32), \
21389857Sobrien			(unsigned int) (val));
21489857Sobrien
21589857Sobrien#define TRACE_S_RESTORE_BR(regid, rstate, val) \
21689857Sobrien    if (env->trace & UWX_TRACE_STEP) \
21789857Sobrien	printf("  restore BR%d     (rstate = %08x %08x) = %08x %08x\n", \
21889857Sobrien			(regid) + 1, \
21989857Sobrien			(unsigned int) ((rstate) >> 32), \
22089857Sobrien			(unsigned int) (rstate), \
22189857Sobrien			(unsigned int) ((val) >> 32), \
22289857Sobrien			(unsigned int) (val));
22389857Sobrien
22489857Sobrien#define TRACE_S_RESTORE_FR(regid, rstate, fval) \
22589857Sobrien    if (env->trace & UWX_TRACE_STEP) \
22689857Sobrien	printf("  restore FR%d     (rstate = %08x %08x) = %08x %08x %08x %08x\n", \
22789857Sobrien			(regid) + 1, \
22889857Sobrien			(unsigned int) ((rstate) >> 32), \
22989857Sobrien			(unsigned int) (rstate), \
23089857Sobrien			(unsigned int) ((fval[0]) >> 32), \
23189857Sobrien			(unsigned int) (fval[0]), \
23289857Sobrien			(unsigned int) ((fval[1]) >> 32), \
23389857Sobrien			(unsigned int) (fval[1]));
23489857Sobrien
23589857Sobrien#define TRACE_T_SEARCH32(ip) \
23689857Sobrien    if (env->trace & UWX_TRACE_UTABLE) \
23789857Sobrien	printf("uwx_search_utable32 (relative ip = %08x)\n", (ip));
23889857Sobrien
23989857Sobrien#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \
24089857Sobrien    if (env->trace & UWX_TRACE_UTABLE) \
24189857Sobrien	printf("    lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \
24289857Sobrien			    lb, ub, mid, code_start, code_end);
24389857Sobrien
24489857Sobrien#define TRACE_C_GET_REG(regid, bsp) \
24589857Sobrien	if (env->trace & UWX_TRACE_CONTEXT) \
24689857Sobrien	    printf("uwx_get_reg (gr%d, bsp = %08x %08x)\n", \
24789857Sobrien			(regid) - UWX_REG_GR(0), \
24889857Sobrien			(unsigned int) ((bsp) >> 32), \
24989857Sobrien			(unsigned int) (bsp));
25089857Sobrien
25189857Sobrien#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \
25289857Sobrien	if (env->trace & UWX_TRACE_CONTEXT) \
25389857Sobrien	    printf("uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \
25489857Sobrien			(regid) + 32, \
25589857Sobrien			(sor), \
25689857Sobrien			(rrb_gr), \
25789857Sobrien			(newregid) + 32);
25889857Sobrien
25989857Sobrien#define TRACE_SELF_COPYIN4(rem, len, wp) \
26089857Sobrien    if (info->trace & UWX_TRACE_COPYIN) \
26189857Sobrien	printf("copyin (rem = %08x %08x, len = %d, val = %08x)\n", \
26289857Sobrien			(unsigned int) ((rem) >> 32), \
26389857Sobrien			(unsigned int) (rem), \
26489857Sobrien			(len), *(wp));
26589857Sobrien
26689857Sobrien#define TRACE_SELF_COPYIN8(rem, len, dp) \
26789857Sobrien    if (info->trace & UWX_TRACE_COPYIN) \
26889857Sobrien	printf("copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \
26989857Sobrien			(unsigned int) ((rem) >> 32), \
27089857Sobrien			(unsigned int) (rem), \
27189857Sobrien			(len), \
27289857Sobrien			((unsigned int *)(dp))[0], \
27389857Sobrien			((unsigned int *)(dp))[1]);
274218822Sdim
27589857Sobrien#define TRACE_SELF_LOOKUP(ip) \
27689857Sobrien    if (info->trace & UWX_TRACE_LOOKUPIP) \
277218822Sdim	printf("Lookup IP callback: ip = %08x %08x\n", \
27889857Sobrien			(unsigned int) ((ip) >> 32), \
27989857Sobrien			(unsigned int) (ip));
28089857Sobrien
28189857Sobrien#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) \
28289857Sobrien	if (info->trace & UWX_TRACE_LOOKUPIP) { \
28389857Sobrien	    printf("  text base:    %08x %08x\n", \
28489857Sobrien			(unsigned int) ((text_base) >> 32), \
28589857Sobrien			(unsigned int) (text_base)); \
28689857Sobrien	    printf("  unwind base:  %08x %08x\n", \
28789857Sobrien			(unsigned int) ((uint64_t)(unwind_base) >> 32), \
28889857Sobrien			(unsigned int) (unwind_base)); \
28989857Sobrien	    printf("  unwind flags: %08x %08x\n", \
29089857Sobrien			(unsigned int) ((unwind_base)[0] >> 32), \
29189857Sobrien			(unsigned int) (unwind_base)[0]); \
29289857Sobrien	    printf("  unwind start: %08x %08x\n", \
29389857Sobrien			(unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \
29489857Sobrien			(unsigned int) ((text_base)+(unwind_base)[1])); \
29589857Sobrien	    printf("  unwind end:   %08x %08x\n", \
29689857Sobrien			(unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \
29789857Sobrien			(unsigned int) ((text_base)+(unwind_base)[2])); \
29889857Sobrien	}
29989857Sobrien
30089857Sobrien#else /* !UWX_TRACE_ENABLE */
30189857Sobrien
30289857Sobrien#define TRACE_INIT
30389857Sobrien#define TRACE_B_REUSE(id)
30489857Sobrien#define TRACE_B_ALLOC(id)
30589857Sobrien#define TRACE_B_POP(id)
30689857Sobrien#define TRACE_B_LABEL(label)
30789857Sobrien#define TRACE_B_LABEL_COPY(id)
30889857Sobrien#define TRACE_B_LABEL_REVERSE(back, new)
30989857Sobrien#define TRACE_B_COPY(label, id)
31089857Sobrien#define TRACE_B_COPY_FREE(id)
31189857Sobrien#define TRACE_B_COPY_FOUND(id)
31289857Sobrien#define TRACE_B_COPY_COPY(id)
31389857Sobrien#define TRACE_B_COPY_REVERSE(back, new)
31489857Sobrien#define TRACE_B_FREE(id)
31589857Sobrien#define TRACE_I_DECODE_RHDR_1(name, b0)
31689857Sobrien#define TRACE_I_DECODE_RHDR_1L(name, b0, val)
31789857Sobrien#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val)
31889857Sobrien#define TRACE_I_DECODE_PROLOGUE_1(name, b0)
31989857Sobrien#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val)
32089857Sobrien#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2)
32189857Sobrien#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1)
32289857Sobrien#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1)
32389857Sobrien#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2)
32489857Sobrien#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3)
32589857Sobrien#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
32689857Sobrien#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
32789857Sobrien#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
32889857Sobrien#define TRACE_I_DECODE_BODY_1(name, b0)
32989857Sobrien#define TRACE_I_DECODE_BODY_1L(name, b0, parm1)
33089857Sobrien#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2)
33189857Sobrien#define TRACE_R_UIB(uentry, ulen)
33289857Sobrien#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
33389857Sobrien#define TRACE_S_STEP(rstate)
33489857Sobrien#define TRACE_S_RESTORE_REG(regname, rstate, val)
33589857Sobrien#define TRACE_S_RESTORE_GR(regid, rstate, val)
33689857Sobrien#define TRACE_S_RESTORE_BR(regid, rstate, val)
33789857Sobrien#define TRACE_S_RESTORE_FR(regid, rstate, val)
33889857Sobrien#define TRACE_T_SEARCH32(ip)
33989857Sobrien#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
34089857Sobrien#define TRACE_C_GET_REG(regid, bsp)
34189857Sobrien#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid)
34289857Sobrien#define TRACE_SELF_COPYIN4(rem, len, wp)
34389857Sobrien#define TRACE_SELF_COPYIN8(rem, len, dp)
34489857Sobrien#define TRACE_SELF_LOOKUP(ip)
34589857Sobrien#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base)
34689857Sobrien
34789857Sobrien#endif /* UWX_TRACE_ENABLE */
34889857Sobrien
34989857Sobrien