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