uwx_trace.h revision 115013
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 DISABLE_TRACE 33 34#define TRACE_INIT 35#define TRACE_B_REUSE(id) 36#define TRACE_B_ALLOC(id) 37#define TRACE_B_POP(id) 38#define TRACE_B_LABEL(label) 39#define TRACE_B_LABEL_COPY(id) 40#define TRACE_B_LABEL_REVERSE(back, new) 41#define TRACE_B_COPY(label, id) 42#define TRACE_B_COPY_FREE(id) 43#define TRACE_B_COPY_FOUND(id) 44#define TRACE_B_COPY_COPY(id) 45#define TRACE_B_COPY_REVERSE(back, new) 46#define TRACE_B_FREE(id) 47#define TRACE_I_DECODE_RHDR_1(name, b0) 48#define TRACE_I_DECODE_RHDR_1L(name, b0, val) 49#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) 50#define TRACE_I_DECODE_PROLOGUE_1(name, b0) 51#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) 52#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) 53#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) 54#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1) 55#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) 56#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) 57#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) 58#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) 59#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) 60#define TRACE_I_DECODE_BODY_1(name, b0) 61#define TRACE_I_DECODE_BODY_1L(name, b0, parm1) 62#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2) 63#define TRACE_R_UIB(uentry, ulen) 64#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) 65#define TRACE_S_STEP(rstate) 66#define TRACE_S_RESTORE_REG(regname, rstate, val) 67#define TRACE_S_RESTORE_GR(regid, rstate, val) 68#define TRACE_S_RESTORE_BR(regid, rstate, val) 69#define TRACE_S_RESTORE_FR(regid, rstate, val) 70#define TRACE_T_SEARCH32(ip) 71#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) 72#define TRACE_C_GET_REG(regid, bsp) 73#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) 74#define TRACE_SELF_COPYIN4(rem, len, wp) 75#define TRACE_SELF_COPYIN8(rem, len, dp) 76#define TRACE_SELF_LOOKUP(ip) 77#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) 78 79#else /* not TRACE_DISABLED */ 80 81extern void uwx_trace_init(struct uwx_env *env); 82 83extern void uwx_dump_rstate(int regid, uint64_t rstate); 84 85struct uwx_rhdr; 86 87extern void uwx_dump_scoreboard( 88 struct uwx_scoreboard *scoreboard, 89 int nsbreg, 90 struct uwx_rhdr *rhdr, 91 int cur_slot, 92 int ip_slot); 93 94#define TRACE_INIT uwx_trace_init(env); 95 96#define TRACE_B_REUSE(id) \ 97 if (env->trace & UWX_TRACE_SB) \ 98 printf("uwx_alloc_scoreboard: reuse id %d\n", (id)); 99 100#define TRACE_B_ALLOC(id) \ 101 if (env->trace & UWX_TRACE_SB) \ 102 printf("uwx_alloc_scoreboard: alloc id %d\n", (id)); 103 104#define TRACE_B_POP(id) \ 105 if (env->trace & UWX_TRACE_SB) \ 106 printf("uwx_pop_scoreboards: free id %d\n", (id)); 107 108#define TRACE_B_LABEL(label) \ 109 if (env->trace & UWX_TRACE_SB) \ 110 printf("uwx_label_scoreboard: label %d\n", (label)); 111 112#define TRACE_B_LABEL_COPY(id) \ 113 if (env->trace & UWX_TRACE_SB) \ 114 printf("uwx_label_scoreboard: copy id %d\n", (id)); 115 116#define TRACE_B_LABEL_REVERSE(back, new) \ 117 if (env->trace & UWX_TRACE_SB) \ 118 printf("uwx_label_scoreboard: reverse link %d -> %d\n", \ 119 (new)->id, ((back) == 0) ? -1 : (back)->id); 120 121#define TRACE_B_COPY(label, id) \ 122 if (env->trace & UWX_TRACE_SB) \ 123 printf("uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id)); 124 125#define TRACE_B_COPY_FREE(id) \ 126 if (env->trace & UWX_TRACE_SB) \ 127 printf("uwx_copy_scoreboard: free id %d\n", (id)); 128 129#define TRACE_B_COPY_FOUND(id) \ 130 if (env->trace & UWX_TRACE_SB) \ 131 printf("uwx_copy_scoreboard: found id %d\n", (id)); 132 133#define TRACE_B_COPY_COPY(id) \ 134 if (env->trace & UWX_TRACE_SB) \ 135 printf("uwx_copy_scoreboard: copy id %d\n", (id)); 136 137#define TRACE_B_COPY_REVERSE(back, new) \ 138 if (env->trace & UWX_TRACE_SB) \ 139 printf("uwx_copy_scoreboard: reverse link %d -> %d\n", \ 140 (new)->id, ((back) == 0) ? -1 : (back)->id); 141 142#define TRACE_B_FREE(id) \ 143 if (env->trace & UWX_TRACE_SB) \ 144 printf("uwx_free_scoreboards: free id %d\n", (id)); 145 146#define TRACE_I_DECODE_RHDR_1(name, b0) \ 147 if (env->trace & UWX_TRACE_UINFO) \ 148 printf("uwx_decode_rhdr: %02x %s\n", \ 149 (b0), (name)); 150 151#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \ 152 if (env->trace & UWX_TRACE_UINFO) \ 153 printf("uwx_decode_rhdr: %02x %08x %s\n", \ 154 (b0), (int)(val), (name)); 155 156#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \ 157 if (env->trace & UWX_TRACE_UINFO) \ 158 printf("uwx_decode_rhdr: %02x %02x %08x %s\n", \ 159 (b0), (b1), (int)(val), (name)); 160 161#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \ 162 if (env->trace & UWX_TRACE_UINFO) \ 163 printf("uwx_decode_prologue: %02x %s\n", \ 164 (b0), (name)); 165 166#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \ 167 if (env->trace & UWX_TRACE_UINFO) \ 168 printf("uwx_decode_prologue: %02x %08x %s\n", \ 169 (b0), (int)(val), (name)); 170 171#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \ 172 if (env->trace & UWX_TRACE_UINFO) \ 173 printf("uwx_decode_prologue: %02x %08x %08x %s\n", \ 174 (b0), (int)(val1), (int)(val2), (name)); 175 176#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \ 177 if (env->trace & UWX_TRACE_UINFO) \ 178 printf("uwx_decode_prologue: %02x %02x %s\n", \ 179 (b0), (b1), (name)); 180 181#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \ 182 if (env->trace & UWX_TRACE_UINFO) \ 183 printf("uwx_decode_prologue: %02x %02x %08x %s\n", \ 184 (b0), (b1), (int)(val), (name)); 185 186#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \ 187 if (env->trace & UWX_TRACE_UINFO) \ 188 printf("uwx_decode_prologue: %02x %02x %02x %s\n", \ 189 (b0), (b1), (b2), (name)); 190 191#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \ 192 if (env->trace & UWX_TRACE_UINFO) \ 193 printf("uwx_decode_prologue: %02x %02x %02x %02x %s\n", \ 194 (b0), (b1), (b2), (b3), (name)); 195 196#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \ 197 if (env->trace & UWX_TRACE_UINFO) \ 198 printf("uwx_decode_prologue: spill base = %08x\n", (int)(spill_base)); 199 200#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \ 201 if (env->trace & UWX_TRACE_UINFO) \ 202 printf("uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \ 203 (gr_mem_mask), (gr_gr_mask)); 204 205#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \ 206 if (env->trace & UWX_TRACE_UINFO) \ 207 printf("uwx_decode_prologue: ngr = %d\n", (ngr)); 208 209#define TRACE_I_DECODE_BODY_1(name, b0) \ 210 if (env->trace & UWX_TRACE_UINFO) \ 211 printf("uwx_decode_body: %02x %s\n", \ 212 (b0), (name)); 213 214#define TRACE_I_DECODE_BODY_1L(name, b0, val) \ 215 if (env->trace & UWX_TRACE_UINFO) \ 216 printf("uwx_decode_body: %02x %08x %s\n", \ 217 (b0), (int)(val), (name)); 218 219#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \ 220 if (env->trace & UWX_TRACE_UINFO) \ 221 printf("uwx_decode_body: %02x %08x %08x %s\n", \ 222 (b0), (int)(val1), (int)(val2), (name)); 223 224#define TRACE_R_UIB(uentry, ulen) \ 225 if (env->trace & UWX_TRACE_RSTATE) \ 226 printf("Unwind info block (flags = %08x %08x, ulen = %d)\n", \ 227 (unsigned int)((uentry)->unwind_flags >> 32), \ 228 (unsigned int)(uentry)->unwind_flags, \ 229 (ulen)); 230 231#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \ 232 if (env->trace & UWX_TRACE_RSTATE) \ 233 uwx_dump_scoreboard(scoreboard, env->nsbreg, \ 234 &(rhdr), cur_slot, ip_slot); 235 236#define TRACE_S_STEP(rstate) \ 237 if (env->trace & UWX_TRACE_STEP) { \ 238 printf("uwx_step:\n"); \ 239 uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \ 240 uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \ 241 uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \ 242 } 243 244#define TRACE_S_RESTORE_REG(regname, rstate, val) \ 245 if (env->trace & UWX_TRACE_STEP) \ 246 printf(" restore %-7s (rstate = %08x %08x) = %08x %08x\n", \ 247 regname, \ 248 (unsigned int) ((rstate) >> 32), \ 249 (unsigned int) (rstate), \ 250 (unsigned int) ((val) >> 32), \ 251 (unsigned int) (val)); 252 253#define TRACE_S_RESTORE_GR(regid, rstate, val) \ 254 if (env->trace & UWX_TRACE_STEP) \ 255 printf(" restore GR%d (rstate = %08x %08x) = %08x %08x\n", \ 256 (regid) + 4, \ 257 (unsigned int) ((rstate) >> 32), \ 258 (unsigned int) (rstate), \ 259 (unsigned int) ((val) >> 32), \ 260 (unsigned int) (val)); 261 262#define TRACE_S_RESTORE_BR(regid, rstate, val) \ 263 if (env->trace & UWX_TRACE_STEP) \ 264 printf(" restore BR%d (rstate = %08x %08x) = %08x %08x\n", \ 265 (regid) + 1, \ 266 (unsigned int) ((rstate) >> 32), \ 267 (unsigned int) (rstate), \ 268 (unsigned int) ((val) >> 32), \ 269 (unsigned int) (val)); 270 271#define TRACE_S_RESTORE_FR(regid, rstate, fval) \ 272 if (env->trace & UWX_TRACE_STEP) \ 273 printf(" restore FR%d (rstate = %08x %08x) = %08x %08x %08x %08x\n", \ 274 (regid) + 1, \ 275 (unsigned int) ((rstate) >> 32), \ 276 (unsigned int) (rstate), \ 277 (unsigned int) ((fval[0]) >> 32), \ 278 (unsigned int) (fval[0]), \ 279 (unsigned int) ((fval[1]) >> 32), \ 280 (unsigned int) (fval[1])); 281 282#define TRACE_T_SEARCH32(ip) \ 283 if (env->trace & UWX_TRACE_UTABLE) \ 284 printf("uwx_search_utable32 (relative ip = %08x)\n", (ip)); 285 286#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \ 287 if (env->trace & UWX_TRACE_UTABLE) \ 288 printf(" lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \ 289 lb, ub, mid, code_start, code_end); 290 291#define TRACE_C_GET_REG(regid, bsp) \ 292 if (env->trace & UWX_TRACE_CONTEXT) \ 293 printf("uwx_get_reg (gr%d, bsp = %08x %08x)\n", \ 294 (regid) - UWX_REG_GR(0), \ 295 (unsigned int) ((bsp) >> 32), \ 296 (unsigned int) (bsp)); 297 298#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \ 299 if (env->trace & UWX_TRACE_CONTEXT) \ 300 printf("uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \ 301 (regid) + 32, \ 302 (sor), \ 303 (rrb_gr), \ 304 (newregid) + 32); 305 306#define TRACE_SELF_COPYIN4(rem, len, wp) \ 307 if (info->trace & UWX_TRACE_COPYIN) \ 308 printf("copyin (rem = %08x %08x, len = %d, val = %08x)\n", \ 309 (unsigned int) ((rem) >> 32), \ 310 (unsigned int) (rem), \ 311 (len), *(wp)); 312 313#define TRACE_SELF_COPYIN8(rem, len, dp) \ 314 if (info->trace & UWX_TRACE_COPYIN) \ 315 printf("copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \ 316 (unsigned int) ((rem) >> 32), \ 317 (unsigned int) (rem), \ 318 (len), \ 319 ((unsigned int *)(dp))[0], \ 320 ((unsigned int *)(dp))[1]); 321 322#define TRACE_SELF_LOOKUP(ip) \ 323 if (info->trace & UWX_TRACE_LOOKUPIP) \ 324 printf("Lookup IP callback: ip = %08x %08x\n", \ 325 (unsigned int) ((ip) >> 32), \ 326 (unsigned int) (ip)); 327 328#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) \ 329 if (info->trace & UWX_TRACE_LOOKUPIP) { \ 330 printf(" text base: %08x %08x\n", \ 331 (unsigned int) ((text_base) >> 32), \ 332 (unsigned int) (text_base)); \ 333 printf(" unwind base: %08x %08x\n", \ 334 (unsigned int) ((uint64_t)(unwind_base) >> 32), \ 335 (unsigned int) (unwind_base)); \ 336 printf(" unwind flags: %08x %08x\n", \ 337 (unsigned int) ((unwind_base)[0] >> 32), \ 338 (unsigned int) (unwind_base)[0]); \ 339 printf(" unwind start: %08x %08x\n", \ 340 (unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \ 341 (unsigned int) ((text_base)+(unwind_base)[1])); \ 342 printf(" unwind end: %08x %08x\n", \ 343 (unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \ 344 (unsigned int) ((text_base)+(unwind_base)[2])); \ 345 } 346 347#endif /* TRACE_DISABLED */ 348 349