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

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

Diff for /src/sys/arch/sparc64/sparc64/pmap.c between version 1.308.4.1 and 1.308.4.2

version 1.308.4.1, 2019/06/10 22:06:48 version 1.308.4.2, 2020/04/08 14:07:54
Line 1473  pmap_create(void)
Line 1473  pmap_create(void)
         memset(pm, 0, sizeof *pm);          memset(pm, 0, sizeof *pm);
         DPRINTF(PDB_CREATE, ("pmap_create(): created %p\n", pm));          DPRINTF(PDB_CREATE, ("pmap_create(): created %p\n", pm));
   
         mutex_init(&pm->pm_obj_lock, MUTEX_DEFAULT, IPL_NONE);          pm->pm_refs = 1;
         uvm_obj_init(&pm->pm_obj, NULL, false, 1);          TAILQ_INIT(&pm->pm_ptps);
         uvm_obj_setlock(&pm->pm_obj, &pm->pm_obj_lock);  
   
         if (pm != pmap_kernel()) {          if (pm != pmap_kernel()) {
                 while (!pmap_get_page(&pm->pm_physaddr)) {                  while (!pmap_get_page(&pm->pm_physaddr)) {
                         uvm_wait("pmap_create");                          uvm_wait("pmap_create");
Line 1510  pmap_destroy(struct pmap *pm)
Line 1508  pmap_destroy(struct pmap *pm)
 #else  #else
 #define pmap_cpus_active 0  #define pmap_cpus_active 0
 #endif  #endif
         struct vm_page *pg, *nextpg;          struct vm_page *pg;
   
         if ((int)atomic_dec_uint_nv(&pm->pm_refs) > 0) {          if ((int)atomic_dec_uint_nv(&pm->pm_refs) > 0) {
                 return;                  return;
Line 1538  pmap_destroy(struct pmap *pm)
Line 1536  pmap_destroy(struct pmap *pm)
 #endif  #endif
   
         /* we could be a little smarter and leave pages zeroed */          /* we could be a little smarter and leave pages zeroed */
         for (pg = TAILQ_FIRST(&pm->pm_obj.memq); pg != NULL; pg = nextpg) {          while ((pg = TAILQ_FIRST(&pm->pm_ptps)) != NULL) {
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
                 struct vm_page_md *md = VM_PAGE_TO_MD(pg);                  struct vm_page_md *md = VM_PAGE_TO_MD(pg);
 #endif  #endif
   
                 KASSERT((pg->flags & PG_MARKER) == 0);                  TAILQ_REMOVE(&pm->pm_ptps, pg, pageq.queue);
                 nextpg = TAILQ_NEXT(pg, listq.queue);  
                 TAILQ_REMOVE(&pm->pm_obj.memq, pg, listq.queue);  
                 KASSERT(md->mdpg_pvh.pv_pmap == NULL);                  KASSERT(md->mdpg_pvh.pv_pmap == NULL);
                 dcache_flush_page_cpuset(VM_PAGE_TO_PHYS(pg), pmap_cpus_active);                  dcache_flush_page_cpuset(VM_PAGE_TO_PHYS(pg), pmap_cpus_active);
                 uvm_pagefree(pg);                  uvm_pagefree(pg);
         }          }
         pmap_free_page((paddr_t)(u_long)pm->pm_segs, pmap_cpus_active);          pmap_free_page((paddr_t)(u_long)pm->pm_segs, pmap_cpus_active);
   
         uvm_obj_destroy(&pm->pm_obj, false);  
         mutex_destroy(&pm->pm_obj_lock);  
         pool_cache_put(&pmap_cache, pm);          pool_cache_put(&pmap_cache, pm);
 }  }
   
Line 1904  pmap_enter(struct pmap *pm, vaddr_t va, 
Line 1898  pmap_enter(struct pmap *pm, vaddr_t va, 
                 ptpg = PHYS_TO_VM_PAGE(ptp);                  ptpg = PHYS_TO_VM_PAGE(ptp);
                 if (ptpg) {                  if (ptpg) {
                         ptpg->offset = (uint64_t)va & (0xfffffLL << 23);                          ptpg->offset = (uint64_t)va & (0xfffffLL << 23);
                         TAILQ_INSERT_TAIL(&pm->pm_obj.memq, ptpg, listq.queue);                          TAILQ_INSERT_TAIL(&pm->pm_ptps, ptpg, pageq.queue);
                 } else {                  } else {
                         KASSERT(pm == pmap_kernel());                          KASSERT(pm == pmap_kernel());
                 }                  }
Line 1916  pmap_enter(struct pmap *pm, vaddr_t va, 
Line 1910  pmap_enter(struct pmap *pm, vaddr_t va, 
                 ptpg = PHYS_TO_VM_PAGE(ptp);                  ptpg = PHYS_TO_VM_PAGE(ptp);
                 if (ptpg) {                  if (ptpg) {
                         ptpg->offset = (((uint64_t)va >> 43) & 0x3ffLL) << 13;                          ptpg->offset = (((uint64_t)va >> 43) & 0x3ffLL) << 13;
                         TAILQ_INSERT_TAIL(&pm->pm_obj.memq, ptpg, listq.queue);                          TAILQ_INSERT_TAIL(&pm->pm_ptps, ptpg, pageq.queue);
                 } else {                  } else {
                         KASSERT(pm == pmap_kernel());                          KASSERT(pm == pmap_kernel());
                 }                  }
Line 2024  pmap_enter(struct pmap *pm, vaddr_t va, 
Line 2018  pmap_enter(struct pmap *pm, vaddr_t va, 
         return error;          return error;
 }  }
   
 void  bool
 pmap_remove_all(struct pmap *pm)  pmap_remove_all(struct pmap *pm)
 {  {
 #ifdef MULTIPROCESSOR  #ifdef MULTIPROCESSOR
Line 2033  pmap_remove_all(struct pmap *pm)
Line 2027  pmap_remove_all(struct pmap *pm)
 #endif  #endif
   
         if (pm == pmap_kernel()) {          if (pm == pmap_kernel()) {
                 return;                  return false;
         }          }
         write_user_windows();          write_user_windows();
         pm->pm_refs = 0;          pm->pm_refs = 0;
Line 2069  pmap_remove_all(struct pmap *pm)
Line 2063  pmap_remove_all(struct pmap *pm)
          * only flush the right context on each CPU?           * only flush the right context on each CPU?
          */           */
         blast_dcache();          blast_dcache();
           return false;
 }  }
   
 /*  /*

Legend:
Removed from v.1.308.4.1  
changed lines
  Added in v.1.308.4.2

CVSweb <webmaster@jp.NetBSD.org>