summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormiod <miod@openbsd.org>2006-07-10 19:23:25 +0000
committermiod <miod@openbsd.org>2006-07-10 19:23:25 +0000
commitd628e111d4ac6d823ea0dbe4f0cd5bf4f94a933f (patch)
tree917c52f998f66115314dc02572a2af20a4a9beef
parentremove some silly Xr's; ok marco (diff)
downloadwireguard-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.c24
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");