17 main(int argc, char **argv)
26 Binit(bioout, 1, OWRITE);
40 text = open(file, OREAD);
42 fatal(1, "open text '%s'", file);
44 Bprint(bioout, "qi\n");
49 bits[i] = 1L << (31-i);
56 * we're rounding segment boundaries to the nearest 1MB on power now,
57 * and mach->pgsize is actually what to round segment boundaries up to.
59 #define SEGROUND mach->pgsize
65 ulong t, d, b, bssend;
68 t = (fhdr.txtaddr+fhdr.txtsz+(SEGROUND-1)) & ~(SEGROUND-1);
69 d = (t + fhdr.datsz + (SEGROUND-1)) & ~(SEGROUND-1);
70 bssend = t + fhdr.datsz + fhdr.bsssz;
71 b = (bssend + (SEGROUND-1)) & ~(SEGROUND-1);
73 s = &memory.seg[Text];
75 s->base = fhdr.txtaddr - fhdr.hdrsz;
77 s->fileoff = fhdr.txtoff - fhdr.hdrsz;
78 s->fileend = s->fileoff + fhdr.txtsz;
79 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
81 iprofsize = (s->end-s->base)/PROFGRAN;
82 iprof = emalloc(iprofsize*sizeof(long));
85 s = &memory.seg[Data];
89 s->fileoff = fhdr.datoff;
90 s->fileend = s->fileoff + fhdr.datsz;
91 datasize = fhdr.datsz;
92 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
98 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
100 s = &memory.seg[Stack];
102 s->base = STACKTOP-STACKSIZE;
104 s->table = emalloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
114 extern Machdata powermach;
117 if (!crackhdr(fd, &fhdr))
118 fatal(0, "read text header");
120 if(fhdr.type != FPOWER)
121 fatal(0, "bad magic number");
123 if(syminit(fd, &fhdr) < 0)
125 symmap = loadmap(symmap, fd, &fhdr);
126 if (mach->sbreg && lookup(0, mach->sbreg, &s))
128 machdata = &powermach;
132 greg(int f, ulong off)
139 n = read(f, wd, BY2WD);
141 fatal(1, "read register");
153 REGOFF(r1), REGOFF(r2), REGOFF(r3),
154 REGOFF(r4), REGOFF(r5), REGOFF(r6),
155 REGOFF(r7), REGOFF(r8), REGOFF(r9),
156 REGOFF(r10), REGOFF(r11), REGOFF(r12),
157 REGOFF(r13), REGOFF(r14), REGOFF(r15),
158 REGOFF(r16), REGOFF(r17), REGOFF(r18),
159 REGOFF(r19), REGOFF(r20), REGOFF(r21),
160 REGOFF(r22), REGOFF(r23), REGOFF(r24),
161 REGOFF(r25), REGOFF(r26), REGOFF(r27),
162 REGOFF(r28), REGOFF(r29), REGOFF(r30),
167 seginit(int fd, Segment *s, int idx, ulong vastart, ulong vaend)
171 while(vastart < vaend) {
172 seek(fd, vastart, 0);
173 s->table[idx] = emalloc(BY2PG);
174 n = read(fd, s->table[idx], BY2PG);
176 fatal(1, "data read");
188 ulong vastart, vaend;
189 char mfile[128], tfile[128], sfile[1024];
191 sprint(mfile, "/proc/%d/mem", pid);
192 sprint(tfile, "/proc/%d/text", pid);
193 sprint(sfile, "/proc/%d/segment", pid);
195 text = open(tfile, OREAD);
197 fatal(1, "open text %s", tfile);
200 sg = open(sfile, OREAD);
202 fatal(1, "open text %s", sfile);
204 n = read(sg, sfile, sizeof(sfile));
205 if(n >= sizeof(sfile))
206 fatal(0, "segment file buffer too small");
209 m = open(mfile, OREAD);
211 fatal(1, "open %s", mfile);
215 p = strstr(sfile, "Data");
219 vastart = strtoul(p+9, 0, 16);
220 vaend = strtoul(p+18, 0, 16);
221 s = &memory.seg[Data];
222 if(s->base != vastart || s->end != vaend) {
226 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
228 seginit(m, s, 0, vastart, vaend);
230 p = strstr(sfile, "Bss");
234 vastart = strtoul(p+9, 0, 16);
235 vaend = strtoul(p+18, 0, 16);
236 s = &memory.seg[Bss];
237 if(s->base != vastart || s->end != vaend) {
241 s->table = malloc(((s->end-s->base)/BY2PG)*sizeof(uchar*));
243 seginit(m, s, 0, vastart, vaend);
245 reg.pc = greg(m, REGOFF(pc));
246 reg.r[1] = greg(m, REGOFF(sp));
247 reg.r[2] = greg(m, REGOFF(r2));
248 reg.r[30] = greg(m, REGOFF(r30));
249 reg.r[31] = greg(m, REGOFF(r31));
251 for(i = 0; i < 32; i++)
252 reg.r[i] = greg(m, roff[i-1]);
254 s = &memory.seg[Stack];
255 vastart = reg.r[1] & ~(BY2PG-1);
256 seginit(m, s, (vastart-s->base)/BY2PG, vastart, STACKTOP);
258 Bprint(bioout, "qi\n");
268 memset(®, 0, sizeof(Registers));
270 for(i = 0; i > Nseg; i++) {
272 l = ((s->end-s->base)/BY2PG)*sizeof(uchar*);
273 for(m = 0; m < l; m++)
279 memset(&memory, 0, sizeof(memory));
281 for(b = bplist; b; b = b->next)
286 initstk(int argc, char *argv[])
288 ulong size, sp, ap, tos;
293 tos = STACKTOP - sizeof(Tos)*2; /* we'll assume twice the host's is big enough */
295 for (i = 0; i < sizeof(Tos)*2; i++)
296 putmem_b(tos + i, 0);
299 * pid is second word from end of tos and needs to be set for nsec().
300 * we know power is a 32-bit cpu, so we'll assume knowledge of the Tos
301 * struct for now, and use our pid.
303 putmem_w(tos + 4*4 + 2*sizeof(ulong) + 3*sizeof(uvlong), getpid());
305 /* Build exec stack */
306 size = strlen(file)+1+BY2WD+BY2WD+(BY2WD*2);
307 for(i = 0; i < argc; i++)
308 size += strlen(argv[i])+BY2WD+1;
313 reg.r[3] = tos; /* Plan 9 profiling clock, etc. */
316 putmem_w(sp, argc+1);
319 /* Compute sizeof(argv) and push argv[0] */
320 ap = sp+((argc+1)*BY2WD)+BY2WD;
324 /* Build argv[0] string into stack */
325 for(p = file; *p; p++)
328 putmem_b(ap++, '\0');
330 /* Loop through pushing the arguments */
331 for(i = 0; i < argc; i++) {
334 for(p = argv[i]; *p; p++)
336 putmem_b(ap++, '\0');
338 /* Null terminate argv */
344 fatal(int syserr, char *fmt, ...)
346 char buf[ERRMAX], *s;
350 vseprint(buf, buf+sizeof(buf), fmt, ap);
360 itrace(char *fmt, ...)
366 vseprint(buf, buf+sizeof(buf), fmt, ap);
368 Bprint(bioout, "%8lux %.8lux %s\n", reg.pc, reg.ir, buf);
377 Bprint(bioout, "PC #%-8lux SP #%-8lux CR #%-8lux LR #%-8lux CTR #%-8lux XER #%-8lux\n",
378 reg.pc, reg.r[1], reg.cr, reg.lr, reg.ctr, reg.xer);
380 for(i = 0; i < 32; i++) {
381 if((i%4) == 0 && i != 0)
382 Bprint(bioout, "\n");
383 Bprint(bioout, "R%-2d #%-8lux ", i, reg.r[i]);
385 Bprint(bioout, "\n");
404 ieeedftos(buf, sizeof(buf), d.hi, d.lo);
405 Bprint(bioout, "F%-2d %s\t", i, buf);
408 ieeedftos(buf, sizeof(buf), d.hi, d.lo);
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");