Necesary to make realemu work (and maybe have video in the future). Reference: /n/patches.lsub.org/patch/realmodemem Date: Thu Apr 26 16:30:27 CES 2012 Signed-off-by: paurea@lsub.org --- /sys/src/nix/k10/devarch.c Thu Apr 12 12:26:27 2012 +++ /sys/src/nix/k10/devarch.c Thu Apr 26 15:37:05 2012 @@ -35,6 +35,7 @@ Qiol, Qbase, Qmapram, + Qrealmem, Qmax = 16, }; @@ -51,6 +52,7 @@ "iow", { Qiow, 0 }, 0, 0660, "iol", { Qiol, 0 }, 0, 0660, "mapram", { Qmapram, 0 }, 0, 0444, + "realmodemem", { Qrealmem, 0 }, 0, 0660, }; Lock archwlock; /* the lock is only for changing archdir */ int narchdir = Qbase; @@ -382,7 +384,6 @@ case Qioalloc: break; - default: if(c->qid.path < narchdir && (fn = readfn[c->qid.path])) return fn(c, a, n, offset); @@ -473,7 +474,6 @@ for(port = offset; port < offset+n; port += 4) outl(port, *lp++); return n; - default: if(c->qid.path < narchdir && (fn = writefn[c->qid.path])) return fn(c, a, n, offset); @@ -531,10 +531,45 @@ return readstr(off, a, n, buf); } + +static long +rmemrw(int isr, void *a, long n, vlong off) +{ + if(off < 0 || n < 0) + error("bad offset/count"); + if(isr){ + if(off >= MB) + return 0; + if(off+n >= MB) + n = MB - off; + memmove(a, KADDR((ulong)off), n); + }else{ + /* realmode buf page ok, allow vga framebuf's access */ + if(off >= MB || off+n > MB && + (off < 0xA0000 || off+n > 0xB0000+0x10000)) + error("bad offset/count in write"); + memmove(KADDR((ulong)off), a, n); + } + return n; +} + +static long +rmemread(Chan*, void *a, long n, vlong off) +{ + return rmemrw(1, a, n, off); +} + +static long +rmemwrite(Chan*, void *a, long n, vlong off) +{ + return rmemrw(0, a, n, off); +} + void archinit(void) { addarchfile("cputype", 0444, cputyperead, nil); + addarchfile("realmodemem", 0660, rmemread, rmemwrite); } void