Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <bio.h>
#include "snap.h"

char *pfile[Npfile] = {
        [Psegment]      "segment",
        [Pfd]                   "fd",
        [Pfpregs]               "fpregs",
        [Pnoteid]               "noteid",
        [Pkregs]                "kregs",
        [Pns]                   "ns",
        [Pproc]         "proc",
        [Pregs]         "regs",
        [Pstatus]               "status",
};

static void
writeseg(Biobuf *b, Proc *proc, Seg *s)
{
        int i, npg;
        Page **pp, *p;
        int type;

        if(s == nil){
                Bprint(b, "%-11ud %-11ud ", 0, 0);
                return;
        }

        type = proc->text ==  s ? 't' : 'm';
        npg = (s->len+Pagesize-1)/Pagesize;
        if(npg != s->npg)
                abort();

        Bprint(b, "%-11llud %-11llud ", s->offset, s->len);
        if(s->len == 0)
                return;

        for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
                if(p->written) {
                        if(p->type == 'z') {
                                Bprint(b, "z");
                                continue;
                        }
                        Bprint(b, "%c%-11ld %-11llud ", p->type, p->pid, p->offset);
                } else {
                        Bprint(b, "r");
                        Bwrite(b, p->data, p->len);
                        if(p->len != Pagesize && i != npg-1)
                                abort();
                        p->written = 1;
                        p->type = type;
                        p->offset = s->offset + i*Pagesize;
                        p->pid = proc->pid;
                }
        }
}


void
writesnap(Biobuf *b, Proc *p)
{
        int i, n;
        Data *d;

        for(i=0; i<Npfile; i++)
                if(d = p->d[i]) {
                        Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
                        Bwrite(b, d->data, d->len);
                }

        if(p->text) {
                Bprint(b, "%-11ld text\n", p->pid);
                writeseg(b, p, p->text);
        }

        if(n = p->nseg) {
                Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
                for(i=0; i<n; i++)
                        writeseg(b, p, p->seg[i]);
        }
}