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