summaryrefslogtreecommitdiffstats
path: root/sys/compat/x86bios
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2010-08-06 15:04:01 +0000
committerjkim <jkim@FreeBSD.org>2010-08-06 15:04:01 +0000
commitc1d76c06de1b1cb71cacf2b0d1803d9b7b048968 (patch)
tree85157bc124908b1f439860857b80dc2c48240e30 /sys/compat/x86bios
parentf4e8725880aad15a64790723505167159829163a (diff)
downloadFreeBSD-src-c1d76c06de1b1cb71cacf2b0d1803d9b7b048968.zip
FreeBSD-src-c1d76c06de1b1cb71cacf2b0d1803d9b7b048968.tar.gz
Fix allocation of multiple pages, which forgot to increase page number.
Particularly, it caused "vm86_addpage: overlap" panics under VirtualBox. Add a safety check before freeing memory while I am here.
Diffstat (limited to 'sys/compat/x86bios')
-rw-r--r--sys/compat/x86bios/x86bios.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/compat/x86bios/x86bios.c b/sys/compat/x86bios/x86bios.c
index cda03a0..2662fad 100644
--- a/sys/compat/x86bios/x86bios.c
+++ b/sys/compat/x86bios/x86bios.c
@@ -121,7 +121,7 @@ x86bios_alloc(uint32_t *offset, size_t size, int flags)
*offset = vtophys(addr);
mtx_lock(&x86bios_lock);
for (i = 0; i < howmany(size, PAGE_SIZE); i++)
- vm86_addpage(&x86bios_vmc, atop(*offset),
+ vm86_addpage(&x86bios_vmc, atop(*offset) + i,
addr + i * PAGE_SIZE);
mtx_unlock(&x86bios_lock);
}
@@ -142,6 +142,10 @@ x86bios_free(void *addr, size_t size)
sizeof(x86bios_vmc.pmap[i]));
last = i;
}
+ if (last < 0) {
+ mtx_unlock(&x86bios_lock);
+ return;
+ }
if (last == x86bios_vmc.npages - 1) {
x86bios_vmc.npages -= howmany(size, PAGE_SIZE);
for (i = x86bios_vmc.npages - 1;
OpenPOWER on IntegriCloud