diff options
author | tegge <tegge@FreeBSD.org> | 2006-02-16 22:10:57 +0000 |
---|---|---|
committer | tegge <tegge@FreeBSD.org> | 2006-02-16 22:10:57 +0000 |
commit | a9e07140a720679e2055eb5c0f729f91005b9b19 (patch) | |
tree | a00ffa46c819879ff6e1d9f28199df5cd3084dee /sys/i386 | |
parent | 2d615c3d1d81caa3fdc03f15212b94eb8bcee239 (diff) | |
download | FreeBSD-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.c | 14 |
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; + } } } |