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