version 1.43, 2006/10/30 17:52:12 |
version 1.43.4.2, 2007/03/12 05:50:07 |
|
|
void |
void |
tlbia(void) |
tlbia(void) |
{ |
{ |
caddr_t i; |
char *i; |
|
|
SYNC(); |
SYNC(); |
#if defined(PPC_OEA) |
#if defined(PPC_OEA) |
|
|
* This needs to be a per-CPU callback to do the appropriate thing |
* This needs to be a per-CPU callback to do the appropriate thing |
* for the CPU. XXX |
* for the CPU. XXX |
*/ |
*/ |
for (i = 0; i < (caddr_t)0x00040000; i += 0x00001000) { |
for (i = 0; i < (char *)0x00040000; i += 0x00001000) { |
TLBIE(i); |
TLBIE(i); |
EIEIO(); |
EIEIO(); |
SYNC(); |
SYNC(); |
|
|
#elif defined (PPC_OEA64) || defined (PPC_OEA64_BRIDGE) |
#elif defined (PPC_OEA64) || defined (PPC_OEA64_BRIDGE) |
printf("Invalidating ALL TLB entries......\n"); |
printf("Invalidating ALL TLB entries......\n"); |
/* This is specifically for the 970, 970UM v1.6 pp. 140. */ |
/* This is specifically for the 970, 970UM v1.6 pp. 140. */ |
for (i = 0; i <= (caddr_t)0xFF000; i += 0x00001000) { |
for (i = 0; i <= (void *)0xFF000; i += 0x00001000) { |
TLBIEL(i); |
TLBIEL(i); |
EIEIO(); |
EIEIO(); |
SYNC(); |
SYNC(); |
Line 932 pmap_pte_insert(int ptegidx, struct pte |
|
Line 932 pmap_pte_insert(int ptegidx, struct pte |
|
*/ |
*/ |
|
|
int |
int |
pmap_pte_spill(struct pmap *pm, vaddr_t addr, boolean_t exec) |
pmap_pte_spill(struct pmap *pm, vaddr_t addr, bool exec) |
{ |
{ |
struct pvo_entry *source_pvo, *victim_pvo, *next_pvo; |
struct pvo_entry *source_pvo, *victim_pvo, *next_pvo; |
struct pvo_entry *pvo; |
struct pvo_entry *pvo; |
Line 1197 pmap_create(void) |
|
Line 1197 pmap_create(void) |
|
pmap_t pm; |
pmap_t pm; |
|
|
pm = pool_get(&pmap_pool, PR_WAITOK); |
pm = pool_get(&pmap_pool, PR_WAITOK); |
memset((caddr_t)pm, 0, sizeof *pm); |
memset((void *)pm, 0, sizeof *pm); |
pmap_pinit(pm); |
pmap_pinit(pm); |
|
|
DPRINTFN(CREATE,("pmap_create: pm %p:\n" |
DPRINTFN(CREATE,("pmap_create: pm %p:\n" |
Line 1745 pmap_pvo_enter(pmap_t pm, struct pool *p |
|
Line 1745 pmap_pvo_enter(pmap_t pm, struct pool *p |
|
* If this is a kernel page, make sure it's active. |
* If this is a kernel page, make sure it's active. |
*/ |
*/ |
if (pm == pmap_kernel()) { |
if (pm == pmap_kernel()) { |
i = pmap_pte_spill(pm, va, FALSE); |
i = pmap_pte_spill(pm, va, false); |
KASSERT(i); |
KASSERT(i); |
} |
} |
} |
} |
Line 2122 pmap_remove(pmap_t pm, vaddr_t va, vaddr |
|
Line 2122 pmap_remove(pmap_t pm, vaddr_t va, vaddr |
|
/* |
/* |
* Get the physical page address for the given pmap/virtual address. |
* Get the physical page address for the given pmap/virtual address. |
*/ |
*/ |
boolean_t |
bool |
pmap_extract(pmap_t pm, vaddr_t va, paddr_t *pap) |
pmap_extract(pmap_t pm, vaddr_t va, paddr_t *pap) |
{ |
{ |
struct pvo_entry *pvo; |
struct pvo_entry *pvo; |
Line 2149 pmap_extract(pmap_t pm, vaddr_t va, padd |
|
Line 2149 pmap_extract(pmap_t pm, vaddr_t va, padd |
|
(~(batu & BAT_BL) << 15) & ~0x1ffffL; |
(~(batu & BAT_BL) << 15) & ~0x1ffffL; |
if (pap) |
if (pap) |
*pap = (batl & mask) | (va & ~mask); |
*pap = (batl & mask) | (va & ~mask); |
return TRUE; |
return true; |
} |
} |
} else { |
} else { |
register_t batu = battable[va >> 23].batu; |
register_t batu = battable[va >> 23].batu; |
Line 2161 pmap_extract(pmap_t pm, vaddr_t va, padd |
|
Line 2161 pmap_extract(pmap_t pm, vaddr_t va, padd |
|
(~(batl & BAT601_BSM) << 17) & ~0x1ffffL; |
(~(batl & BAT601_BSM) << 17) & ~0x1ffffL; |
if (pap) |
if (pap) |
*pap = (batl & mask) | (va & ~mask); |
*pap = (batl & mask) | (va & ~mask); |
return TRUE; |
return true; |
} else if (SR601_VALID_P(sr) && |
} else if (SR601_VALID_P(sr) && |
SR601_PA_MATCH_P(sr, va)) { |
SR601_PA_MATCH_P(sr, va)) { |
if (pap) |
if (pap) |
*pap = va; |
*pap = va; |
return TRUE; |
return true; |
} |
} |
} |
} |
return FALSE; |
return false; |
#elif defined (PPC_OEA64_BRIDGE) |
#elif defined (PPC_OEA64_BRIDGE) |
panic("%s: pm: %s, va: 0x%08lx\n", __FUNCTION__, |
panic("%s: pm: %s, va: 0x%08lx\n", __FUNCTION__, |
(pm == pmap_kernel() ? "kernel" : "user"), va); |
(pm == pmap_kernel() ? "kernel" : "user"), va); |
Line 2394 pmap_deactivate(struct lwp *l) |
|
Line 2394 pmap_deactivate(struct lwp *l) |
|
{ |
{ |
} |
} |
|
|
boolean_t |
bool |
pmap_query_bit(struct vm_page *pg, int ptebit) |
pmap_query_bit(struct vm_page *pg, int ptebit) |
{ |
{ |
struct pvo_entry *pvo; |
struct pvo_entry *pvo; |
Line 2402 pmap_query_bit(struct vm_page *pg, int p |
|
Line 2402 pmap_query_bit(struct vm_page *pg, int p |
|
register_t msr; |
register_t msr; |
|
|
if (pmap_attr_fetch(pg) & ptebit) |
if (pmap_attr_fetch(pg) & ptebit) |
return TRUE; |
return true; |
|
|
msr = pmap_interrupts_off(); |
msr = pmap_interrupts_off(); |
LIST_FOREACH(pvo, vm_page_to_pvoh(pg), pvo_vlink) { |
LIST_FOREACH(pvo, vm_page_to_pvoh(pg), pvo_vlink) { |
Line 2415 pmap_query_bit(struct vm_page *pg, int p |
|
Line 2415 pmap_query_bit(struct vm_page *pg, int p |
|
pmap_attr_save(pg, ptebit); |
pmap_attr_save(pg, ptebit); |
PMAP_PVO_CHECK(pvo); /* sanity check */ |
PMAP_PVO_CHECK(pvo); /* sanity check */ |
pmap_interrupts_restore(msr); |
pmap_interrupts_restore(msr); |
return TRUE; |
return true; |
} |
} |
} |
} |
/* |
/* |
Line 2438 pmap_query_bit(struct vm_page *pg, int p |
|
Line 2438 pmap_query_bit(struct vm_page *pg, int p |
|
pmap_attr_save(pg, ptebit); |
pmap_attr_save(pg, ptebit); |
PMAP_PVO_CHECK(pvo); /* sanity check */ |
PMAP_PVO_CHECK(pvo); /* sanity check */ |
pmap_interrupts_restore(msr); |
pmap_interrupts_restore(msr); |
return TRUE; |
return true; |
} |
} |
} |
} |
} |
} |
pmap_interrupts_restore(msr); |
pmap_interrupts_restore(msr); |
return FALSE; |
return false; |
} |
} |
|
|
boolean_t |
bool |
pmap_clear_bit(struct vm_page *pg, int ptebit) |
pmap_clear_bit(struct vm_page *pg, int ptebit) |
{ |
{ |
struct pvo_head *pvoh = vm_page_to_pvoh(pg); |
struct pvo_head *pvoh = vm_page_to_pvoh(pg); |
Line 2828 pmap_pool_ualloc(struct pool *pp, int fl |
|
Line 2828 pmap_pool_ualloc(struct pool *pp, int fl |
|
SIMPLEQ_REMOVE_HEAD(&pmap_upvop_head, pvop_link); |
SIMPLEQ_REMOVE_HEAD(&pmap_upvop_head, pvop_link); |
return pvop; |
return pvop; |
} |
} |
if (uvm.page_init_done != TRUE) { |
if (uvm.page_init_done != true) { |
return (void *) uvm_pageboot_alloc(PAGE_SIZE); |
return (void *) uvm_pageboot_alloc(PAGE_SIZE); |
} |
} |
return pmap_pool_malloc(pp, flags); |
return pmap_pool_malloc(pp, flags); |
Line 2906 pmap_steal_memory(vsize_t vsize, vaddr_t |
|
Line 2906 pmap_steal_memory(vsize_t vsize, vaddr_t |
|
int npgs, bank; |
int npgs, bank; |
struct vm_physseg *ps; |
struct vm_physseg *ps; |
|
|
if (uvm.page_init_done == TRUE) |
if (uvm.page_init_done == true) |
panic("pmap_steal_memory: called _after_ bootstrap"); |
panic("pmap_steal_memory: called _after_ bootstrap"); |
|
|
*vstartp = VM_MIN_KERNEL_ADDRESS; |
*vstartp = VM_MIN_KERNEL_ADDRESS; |
Line 2951 pmap_steal_memory(vsize_t vsize, vaddr_t |
|
Line 2951 pmap_steal_memory(vsize_t vsize, vaddr_t |
|
} |
} |
|
|
va = (vaddr_t) pa; |
va = (vaddr_t) pa; |
memset((caddr_t) va, 0, size); |
memset((void *) va, 0, size); |
pmap_pages_stolen += npgs; |
pmap_pages_stolen += npgs; |
#ifdef DEBUG |
#ifdef DEBUG |
if (pmapdebug && npgs > 1) { |
if (pmapdebug && npgs > 1) { |