summaryrefslogtreecommitdiffstats
path: root/sys/contrib/ia64/libuwx/src/uwx_trace.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/ia64/libuwx/src/uwx_trace.h')
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_trace.h348
1 files changed, 348 insertions, 0 deletions
diff --git a/sys/contrib/ia64/libuwx/src/uwx_trace.h b/sys/contrib/ia64/libuwx/src/uwx_trace.h
new file mode 100644
index 0000000..4b8cdaa
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_trace.h
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 2002,2003 Hewlett-Packard Company
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#define UWX_TRACE_SB 1 /* UWX_TRACE=b: scoreboard mgmt */
+#define UWX_TRACE_UINFO 2 /* UWX_TRACE=i: unwind info */
+#define UWX_TRACE_RSTATE 4 /* UWX_TRACE=r: reg state vector */
+#define UWX_TRACE_STEP 8 /* UWX_TRACE=s: step */
+#define UWX_TRACE_UTABLE 16 /* UWX_TRACE=t: unwind tbl search */
+#define UWX_TRACE_CONTEXT 32 /* UWX_TRACE=c: context */
+#define UWX_TRACE_COPYIN 64 /* UWX_TRACE=C: copyin callback */
+#define UWX_TRACE_LOOKUPIP 128 /* UWX_TRACE=L: lookupip callback */
+
+#ifdef DISABLE_TRACE
+
+#define TRACE_INIT
+#define TRACE_B_REUSE(id)
+#define TRACE_B_ALLOC(id)
+#define TRACE_B_POP(id)
+#define TRACE_B_LABEL(label)
+#define TRACE_B_LABEL_COPY(id)
+#define TRACE_B_LABEL_REVERSE(back, new)
+#define TRACE_B_COPY(label, id)
+#define TRACE_B_COPY_FREE(id)
+#define TRACE_B_COPY_FOUND(id)
+#define TRACE_B_COPY_COPY(id)
+#define TRACE_B_COPY_REVERSE(back, new)
+#define TRACE_B_FREE(id)
+#define TRACE_I_DECODE_RHDR_1(name, b0)
+#define TRACE_I_DECODE_RHDR_1L(name, b0, val)
+#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val)
+#define TRACE_I_DECODE_PROLOGUE_1(name, b0)
+#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val)
+#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2)
+#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1)
+#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1)
+#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2)
+#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3)
+#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
+#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
+#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
+#define TRACE_I_DECODE_BODY_1(name, b0)
+#define TRACE_I_DECODE_BODY_1L(name, b0, parm1)
+#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2)
+#define TRACE_R_UIB(uentry, ulen)
+#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
+#define TRACE_S_STEP(rstate)
+#define TRACE_S_RESTORE_REG(regname, rstate, val)
+#define TRACE_S_RESTORE_GR(regid, rstate, val)
+#define TRACE_S_RESTORE_BR(regid, rstate, val)
+#define TRACE_S_RESTORE_FR(regid, rstate, val)
+#define TRACE_T_SEARCH32(ip)
+#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
+#define TRACE_C_GET_REG(regid, bsp)
+#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid)
+#define TRACE_SELF_COPYIN4(rem, len, wp)
+#define TRACE_SELF_COPYIN8(rem, len, dp)
+#define TRACE_SELF_LOOKUP(ip)
+#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base)
+
+#else /* not TRACE_DISABLED */
+
+extern void uwx_trace_init(struct uwx_env *env);
+
+extern void uwx_dump_rstate(int regid, uint64_t rstate);
+
+struct uwx_rhdr;
+
+extern void uwx_dump_scoreboard(
+ struct uwx_scoreboard *scoreboard,
+ int nsbreg,
+ struct uwx_rhdr *rhdr,
+ int cur_slot,
+ int ip_slot);
+
+#define TRACE_INIT uwx_trace_init(env);
+
+#define TRACE_B_REUSE(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_alloc_scoreboard: reuse id %d\n", (id));
+
+#define TRACE_B_ALLOC(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_alloc_scoreboard: alloc id %d\n", (id));
+
+#define TRACE_B_POP(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_pop_scoreboards: free id %d\n", (id));
+
+#define TRACE_B_LABEL(label) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_label_scoreboard: label %d\n", (label));
+
+#define TRACE_B_LABEL_COPY(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_label_scoreboard: copy id %d\n", (id));
+
+#define TRACE_B_LABEL_REVERSE(back, new) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_label_scoreboard: reverse link %d -> %d\n", \
+ (new)->id, ((back) == 0) ? -1 : (back)->id);
+
+#define TRACE_B_COPY(label, id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id));
+
+#define TRACE_B_COPY_FREE(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_copy_scoreboard: free id %d\n", (id));
+
+#define TRACE_B_COPY_FOUND(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_copy_scoreboard: found id %d\n", (id));
+
+#define TRACE_B_COPY_COPY(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_copy_scoreboard: copy id %d\n", (id));
+
+#define TRACE_B_COPY_REVERSE(back, new) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_copy_scoreboard: reverse link %d -> %d\n", \
+ (new)->id, ((back) == 0) ? -1 : (back)->id);
+
+#define TRACE_B_FREE(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ printf("uwx_free_scoreboards: free id %d\n", (id));
+
+#define TRACE_I_DECODE_RHDR_1(name, b0) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_rhdr: %02x %s\n", \
+ (b0), (name));
+
+#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_rhdr: %02x %08x %s\n", \
+ (b0), (int)(val), (name));
+
+#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_rhdr: %02x %02x %08x %s\n", \
+ (b0), (b1), (int)(val), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %s\n", \
+ (b0), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %08x %s\n", \
+ (b0), (int)(val), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %08x %08x %s\n", \
+ (b0), (int)(val1), (int)(val2), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %02x %s\n", \
+ (b0), (b1), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %02x %08x %s\n", \
+ (b0), (b1), (int)(val), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %02x %02x %s\n", \
+ (b0), (b1), (b2), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: %02x %02x %02x %02x %s\n", \
+ (b0), (b1), (b2), (b3), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: spill base = %08x\n", (int)(spill_base));
+
+#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \
+ (gr_mem_mask), (gr_gr_mask));
+
+#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_prologue: ngr = %d\n", (ngr));
+
+#define TRACE_I_DECODE_BODY_1(name, b0) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_body: %02x %s\n", \
+ (b0), (name));
+
+#define TRACE_I_DECODE_BODY_1L(name, b0, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_body: %02x %08x %s\n", \
+ (b0), (int)(val), (name));
+
+#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ printf("uwx_decode_body: %02x %08x %08x %s\n", \
+ (b0), (int)(val1), (int)(val2), (name));
+
+#define TRACE_R_UIB(uentry, ulen) \
+ if (env->trace & UWX_TRACE_RSTATE) \
+ printf("Unwind info block (flags = %08x %08x, ulen = %d)\n", \
+ (unsigned int)((uentry)->unwind_flags >> 32), \
+ (unsigned int)(uentry)->unwind_flags, \
+ (ulen));
+
+#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \
+ if (env->trace & UWX_TRACE_RSTATE) \
+ uwx_dump_scoreboard(scoreboard, env->nsbreg, \
+ &(rhdr), cur_slot, ip_slot);
+
+#define TRACE_S_STEP(rstate) \
+ if (env->trace & UWX_TRACE_STEP) { \
+ printf("uwx_step:\n"); \
+ uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \
+ uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \
+ uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \
+ }
+
+#define TRACE_S_RESTORE_REG(regname, rstate, val) \
+ if (env->trace & UWX_TRACE_STEP) \
+ printf(" restore %-7s (rstate = %08x %08x) = %08x %08x\n", \
+ regname, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((val) >> 32), \
+ (unsigned int) (val));
+
+#define TRACE_S_RESTORE_GR(regid, rstate, val) \
+ if (env->trace & UWX_TRACE_STEP) \
+ printf(" restore GR%d (rstate = %08x %08x) = %08x %08x\n", \
+ (regid) + 4, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((val) >> 32), \
+ (unsigned int) (val));
+
+#define TRACE_S_RESTORE_BR(regid, rstate, val) \
+ if (env->trace & UWX_TRACE_STEP) \
+ printf(" restore BR%d (rstate = %08x %08x) = %08x %08x\n", \
+ (regid) + 1, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((val) >> 32), \
+ (unsigned int) (val));
+
+#define TRACE_S_RESTORE_FR(regid, rstate, fval) \
+ if (env->trace & UWX_TRACE_STEP) \
+ printf(" restore FR%d (rstate = %08x %08x) = %08x %08x %08x %08x\n", \
+ (regid) + 1, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((fval[0]) >> 32), \
+ (unsigned int) (fval[0]), \
+ (unsigned int) ((fval[1]) >> 32), \
+ (unsigned int) (fval[1]));
+
+#define TRACE_T_SEARCH32(ip) \
+ if (env->trace & UWX_TRACE_UTABLE) \
+ printf("uwx_search_utable32 (relative ip = %08x)\n", (ip));
+
+#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \
+ if (env->trace & UWX_TRACE_UTABLE) \
+ printf(" lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \
+ lb, ub, mid, code_start, code_end);
+
+#define TRACE_C_GET_REG(regid, bsp) \
+ if (env->trace & UWX_TRACE_CONTEXT) \
+ printf("uwx_get_reg (gr%d, bsp = %08x %08x)\n", \
+ (regid) - UWX_REG_GR(0), \
+ (unsigned int) ((bsp) >> 32), \
+ (unsigned int) (bsp));
+
+#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \
+ if (env->trace & UWX_TRACE_CONTEXT) \
+ printf("uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \
+ (regid) + 32, \
+ (sor), \
+ (rrb_gr), \
+ (newregid) + 32);
+
+#define TRACE_SELF_COPYIN4(rem, len, wp) \
+ if (info->trace & UWX_TRACE_COPYIN) \
+ printf("copyin (rem = %08x %08x, len = %d, val = %08x)\n", \
+ (unsigned int) ((rem) >> 32), \
+ (unsigned int) (rem), \
+ (len), *(wp));
+
+#define TRACE_SELF_COPYIN8(rem, len, dp) \
+ if (info->trace & UWX_TRACE_COPYIN) \
+ printf("copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \
+ (unsigned int) ((rem) >> 32), \
+ (unsigned int) (rem), \
+ (len), \
+ ((unsigned int *)(dp))[0], \
+ ((unsigned int *)(dp))[1]);
+
+#define TRACE_SELF_LOOKUP(ip) \
+ if (info->trace & UWX_TRACE_LOOKUPIP) \
+ printf("Lookup IP callback: ip = %08x %08x\n", \
+ (unsigned int) ((ip) >> 32), \
+ (unsigned int) (ip));
+
+#define TRACE_SELF_LOOKUP_DESC(text_base, unwind_base) \
+ if (info->trace & UWX_TRACE_LOOKUPIP) { \
+ printf(" text base: %08x %08x\n", \
+ (unsigned int) ((text_base) >> 32), \
+ (unsigned int) (text_base)); \
+ printf(" unwind base: %08x %08x\n", \
+ (unsigned int) ((uint64_t)(unwind_base) >> 32), \
+ (unsigned int) (unwind_base)); \
+ printf(" unwind flags: %08x %08x\n", \
+ (unsigned int) ((unwind_base)[0] >> 32), \
+ (unsigned int) (unwind_base)[0]); \
+ printf(" unwind start: %08x %08x\n", \
+ (unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \
+ (unsigned int) ((text_base)+(unwind_base)[1])); \
+ printf(" unwind end: %08x %08x\n", \
+ (unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \
+ (unsigned int) ((text_base)+(unwind_base)[2])); \
+ }
+
+#endif /* TRACE_DISABLED */
+
OpenPOWER on IntegriCloud