Blame


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>
5 a84cbb2a 2004-04-19 devnull
6 a84cbb2a 2004-04-19 devnull /*
7 a84cbb2a 2004-04-19 devnull * XXX could remove the rock by hiding it in a special regs.
8 a84cbb2a 2004-04-19 devnull * That would still be sleazy but would be thread-safe.
9 a84cbb2a 2004-04-19 devnull */
10 a84cbb2a 2004-04-19 devnull
11 a84cbb2a 2004-04-19 devnull static struct {
12 a84cbb2a 2004-04-19 devnull int found;
13 a84cbb2a 2004-04-19 devnull int nframe;
14 a84cbb2a 2004-04-19 devnull Loc l;
15 a84cbb2a 2004-04-19 devnull char *fn;
16 a84cbb2a 2004-04-19 devnull char *var;
17 a84cbb2a 2004-04-19 devnull } rock;
18 a84cbb2a 2004-04-19 devnull
19 a84cbb2a 2004-04-19 devnull static int
20 a84cbb2a 2004-04-19 devnull ltrace(Map *map, Regs *regs, ulong pc, ulong nextpc, Symbol *sym, int depth)
21 a84cbb2a 2004-04-19 devnull {
22 a84cbb2a 2004-04-19 devnull ulong v;
23 a84cbb2a 2004-04-19 devnull Symbol s1;
24 a84cbb2a 2004-04-19 devnull
25 a84cbb2a 2004-04-19 devnull USED(pc);
26 a84cbb2a 2004-04-19 devnull USED(nextpc);
27 a84cbb2a 2004-04-19 devnull USED(depth);
28 a84cbb2a 2004-04-19 devnull
29 a84cbb2a 2004-04-19 devnull if(sym==nil || strcmp(sym->name, rock.fn) != 0)
30 a84cbb2a 2004-04-19 devnull return ++rock.nframe < 40;
31 a84cbb2a 2004-04-19 devnull if(lookuplsym(sym, rock.var, &s1) < 0)
32 a84cbb2a 2004-04-19 devnull return 0;
33 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, s1.loc, &rock.l) < 0)
34 a84cbb2a 2004-04-19 devnull return 0;
35 a84cbb2a 2004-04-19 devnull if(rock.l.type == LREG && rget(regs, rock.l.reg, &v) >= 0)
36 a84cbb2a 2004-04-19 devnull rock.l = locconst(v);
37 a84cbb2a 2004-04-19 devnull if(rock.l.type != LADDR && rock.l.type != LCONST)
38 a84cbb2a 2004-04-19 devnull return 0;
39 a84cbb2a 2004-04-19 devnull rock.found = 1;
40 a84cbb2a 2004-04-19 devnull return 0;
41 a84cbb2a 2004-04-19 devnull }
42 a84cbb2a 2004-04-19 devnull
43 a84cbb2a 2004-04-19 devnull int
44 a84cbb2a 2004-04-19 devnull localaddr(Map *map, Regs *regs, char *fn, char *var, ulong *val)
45 a84cbb2a 2004-04-19 devnull {
46 a84cbb2a 2004-04-19 devnull rock.found = 0;
47 a84cbb2a 2004-04-19 devnull rock.nframe = 0;
48 a84cbb2a 2004-04-19 devnull rock.fn = fn;
49 a84cbb2a 2004-04-19 devnull rock.var = var;
50 a84cbb2a 2004-04-19 devnull stacktrace(map, regs, ltrace);
51 a84cbb2a 2004-04-19 devnull if(rock.found){
52 a84cbb2a 2004-04-19 devnull *val = rock.l.addr;
53 a84cbb2a 2004-04-19 devnull return 0;
54 a84cbb2a 2004-04-19 devnull }
55 a84cbb2a 2004-04-19 devnull return -1;
56 a84cbb2a 2004-04-19 devnull }