15 findpid(Proc *plist, long pid)
26 findpage(Proc *plist, long pid, int type, uvlong off)
31 plist = findpid(plist, pid);
33 panic("can't find referenced pid");
37 panic("bad text offset alignment");
41 return s->pg[off/Pagesize];
45 for(i=0; i<plist->nseg; i++) {
47 if(s && s->offset <= off && off < s->offset+s->len)
56 panic("bad mem offset alignment");
58 return s->pg[off/Pagesize];
62 Breadnumber(Biobuf *b, char *buf)
70 if((c = Bgetc(b)) == Beof)
72 if('0' <= c && c <= '9'){
77 while((c = Bgetc(b)) == ' ')
84 werrstr("bad character %.2ux", c);
93 Breadulong(Biobuf *b, ulong *x)
97 if(Breadnumber(b, buf) < 0)
99 *x = strtoul(buf, 0, 0);
104 Breaduvlong(Biobuf *b, uvlong *x)
108 if(Breadnumber(b, buf) < 0)
110 *x = strtoull(buf, 0, 0);
121 if(Bread(b, str, 12) != 12)
122 panic("can't read data hdr\n");
125 d = emalloc(sizeof(*d) + len);
126 if(Bread(b, d->data, len) != len)
127 panic("can't read data body\n");
133 readseg(Seg **ps, Biobuf *b, Proc *plist)
143 static char zero[Pagesize];
145 s = emalloc(sizeof *s);
146 if(Breaduvlong(b, &s->offset) < 0
147 || Breaduvlong(b, &s->len) < 0)
148 panic("error reading segment");
150 npg = (s->len + Pagesize-1)/Pagesize;
156 pp = emalloc(sizeof(*pp)*npg);
161 for(i=0; i<npg; i++) {
163 len = s->len - (uvlong)i*Pagesize;
165 switch(t = Bgetc(b)) {
167 pp[i] = datapage(zero, len);
169 fprint(2, "0x%.8llux all zeros\n", s->offset+(uvlong)i*Pagesize);
173 if(Breadulong(b, &pid) < 0
174 || Breaduvlong(b, &off) < 0)
175 panic("error reading segment x");
176 pp[i] = findpage(plist, pid, t, off);
178 panic("bad page reference in snapshot");
180 fprint(2, "0x%.8llux same as %s pid %lud 0x%.8llux\n",
181 s->offset+(uvlong)i*Pagesize, t=='m'?"mem":"text", pid, off);
184 if((n=Bread(b, buf, len)) != len)
185 sysfatal("short read of segment %d/%d at %llx: %r", n, len, Boffset(b));
186 pp[i] = datapage(buf, len);
188 fprint(2, "0x%.8llux is raw data\n", s->offset+(uvlong)i*Pagesize);
191 fprint(2, "bad type char %#.2ux\n", t);
192 panic("error reading segment");
207 if((q = Brdline(b, '\n')) == nil)
208 panic("error reading snapshot file");
209 if(strncmp(q, "process snapshot", strlen("process snapshot")) != 0)
210 panic("bad snapshot file format");
213 while(q = Brdline(b, '\n')) {
214 q[Blinelen(b)-1] = 0;
217 p = findpid(plist, pid);
219 p = emalloc(sizeof(*p));
225 for(i=0; i<Npfile; i++) {
226 if(strcmp(pfile[i], q) == 0) {
227 p->d[i] = readdata(b);
233 if(strcmp(q, "mem") == 0) {
234 if(Bread(b, buf, 12) != 12)
235 panic("can't read memory section");
238 p->seg = emalloc(n*sizeof(*p->seg));
240 readseg(&p->seg[i], b, plist);
241 } else if(strcmp(q, "text") == 0)
242 readseg(&p->text, b, plist);
244 panic("unknown section");