7 findpid(Proc *plist, long pid)
18 findpage(Proc *plist, long pid, int type, uvlong off)
23 plist = findpid(plist, pid);
25 sysfatal("can't find referenced pid");
29 sysfatal("bad text offset alignment");
33 return s->pg[off/Pagesize];
37 for(i=0; i<plist->nseg; i++) {
39 if(s && s->offset <= off && off < s->offset+s->len)
48 sysfatal("bad mem offset alignment");
50 return s->pg[off/Pagesize];
54 Breadnumber(Biobuf *b, char *buf)
62 if((c = Bgetc(b)) == Beof)
64 if('0' <= c && c <= '9'){
69 while((c = Bgetc(b)) == ' ')
76 werrstr("bad character %.2ux", c);
85 Breadulong(Biobuf *b, ulong *x)
89 if(Breadnumber(b, buf) < 0)
91 *x = strtoul(buf, 0, 0);
96 Breaduvlong(Biobuf *b, uvlong *x)
100 if(Breadnumber(b, buf) < 0)
102 *x = strtoull(buf, 0, 0);
113 if(Bread(b, str, 12) != 12)
114 sysfatal("can't read data hdr: %r");
116 len = strtoul(str, 0, 0);
117 if(len + sizeof(*d) < sizeof(*d))
118 sysfatal("data len too large");
119 d = emalloc(sizeof(*d) + len);
120 if(len && Bread(b, d->data, len) != len)
121 sysfatal("can't read data body");
127 readseg(Seg **ps, Biobuf *b, Proc *plist, char *name)
139 s = emalloc(sizeof *s);
140 if(Breaduvlong(b, &s->offset) < 0
141 || Breaduvlong(b, &s->len) < 0)
142 sysfatal("error reading segment: %r");
145 fprint(2, "readseg %.8llux - %.8llux %s\n", s->offset, s->offset + s->len, name);
147 npg = (s->len + Pagesize-1)/Pagesize;
153 pp = emalloc(sizeof(*pp)*npg);
158 for(i=0; i<npg; i++) {
160 len = s->len - (uvlong)i*Pagesize;
162 switch(t = Bgetc(b)) {
164 pp[i] = datapage(zeros, len);
166 fprint(2, "0x%.8llux all zeros\n", s->offset+(uvlong)i*Pagesize);
170 if(Breadulong(b, &pid) < 0
171 || Breaduvlong(b, &off) < 0)
172 sysfatal("error reading segment x: %r");
173 pp[i] = findpage(plist, pid, t, off);
175 sysfatal("bad page reference in snapshot");
177 fprint(2, "0x%.8llux same as %s pid %lud 0x%.8llux\n",
178 s->offset+(uvlong)i*Pagesize, t=='m'?"mem":"text", pid, off);
181 if((n=Bread(b, buf, len)) != len)
182 sysfatal("short read of segment %d/%d at %llx: %r", n, len, Boffset(b));
183 pp[i] = datapage(buf, len);
185 fprint(2, "0x%.8llux is raw data\n", s->offset+(uvlong)i*Pagesize);
188 fprint(2, "bad type char %#.2ux\n", t);
189 sysfatal("error reading segment");
204 if((q = Brdline(b, '\n')) == nil)
205 sysfatal("error reading snapshot file");
206 if(strncmp(q, "process snapshot", strlen("process snapshot")) != 0)
207 sysfatal("bad snapshot file format");
210 while(q = Brdline(b, '\n')) {
211 q[Blinelen(b)-1] = 0;
214 p = findpid(plist, pid);
216 p = emalloc(sizeof(*p));
222 for(i=0; i<Npfile; i++) {
223 if(strcmp(pfile[i], q) == 0) {
224 p->d[i] = readdata(b);
230 if(strcmp(q, "mem") == 0) {
231 if(Bread(b, buf, 12) != 12)
232 sysfatal("can't read memory section: %r");
236 sysfatal("bad segment count: %d", n);
238 p->seg = emalloc(n*sizeof(*p->seg));
240 snprint(buf, sizeof(buf), "[%d]", i);
241 readseg(&p->seg[i], b, plist, buf);
243 } else if(strcmp(q, "text") == 0) {
244 readseg(&p->text, b, plist, q);
246 sysfatal("unknown section");