summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authortegge <tegge@FreeBSD.org>2006-02-16 22:10:57 +0000
committertegge <tegge@FreeBSD.org>2006-02-16 22:10:57 +0000
commita9e07140a720679e2055eb5c0f729f91005b9b19 (patch)
treea00ffa46c819879ff6e1d9f28199df5cd3084dee /sys/i386
parent2d615c3d1d81caa3fdc03f15212b94eb8bcee239 (diff)
downloadFreeBSD-src-a9e07140a720679e2055eb5c0f729f91005b9b19.zip
FreeBSD-src-a9e07140a720679e2055eb5c0f729f91005b9b19.tar.gz
Rounding addr upwards to next 4M or 2M boundary in pmap_growkernel() could
cause addr to become 0, resulting in an early return without populating the last PDE. Reviewed by: alc
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/pmap.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 7f39d2e..933defd 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -1387,12 +1387,22 @@ pmap_growkernel(vm_offset_t addr)
while (pdir_pde(PTD, kernel_vm_end)) {
kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
nkpt++;
+ if (kernel_vm_end - 1 >= kernel_map->max_offset) {
+ kernel_vm_end = kernel_map->max_offset;
+ break;
+ }
}
}
addr = roundup2(addr, PAGE_SIZE * NPTEPG);
+ if (addr - 1 >= kernel_map->max_offset)
+ addr = kernel_map->max_offset;
while (kernel_vm_end < addr) {
if (pdir_pde(PTD, kernel_vm_end)) {
kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
+ if (kernel_vm_end - 1 >= kernel_map->max_offset) {
+ kernel_vm_end = kernel_map->max_offset;
+ break;
+ }
continue;
}
@@ -1418,6 +1428,10 @@ pmap_growkernel(vm_offset_t addr)
}
mtx_unlock_spin(&allpmaps_lock);
kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
+ if (kernel_vm_end - 1 >= kernel_map->max_offset) {
+ kernel_vm_end = kernel_map->max_offset;
+ break;
+ }
}
}
OpenPOWER on IntegriCloud