diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-02-02 05:10:58 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-02-02 05:10:58 +0100 |
commit | e289fd8ccdfb081f16f02a025e53421aab7f90b7 (patch) | |
tree | 061bf8ca9447955caf6dbe90582d85b89e50fcaa | |
parent | 0850718033bb8c4a89628aa08659d1fc573d1491 (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.c | 9 |
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. */ |