version 1.375, 2019/12/31 18:09:21 |
version 1.375.2.1, 2020/01/17 21:47:23 |
Line 5787 pmap_grow_map(vaddr_t va, paddr_t *pap) |
|
Line 5787 pmap_grow_map(vaddr_t va, paddr_t *pap) |
|
#else |
#else |
if (uvm_page_physget(&pa) == false) |
if (uvm_page_physget(&pa) == false) |
return (1); |
return (1); |
|
|
|
pmap_kenter_pa(va, pa, |
|
VM_PROT_READ|VM_PROT_WRITE, PMAP_KMPAGE|PMAP_PTE); |
#endif /* PMAP_STEAL_MEMORY */ |
#endif /* PMAP_STEAL_MEMORY */ |
} else { |
} else { |
struct vm_page *pg; |
struct vm_page *pg; |
Line 7789 pmap_boot_pagealloc(psize_t amount, psiz |
|
Line 7792 pmap_boot_pagealloc(psize_t amount, psiz |
|
pv_addr_t *rpv) |
pv_addr_t *rpv) |
{ |
{ |
pv_addr_t *pv, **pvp; |
pv_addr_t *pv, **pvp; |
struct vm_physseg *ps; |
|
size_t i; |
|
|
|
KASSERT(amount & PGOFSET); |
KASSERT(amount & PGOFSET); |
KASSERT((mask & PGOFSET) == 0); |
KASSERT((mask & PGOFSET) == 0); |
Line 7803 pmap_boot_pagealloc(psize_t amount, psiz |
|
Line 7804 pmap_boot_pagealloc(psize_t amount, psiz |
|
pv_addr_t *newpv; |
pv_addr_t *newpv; |
psize_t off; |
psize_t off; |
/* |
/* |
* If this entry is too small to satify the request... |
* If this entry is too small to satisfy the request... |
*/ |
*/ |
KASSERT(pv->pv_size > 0); |
KASSERT(pv->pv_size > 0); |
if (pv->pv_size < amount) |
if (pv->pv_size < amount) |
Line 7848 pmap_boot_pagealloc(psize_t amount, psiz |
|
Line 7849 pmap_boot_pagealloc(psize_t amount, psiz |
|
return; |
return; |
} |
} |
|
|
if (vm_nphysseg == 0) |
if (!uvm_physseg_valid_p(uvm_physseg_get_first())) |
panic("pmap_boot_pagealloc: couldn't allocate memory"); |
panic("pmap_boot_pagealloc: couldn't allocate memory"); |
|
|
for (pvp = &SLIST_FIRST(&pmap_boot_freeq); |
for (pvp = &SLIST_FIRST(&pmap_boot_freeq); |
Line 7858 pmap_boot_pagealloc(psize_t amount, psiz |
|
Line 7859 pmap_boot_pagealloc(psize_t amount, psiz |
|
break; |
break; |
} |
} |
KASSERT(mask == 0); |
KASSERT(mask == 0); |
for (i = 0; i < vm_nphysseg; i++) { |
|
ps = VM_PHYSMEM_PTR(i); |
for (uvm_physseg_t ups = uvm_physseg_get_first(); |
if (ps->avail_start == atop(pv->pv_pa + pv->pv_size) |
uvm_physseg_valid_p(ups); |
&& pv->pv_va + pv->pv_size <= ptoa(ps->avail_end)) { |
ups = uvm_physseg_get_next(ups)) { |
|
|
|
paddr_t spn = uvm_physseg_get_start(ups); |
|
paddr_t epn = uvm_physseg_get_end(ups); |
|
if (spn == atop(pv->pv_pa + pv->pv_size) |
|
&& pv->pv_va + pv->pv_size <= ptoa(epn)) { |
rpv->pv_va = pv->pv_va; |
rpv->pv_va = pv->pv_va; |
rpv->pv_pa = pv->pv_pa; |
rpv->pv_pa = pv->pv_pa; |
rpv->pv_size = amount; |
rpv->pv_size = amount; |
*pvp = NULL; |
*pvp = NULL; |
pmap_map_chunk(kernel_l1pt.pv_va, |
pmap_map_chunk(kernel_l1pt.pv_va, |
ptoa(ps->avail_start) + (pv->pv_va - pv->pv_pa), |
ptoa(spn) + (pv->pv_va - pv->pv_pa), |
ptoa(ps->avail_start), |
ptoa(spn), |
amount - pv->pv_size, |
amount - pv->pv_size, |
VM_PROT_READ|VM_PROT_WRITE, |
VM_PROT_READ|VM_PROT_WRITE, |
PTE_CACHE); |
PTE_CACHE); |
ps->avail_start += atop(amount - pv->pv_size); |
|
/* |
uvm_physseg_unplug(spn, atop(amount - pv->pv_size)); |
* If we consumed the entire physseg, remove it. |
|
*/ |
|
if (ps->avail_start == ps->avail_end) { |
|
for (--vm_nphysseg; i < vm_nphysseg; i++) |
|
VM_PHYSMEM_PTR_SWAP(i, i + 1); |
|
} |
|
memset((void *)rpv->pv_va, 0, rpv->pv_size); |
memset((void *)rpv->pv_va, 0, rpv->pv_size); |
return; |
return; |
} |
} |