xref: /plan9/sys/src/cmd/snap/write.c (revision ff8c3af2f44d95267f67219afa20ba82ff6cf7e4)
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
19 writeseg(Biobuf *b, Proc *proc, Seg *s)
20 {
21 	int i, npg;
22 	Page **pp, *p;
23 	int type;
24 
25 	type = proc->text ==  s ? 't' : 'm';
26 
27 	npg = (s->len+Pagesize-1)/Pagesize;
28 	if(npg != s->npg)
29 		abort();
30 
31 	Bprint(b, "%-11lud %-11lud ", s->offset, s->len);
32 	if(s->len == 0)
33 		return;
34 
35 	for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
36 		if(p->written) {
37 			if(p->type == 'z') {
38 				Bprint(b, "z");
39 				continue;
40 			}
41 			Bprint(b, "%c%-11ld %-11lud ", p->type, p->pid, p->offset);
42 		} else {
43 			Bprint(b, "r");
44 			Bwrite(b, p->data, p->len);
45 			if(p->len != Pagesize && i != npg-1)
46 				abort();
47 			p->written = 1;
48 			p->type = type;
49 			p->offset = s->offset + i*Pagesize;
50 			p->pid = proc->pid;
51 		}
52 	}
53 }
54 
55 
56 void
57 writesnap(Biobuf *b, Proc *p)
58 {
59 	int i, n;
60 	Data *d;
61 
62 	for(i=0; i<Npfile; i++)
63 		if(d = p->d[i]) {
64 			Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
65 			Bwrite(b, d->data, d->len);
66 		}
67 
68 	if(p->text) {
69 		Bprint(b, "%-11ld text\n", p->pid);
70 		writeseg(b, p, p->text);
71 	}
72 
73 	if(n = p->nseg) {
74 		Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
75 		for(i=0; i<n; i++)
76 			writeseg(b, p, p->seg[i]);
77 	}
78 }
79