[BACK]Return to pmap.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / arch / arm / arm32

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/arch/arm/arm32/pmap.c between version 1.375 and 1.375.2.1

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;
                 }                  }

Legend:
Removed from v.1.375  
changed lines
  Added in v.1.375.2.1

CVSweb <webmaster@jp.NetBSD.org>