17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include "snap.h"
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier char *pfile[Npfile] = {
77dd7cddfSDavid du Colombier [Psegment] "segment",
87dd7cddfSDavid du Colombier [Pfd] "fd",
97dd7cddfSDavid du Colombier [Pfpregs] "fpregs",
107dd7cddfSDavid du Colombier [Pnoteid] "noteid",
117dd7cddfSDavid du Colombier [Pkregs] "kregs",
127dd7cddfSDavid du Colombier [Pns] "ns",
137dd7cddfSDavid du Colombier [Pproc] "proc",
147dd7cddfSDavid du Colombier [Pregs] "regs",
157dd7cddfSDavid du Colombier [Pstatus] "status",
167dd7cddfSDavid du Colombier };
177dd7cddfSDavid du Colombier
187dd7cddfSDavid du Colombier static void
writeseg(Biobuf * b,Proc * proc,Seg * s)197dd7cddfSDavid du Colombier writeseg(Biobuf *b, Proc *proc, Seg *s)
207dd7cddfSDavid du Colombier {
217dd7cddfSDavid du Colombier int i, npg;
227dd7cddfSDavid du Colombier Page **pp, *p;
237dd7cddfSDavid du Colombier int type;
247dd7cddfSDavid du Colombier
25*50e5f38dSDavid du Colombier if(s == nil){
26*50e5f38dSDavid du Colombier Bprint(b, "%-11ud %-11ud ", 0, 0);
27*50e5f38dSDavid du Colombier return;
28*50e5f38dSDavid du Colombier }
297dd7cddfSDavid du Colombier
30*50e5f38dSDavid du Colombier type = proc->text == s ? 't' : 'm';
317dd7cddfSDavid du Colombier npg = (s->len+Pagesize-1)/Pagesize;
327dd7cddfSDavid du Colombier if(npg != s->npg)
337dd7cddfSDavid du Colombier abort();
347dd7cddfSDavid du Colombier
35*50e5f38dSDavid du Colombier Bprint(b, "%-11llud %-11llud ", s->offset, s->len);
363ff48bf5SDavid du Colombier if(s->len == 0)
373ff48bf5SDavid du Colombier return;
383ff48bf5SDavid du Colombier
397dd7cddfSDavid du Colombier for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
407dd7cddfSDavid du Colombier if(p->written) {
417dd7cddfSDavid du Colombier if(p->type == 'z') {
427dd7cddfSDavid du Colombier Bprint(b, "z");
437dd7cddfSDavid du Colombier continue;
447dd7cddfSDavid du Colombier }
45*50e5f38dSDavid du Colombier Bprint(b, "%c%-11ld %-11llud ", p->type, p->pid, p->offset);
467dd7cddfSDavid du Colombier } else {
477dd7cddfSDavid du Colombier Bprint(b, "r");
487dd7cddfSDavid du Colombier Bwrite(b, p->data, p->len);
497dd7cddfSDavid du Colombier if(p->len != Pagesize && i != npg-1)
507dd7cddfSDavid du Colombier abort();
517dd7cddfSDavid du Colombier p->written = 1;
527dd7cddfSDavid du Colombier p->type = type;
537dd7cddfSDavid du Colombier p->offset = s->offset + i*Pagesize;
547dd7cddfSDavid du Colombier p->pid = proc->pid;
557dd7cddfSDavid du Colombier }
567dd7cddfSDavid du Colombier }
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier void
writesnap(Biobuf * b,Proc * p)617dd7cddfSDavid du Colombier writesnap(Biobuf *b, Proc *p)
627dd7cddfSDavid du Colombier {
637dd7cddfSDavid du Colombier int i, n;
647dd7cddfSDavid du Colombier Data *d;
657dd7cddfSDavid du Colombier
667dd7cddfSDavid du Colombier for(i=0; i<Npfile; i++)
677dd7cddfSDavid du Colombier if(d = p->d[i]) {
687dd7cddfSDavid du Colombier Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
697dd7cddfSDavid du Colombier Bwrite(b, d->data, d->len);
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier
727dd7cddfSDavid du Colombier if(p->text) {
737dd7cddfSDavid du Colombier Bprint(b, "%-11ld text\n", p->pid);
747dd7cddfSDavid du Colombier writeseg(b, p, p->text);
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier if(n = p->nseg) {
787dd7cddfSDavid du Colombier Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
797dd7cddfSDavid du Colombier for(i=0; i<n; i++)
807dd7cddfSDavid du Colombier writeseg(b, p, p->seg[i]);
817dd7cddfSDavid du Colombier }
827dd7cddfSDavid du Colombier }
83