16 main(int argc, char **argv)
25 Binit(bioout, 1, OWRITE);
39 text = open(file, OREAD);
41 fatal(1, "open text '%s'", file);
43 Bprint(bioout, "ki\n");
47 reg.fd[13] = 0.5; /* Normally initialised by the kernel */
58 ulong t, d, b, bssend;
61 t = (fhdr.txtaddr+fhdr.txtsz+(BY2PG-1)) & ~(BY2PG-1);
62 d = (t + fhdr.datsz + (BY2PG-1)) & ~(BY2PG-1);
63 bssend = t + fhdr.datsz + fhdr.bsssz;
64 b = (bssend + (BY2PG-1)) & ~(BY2PG-1);
66 s = &memory.seg[Text];
68 s->base = fhdr.txtaddr - fhdr.hdrsz;
70 s->fileoff = fhdr.txtoff - fhdr.hdrsz;
71 s->fileend = s->fileoff + fhdr.txtsz;
72 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
74 iprof = emalloc(((s->end-s->base)/PROFGRAN)*sizeof(long));
77 s = &memory.seg[Data];
81 s->fileoff = fhdr.datoff;
82 s->fileend = s->fileoff + fhdr.datsz;
83 datasize = fhdr.datsz;
84 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
90 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
92 s = &memory.seg[Stack];
94 s->base = STACKTOP-STACKSIZE;
96 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
106 extern Machdata sparcmach;
109 if (!crackhdr(fd, &fhdr))
110 fatal(0, "read text header");
112 if(fhdr.type != FSPARC)
113 fatal(0, "bad magic number");
115 if(syminit(fd, &fhdr) < 0)
117 symmap = loadmap(symmap, fd, &fhdr);
118 if (mach->sbreg && lookup(0, mach->sbreg, &s))
120 machdata = &sparcmach;
125 greg(int f, ulong off)
132 n = read(f, wd, BY2WD);
134 fatal(1, "read register");
145 REGOFF(r1), REGOFF(r2), REGOFF(r3),
146 REGOFF(r4), REGOFF(r5), REGOFF(r6),
147 REGOFF(r7), REGOFF(r8), REGOFF(r9),
148 REGOFF(r10), REGOFF(r11), REGOFF(r12),
149 REGOFF(r13), REGOFF(r14), REGOFF(r15),
150 REGOFF(r16), REGOFF(r17), REGOFF(r18),
151 REGOFF(r19), REGOFF(r20), REGOFF(r21),
152 REGOFF(r22), REGOFF(r23), REGOFF(r24),
153 REGOFF(r25), REGOFF(r26), REGOFF(r27),
158 seginit(int fd, Segment *s, int idx, ulong vastart, ulong vaend)
162 while(vastart < vaend) {
163 seek(fd, vastart, 0);
164 s->table[idx] = emalloc(BY2PG);
165 n = read(fd, s->table[idx], BY2PG);
167 fatal(1, "data read");
179 ulong vastart, vaend;
180 char mfile[128], tfile[128], sfile[1024];
182 sprint(mfile, "/proc/%d/mem", pid);
183 sprint(tfile, "/proc/%d/text", pid);
184 sprint(sfile, "/proc/%d/segment", pid);
186 text = open(tfile, OREAD);
188 fatal(1, "open text %s", tfile);
191 sg = open(sfile, OREAD);
193 fatal(1, "open text %s", sfile);
195 n = read(sg, sfile, sizeof(sfile));
196 if(n >= sizeof(sfile))
197 fatal(0, "segment file buffer too small");
200 m = open(mfile, OREAD);
202 fatal(1, "open %s", mfile);
206 p = strstr(sfile, "Data");
210 vastart = strtoul(p+9, 0, 16);
211 vaend = strtoul(p+18, 0, 16);
212 s = &memory.seg[Data];
213 if(s->base != vastart || s->end != vaend) {
217 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
219 seginit(m, s, 0, vastart, vaend);
221 p = strstr(sfile, "Bss");
225 vastart = strtoul(p+9, 0, 16);
226 vaend = strtoul(p+18, 0, 16);
227 s = &memory.seg[Bss];
228 if(s->base != vastart || s->end != vaend) {
232 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
234 seginit(m, s, 0, vastart, vaend);
236 reg.pc = greg(m, REGOFF(pc));
237 reg.r[1] = greg(m, REGOFF(sp));
238 reg.r[30] = greg(m, REGOFF(r30));
239 reg.r[31] = greg(m, REGOFF(r31));
241 for(i = 1; i < 29; i++)
242 reg.r[i] = greg(m, roff[i-1]);
244 s = &memory.seg[Stack];
245 vastart = reg.r[1] & ~(BY2PG-1);
246 seginit(m, s, (vastart-s->base)/BY2PG, vastart, STACKTOP);
248 Bprint(bioout, "ki\n");
258 memset(®, 0, sizeof(Registers));
259 reg.fd[13] = 0.5; /* Normally initialised by the kernel */
263 for(i = 0; i > Nseg; i++) {
265 l = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
266 for(m = 0; m < l; m++)
272 memset(&memory, 0, sizeof(memory));
274 for(b = bplist; b; b = b->next)
279 initstk(int argc, char *argv[])
281 ulong size, sp, ap, tos;
286 tos = STACKTOP - sizeof(Tos)*2; /* we'll assume twice the host's is big enough */
288 for (i = 0; i < sizeof(Tos)*2; i++)
289 putmem_b(tos + i, 0);
292 * pid is second word from end of tos and needs to be set for nsec().
293 * we know sparc is a 32-bit cpu, so we'll assume knowledge of the Tos
294 * struct for now, and use our pid.
296 putmem_w(tos + 4*4 + 2*sizeof(ulong) + 3*sizeof(uvlong), getpid());
298 /* Build exec stack */
299 size = strlen(file)+1+BY2WD+BY2WD+(BY2WD*2);
300 for(i = 0; i < argc; i++)
301 size += strlen(argv[i])+BY2WD+1;
306 reg.r[7] = tos; /* Plan 9 profiling clock, etc. */
309 putmem_w(sp, argc+1);
312 /* Compute sizeof(argv) and push argv[0] */
313 ap = sp+((argc+1)*BY2WD)+BY2WD;
317 /* Build argv[0] string into stack */
318 for(p = file; *p; p++)
321 putmem_b(ap++, '\0');
323 /* Loop through pushing the arguments */
324 for(i = 0; i < argc; i++) {
327 for(p = argv[i]; *p; p++)
329 putmem_b(ap++, '\0');
331 /* Null terminate argv */
337 fatal(int syserr, char *fmt, ...)
339 char buf[ERRMAX], *s;
343 vseprint(buf, buf+sizeof(buf), fmt, arg);
353 itrace(char *fmt, ...)
359 vseprint(buf, buf+sizeof(buf), fmt, arg);
361 Bprint(bioout, "%8lux %.8lux %s\n", reg.pc, reg.ir, buf);
369 Bprint(bioout, "PC #%-8lux SP #%-8lux Y #%-8lux PSR #%-8lux\n",
370 reg.pc, reg.r[1], reg.Y, reg.psr);
372 for(i = 0; i < 32; i++) {
373 if((i%4) == 0 && i != 0)
374 Bprint(bioout, "\n");
375 Bprint(bioout, "R%-2d #%-8lux ", i, reg.r[i]);
377 Bprint(bioout, "\n");
388 ieeesftos(buf, sizeof(buf), reg.di[i]);
389 Bprint(bioout, "F%-2d %s\t", i, buf);
391 ieeesftos(buf, sizeof(buf), reg.di[i]);
392 Bprint(bioout, "\tF%-2d %s\n", i, buf);
405 ieeedftos(buf, sizeof(buf), reg.di[i] ,reg.di[i+1]);
406 Bprint(bioout, "F%-2d %s\t", i, buf);
408 ieeedftos(buf, sizeof(buf), reg.di[i] ,reg.di[i+1]);
409 Bprint(bioout, "\tF%-2d %s\n", i, buf);
421 fatal(0, "no memory");
428 erealloc(void *a, ulong oldsize, ulong size)
434 fatal(0, "no memory");
443 mulu(ulong u1, ulong u2)
445 ulong lo1, lo2, hi1, hi2, lo, hi, t1, t2, t;
464 hi += (t1 >> 16) + (t2 >> 16);
465 return (Mulu){lo, hi};
469 mul(long l1, long l2)
494 return (Mul){lo, hi};