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>
7 a84cbb2a 2004-04-19 devnull locfmt(Fmt *fmt)
11 a84cbb2a 2004-04-19 devnull l = va_arg(fmt->args, Loc);
12 a84cbb2a 2004-04-19 devnull switch(l.type){
14 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "<loc%d>", l.type);
15 a84cbb2a 2004-04-19 devnull case LCONST:
16 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "0x%lux", l.addr);
17 a84cbb2a 2004-04-19 devnull case LADDR:
18 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "*0x%lux", l.addr);
19 a84cbb2a 2004-04-19 devnull case LOFFSET:
20 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "%ld(%s)", l.offset, l.reg);
21 a84cbb2a 2004-04-19 devnull case LREG:
22 a84cbb2a 2004-04-19 devnull return fmtprint(fmt, "%s", l.reg);
27 a84cbb2a 2004-04-19 devnull loccmp(Loc *a, Loc *b)
31 a84cbb2a 2004-04-19 devnull if(a->type < b->type)
32 a84cbb2a 2004-04-19 devnull return -1;
33 a84cbb2a 2004-04-19 devnull if(a->type > b->type)
34 a84cbb2a 2004-04-19 devnull return 1;
35 a84cbb2a 2004-04-19 devnull switch(a->type){
37 a84cbb2a 2004-04-19 devnull return 0;
38 a84cbb2a 2004-04-19 devnull case LADDR:
39 a84cbb2a 2004-04-19 devnull if(a->addr < b->addr)
40 a84cbb2a 2004-04-19 devnull return -1;
41 a84cbb2a 2004-04-19 devnull if(a->addr > b->addr)
42 a84cbb2a 2004-04-19 devnull return 1;
43 a84cbb2a 2004-04-19 devnull return 0;
44 a84cbb2a 2004-04-19 devnull case LOFFSET:
45 a84cbb2a 2004-04-19 devnull i = strcmp(a->reg, b->reg);
46 a84cbb2a 2004-04-19 devnull if(i != 0)
47 a84cbb2a 2004-04-19 devnull return i;
48 a84cbb2a 2004-04-19 devnull if(a->offset < b->offset)
49 a84cbb2a 2004-04-19 devnull return -1;
50 a84cbb2a 2004-04-19 devnull if(a->offset > b->offset)
51 a84cbb2a 2004-04-19 devnull return 1;
52 a84cbb2a 2004-04-19 devnull return 0;
53 a84cbb2a 2004-04-19 devnull case LREG:
54 a84cbb2a 2004-04-19 devnull return strcmp(a->reg, b->reg);
59 a84cbb2a 2004-04-19 devnull lget1(Map *map, Regs *regs, Loc loc, uchar *a, uint n)
61 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
62 a84cbb2a 2004-04-19 devnull return -1;
63 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
64 a84cbb2a 2004-04-19 devnull return get1(map, loc.addr, a, n);
65 a84cbb2a 2004-04-19 devnull /* could do more here - i'm lazy */
66 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget1");
67 a84cbb2a 2004-04-19 devnull return -1;
71 a84cbb2a 2004-04-19 devnull lget2(Map *map, Regs *regs, Loc loc, u16int *u)
73 4f0073fe 2004-06-11 devnull ulong ul;
75 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
76 a84cbb2a 2004-04-19 devnull return -1;
77 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
78 a84cbb2a 2004-04-19 devnull return get2(map, loc.addr, u);
79 a84cbb2a 2004-04-19 devnull if(loc.type == LCONST){
80 a84cbb2a 2004-04-19 devnull *u = loc.addr;
81 a84cbb2a 2004-04-19 devnull return 0;
83 a84cbb2a 2004-04-19 devnull if(loc.type == LREG){
84 a84cbb2a 2004-04-19 devnull if(rget(regs, loc.reg, &ul) < 0)
85 a84cbb2a 2004-04-19 devnull return -1;
87 a84cbb2a 2004-04-19 devnull return 0;
89 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget2");
90 a84cbb2a 2004-04-19 devnull return -1;
94 a84cbb2a 2004-04-19 devnull lget4(Map *map, Regs *regs, Loc loc, u32int *u)
96 4f0073fe 2004-06-11 devnull ulong ul;
98 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
99 a84cbb2a 2004-04-19 devnull return -1;
100 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
101 a84cbb2a 2004-04-19 devnull return get4(map, loc.addr, u);
102 a84cbb2a 2004-04-19 devnull if(loc.type == LCONST){
103 a84cbb2a 2004-04-19 devnull *u = loc.addr;
104 a84cbb2a 2004-04-19 devnull return 0;
106 a84cbb2a 2004-04-19 devnull if(loc.type == LREG){
107 a84cbb2a 2004-04-19 devnull if(rget(regs, loc.reg, &ul) < 0)
108 a84cbb2a 2004-04-19 devnull return -1;
109 a84cbb2a 2004-04-19 devnull *u = ul;
110 a84cbb2a 2004-04-19 devnull return 0;
112 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget4");
113 a84cbb2a 2004-04-19 devnull return -1;
117 a84cbb2a 2004-04-19 devnull lget8(Map *map, Regs *regs, Loc loc, u64int *u)
119 4f0073fe 2004-06-11 devnull ulong ul;
121 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
122 a84cbb2a 2004-04-19 devnull return -1;
123 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
124 a84cbb2a 2004-04-19 devnull return get8(map, loc.addr, u);
125 a84cbb2a 2004-04-19 devnull if(loc.type == LCONST){
126 a84cbb2a 2004-04-19 devnull *u = loc.addr;
127 a84cbb2a 2004-04-19 devnull return 0;
129 a84cbb2a 2004-04-19 devnull if(loc.type == LREG){
130 a84cbb2a 2004-04-19 devnull if(rget(regs, loc.reg, &ul) < 0)
131 a84cbb2a 2004-04-19 devnull return -1;
132 a84cbb2a 2004-04-19 devnull *u = ul;
133 a84cbb2a 2004-04-19 devnull return 0;
135 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget8");
136 a84cbb2a 2004-04-19 devnull return -1;
140 a84cbb2a 2004-04-19 devnull lput1(Map *map, Regs *regs, Loc loc, uchar *a, uint n)
142 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
143 a84cbb2a 2004-04-19 devnull return -1;
144 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
145 a84cbb2a 2004-04-19 devnull return put1(map, loc.addr, a, n);
146 a84cbb2a 2004-04-19 devnull /* could do more here - i'm lazy */
147 a84cbb2a 2004-04-19 devnull werrstr("bad location for lput1");
148 a84cbb2a 2004-04-19 devnull return -1;
152 a84cbb2a 2004-04-19 devnull lput2(Map *map, Regs *regs, Loc loc, u16int u)
154 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
155 a84cbb2a 2004-04-19 devnull return -1;
156 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
157 a84cbb2a 2004-04-19 devnull return put2(map, loc.addr, u);
158 a84cbb2a 2004-04-19 devnull if(loc.type == LREG)
159 a84cbb2a 2004-04-19 devnull return rput(regs, loc.reg, u);
160 a84cbb2a 2004-04-19 devnull werrstr("bad location for lput2");
161 a84cbb2a 2004-04-19 devnull return -1;
165 a84cbb2a 2004-04-19 devnull lput4(Map *map, Regs *regs, Loc loc, u32int u)
167 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
168 a84cbb2a 2004-04-19 devnull return -1;
169 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
170 a84cbb2a 2004-04-19 devnull return put4(map, loc.addr, u);
171 a84cbb2a 2004-04-19 devnull if(loc.type == LREG)
172 a84cbb2a 2004-04-19 devnull return rput(regs, loc.reg, u);
173 a84cbb2a 2004-04-19 devnull werrstr("bad location for lput4");
174 a84cbb2a 2004-04-19 devnull return -1;
178 a84cbb2a 2004-04-19 devnull lput8(Map *map, Regs *regs, Loc loc, u64int u)
180 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
181 a84cbb2a 2004-04-19 devnull return -1;
182 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
183 a84cbb2a 2004-04-19 devnull return put8(map, loc.addr, u);
184 a84cbb2a 2004-04-19 devnull if(loc.type == LREG)
185 a84cbb2a 2004-04-19 devnull return rput(regs, loc.reg, u);
186 a84cbb2a 2004-04-19 devnull werrstr("bad location for lput8");
187 a84cbb2a 2004-04-19 devnull return -1;
190 98bfdd28 2006-02-06 devnull static Loc zl;
193 4f0073fe 2004-06-11 devnull locaddr(ulong addr)
198 a84cbb2a 2004-04-19 devnull l.type = LADDR;
199 a84cbb2a 2004-04-19 devnull l.addr = addr;
200 a84cbb2a 2004-04-19 devnull return l;
204 4f0073fe 2004-06-11 devnull locindir(char *reg, long offset)
209 a84cbb2a 2004-04-19 devnull l.type = LOFFSET;
210 a84cbb2a 2004-04-19 devnull l.reg = reg;
211 a84cbb2a 2004-04-19 devnull l.offset = offset;
212 3c47d761 2005-07-13 devnull l.addr = 0; /* SHUT UP GCC 4.0 */
213 a84cbb2a 2004-04-19 devnull return l;
217 4f0073fe 2004-06-11 devnull locconst(ulong con)
222 a84cbb2a 2004-04-19 devnull l.type = LCONST;
223 a84cbb2a 2004-04-19 devnull l.addr = con;
224 a84cbb2a 2004-04-19 devnull return l;
228 a84cbb2a 2004-04-19 devnull locnone(void)
233 a84cbb2a 2004-04-19 devnull l.type = LNONE;
234 a84cbb2a 2004-04-19 devnull return l;
238 a84cbb2a 2004-04-19 devnull locreg(char *reg)
243 a84cbb2a 2004-04-19 devnull l.type = LREG;
244 a84cbb2a 2004-04-19 devnull l.reg = reg;
245 a84cbb2a 2004-04-19 devnull return l;
249 a84cbb2a 2004-04-19 devnull locsimplify(Map *map, Regs *regs, Loc loc, Loc *newloc)
251 a84cbb2a 2004-04-19 devnull ulong u;
253 a84cbb2a 2004-04-19 devnull if(loc.type == LOFFSET){
254 a84cbb2a 2004-04-19 devnull if(rget(regs, loc.reg, &u) < 0)
255 a84cbb2a 2004-04-19 devnull return -1;
256 a84cbb2a 2004-04-19 devnull *newloc = locaddr(u + loc.offset);
258 a84cbb2a 2004-04-19 devnull *newloc = loc;
259 a84cbb2a 2004-04-19 devnull return 0;