1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "snap.h"
5
6 char *pfile[Npfile] = {
7 [Psegment] "segment",
8 [Pfd] "fd",
9 [Pfpregs] "fpregs",
10 [Pnoteid] "noteid",
11 [Pkregs] "kregs",
12 [Pns] "ns",
13 [Pproc] "proc",
14 [Pregs] "regs",
15 [Pstatus] "status",
16 };
17
18 static void
writeseg(Biobuf * b,Proc * proc,Seg * s)19 writeseg(Biobuf *b, Proc *proc, Seg *s)
20 {
21 int i, npg;
22 Page **pp, *p;
23 int type;
24
25 if(s == nil){
26 Bprint(b, "%-11ud %-11ud ", 0, 0);
27 return;
28 }
29
30 type = proc->text == s ? 't' : 'm';
31 npg = (s->len+Pagesize-1)/Pagesize;
32 if(npg != s->npg)
33 abort();
34
35 Bprint(b, "%-11llud %-11llud ", s->offset, s->len);
36 if(s->len == 0)
37 return;
38
39 for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
40 if(p->written) {
41 if(p->type == 'z') {
42 Bprint(b, "z");
43 continue;
44 }
45 Bprint(b, "%c%-11ld %-11llud ", p->type, p->pid, p->offset);
46 } else {
47 Bprint(b, "r");
48 Bwrite(b, p->data, p->len);
49 if(p->len != Pagesize && i != npg-1)
50 abort();
51 p->written = 1;
52 p->type = type;
53 p->offset = s->offset + i*Pagesize;
54 p->pid = proc->pid;
55 }
56 }
57 }
58
59
60 void
writesnap(Biobuf * b,Proc * p)61 writesnap(Biobuf *b, Proc *p)
62 {
63 int i, n;
64 Data *d;
65
66 for(i=0; i<Npfile; i++)
67 if(d = p->d[i]) {
68 Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
69 Bwrite(b, d->data, d->len);
70 }
71
72 if(p->text) {
73 Bprint(b, "%-11ld text\n", p->pid);
74 writeseg(b, p, p->text);
75 }
76
77 if(n = p->nseg) {
78 Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
79 for(i=0; i<n; i++)
80 writeseg(b, p, p->seg[i]);
81 }
82 }
83