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

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

Diff for /src/sys/arch/sparc/sparc/pmap.c between version 1.91.2.5 and 1.91.2.6

version 1.91.2.5, 1997/09/29 07:20:44 version 1.91.2.6, 1997/10/14 10:18:49
Line 319  char *ctxbusyvector;  /* [4m] tells what
Line 319  char *ctxbusyvector;  /* [4m] tells what
 #endif  #endif
   
 caddr_t vpage[2];               /* two reserved MD virtual pages */  caddr_t vpage[2];               /* two reserved MD virtual pages */
   #if defined(SUN4M)
   int     *vpage_pte[2];          /* pte location of vpage[] */
   #endif
 caddr_t vmmap;                  /* one reserved MI vpage for /dev/mem */  caddr_t vmmap;                  /* one reserved MI vpage for /dev/mem */
 caddr_t vdumppages;             /* 32KB worth of reserved dump pages */  caddr_t vdumppages;             /* 32KB worth of reserved dump pages */
   
Line 3284  pmap_bootstrap4m(void)
Line 3287  pmap_bootstrap4m(void)
         vmmap = p, p += NBPG;          vmmap = p, p += NBPG;
         p = reserve_dumppages(p);          p = reserve_dumppages(p);
   
           /* Find PTE locations of vpage[] to optimize zero_fill() et.al. */
           for (i = 0; i < 2; i++) {
                   struct regmap *rp;
                   struct segmap *sp;
                   rp = &pmap_kernel()->pm_regmap[VA_VREG(vpage[i])];
                   sp = &rp->rg_segmap[VA_VSEG(vpage[i])];
                   vpage_pte[i] = &sp->sg_pte[VA_SUN4M_VPG(vpage[i])];
           }
   
         /*          /*
          * Allocate virtual memory for pv_table[], which will be mapped           * Allocate virtual memory for pv_table[], which will be mapped
          * sparsely in pmap_init().           * sparsely in pmap_init().
Line 3723  pmap_release(pm)
Line 3735  pmap_release(pm)
                         ctx_free(pm);                          ctx_free(pm);
                 }                  }
         }          }
   
   #if defined(SUN4M)
           if (CPU_ISSUN4M) {
                   if ((c = pm->pm_ctx) != NULL) {
                           if (pm->pm_ctxnum == 0)
                                   panic("pmap_release: releasing kernel");
                           ctx_free(pm);
                   }
                   pgtfree(pm->pm_reg_ptps, SRMMU_L1SIZE * sizeof(int));
                   pm->pm_reg_ptps = NULL;
                   pm->pm_reg_ptps_pa = 0;
           }
   #endif
         splx(s);          splx(s);
   
 #ifdef DEBUG  #ifdef DEBUG
Line 3751  if (pmapdebug) {
Line 3776  if (pmapdebug) {
         }          }
 }  }
 #endif  #endif
   
         if (pm->pm_regstore)          if (pm->pm_regstore)
                 free(pm->pm_regstore, M_VMPMAP);                  free(pm->pm_regstore, M_VMPMAP);
   
         if (CPU_ISSUN4M) {  
                 if ((c = pm->pm_ctx) != NULL) {  
                         if (pm->pm_ctxnum == 0)  
                                 panic("pmap_release: releasing kernel");  
                         ctx_free(pm);  
                 }  
                 pgtfree(pm->pm_reg_ptps, SRMMU_L1SIZE * sizeof(int));  
                 pm->pm_reg_ptps = NULL;  
                 pm->pm_reg_ptps_pa = 0;  
         }  
 }  }
   
 /*  /*
Line 6215  pmap_zero_page4m(pa)
Line 6230  pmap_zero_page4m(pa)
 {  {
         register caddr_t va;          register caddr_t va;
         register int pte;          register int pte;
         int ctx;  
   
         if (((pa & (PMAP_TNC_SRMMU & ~PMAP_NC)) == 0) && managed(pa)) {          if (((pa & (PMAP_TNC_SRMMU & ~PMAP_NC)) == 0) && managed(pa)) {
                 /*                  /*
Line 6233  pmap_zero_page4m(pa)
Line 6247  pmap_zero_page4m(pa)
         else          else
                 pte &= ~SRMMU_PG_C;                  pte &= ~SRMMU_PG_C;
   
         /* XXX - must use context 0 or else setpte4m() will fail */  
         ctx = getcontext4m();  
         setcontext4m(0);  
         va = vpage[0];          va = vpage[0];
         setpte4m((vm_offset_t) va, pte);          *vpage_pte[0] = pte;
         qzero(va, NBPG);          qzero(va, NBPG);
         setpte4m((vm_offset_t) va, SRMMU_TEINVALID);          /* Remove temporary mapping */
         setcontext4m(ctx);          tlb_flush_page((int)va);
           *vpage_pte[0] = SRMMU_TEINVALID;
 }  }
   
 /*  /*
Line 6258  pmap_copy_page4m(src, dst)
Line 6270  pmap_copy_page4m(src, dst)
 {  {
         register caddr_t sva, dva;          register caddr_t sva, dva;
         register int spte, dpte;          register int spte, dpte;
         int ctx;  
   
         if (managed(src)) {          if (managed(src)) {
                 if (CACHEINFO.c_vactype == VAC_WRITEBACK)                  if (CACHEINFO.c_vactype == VAC_WRITEBACK)
Line 6279  pmap_copy_page4m(src, dst)
Line 6290  pmap_copy_page4m(src, dst)
         else          else
                 dpte &= ~SRMMU_PG_C;                  dpte &= ~SRMMU_PG_C;
   
         /* XXX - must use context 0 or else setpte4m() will fail */  
         ctx = getcontext4m();  
         setcontext4m(0);  
         sva = vpage[0];          sva = vpage[0];
         dva = vpage[1];          dva = vpage[1];
         setpte4m((vm_offset_t) sva, spte);          *vpage_pte[0] = spte;
         setpte4m((vm_offset_t) dva, dpte);          *vpage_pte[1] = dpte;
         qcopy(sva, dva, NBPG);  /* loads cache, so we must ... */          qcopy(sva, dva, NBPG);  /* loads cache, so we must ... */
         cache_flush_page((int)sva);          cache_flush_page((int)sva);
         setpte4m((vm_offset_t) sva, SRMMU_TEINVALID);          *vpage_pte[0] = SRMMU_TEINVALID;
         setpte4m((vm_offset_t) dva, SRMMU_TEINVALID);          *vpage_pte[1] = SRMMU_TEINVALID;
         setcontext4m(ctx);          tlb_flush_page((int)sva);
           tlb_flush_page((int)dva);
 }  }
 #endif /* Sun4M */  #endif /* Sun4M */
   
Line 6429  void
Line 6438  void
 pmap_redzone()  pmap_redzone()
 {  {
         pmap_remove(pmap_kernel(), KERNBASE, KERNBASE+NBPG);          pmap_remove(pmap_kernel(), KERNBASE, KERNBASE+NBPG);
         return;  
 #if defined(SUN4M)  
         if (CPU_ISSUN4M) {  
                 setpte4m(KERNBASE, 0);  
                 return;  
         }  
 #endif  
 #if defined(SUN4) || defined(SUN4C)  
         if (CPU_ISSUN4OR4C) {  
                 setpte4(KERNBASE, 0);  
                 return;  
         }  
 #endif  
 }  }
   
 #ifdef DEBUG  #ifdef DEBUG

Legend:
Removed from v.1.91.2.5  
changed lines
  Added in v.1.91.2.6

CVSweb <webmaster@jp.NetBSD.org>