From 95181ed7ff282098b4f2be3f86036e2c6754d7c8 Mon Sep 17 00:00:00 2001 From: Ian Lepore Date: Sat, 2 Jan 2016 22:31:14 +0000 Subject: [PATCH] Work around problems that happen when there is ram at the end of the physical address space. --- sys/arm/arm/physmem.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sys/arm/arm/physmem.c b/sys/arm/arm/physmem.c index a9e7becb6ec..2ae2c5d08de 100644 --- a/sys/arm/arm/physmem.c +++ b/sys/arm/arm/physmem.c @@ -280,10 +280,24 @@ arm_physmem_hardware_region(vm_paddr_t pa, vm_size_t sz) /* * Filter out the page at PA 0x00000000. The VM can't handle it, as * pmap_extract() == 0 means failure. + * + * Also filter out the page at the end of the physical address space -- + * if addr is non-zero and addr+size is zero that means we wrapped to + * the next byte beyond what vm_paddr_t can express. The calculations + * in vm_page_startup() are going to have the same problem, so just work + * around it by leaving the last page out. + * + * XXX This just in: subtract out a whole megabyte, not just 1 page. + * Reducing the size by anything less than 1MB results in a NULL pointer + * deref in _vm_map_lock_read() very early in startup. Better to give + * up a whole megabyte than leave some folks with an unusable system + * while we investigate. */ if (pa == 0) { pa = PAGE_SIZE; sz -= PAGE_SIZE; + } else if (pa + sz == 0) { + sz -= 1024 * 1024; } /*