allow misaligned pages Reference: /n/atom/patch/applied2013/snapmisalign Date: Wed Jun 19 01:25:52 CES 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/snap/read.c Wed Jun 19 01:25:47 2013 +++ /sys/src/cmd/snap/read.c Wed Jun 19 01:25:47 2013 @@ -4,9 +4,13 @@ #include "snap.h" void -panic(char *s) +panic(char *s, ...) { - fprint(2, "%s\n", s); + va_list va; + + va_start(va, s); + vfprint(2, s, va); + fprint(2, "\n"); abort(); exits(s); } @@ -22,6 +26,11 @@ return plist; } +static char dbuf[Pagesize]; +static Page fu = { +.data = dbuf, +}; + Page* findpage(Proc *plist, long pid, int type, uvlong off) { @@ -52,8 +61,22 @@ return nil; off -= s->offset; - if(off%Pagesize) - panic("bad mem offset alignment"); + if(off%Pagesize){ + /*panic("bad mem offset alignment %lld, %lld %lld", off, off%Pagesize, s->offset);*/ + uvlong r, p; + + r = off%Pagesize; + p = off/Pagesize; + if(p > 0){ + memmove(fu.data, s->pg[p-1]->data+r, Pagesize-r); + if(debug) + print("memmove(x, s->pg[%lld], %lld);\n", p-1, Pagesize-r); + } + memmove(fu.data+Pagesize-r, s->pg[p]->data, r); + if(debug) + print("memmove(x+%lld, s->pg[%lld], %lld);\n", Pagesize-r, p, r); + return &fu; + } return s->pg[off/Pagesize]; }