16 main(int argc, char **argv)
25 Binit(bioout, 1, OWRITE);
42 text = open(file, OREAD);
44 fatal(1, "open text '%s'", file);
46 Bprint(bioout, "vi\n");
50 reg.fd[dreg(24)] = 0.0; /* Normally initialised by the kernel */
52 reg.fd[dreg(26)] = 0.5;
54 reg.fd[dreg(28)] = 1.0;
56 reg.fd[dreg(30)] = 2.0;
64 ulong t, d, b, bssend;
67 t = (fhdr.txtaddr+fhdr.txtsz+(BY2PG-1)) & ~(BY2PG-1);
68 d = (t + fhdr.datsz + (BY2PG-1)) & ~(BY2PG-1);
69 bssend = t + fhdr.datsz + fhdr.bsssz;
70 b = (bssend + (BY2PG-1)) & ~(BY2PG-1);
72 s = &memory.seg[Text];
74 s->base = fhdr.txtaddr - fhdr.hdrsz;
76 s->fileoff = fhdr.txtoff - fhdr.hdrsz;
77 s->fileend = s->fileoff + fhdr.txtsz;
78 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
80 iprof = emalloc(((s->end-s->base)/PROFGRAN)*sizeof(long));
83 s = &memory.seg[Data];
87 s->fileoff = fhdr.datoff;
88 s->fileend = s->fileoff + fhdr.datsz;
89 datasize = fhdr.datsz;
90 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
96 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
98 s = &memory.seg[Stack];
100 s->base = STACKTOP-STACKSIZE;
102 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
112 extern Machdata mipsmach;
115 if (!crackhdr(fd, &fhdr))
116 fatal(0, "read text header");
118 if(fhdr.type != FMIPS && fhdr.type != FMIPS2BE)
119 fatal(0, "bad magic number: %d %d", fhdr.type, FMIPS);
121 if (syminit(fd, &fhdr) < 0)
124 symmap = loadmap(symmap, fd, &fhdr);
125 if (mach->sbreg && lookup(0, mach->sbreg, &s))
127 machdata = &mipsmach;
131 greg(int f, ulong off)
138 n = read(f, wd, BY2WD);
140 fatal(1, "read register");
151 REGOFF(r1), REGOFF(r2), REGOFF(r3),
152 REGOFF(r4), REGOFF(r5), REGOFF(r6),
153 REGOFF(r7), REGOFF(r8), REGOFF(r9),
154 REGOFF(r10), REGOFF(r11), REGOFF(r12),
155 REGOFF(r13), REGOFF(r14), REGOFF(r15),
156 REGOFF(r16), REGOFF(r17), REGOFF(r18),
157 REGOFF(r19), REGOFF(r20), REGOFF(r21),
158 REGOFF(r22), REGOFF(r23), REGOFF(r24),
159 REGOFF(r25), REGOFF(r26), REGOFF(r27),
164 seginit(int fd, Segment *s, int idx, ulong vastart, ulong vaend)
168 while(vastart < vaend) {
169 seek(fd, vastart, 0);
170 s->table[idx] = emalloc(BY2PG);
171 n = read(fd, s->table[idx], BY2PG);
173 fatal(1, "data read");
185 ulong vastart, vaend;
186 char mfile[128], tfile[128], sfile[1024];
188 sprint(mfile, "/proc/%d/mem", pid);
189 sprint(tfile, "/proc/%d/text", pid);
190 sprint(sfile, "/proc/%d/segment", pid);
192 text = open(tfile, OREAD);
194 fatal(1, "open text %s", tfile);
197 sg = open(sfile, OREAD);
199 fatal(1, "open text %s", sfile);
201 n = read(sg, sfile, sizeof(sfile));
202 if(n >= sizeof(sfile))
203 fatal(0, "segment file buffer too small");
206 m = open(mfile, OREAD);
208 fatal(1, "open %s", mfile);
211 p = strstr(sfile, "Data");
215 vastart = strtoul(p+9, 0, 16);
216 vaend = strtoul(p+18, 0, 16);
217 s = &memory.seg[Data];
218 if(s->base != vastart || s->end != vaend) {
222 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
224 seginit(m, s, 0, vastart, vaend);
226 p = strstr(sfile, "Bss");
230 vastart = strtoul(p+9, 0, 16);
231 vaend = strtoul(p+18, 0, 16);
232 s = &memory.seg[Bss];
233 if(s->base != vastart || s->end != vaend) {
237 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
239 seginit(m, s, 0, vastart, vaend);
241 reg.pc = greg(m, REGOFF(pc));
242 reg.r[29] = greg(m, REGOFF(sp));
243 reg.r[30] = greg(m, REGOFF(r30));
244 reg.r[31] = greg(m, REGOFF(r31));
246 reg.mhi = greg(m, REGOFF(hi));
247 reg.mlo = greg(m, REGOFF(lo));
249 for(i = 1; i < 29; i++)
250 reg.r[i] = greg(m, roff[i-1]);
252 s = &memory.seg[Stack];
253 vastart = reg.r[29] & ~(BY2PG-1);
254 seginit(m, s, (vastart-s->base)/BY2PG, vastart, STACKTOP);
256 Bprint(bioout, "vi\n");
266 memset(®, 0, sizeof(Registers));
267 reg.fd[dreg(24)] = 0.0; /* Normally initialised by the kernel */
269 reg.fd[dreg(26)] = 0.5;
271 reg.fd[dreg(28)] = 1.0;
273 reg.fd[dreg(30)] = 2.0;
276 for(i = 0; i > Nseg; i++) {
278 l = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
279 for(m = 0; m < l; m++)
285 memset(&memory, 0, sizeof(memory));
287 for(b = bplist; b; b = b->next)
292 initstk(int argc, char *argv[])
300 tos = STACKTOP - sizeof(Tos)*2; /* we'll assume twice the host's is big enough */
302 for (i = 0; i < sizeof(Tos)*2; i++)
303 putmem_b(tos + i, 0);
306 * pid is second word from end of tos and needs to be set for nsec().
307 * we know mips is a 32-bit cpu, so we'll assume knowledge of the Tos
308 * struct for now, and use our pid.
310 putmem_w(tos + 4*4 + 2*sizeof(ulong) + 3*sizeof(uvlong), getpid());
312 /* Build exec stack */
313 size = strlen(file)+1+BY2WD+BY2WD+BY2WD;
314 for(i = 0; i < argc; i++)
315 size += strlen(argv[i])+BY2WD+1;
320 reg.r[1] = tos; /* Plan 9 profiling clock, etc. */
323 putmem_w(sp, argc+1);
326 /* Compute sizeof(argv) and push argv[0] */
327 ap = sp+((argc+1)*BY2WD)+BY2WD;
331 /* Build argv[0] string into stack */
332 for(p = file; *p; p++)
335 putmem_b(ap++, '\0');
337 /* Loop through pushing the arguments */
338 for(i = 0; i < argc; i++) {
341 for(p = argv[i]; *p; p++)
343 putmem_b(ap++, '\0');
345 /* Null terminate argv */
351 fatal(int syserr, char *fmt, ...)
353 char buf[ERRMAX], *s;
357 vseprint(buf, buf+sizeof(buf), fmt, arg);
367 itrace(char *fmt, ...)
373 vseprint(buf, buf+sizeof(buf), fmt, arg);
375 Bprint(bioout, "%8lux %.8lux %s\n", reg.pc, reg.ir, buf);
383 Bprint(bioout, "PC #%-8lux SP #%-8lux HI #%-8lux LO #%-8lux\n",
384 reg.pc, reg.r[29], reg.mhi, reg.mlo);
386 for(i = 0; i < 32; i++) {
387 if((i%4) == 0 && i != 0)
388 Bprint(bioout, "\n");
389 Bprint(bioout, "R%-2d #%-8lux ", i, reg.r[i]);
391 Bprint(bioout, "\n");
402 ieeesftos(buf, sizeof(buf), reg.di[i]);
403 Bprint(bioout, "F%-2d %s\t", i, buf);
406 ieeesftos(buf, sizeof(buf), reg.di[i]);
407 Bprint(bioout, "\t\t\tF%-2d %s\n", i, buf);
421 ieeedftos(buf, sizeof(buf), reg.di[i] ,reg.di[i+1]);
423 ieeedftos(buf, sizeof(buf), reg.di[i+1] ,reg.di[i]);
424 Bprint(bioout, "F%-2d %s\t\t\t", i, buf);
428 ieeedftos(buf, sizeof(buf), reg.di[i] ,reg.di[i+1]);
430 ieeedftos(buf, sizeof(buf), reg.di[i+1] ,reg.di[i]);
431 Bprint(bioout, "F%-2d %s\n", i, buf);
443 fatal(0, "no memory");
450 erealloc(void *a, ulong oldsize, ulong size)
456 fatal(0, "no memory");
465 mulu(ulong u1, ulong u2)
467 ulong lo1, lo2, hi1, hi2, lo, hi, t1, t2, t;
486 hi += (t1 >> 16) + (t2 >> 16);
487 return (Mulu){lo, hi};
491 mul(long l1, long l2)
516 return (Mul){lo, hi};