summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-02-02 05:10:58 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2014-02-02 05:10:58 +0100
commite289fd8ccdfb081f16f02a025e53421aab7f90b7 (patch)
tree061bf8ca9447955caf6dbe90582d85b89e50fcaa
parent0850718033bb8c4a89628aa08659d1fc573d1491 (diff)
pc64: fix vmap
VMAP address calculation was all wrong resulting in vmaps get mapped into KZERO map.
-rw-r--r--sys/src/9/pc64/mmu.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c
index 43918c678..af1fa113c 100644
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -149,7 +149,7 @@ paddr(void *v)
if(va >= KZERO)
return va-KZERO;
if(va >= VMAP)
- return va-VMAP;
+ return va-(VMAP-(-KZERO));
panic("paddr: va=%#p pc=%#p", va, getcallerpc(&v));
return 0;
}
@@ -260,7 +260,7 @@ pmap(uintptr *pml4, uintptr pa, uintptr va, int size)
pte = mmuwalk(pml4, va, ++l, 0);
if(pte && (*pte & PTESIZE)){
flags |= PTESIZE;
- z = va & PGLSZ(l)-1;
+ z = va & (PGLSZ(l)-1);
va -= z;
pa -= z;
size += z;
@@ -442,6 +442,7 @@ kunmap(KMap *k)
if(pte == 0 || (*pte & PTEVALID) == 0)
panic("kunmap: va=%#p", va);
*pte = 0;
+ mmuflushtlb();
splx(x);
}
@@ -454,12 +455,12 @@ vmap(uintptr pa, int size)
uintptr va;
int o;
- if(size <= 0 || pa & ~0xffffffffull)
+ if(size <= 0 || pa >= -VMAP)
panic("vmap: pa=%#p size=%d pc=%#p", pa, size, getcallerpc(&pa));
if(cankaddr(pa) >= size)
va = pa+KZERO;
else
- va = pa+VMAP;
+ va = pa+(VMAP-(-KZERO));
/*
* might be asking for less than a page.
*/