From f0ac91ac3943e675d8372f7422d5fd7cbda48411 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 23 Feb 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-02-23 --- pc/mmu.c | 2 ++ port/sysfile.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ port/systab.h | 6 +++++ 3 files changed, 71 insertions(+) diff --git a/pc/mmu.c b/pc/mmu.c index 198ca9cb77ff956972a91e56e3b4c911d62d37c3..81c99891a0683c158dc25a741ce11eb08a38ad22 100644 --- a/pc/mmu.c +++ b/pc/mmu.c @@ -36,6 +36,7 @@ taskswitch(ulong pdb, ulong stack) tss->ss2 = KDSEL; tss->esp2 = stack; tss->cr3 = pdb; + coherence(); putcr3(pdb); } @@ -226,6 +227,7 @@ putmmu(ulong va, ulong pa, Page*) s = splhi(); pdb[PDX(MACHADDR)] = m->pdb[PDX(MACHADDR)]; + coherence(); mmuflushtlb(up->mmupdb->pa); splx(s); } diff --git a/port/sysfile.c b/port/sysfile.c index 04cbc59fb5b529af7bb575018389bbaf02cfc24f..b1c9c7348a4c14ceedbc11b464f3f1c4d39c5ff0 100644 --- a/port/sysfile.c +++ b/port/sysfile.c @@ -445,6 +445,38 @@ sysread(ulong *arg) return n; } +long +syspread(ulong *arg) +{ + long n; + Chan *c; + union { + uvlong v; + ulong u[2]; + } o; + + n = arg[2]; + validaddr(arg[1], n, 1); + c = fdtochan(arg[0], OREAD, 1, 1); + o.u[0] = arg[3]; + o.u[1] = arg[4]; + + if(waserror()) { + cclose(c); + nexterror(); + } + + if(c->qid.path&CHDIR) + error(Eisdir); + + n = devtab[c->type]->read(c, (void*)arg[1], n, o.v); + + poperror(); + cclose(c); + + return n; +} + long syswrite9p(ulong *arg) { @@ -515,6 +547,37 @@ syswrite(ulong *arg) return m; } +long +syspwrite(ulong *arg) +{ + Chan *c; + long m, n; + union { + uvlong v; + ulong u[2]; + } o; + + validaddr(arg[1], arg[2], 0); + n = arg[2]; + c = fdtochan(arg[0], OWRITE, 1, 1); + o.u[0] = arg[3]; + o.u[1] = arg[4]; + if(waserror()) { + cclose(c); + nexterror(); + } + + if(c->qid.path & CHDIR) + error(Eisdir); + + m = devtab[c->type]->write(c, (void*)arg[1], n, o.v); + + poperror(); + cclose(c); + + return m; +} + static void sseek(ulong *arg) { diff --git a/port/systab.h b/port/systab.h index ffa86f227bdffde01daf6bfd25e66cbad5959078..574a5e492c8edb18b4f47cf9efb1c2cf4d4724d8 100644 --- a/port/systab.h +++ b/port/systab.h @@ -43,6 +43,8 @@ Syscall syswait; Syscall syswrite9p; Syscall sysread9p; Syscall sysseek; +Syscall syspread; +Syscall syspwrite; Syscall sysdeath; Syscall *systab[]={ @@ -86,6 +88,8 @@ Syscall *systab[]={ [WRITE9P] syswrite9p, [READ9P] sysread9p, [SEEK] sysseek, + [PREAD] syspread, + [PWRITE] syspwrite, }; char *sysctab[]={ @@ -129,6 +133,8 @@ char *sysctab[]={ [WRITE9P] "Write9p", [READ9P] "Read9p", [SEEK] "Seek", + [PREAD] "Pread", + [PWRITE] "Pwrite", }; int nsyscall = (sizeof systab/sizeof systab[0]);