15 main(int argc, char **argv)
24 Binit(bioout, 1, OWRITE);
38 text = open(file, OREAD);
40 fatal(1, "open text '%s'", file);
42 Bprint(bioout, "ki\n");
46 reg.fd[13] = 0.5; /* Normally initialised by the kernel */
57 ulong t, d, b, bssend;
60 t = (fhdr.txtaddr+fhdr.txtsz+(BY2PG-1)) & ~(BY2PG-1);
61 d = (t + fhdr.datsz + (BY2PG-1)) & ~(BY2PG-1);
62 bssend = t + fhdr.datsz + fhdr.bsssz;
63 b = (bssend + (BY2PG-1)) & ~(BY2PG-1);
65 s = &memory.seg[Text];
67 s->base = fhdr.txtaddr - fhdr.hdrsz;
69 s->fileoff = fhdr.txtoff - fhdr.hdrsz;
70 s->fileend = s->fileoff + fhdr.txtsz;
71 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
73 iprof = emalloc(((s->end-s->base)/PROFGRAN)*sizeof(long));
76 s = &memory.seg[Data];
80 s->fileoff = fhdr.datoff;
81 s->fileend = s->fileoff + fhdr.datsz;
82 datasize = fhdr.datsz;
83 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
89 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
91 s = &memory.seg[Stack];
93 s->base = STACKTOP-STACKSIZE;
95 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
105 extern Machdata sparcmach;
108 if (!crackhdr(fd, &fhdr))
109 fatal(0, "read text header");
111 if(fhdr.type != FSPARC)
112 fatal(0, "bad magic number");
114 if(syminit(fd, &fhdr) < 0)
116 symmap = loadmap(symmap, fd, &fhdr);
117 if (mach->sbreg && lookup(0, mach->sbreg, &s))
119 machdata = &sparcmach;
124 greg(int f, ulong off)
131 n = read(f, wd, BY2WD);
133 fatal(1, "read register");
144 REGOFF(r1), REGOFF(r2), REGOFF(r3),
145 REGOFF(r4), REGOFF(r5), REGOFF(r6),
146 REGOFF(r7), REGOFF(r8), REGOFF(r9),
147 REGOFF(r10), REGOFF(r11), REGOFF(r12),
148 REGOFF(r13), REGOFF(r14), REGOFF(r15),
149 REGOFF(r16), REGOFF(r17), REGOFF(r18),
150 REGOFF(r19), REGOFF(r20), REGOFF(r21),
151 REGOFF(r22), REGOFF(r23), REGOFF(r24),
152 REGOFF(r25), REGOFF(r26), REGOFF(r27),
157 seginit(int fd, Segment *s, int idx, ulong vastart, ulong vaend)
161 while(vastart < vaend) {
162 seek(fd, vastart, 0);
163 s->table[idx] = emalloc(BY2PG);
164 n = read(fd, s->table[idx], BY2PG);
166 fatal(1, "data read");
178 ulong vastart, vaend;
179 char mfile[128], tfile[128], sfile[1024];
181 sprint(mfile, "/proc/%d/mem", pid);
182 sprint(tfile, "/proc/%d/text", pid);
183 sprint(sfile, "/proc/%d/segment", pid);
185 text = open(tfile, OREAD);
187 fatal(1, "open text %s", tfile);
190 sg = open(sfile, OREAD);
192 fatal(1, "open text %s", sfile);
194 n = read(sg, sfile, sizeof(sfile));
195 if(n >= sizeof(sfile))
196 fatal(0, "segment file buffer too small");
199 m = open(mfile, OREAD);
201 fatal(1, "open %s", mfile);
205 p = strstr(sfile, "Data");
209 vastart = strtoul(p+9, 0, 16);
210 vaend = strtoul(p+18, 0, 16);
211 s = &memory.seg[Data];
212 if(s->base != vastart || s->end != vaend) {
216 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
218 seginit(m, s, 0, vastart, vaend);
220 p = strstr(sfile, "Bss");
224 vastart = strtoul(p+9, 0, 16);
225 vaend = strtoul(p+18, 0, 16);
226 s = &memory.seg[Bss];
227 if(s->base != vastart || s->end != vaend) {
231 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
233 seginit(m, s, 0, vastart, vaend);
235 reg.pc = greg(m, REGOFF(pc));
236 reg.r[1] = greg(m, REGOFF(sp));
237 reg.r[30] = greg(m, REGOFF(r30));
238 reg.r[31] = greg(m, REGOFF(r31));
240 for(i = 1; i < 29; i++)
241 reg.r[i] = greg(m, roff[i-1]);
243 s = &memory.seg[Stack];
244 vastart = reg.r[1] & ~(BY2PG-1);
245 seginit(m, s, (vastart-s->base)/BY2PG, vastart, STACKTOP);
247 Bprint(bioout, "ki\n");
257 memset(®, 0, sizeof(Registers));
258 reg.fd[13] = 0.5; /* Normally initialised by the kernel */
262 for(i = 0; i > Nseg; i++) {
264 l = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
265 for(m = 0; m < l; m++)
271 memset(&memory, 0, sizeof(memory));
273 for(b = bplist; b; b = b->next)
278 initstk(int argc, char *argv[])
287 /* Build exec stack */
288 size = strlen(file)+1+BY2WD+BY2WD+(BY2WD*2);
289 for(i = 0; i < argc; i++)
290 size += strlen(argv[i])+BY2WD+1;
295 reg.r[7] = STACKTOP-4; /* Plan 9 profiling clock */
298 putmem_w(sp, argc+1);
301 /* Compute sizeof(argv) and push argv[0] */
302 ap = sp+((argc+1)*BY2WD)+BY2WD;
306 /* Build argv[0] string into stack */
307 for(p = file; *p; p++)
310 putmem_b(ap++, '\0');
312 /* Loop through pushing the arguments */
313 for(i = 0; i < argc; i++) {
316 for(p = argv[i]; *p; p++)
318 putmem_b(ap++, '\0');
320 /* Null terminate argv */
326 fatal(int syserr, char *fmt, ...)
328 char buf[ERRMAX], *s;
332 vseprint(buf, buf+sizeof(buf), fmt, arg);
342 itrace(char *fmt, ...)
348 vseprint(buf, buf+sizeof(buf), fmt, arg);
350 Bprint(bioout, "%8lux %.8lux %s\n", reg.pc, reg.ir, buf);
358 Bprint(bioout, "PC #%-8lux SP #%-8lux Y #%-8lux PSR #%-8lux\n",
359 reg.pc, reg.r[1], reg.Y, reg.psr);
361 for(i = 0; i < 32; i++) {
362 if((i%4) == 0 && i != 0)
363 Bprint(bioout, "\n");
364 Bprint(bioout, "R%-2d #%-8lux ", i, reg.r[i]);
366 Bprint(bioout, "\n");
377 ieeesftos(buf, sizeof(buf), reg.di[i]);
378 Bprint(bioout, "F%-2d %s\t", i, buf);
380 ieeesftos(buf, sizeof(buf), reg.di[i]);
381 Bprint(bioout, "\tF%-2d %s\n", i, buf);
394 ieeedftos(buf, sizeof(buf), reg.di[i] ,reg.di[i+1]);
395 Bprint(bioout, "F%-2d %s\t", i, buf);
397 ieeedftos(buf, sizeof(buf), reg.di[i] ,reg.di[i+1]);
398 Bprint(bioout, "\tF%-2d %s\n", i, buf);
410 fatal(0, "no memory");
417 erealloc(void *a, ulong oldsize, ulong size)
423 fatal(0, "no memory");
432 mulu(ulong u1, ulong u2)
434 ulong lo1, lo2, hi1, hi2, lo, hi, t1, t2, t;
453 hi += (t1 >> 16) + (t2 >> 16);
454 return (Mulu){lo, hi};
458 mul(long l1, long l2)
483 return (Mul){lo, hi};