M pc/mmu.c => pc/mmu.c +2 -0
@@ 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);
}
M port/sysfile.c => port/sysfile.c +63 -0
@@ 446,6 446,38 @@ sysread(ulong *arg)
}
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)
{
Chan *c;
@@ 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)
{
M port/systab.h => port/systab.h +6 -0
@@ 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]);