Module Name: src Committed By: matt Date: Wed Oct 17 18:53:45 UTC 2012
Modified Files: src/sys/arch/arm/arm32: arm32_boot.c Log Message: Change the semantics of the boot_physmem array to select a freelist to use with uvm_page_physload. Reduces duplication of work. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/arm32/arm32_boot.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm32/arm32_boot.c diff -u src/sys/arch/arm/arm32/arm32_boot.c:1.1 src/sys/arch/arm/arm32/arm32_boot.c:1.2 --- src/sys/arch/arm/arm32/arm32_boot.c:1.1 Fri Aug 31 23:59:51 2012 +++ src/sys/arch/arm/arm32/arm32_boot.c Wed Oct 17 18:53:45 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: arm32_boot.c,v 1.1 2012/08/31 23:59:51 matt Exp $ */ +/* $NetBSD: arm32_boot.c,v 1.2 2012/10/17 18:53:45 matt Exp $ */ /* * Copyright (c) 2002, 2003, 2005 Genetec Corporation. All rights reserved. @@ -123,7 +123,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.1 2012/08/31 23:59:51 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.2 2012/10/17 18:53:45 matt Exp $"); #include <sys/param.h> #include <sys/reboot.h> @@ -215,27 +215,42 @@ initarm_common(vaddr_t kvm_base, vsize_t #ifdef VERBOSE_INIT_ARM printf("pmap_physload "); #endif + KASSERT(bp != NULL || nbp == 0); + KASSERT(bp == NULL || nbp != 0); - if (bp == NULL) { - KASSERT(nbp == 0); - for (size_t i = 0; i < bmi->bmi_nfreeblocks; i++) { - pv_addr_t * const pv = &bmi->bmi_freeblocks[i]; - const paddr_t start = atop(pv->pv_pa); - const paddr_t end = start + atop(pv->pv_size); - - uvm_page_physload(start, end, start, end, - VM_FREELIST_DEFAULT); - } - } - - for (; nbp-- > 0; bp++) { - const paddr_t start = bp->bp_start; - const paddr_t end = start + bp->bp_pages; - - if (start < end) { - KASSERT(bp->bp_freelist < VM_NFREELIST); - uvm_page_physload(start, end, start, end, - bp->bp_freelist); + for (size_t i = 0; i < bmi->bmi_nfreeblocks; i++) { + pv_addr_t * const pv = &bmi->bmi_freeblocks[i]; + paddr_t start = atop(pv->pv_pa); + const paddr_t end = start + atop(pv->pv_size); + + while (start < end) { + int vm_freelist = VM_FREELIST_DEFAULT; + paddr_t segend = end; + /* + * This assumes the bp list is sorted in ascending + * order. + */ + for (size_t j = 0; j < nbp; j++) { + paddr_t bp_start = bp[j].bp_start; + paddr_t bp_end = bp_start + bp[j].bp_pages; + if (start < bp_start) { + if (segend > bp_start) { + segend = bp_start; + } + break; + } + if (start < bp_end) { + if (segend > bp_end) { + segend = bp_end; + } + vm_freelist = bp[j].bp_freelist; + break; + } + } + + uvm_page_physload(start, segend, start, segend, + vm_freelist); + start = segend; } }