diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-11-17 01:28:11 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-11-17 01:28:11 +0100 |
commit | 1a782fda3e0fcc3205dc4b2a9b6ef3a75f68efb7 (patch) | |
tree | 13bb6137aa1ca75ba0b84524c48de55c44caaa17 /sys/src/9/pc64 | |
parent | 78d2a52577c39f5f580b925931aa1ffbdc3d16be (diff) |
pc64: check if vmap() range fits in VMAPLEN window, remove unneeded vmapsync(), rename fault386() to faultamd64()
Diffstat (limited to 'sys/src/9/pc64')
-rw-r--r-- | sys/src/9/pc64/fns.h | 1 | ||||
-rw-r--r-- | sys/src/9/pc64/mmu.c | 32 | ||||
-rw-r--r-- | sys/src/9/pc64/trap.c | 12 |
3 files changed, 10 insertions, 35 deletions
diff --git a/sys/src/9/pc64/fns.h b/sys/src/9/pc64/fns.h index 1d92109cd..4b55e7399 100644 --- a/sys/src/9/pc64/fns.h +++ b/sys/src/9/pc64/fns.h @@ -180,7 +180,6 @@ void upafree(uintptr, int); void upareserve(uintptr, int); void vectortable(void); void* vmap(uintptr, int); -int vmapsync(uintptr); void vunmap(void*, int); void wbinvd(void); int wrmsr(int, vlong); diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c index 34d1c28a2..18b8878f7 100644 --- a/sys/src/9/pc64/mmu.c +++ b/sys/src/9/pc64/mmu.c @@ -506,6 +506,9 @@ kunmap(KMap *k) /* * Add a device mapping to the vmap range. + * note that the VMAP and KZERO PDPs are shared + * between processors (see mpstartap) so no + * synchronization is being done. */ void* vmap(uintptr pa, int size) @@ -513,6 +516,8 @@ vmap(uintptr pa, int size) uintptr va; int o; + if(pa+size > VMAPSIZE) + return 0; va = pa+VMAP; /* * might be asking for less than a page. @@ -530,30 +535,3 @@ vunmap(void *v, int) { paddr(v); /* will panic on error */ } - -/* - * vmapsync() is currently unused as the VMAP and KZERO PDPs - * are shared between processors. (see mpstartap) - */ -int -vmapsync(uintptr va) -{ - uintptr *pte1, *pte2; - int level; - - if(va < VMAP || m->machno == 0) - return 0; - - for(level=0; level<2; level++){ - pte1 = mmuwalk(MACHP(0)->pml4, va, level, 0); - if(pte1 && *pte1 & PTEVALID){ - pte2 = mmuwalk(m->pml4, va, level, 1); - if(pte2 == 0) - break; - if(pte1 != pte2) - *pte2 = *pte1; - return 1; - } - } - return 0; -} diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c index e84b199a3..4c64d201e 100644 --- a/sys/src/9/pc64/trap.c +++ b/sys/src/9/pc64/trap.c @@ -14,7 +14,7 @@ static int trapinited; void noted(Ureg*, ulong); static void debugbpt(Ureg*, void*); -static void fault386(Ureg*, void*); +static void faultamd64(Ureg*, void*); static void doublefault(Ureg*, void*); static void unexpected(Ureg*, void*); static void _dumpstack(Ureg*); @@ -225,7 +225,7 @@ trapinit(void) * Syscall() is called directly without going through trap(). */ trapenable(VectorBPT, debugbpt, 0, "debugpt"); - trapenable(VectorPF, fault386, 0, "fault386"); + trapenable(VectorPF, faultamd64, 0, "faultamd64"); trapenable(Vector2F, doublefault, 0, "doublefault"); trapenable(Vector15, unexpected, 0, "unexpected"); nmienable(); @@ -315,9 +315,9 @@ trap(Ureg *ureg) Mach *mach; if(!trapinited){ - /* fault386 can give a better error message */ + /* faultamd64 can give a better error message */ if(ureg->type == VectorPF) - fault386(ureg, nil); + faultamd64(ureg, nil); panic("trap %llud: not ready", ureg->type); } @@ -614,7 +614,7 @@ unexpected(Ureg* ureg, void*) extern void checkpages(void); static void -fault386(Ureg* ureg, void*) +faultamd64(Ureg* ureg, void*) { uintptr addr; int read, user, n, insyscall; @@ -624,8 +624,6 @@ fault386(Ureg* ureg, void*) read = !(ureg->error & 2); user = userureg(ureg); if(!user){ - if(vmapsync(addr)) - return; if(addr >= USTKTOP) panic("kernel fault: bad address pc=%#p addr=%#p", ureg->pc, addr); if(up == nil) |