[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.190 and 1.190.8.3

version 1.190, 2007/05/23 09:36:22 version 1.190.8.3, 2007/10/02 18:27:46
Line 407  static void pmap_alloc_bootargs(void)
Line 407  static void pmap_alloc_bootargs(void)
         memset(v, 0, 2*PAGE_SIZE);          memset(v, 0, 2*PAGE_SIZE);
   
         cpu_args = (struct cpu_bootargs*)v;          cpu_args = (struct cpu_bootargs*)v;
   
         cpu_args->cb_initstack = v + 2*PAGE_SIZE;  
 }  }
   
 #if defined(MULTIPROCESSOR)  #if defined(MULTIPROCESSOR)
Line 754  pmap_bootstrap(u_long kernelstart, u_lon
Line 752  pmap_bootstrap(u_long kernelstart, u_lon
 #endif  #endif
   
         /*          /*
          * Allocate a ncpu*128KB page for the cpu_info & stack structure now.           * Allocate a ncpu*64KB page for the cpu_info & stack structure now.
          */           */
         cpu0paddr = prom_alloc_phys(16 * PAGE_SIZE * sparc_ncpus, 8 * PAGE_SIZE);          cpu0paddr = prom_alloc_phys(8 * PAGE_SIZE * sparc_ncpus, 8 * PAGE_SIZE);
         if (cpu0paddr == 0) {          if (cpu0paddr == 0) {
                 prom_printf("Cannot allocate cpu_infos\n");                  prom_printf("Cannot allocate cpu_infos\n");
                 prom_halt();                  prom_halt();
Line 1054  pmap_bootstrap(u_long kernelstart, u_lon
Line 1052  pmap_bootstrap(u_long kernelstart, u_lon
                 BDPRINTF(PDB_BOOT1,                  BDPRINTF(PDB_BOOT1,
                         ("Inserting cpu_info into pmap_kernel() at %p\n",                          ("Inserting cpu_info into pmap_kernel() at %p\n",
                                  cpus));                                   cpus));
                 /* Now map in all 16 pages of interrupt stack/cpu_info */                  /* Now map in all 8 pages of interrupt stack/cpu_info */
                 pa = cpu0paddr;                  pa = cpu0paddr;
                 prom_map_phys(pa, 128*KB, vmmap, -1);                  prom_map_phys(pa, 64*KB, vmmap, -1);
   
                 /*                  /*
                  * Also map it in as the interrupt stack.                   * Also map it in as the interrupt stack.
Line 1066  pmap_bootstrap(u_long kernelstart, u_lon
Line 1064  pmap_bootstrap(u_long kernelstart, u_lon
                  * before installing the locked TTE.                   * before installing the locked TTE.
                  */                   */
                 prom_map_phys(pa, 64*KB, INTSTACK, -1);                  prom_map_phys(pa, 64*KB, INTSTACK, -1);
                 prom_map_phys(pa + 64*KB, 64*KB, KSTACK_VA, -1);                  for (i = 0; i < 8; i++) {
                 for (i = 0; i < 16; i++) {  
                         int64_t data1;                          int64_t data1;
   
                         data1 = TSB_DATA(0 /* global */,                          data1 = TSB_DATA(0 /* global */,
Line 1086  pmap_bootstrap(u_long kernelstart, u_lon
Line 1083  pmap_bootstrap(u_long kernelstart, u_lon
                 BDPRINTF(PDB_BOOT1, ("Initializing cpu_info\n"));                  BDPRINTF(PDB_BOOT1, ("Initializing cpu_info\n"));
   
                 /* Initialize our cpu_info structure */                  /* Initialize our cpu_info structure */
                 memset((void *)intstk, 0, 128 * KB);                  memset((void *)intstk, 0, 64 * KB);
                 cpus->ci_self = cpus;                  cpus->ci_self = cpus;
                 cpus->ci_next = NULL;                  cpus->ci_next = NULL;
                 cpus->ci_curlwp = &lwp0;                  cpus->ci_curlwp = &lwp0;
                 cpus->ci_flags = CPUF_PRIMARY;                  cpus->ci_flags = CPUF_PRIMARY;
                 cpus->ci_upaid = CPU_UPAID;                  cpus->ci_cpuid = CPU_UPAID;
                 cpus->ci_number = 0;  
                 cpus->ci_cpuid = cpus->ci_upaid;  
                 cpus->ci_fplwp = NULL;                  cpus->ci_fplwp = NULL;
                 cpus->ci_spinup = main; /* Call main when we're running. */                  cpus->ci_spinup = main; /* Call main when we're running. */
                 cpus->ci_paddr = cpu0paddr;                  cpus->ci_paddr = cpu0paddr;
                 cpus->ci_cpcb = (struct pcb *)u0va;                  cpus->ci_cpcb = (struct pcb *)u0va;
                 cpus->ci_initstack = (void *)INITSTACK_VA;  
                 proc0paddr = cpus->ci_cpcb;                  proc0paddr = cpus->ci_cpcb;
   
                 cpu0paddr += 128 * KB;                  lwp0.l_addr = (struct user*)u0va;
                   lwp0.l_md.md_tf = (struct trapframe64*)(u0va + USPACE
                       - sizeof(struct trapframe64));
   
                   cpu0paddr += 64 * KB;
   
                 CPUSET_CLEAR(cpus_active);                  CPUSET_CLEAR(cpus_active);
                 CPUSET_ADD(cpus_active, 0);                  CPUSET_ADD(cpus_active, 0);
Line 2046  pmap_extract(pm, va, pap)
Line 2044  pmap_extract(pm, va, pap)
         paddr_t *pap;          paddr_t *pap;
 {  {
         paddr_t pa;          paddr_t pa;
           int64_t data = 0;
   
         if (pm == pmap_kernel() && va >= kdata && va < roundup(ekdata, 4*MEG)) {          if (pm == pmap_kernel() && va >= kdata && va < roundup(ekdata, 4*MEG)) {
                 /* Need to deal w/locked TLB entry specially. */                  /* Need to deal w/locked TLB entry specially. */
Line 2064  pmap_extract(pm, va, pap)
Line 2063  pmap_extract(pm, va, pap)
                 if (pap != NULL)                  if (pap != NULL)
                         *pap = pa;                          *pap = pa;
                 return TRUE;                  return TRUE;
         } else if (pm == pmap_kernel() && va >= KSTACK_VA && va < (KSTACK_VA + 64*KB)) {  
                 pa = (paddr_t)(curcpu()->ci_paddr - KSTACK_VA + va);  
                 DPRINTF(PDB_EXTRACT, ("pmap_extract (kstack): va=%lx pa=%llx\n",  
                     (u_long)va, (unsigned long long)pa));  
                 if (pap != NULL)  
                         *pap = pa;  
                 return TRUE;  
         } else {          } else {
                 if (pm != pmap_kernel()) {                  if (pm != pmap_kernel()) {
                         simple_lock(&pm->pm_lock);                          simple_lock(&pm->pm_lock);
                 }                  }
                 pa = pseg_get(pm, va) & TLB_PA_MASK;                  data = pseg_get(pm, va);
                   pa = data & TLB_PA_MASK;
 #ifdef DEBUG  #ifdef DEBUG
                 if (pmapdebug & PDB_EXTRACT) {                  if (pmapdebug & PDB_EXTRACT) {
                         paddr_t npa = ldxa((vaddr_t)&pm->pm_segs[va_to_seg(va)],                          paddr_t npa = ldxa((vaddr_t)&pm->pm_segs[va_to_seg(va)],
Line 2109  pmap_extract(pm, va, pap)
Line 2102  pmap_extract(pm, va, pap)
                         simple_unlock(&pm->pm_lock);                          simple_unlock(&pm->pm_lock);
                 }                  }
         }          }
         if (pa == 0)          if ((data & TLB_V) == 0)
                 return (FALSE);                  return (FALSE);
         if (pap != NULL)          if (pap != NULL)
                 *pap = pa + (va & PGOFSET);                  *pap = pa + (va & PGOFSET);
Line 3430  void
Line 3423  void
 pmap_update(struct pmap *pmap)  pmap_update(struct pmap *pmap)
 {  {
   
 #ifdef MULTIPROCESSOR  
         smp_tlb_flush_all();    /* XXX */  
 #endif  
   
         if (pmap->pm_refs > 0) {          if (pmap->pm_refs > 0) {
                 return;                  return;
         }          }

Legend:
Removed from v.1.190  
changed lines
  Added in v.1.190.8.3

CVSweb <webmaster@jp.NetBSD.org>