uwx_trace.c revision 120925
1221337Sdim/* 2221337Sdim * Copyright (c) 2002,2003 Hewlett-Packard Company 3221337Sdim * 4221337Sdim * Permission is hereby granted, free of charge, to any person obtaining a 5221337Sdim * copy of this software and associated documentation files (the "Software"), 6221337Sdim * to deal in the Software without restriction, including without limitation 7221337Sdim * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8221337Sdim * and/or sell copies of the Software, and to permit persons to whom the 9221337Sdim * Software is furnished to do so, subject to the following conditions: 10239462Sdim * 11221337Sdim * The above copyright notice and this permission notice shall be included 12221337Sdim * in all copies or substantial portions of the Software. 13221337Sdim * 14221337Sdim * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15221337Sdim * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16249423Sdim * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17234353Sdim * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18221337Sdim * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 19249423Sdim * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20239462Sdim * DEALINGS IN THE SOFTWARE. 21249423Sdim */ 22249423Sdim 23249423Sdim#include "uwx_env.h" 24249423Sdim#include "uwx_uinfo.h" 25234353Sdim#include "uwx_scoreboard.h" 26249423Sdim#include "uwx_trace.h" 27226633Sdim 28221337Sdim#ifdef UWX_TRACE_ENABLE 29221337Sdim 30221337Sdimvoid uwx_trace_init(struct uwx_env *env) 31221337Sdim{ 32221337Sdim char *tstr; 33221337Sdim 34221337Sdim tstr = getenv("UWX_TRACE"); 35249423Sdim if (tstr != NULL) { 36249423Sdim while (*tstr != '\0') { 37249423Sdim switch (*tstr) { 38249423Sdim case 'i': env->trace |= UWX_TRACE_UINFO; break; 39221337Sdim case 't': env->trace |= UWX_TRACE_UTABLE; break; 40221337Sdim case 'b': env->trace |= UWX_TRACE_SB; break; 41221337Sdim case 'r': env->trace |= UWX_TRACE_RSTATE; break; 42221337Sdim case 's': env->trace |= UWX_TRACE_STEP; break; 43221337Sdim case 'c': env->trace |= UWX_TRACE_CONTEXT; break; 44221337Sdim case 'C': env->trace |= UWX_TRACE_COPYIN; break; 45221337Sdim case 'L': env->trace |= UWX_TRACE_LOOKUPIP; break; 46221337Sdim case '?': 47221337Sdim#ifdef _KERNEL 48221337Sdim printf("UWX_TRACE flag `%c' unknown.\n", *tstr); 49221337Sdim#else 50221337Sdim fprintf(stderr, "UWX_TRACE flags:\n"); 51221337Sdim fprintf(stderr, " i: unwind info\n"); 52221337Sdim fprintf(stderr, " t: unwind table searching\n"); 53221337Sdim fprintf(stderr, " b: scoreboard management\n"); 54221337Sdim fprintf(stderr, " r: register state vector\n"); 55249423Sdim fprintf(stderr, " s: step\n"); 56249423Sdim fprintf(stderr, " c: context\n"); 57249423Sdim fprintf(stderr, " C: copyin callback\n"); 58249423Sdim fprintf(stderr, " L: lookup ip callback\n"); 59249423Sdim exit(1); 60249423Sdim#endif 61249423Sdim } 62249423Sdim tstr++; 63249423Sdim } 64249423Sdim } 65249423Sdim} 66249423Sdim 67249423Sdimchar *uwx_sb_rnames[] = { 68249423Sdim "RP", "PSP", "PFS", 69249423Sdim "PREDS", "UNAT", "PRIUNAT", "RNAT", "LC", "FPSR", 70249423Sdim "GR4", "GR5", "GR6", "GR7", 71249423Sdim "BR1", "BR2", "BR3", "BR4", "BR5", 72249423Sdim "FR2", "FR3", "FR4", "FR5", 73249423Sdim "FR16", "FR17", "FR18", "FR19", 74249423Sdim "FR20", "FR21", "FR22", "FR23", 75249423Sdim "FR24", "FR25", "FR26", "FR27", 76249423Sdim "FR28", "FR29", "FR30", "FR31", 77249423Sdim}; 78249423Sdim 79249423Sdimvoid uwx_dump_rstate(int regid, uint64_t rstate) 80249423Sdim{ 81249423Sdim int reg; 82249423Sdim 83249423Sdim if (rstate == UWX_DISP_NONE) 84249423Sdim return; 85249423Sdim printf(" %-7s", uwx_sb_rnames[regid]); 86249423Sdim switch (UWX_GET_DISP_CODE(rstate)) { 87249423Sdim case UWX_DISP_NONE: 88249423Sdim printf(" unchanged\n"); 89249423Sdim break; 90249423Sdim case UWX_DISP_SPPLUS(0): 91249423Sdim printf(" SP + %d\n", (int)rstate & ~0x07); 92249423Sdim break; 93249423Sdim case UWX_DISP_SPREL(0): 94249423Sdim printf(" [SP + %d]\n", (int)rstate & ~0x07); 95249423Sdim break; 96249423Sdim case UWX_DISP_PSPREL(0): 97249423Sdim printf(" [PSP + 16 - %d]\n", (int)rstate & ~0x07); 98249423Sdim break; 99243830Sdim case UWX_DISP_REG(0): 100243830Sdim reg = UWX_GET_DISP_REGID(rstate); 101243830Sdim if (reg == UWX_REG_AR_PFS) 102243830Sdim printf(" [AR.PFS]\n"); 103243830Sdim else if (reg == UWX_REG_AR_UNAT) 104243830Sdim printf(" [AR.UNAT]\n"); 105243830Sdim else if (reg >= UWX_REG_GR(0) && reg < UWX_REG_GR(128)) 106243830Sdim printf(" [GR%d]\n", reg - UWX_REG_GR(0)); 107243830Sdim else if (reg >= UWX_REG_FR(0) && reg < UWX_REG_FR(128)) 108221337Sdim printf(" [FR%d]\n", reg - UWX_REG_FR(0)); 109221337Sdim else if (reg >= UWX_REG_BR(0) && reg < UWX_REG_BR(8)) 110221337Sdim printf(" [BR%d]\n", reg - UWX_REG_BR(0)); 111221337Sdim else 112221337Sdim printf(" [reg %d]\n", reg); 113221337Sdim break; 114221337Sdim default: 115221337Sdim printf(" <%08llx>\n", (unsigned long long)rstate); 116221337Sdim break; 117221337Sdim } 118221337Sdim} 119221337Sdim 120221337Sdimvoid uwx_dump_scoreboard( 121221337Sdim struct uwx_scoreboard *scoreboard, 122221337Sdim int nsbreg, 123221337Sdim struct uwx_rhdr *rhdr, 124221337Sdim int cur_slot, 125221337Sdim int ip_slot) 126221337Sdim{ 127234353Sdim int i; 128234353Sdim 129249423Sdim if (rhdr->is_prologue) 130249423Sdim printf(" Prologue region (start = %d, length = %d)\n", 131249423Sdim (int)cur_slot, (int)rhdr->rlen); 132234353Sdim else 133249423Sdim printf(" Body region (start = %d, length = %d, ecount = %d)\n", 134249423Sdim cur_slot, (int)rhdr->rlen, rhdr->ecount); 135249423Sdim if (ip_slot < rhdr->rlen) 136249423Sdim printf(" IP is in this region (offset = %d)\n", ip_slot); 137249423Sdim for (i = 0; i < nsbreg; i++) 138249423Sdim uwx_dump_rstate(i, scoreboard->rstate[i]); 139249423Sdim} 140249423Sdim 141249423Sdim#endif /* UWX_TRACE_ENABLE */ 142249423Sdim