diff options
Diffstat (limited to 'sys/contrib/ia64/libuwx/src/uwx_trace.c')
-rw-r--r-- | sys/contrib/ia64/libuwx/src/uwx_trace.c | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/sys/contrib/ia64/libuwx/src/uwx_trace.c b/sys/contrib/ia64/libuwx/src/uwx_trace.c index 11c3db6cf1a1..10ab55d39f2b 100644 --- a/sys/contrib/ia64/libuwx/src/uwx_trace.c +++ b/sys/contrib/ia64/libuwx/src/uwx_trace.c @@ -1,5 +1,5 @@ /* -Copyright (c) 2003 Hewlett-Packard Development Company, L.P. +Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P. 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 @@ -23,12 +23,11 @@ OTHER DEALINGS IN THE SOFTWARE. */ #include "uwx_env.h" +#include "uwx_utable.h" #include "uwx_uinfo.h" #include "uwx_scoreboard.h" #include "uwx_trace.h" -#ifdef UWX_TRACE_ENABLE - void uwx_trace_init(struct uwx_env *env) { char *tstr; @@ -36,7 +35,7 @@ void uwx_trace_init(struct uwx_env *env) tstr = getenv("UWX_TRACE"); if (tstr != NULL) { while (*tstr != '\0') { - switch (*tstr) { + switch (*tstr++) { case 'i': env->trace |= UWX_TRACE_UINFO; break; case 't': env->trace |= UWX_TRACE_UTABLE; break; case 'b': env->trace |= UWX_TRACE_SB; break; @@ -46,9 +45,6 @@ void uwx_trace_init(struct uwx_env *env) case 'C': env->trace |= UWX_TRACE_COPYIN; break; case 'L': env->trace |= UWX_TRACE_LOOKUPIP; break; case '?': -#ifdef _KERNEL - printf("UWX_TRACE flag `%c' unknown.\n", *tstr); -#else fprintf(stderr, "UWX_TRACE flags:\n"); fprintf(stderr, " i: unwind info\n"); fprintf(stderr, " t: unwind table searching\n"); @@ -59,9 +55,7 @@ void uwx_trace_init(struct uwx_env *env) fprintf(stderr, " C: copyin callback\n"); fprintf(stderr, " L: lookup ip callback\n"); exit(1); -#endif } - tstr++; } } } @@ -84,37 +78,37 @@ void uwx_dump_rstate(int regid, uint64_t rstate) if (rstate == UWX_DISP_NONE) return; - printf(" %-7s", uwx_sb_rnames[regid]); + fprintf(stderr, " %-7s", uwx_sb_rnames[regid]); switch (UWX_GET_DISP_CODE(rstate)) { case UWX_DISP_NONE: - printf(" unchanged\n"); + fprintf(stderr, " unchanged\n"); break; case UWX_DISP_SPPLUS(0): - printf(" SP + %d\n", (int)rstate & ~0x07); + fprintf(stderr, " SP + %d\n", (int)rstate & ~0x07); break; case UWX_DISP_SPREL(0): - printf(" [SP + %d]\n", (int)rstate & ~0x07); + fprintf(stderr, " [SP + %d]\n", (int)rstate & ~0x07); break; case UWX_DISP_PSPREL(0): - printf(" [PSP + 16 - %d]\n", (int)rstate & ~0x07); + fprintf(stderr, " [PSP + 16 - %d]\n", (int)rstate & ~0x07); break; case UWX_DISP_REG(0): reg = UWX_GET_DISP_REGID(rstate); if (reg == UWX_REG_AR_PFS) - printf(" [AR.PFS]\n"); + fprintf(stderr, " AR.PFS\n"); else if (reg == UWX_REG_AR_UNAT) - printf(" [AR.UNAT]\n"); + fprintf(stderr, " AR.UNAT\n"); else if (reg >= UWX_REG_GR(0) && reg < UWX_REG_GR(128)) - printf(" [GR%d]\n", reg - UWX_REG_GR(0)); + fprintf(stderr, " GR%d\n", reg - UWX_REG_GR(0)); else if (reg >= UWX_REG_FR(0) && reg < UWX_REG_FR(128)) - printf(" [FR%d]\n", reg - UWX_REG_FR(0)); + fprintf(stderr, " FR%d\n", reg - UWX_REG_FR(0)); else if (reg >= UWX_REG_BR(0) && reg < UWX_REG_BR(8)) - printf(" [BR%d]\n", reg - UWX_REG_BR(0)); + fprintf(stderr, " BR%d\n", reg - UWX_REG_BR(0)); else - printf(" [reg %d]\n", reg); + fprintf(stderr, " <reg %d>\n", reg); break; default: - printf(" <%08llx>\n", (unsigned long long)rstate); + fprintf(stderr, " <%08x>\n", rstate); break; } } @@ -129,15 +123,35 @@ void uwx_dump_scoreboard( int i; if (rhdr->is_prologue) - printf(" Prologue region (start = %d, length = %d)\n", + fprintf(stderr, " Prologue region (start = %d, length = %d)\n", (int)cur_slot, (int)rhdr->rlen); else - printf(" Body region (start = %d, length = %d, ecount = %d)\n", + fprintf(stderr, " Body region (start = %d, length = %d, ecount = %d)\n", cur_slot, (int)rhdr->rlen, rhdr->ecount); if (ip_slot < rhdr->rlen) - printf(" IP is in this region (offset = %d)\n", ip_slot); + fprintf(stderr, " IP is in this region (offset = %d)\n", ip_slot); for (i = 0; i < nsbreg; i++) uwx_dump_rstate(i, scoreboard->rstate[i]); } -#endif /* UWX_TRACE_ENABLE */ +void uwx_dump_uinfo_block( + struct uwx_utable_entry *uentry, + unsigned int ulen) +{ + int i; + uint32_t *uinfo = (uint32_t *)(intptr_t)uentry->unwind_info; + + ulen += DWORDSZ; /* Include unwind info header */ + if (uentry->unwind_flags & UNWIND_TBL_32BIT) /* and personality routine */ + ulen += WORDSZ; + else + ulen += DWORDSZ; + while (ulen >= WORDSZ) { + fprintf(stderr, " %08lx: ", (unsigned long)uinfo); + for (i = 0; i < 4 * WORDSZ && ulen >= WORDSZ; i += WORDSZ) { + fprintf(stderr, " %08lx", *uinfo++); + ulen -= WORDSZ; + } + fprintf(stderr, "\n"); + } +} |