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 int
7 a84cbb2a 2004-04-19 devnull locfmt(Fmt *fmt)
8 a84cbb2a 2004-04-19 devnull {
9 a84cbb2a 2004-04-19 devnull Loc l;
10 a84cbb2a 2004-04-19 devnull
11 a84cbb2a 2004-04-19 devnull l = va_arg(fmt->args, Loc);
12 a84cbb2a 2004-04-19 devnull switch(l.type){
13 a84cbb2a 2004-04-19 devnull default:
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);
23 a84cbb2a 2004-04-19 devnull }
24 a84cbb2a 2004-04-19 devnull }
25 a84cbb2a 2004-04-19 devnull
26 a84cbb2a 2004-04-19 devnull int
27 a84cbb2a 2004-04-19 devnull loccmp(Loc *a, Loc *b)
28 a84cbb2a 2004-04-19 devnull {
29 a84cbb2a 2004-04-19 devnull int i;
30 a84cbb2a 2004-04-19 devnull
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){
36 a84cbb2a 2004-04-19 devnull default:
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);
55 a84cbb2a 2004-04-19 devnull }
56 a84cbb2a 2004-04-19 devnull }
57 a84cbb2a 2004-04-19 devnull
58 a84cbb2a 2004-04-19 devnull int
59 a84cbb2a 2004-04-19 devnull lget1(Map *map, Regs *regs, Loc loc, uchar *a, uint n)
60 a84cbb2a 2004-04-19 devnull {
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;
68 a84cbb2a 2004-04-19 devnull }
69 a84cbb2a 2004-04-19 devnull
70 a84cbb2a 2004-04-19 devnull int
71 a84cbb2a 2004-04-19 devnull lget2(Map *map, Regs *regs, Loc loc, u16int *u)
72 a84cbb2a 2004-04-19 devnull {
73 443d6288 2012-02-19 rsc u64int ul;
74 a84cbb2a 2004-04-19 devnull
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;
82 a84cbb2a 2004-04-19 devnull }
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;
86 a84cbb2a 2004-04-19 devnull *u = ul;
87 a84cbb2a 2004-04-19 devnull return 0;
88 a84cbb2a 2004-04-19 devnull }
89 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget2");
90 a84cbb2a 2004-04-19 devnull return -1;
91 a84cbb2a 2004-04-19 devnull }
92 a84cbb2a 2004-04-19 devnull
93 a84cbb2a 2004-04-19 devnull int
94 a84cbb2a 2004-04-19 devnull lget4(Map *map, Regs *regs, Loc loc, u32int *u)
95 a84cbb2a 2004-04-19 devnull {
96 443d6288 2012-02-19 rsc u64int ul;
97 a84cbb2a 2004-04-19 devnull
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;
105 a84cbb2a 2004-04-19 devnull }
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;
111 a84cbb2a 2004-04-19 devnull }
112 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget4");
113 a84cbb2a 2004-04-19 devnull return -1;
114 a84cbb2a 2004-04-19 devnull }
115 a84cbb2a 2004-04-19 devnull
116 a84cbb2a 2004-04-19 devnull int
117 443d6288 2012-02-19 rsc lgeta(Map *map, Regs *regs, Loc loc, u64int *u)
118 443d6288 2012-02-19 rsc {
119 443d6288 2012-02-19 rsc u32int v;
120 443d6288 2012-02-19 rsc
121 443d6288 2012-02-19 rsc if(machcpu == &machamd64)
122 443d6288 2012-02-19 rsc return lget8(map, regs, loc, u);
123 443d6288 2012-02-19 rsc if(lget4(map, regs, loc, &v) < 0)
124 443d6288 2012-02-19 rsc return -1;
125 443d6288 2012-02-19 rsc *u = v;
126 443d6288 2012-02-19 rsc return 4;
127 443d6288 2012-02-19 rsc }
128 443d6288 2012-02-19 rsc
129 443d6288 2012-02-19 rsc int
130 a84cbb2a 2004-04-19 devnull lget8(Map *map, Regs *regs, Loc loc, u64int *u)
131 a84cbb2a 2004-04-19 devnull {
132 443d6288 2012-02-19 rsc u64int ul;
133 a84cbb2a 2004-04-19 devnull
134 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
135 a84cbb2a 2004-04-19 devnull return -1;
136 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
137 a84cbb2a 2004-04-19 devnull return get8(map, loc.addr, u);
138 a84cbb2a 2004-04-19 devnull if(loc.type == LCONST){
139 a84cbb2a 2004-04-19 devnull *u = loc.addr;
140 a84cbb2a 2004-04-19 devnull return 0;
141 a84cbb2a 2004-04-19 devnull }
142 a84cbb2a 2004-04-19 devnull if(loc.type == LREG){
143 a84cbb2a 2004-04-19 devnull if(rget(regs, loc.reg, &ul) < 0)
144 a84cbb2a 2004-04-19 devnull return -1;
145 a84cbb2a 2004-04-19 devnull *u = ul;
146 a84cbb2a 2004-04-19 devnull return 0;
147 a84cbb2a 2004-04-19 devnull }
148 a84cbb2a 2004-04-19 devnull werrstr("bad location for lget8");
149 a84cbb2a 2004-04-19 devnull return -1;
150 a84cbb2a 2004-04-19 devnull }
151 a84cbb2a 2004-04-19 devnull
152 a84cbb2a 2004-04-19 devnull int
153 a84cbb2a 2004-04-19 devnull lput1(Map *map, Regs *regs, Loc loc, uchar *a, uint n)
154 a84cbb2a 2004-04-19 devnull {
155 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
156 a84cbb2a 2004-04-19 devnull return -1;
157 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
158 a84cbb2a 2004-04-19 devnull return put1(map, loc.addr, a, n);
159 a84cbb2a 2004-04-19 devnull /* could do more here - i'm lazy */
160 a84cbb2a 2004-04-19 devnull werrstr("bad location for lput1");
161 a84cbb2a 2004-04-19 devnull return -1;
162 a84cbb2a 2004-04-19 devnull }
163 a84cbb2a 2004-04-19 devnull
164 a84cbb2a 2004-04-19 devnull int
165 a84cbb2a 2004-04-19 devnull lput2(Map *map, Regs *regs, Loc loc, u16int u)
166 a84cbb2a 2004-04-19 devnull {
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 put2(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 lput2");
174 a84cbb2a 2004-04-19 devnull return -1;
175 a84cbb2a 2004-04-19 devnull }
176 a84cbb2a 2004-04-19 devnull
177 a84cbb2a 2004-04-19 devnull int
178 a84cbb2a 2004-04-19 devnull lput4(Map *map, Regs *regs, Loc loc, u32int u)
179 a84cbb2a 2004-04-19 devnull {
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 put4(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 lput4");
187 a84cbb2a 2004-04-19 devnull return -1;
188 a84cbb2a 2004-04-19 devnull }
189 a84cbb2a 2004-04-19 devnull
190 a84cbb2a 2004-04-19 devnull int
191 a84cbb2a 2004-04-19 devnull lput8(Map *map, Regs *regs, Loc loc, u64int u)
192 a84cbb2a 2004-04-19 devnull {
193 a84cbb2a 2004-04-19 devnull if(locsimplify(map, regs, loc, &loc) < 0)
194 a84cbb2a 2004-04-19 devnull return -1;
195 a84cbb2a 2004-04-19 devnull if(loc.type == LADDR)
196 a84cbb2a 2004-04-19 devnull return put8(map, loc.addr, u);
197 a84cbb2a 2004-04-19 devnull if(loc.type == LREG)
198 a84cbb2a 2004-04-19 devnull return rput(regs, loc.reg, u);
199 a84cbb2a 2004-04-19 devnull werrstr("bad location for lput8");
200 a84cbb2a 2004-04-19 devnull return -1;
201 a84cbb2a 2004-04-19 devnull }
202 a84cbb2a 2004-04-19 devnull
203 98bfdd28 2006-02-06 devnull static Loc zl;
204 98bfdd28 2006-02-06 devnull
205 a84cbb2a 2004-04-19 devnull Loc
206 443d6288 2012-02-19 rsc locaddr(u64int addr)
207 a84cbb2a 2004-04-19 devnull {
208 a84cbb2a 2004-04-19 devnull Loc l;
209 a84cbb2a 2004-04-19 devnull
210 98bfdd28 2006-02-06 devnull l = zl;
211 a84cbb2a 2004-04-19 devnull l.type = LADDR;
212 a84cbb2a 2004-04-19 devnull l.addr = addr;
213 a84cbb2a 2004-04-19 devnull return l;
214 a84cbb2a 2004-04-19 devnull }
215 a84cbb2a 2004-04-19 devnull
216 a84cbb2a 2004-04-19 devnull Loc
217 4f0073fe 2004-06-11 devnull locindir(char *reg, long offset)
218 a84cbb2a 2004-04-19 devnull {
219 a84cbb2a 2004-04-19 devnull Loc l;
220 a84cbb2a 2004-04-19 devnull
221 98bfdd28 2006-02-06 devnull l = zl;
222 a84cbb2a 2004-04-19 devnull l.type = LOFFSET;
223 a84cbb2a 2004-04-19 devnull l.reg = reg;
224 a84cbb2a 2004-04-19 devnull l.offset = offset;
225 3c47d761 2005-07-13 devnull l.addr = 0; /* SHUT UP GCC 4.0 */
226 a84cbb2a 2004-04-19 devnull return l;
227 a84cbb2a 2004-04-19 devnull }
228 a84cbb2a 2004-04-19 devnull
229 a84cbb2a 2004-04-19 devnull Loc
230 443d6288 2012-02-19 rsc locconst(u64int con)
231 a84cbb2a 2004-04-19 devnull {
232 a84cbb2a 2004-04-19 devnull Loc l;
233 a84cbb2a 2004-04-19 devnull
234 98bfdd28 2006-02-06 devnull l = zl;
235 a84cbb2a 2004-04-19 devnull l.type = LCONST;
236 a84cbb2a 2004-04-19 devnull l.addr = con;
237 a84cbb2a 2004-04-19 devnull return l;
238 a84cbb2a 2004-04-19 devnull }
239 a84cbb2a 2004-04-19 devnull
240 a84cbb2a 2004-04-19 devnull Loc
241 a84cbb2a 2004-04-19 devnull locnone(void)
242 a84cbb2a 2004-04-19 devnull {
243 a84cbb2a 2004-04-19 devnull Loc l;
244 a84cbb2a 2004-04-19 devnull
245 98bfdd28 2006-02-06 devnull l = zl;
246 a84cbb2a 2004-04-19 devnull l.type = LNONE;
247 a84cbb2a 2004-04-19 devnull return l;
248 a84cbb2a 2004-04-19 devnull }
249 a84cbb2a 2004-04-19 devnull
250 a84cbb2a 2004-04-19 devnull Loc
251 a84cbb2a 2004-04-19 devnull locreg(char *reg)
252 a84cbb2a 2004-04-19 devnull {
253 a84cbb2a 2004-04-19 devnull Loc l;
254 a84cbb2a 2004-04-19 devnull
255 98bfdd28 2006-02-06 devnull l = zl;
256 a84cbb2a 2004-04-19 devnull l.type = LREG;
257 a84cbb2a 2004-04-19 devnull l.reg = reg;
258 a84cbb2a 2004-04-19 devnull return l;
259 a84cbb2a 2004-04-19 devnull }
260 a84cbb2a 2004-04-19 devnull
261 a84cbb2a 2004-04-19 devnull int
262 a84cbb2a 2004-04-19 devnull locsimplify(Map *map, Regs *regs, Loc loc, Loc *newloc)
263 a84cbb2a 2004-04-19 devnull {
264 443d6288 2012-02-19 rsc u64int u;
265 a84cbb2a 2004-04-19 devnull
266 a84cbb2a 2004-04-19 devnull if(loc.type == LOFFSET){
267 a84cbb2a 2004-04-19 devnull if(rget(regs, loc.reg, &u) < 0)
268 a84cbb2a 2004-04-19 devnull return -1;
269 a84cbb2a 2004-04-19 devnull *newloc = locaddr(u + loc.offset);
270 a84cbb2a 2004-04-19 devnull }else
271 a84cbb2a 2004-04-19 devnull *newloc = loc;
272 a84cbb2a 2004-04-19 devnull return 0;
273 a84cbb2a 2004-04-19 devnull }