1 a84cbb2a 2004-04-19 devnull #include <u.h>
2 a84cbb2a 2004-04-19 devnull #include <libc.h>
3 a84cbb2a 2004-04-19 devnull #include <bio.h>
4 a84cbb2a 2004-04-19 devnull #include <mach.h>
6 a84cbb2a 2004-04-19 devnull typedef struct LocRegs LocRegs;
7 a84cbb2a 2004-04-19 devnull struct LocRegs
10 a84cbb2a 2004-04-19 devnull Regs *oldregs;
11 a84cbb2a 2004-04-19 devnull Map *map;
12 a84cbb2a 2004-04-19 devnull ulong *val;
15 a84cbb2a 2004-04-19 devnull static int
16 4f0073fe 2004-06-11 devnull locregrw(Regs *regs, char *name, ulong *val, int isr)
19 a84cbb2a 2004-04-19 devnull LocRegs *lr;
21 a84cbb2a 2004-04-19 devnull lr = (LocRegs*)regs;
22 a84cbb2a 2004-04-19 devnull i = windindex(name);
23 a84cbb2a 2004-04-19 devnull if(i == -1)
24 a84cbb2a 2004-04-19 devnull return lr->oldregs->rw(lr->oldregs, name, val, isr);
26 a84cbb2a 2004-04-19 devnull *val = lr->val[i];
27 a84cbb2a 2004-04-19 devnull return 0;
29 a84cbb2a 2004-04-19 devnull werrstr("saved registers are immutable");
30 a84cbb2a 2004-04-19 devnull return -1;
35 a84cbb2a 2004-04-19 devnull stacktrace(Map *map, Regs *regs, Tracer trace)
37 a84cbb2a 2004-04-19 devnull char *rname;
38 a84cbb2a 2004-04-19 devnull int i, ipc, ret;
39 4f0073fe 2004-06-11 devnull ulong nextpc, pc, v;
40 a84cbb2a 2004-04-19 devnull ulong *cur, *next;
41 a84cbb2a 2004-04-19 devnull LocRegs lr;
42 a84cbb2a 2004-04-19 devnull Symbol s, *sp;
45 a84cbb2a 2004-04-19 devnull * Allocate location arrays.
47 a84cbb2a 2004-04-19 devnull ret = -1;
48 a84cbb2a 2004-04-19 devnull cur = malloc(mach->nwindreg*sizeof(cur[0]));
49 a84cbb2a 2004-04-19 devnull next = malloc(mach->nwindreg*sizeof(cur[0]));
50 a84cbb2a 2004-04-19 devnull if(cur==nil || next==nil)
51 a84cbb2a 2004-04-19 devnull goto out;
54 a84cbb2a 2004-04-19 devnull * Initialize current registers using regs.
56 a84cbb2a 2004-04-19 devnull if(rget(regs, mach->pc, &pc) < 0){
57 a84cbb2a 2004-04-19 devnull werrstr("cannot fetch initial pc: %r");
58 a84cbb2a 2004-04-19 devnull goto out;
61 a84cbb2a 2004-04-19 devnull for(i=0; i<mach->nwindreg; i++){
62 a84cbb2a 2004-04-19 devnull rname = mach->windreg[i];
63 a84cbb2a 2004-04-19 devnull if(rget(regs, rname, &v) < 0)
64 a84cbb2a 2004-04-19 devnull v = ~(ulong)0;
65 a84cbb2a 2004-04-19 devnull cur[i] = v;
68 a84cbb2a 2004-04-19 devnull ipc = windindex(mach->pc);
71 a84cbb2a 2004-04-19 devnull /* set up cur[i]==next[i] for unwindframe */
72 a84cbb2a 2004-04-19 devnull memmove(next, cur, mach->nwindreg*sizeof(next[0]));
75 a84cbb2a 2004-04-19 devnull if(findsym(locaddr(pc), CTEXT, &s) < 0)
76 a84cbb2a 2004-04-19 devnull sp = nil;
78 a84cbb2a 2004-04-19 devnull lr.r.rw = locregrw;
79 a84cbb2a 2004-04-19 devnull lr.oldregs = regs;
80 a84cbb2a 2004-04-19 devnull lr.val = cur;
81 a84cbb2a 2004-04-19 devnull lr.map = map;
82 1cc215aa 2004-12-25 devnull if((i = unwindframe(map, &lr.r, next, sp)) >= 0)
83 a84cbb2a 2004-04-19 devnull nextpc = next[ipc];
85 a84cbb2a 2004-04-19 devnull nextpc = ~(ulong)0;
86 a84cbb2a 2004-04-19 devnull if((*trace)(map, &lr.r, pc, nextpc, sp, ++ret) <= 0)
88 a84cbb2a 2004-04-19 devnull if(i < 0)
91 dd944ec7 2005-01-23 devnull if(strcmp(sp->name, "main") == 0
92 dd944ec7 2005-01-23 devnull || strcmp(sp->name, "procscheduler") == 0
93 dd944ec7 2005-01-23 devnull || strcmp(sp->name, "threadstart") == 0)
96 a84cbb2a 2004-04-19 devnull pc = nextpc;
97 a84cbb2a 2004-04-19 devnull memmove(cur, next, mach->nwindreg*sizeof(cur[0]));
101 a84cbb2a 2004-04-19 devnull free(cur);
102 a84cbb2a 2004-04-19 devnull free(next);
103 a84cbb2a 2004-04-19 devnull return ret;
107 a84cbb2a 2004-04-19 devnull windindex(char *reg)
109 a84cbb2a 2004-04-19 devnull char **p;
112 a84cbb2a 2004-04-19 devnull p = mach->windreg;
113 a84cbb2a 2004-04-19 devnull for(i=0; i<mach->nwindreg; i++)
114 a84cbb2a 2004-04-19 devnull if(strcmp(p[i], reg) == 0)
115 a84cbb2a 2004-04-19 devnull return i;
116 a84cbb2a 2004-04-19 devnull werrstr("%s is not a winding register", reg);
117 a84cbb2a 2004-04-19 devnull return -1;
121 a84cbb2a 2004-04-19 devnull windreglocs(void)
124 a84cbb2a 2004-04-19 devnull Loc *loc;
126 a84cbb2a 2004-04-19 devnull loc = malloc(mach->nwindreg*sizeof(loc[0]));
127 a84cbb2a 2004-04-19 devnull if(loc == nil)
128 a84cbb2a 2004-04-19 devnull return nil;
129 a84cbb2a 2004-04-19 devnull for(i=0; i<mach->nwindreg; i++){
130 a84cbb2a 2004-04-19 devnull loc[i].type = LREG;
131 a84cbb2a 2004-04-19 devnull loc[i].reg = mach->windreg[i];
133 a84cbb2a 2004-04-19 devnull return loc;