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