diff options
author | 2006-07-10 19:23:25 +0000 | |
---|---|---|
committer | 2006-07-10 19:23:25 +0000 | |
commit | d628e111d4ac6d823ea0dbe4f0cd5bf4f94a933f (patch) | |
tree | 917c52f998f66115314dc02572a2af20a4a9beef | |
parent | remove some silly Xr's; ok marco (diff) | |
download | wireguard-openbsd-d628e111d4ac6d823ea0dbe4f0cd5bf4f94a933f.tar.xz wireguard-openbsd-d628e111d4ac6d823ea0dbe4f0cd5bf4f94a933f.zip |
Accept non-page-aligned addresses and sizes in mapiodev() and unmapiodev().
-rw-r--r-- | sys/arch/mvme68k/mvme68k/autoconf.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/sys/arch/mvme68k/mvme68k/autoconf.c b/sys/arch/mvme68k/mvme68k/autoconf.c index b52448cfdc0..43bbd9de2b8 100644 --- a/sys/arch/mvme68k/mvme68k/autoconf.c +++ b/sys/arch/mvme68k/mvme68k/autoconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: autoconf.c,v 1.34 2006/06/24 14:04:04 miod Exp $ */ +/* $OpenBSD: autoconf.c,v 1.35 2006/07/10 19:23:25 miod Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -215,15 +215,15 @@ mapiodev(pa, size) int size; { int error; + paddr_t base; vaddr_t va, iova; if (size <= 0) return NULL; -#ifdef DEBUG - if ((pa & PGOFSET) || (size & PGOFSET)) - panic("mapiodev: unaligned"); -#endif + base = pa & PAGE_MASK; + pa = trunc_page(pa); + size = round_page(base + size); error = extent_alloc(extio, size, EX_NOALIGN, 0, EX_NOBOUNDARY, EX_NOWAIT | EX_MALLOCOK, &iova); @@ -239,7 +239,7 @@ mapiodev(pa, size) pa += PAGE_SIZE; } pmap_update(pmap_kernel()); - return (iova); + return (iova + base); } void @@ -248,17 +248,19 @@ unmapiodev(kva, size) int size; { int error; + vaddr_t va; #ifdef DEBUG - if ((kva & PGOFSET) || (size & PGOFSET)) - panic("unmapiodev: unaligned"); - if (kva < extiobase || kva >= extiobase + ctob(EIOMAPSIZE)) + if (kva < extiobase || kva + size >= extiobase + ctob(EIOMAPSIZE)) panic("unmapiodev: bad address"); #endif - pmap_kremove(kva, size); + + va = trunc_page(kva); + size = round_page(kva + size) - va; + pmap_kremove(va, size); pmap_update(pmap_kernel()); - error = extent_free(extio, kva, size, EX_NOWAIT); + error = extent_free(extio, va, size, EX_NOWAIT); #ifdef DIAGNOSTIC if (error != 0) printf("unmapiodev: extent_free failed\n"); |