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