remove dead non-MNN code (one block left)
This commit is contained in:
parent
c2ed19ee97
commit
4e484e0e02
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: pmap.c,v 1.37 1999/01/09 21:10:50 mark Exp $ */
|
/* $NetBSD: pmap.c,v 1.38 1999/01/16 21:03:48 chuck Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994-1998 Mark Brinicombe.
|
* Copyright (c) 1994-1998 Mark Brinicombe.
|
||||||
@ -105,10 +105,6 @@ char *memhook;
|
|||||||
pt_entry_t msgbufpte;
|
pt_entry_t msgbufpte;
|
||||||
extern caddr_t msgbufaddr;
|
extern caddr_t msgbufaddr;
|
||||||
|
|
||||||
#if !defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
u_char *pmap_attributes = NULL;
|
|
||||||
pv_entry_t pv_table = NULL;
|
|
||||||
#endif
|
|
||||||
boolean_t pmap_initialized = FALSE; /* Has pmap_init completed? */
|
boolean_t pmap_initialized = FALSE; /* Has pmap_init completed? */
|
||||||
|
|
||||||
TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist;
|
TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist;
|
||||||
@ -759,7 +755,6 @@ pmap_bootstrap(kernel_l1pt, kernel_ptpt)
|
|||||||
cpu_cache_cleanD();
|
cpu_cache_cleanD();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
/*
|
/*
|
||||||
* void pmap_init(void)
|
* void pmap_init(void)
|
||||||
*
|
*
|
||||||
@ -837,69 +832,6 @@ pmap_init()
|
|||||||
l1pt_reuse_count = 0;
|
l1pt_reuse_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* MACHINE_NEW_NONCONTIG */
|
|
||||||
/*
|
|
||||||
* void pmap_init(void)
|
|
||||||
*
|
|
||||||
* Initialize the pmap module.
|
|
||||||
* Called by vm_init() in vm/vm_init.c in order to initialise
|
|
||||||
* any structures that the pmap system needs to map virtual memory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern int physmem;
|
|
||||||
|
|
||||||
void
|
|
||||||
pmap_init()
|
|
||||||
{
|
|
||||||
vm_size_t s;
|
|
||||||
vm_offset_t addr;
|
|
||||||
|
|
||||||
npages = physmem;
|
|
||||||
printf("Number of pages to handle = %ld\n", npages);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set the available memory vars - These do not map to real memory
|
|
||||||
* addresses and cannot as the physical memory is fragmented.
|
|
||||||
* They are used by ps for %mem calculations.
|
|
||||||
* One could argue whether this should be the entire memory or just
|
|
||||||
* the memory that is useable in a user process.
|
|
||||||
*/
|
|
||||||
|
|
||||||
avail_start = 0;
|
|
||||||
avail_end = physmem * NBPG;
|
|
||||||
|
|
||||||
s = (vm_size_t) (sizeof(struct pv_entry) * npages + npages);
|
|
||||||
s = round_page(s);
|
|
||||||
#if defined(UVM)
|
|
||||||
addr = (vm_offset_t)uvm_km_zalloc(kernel_map, s);
|
|
||||||
#else
|
|
||||||
addr = (vm_offset_t)kmem_alloc(kernel_map, s);
|
|
||||||
#endif
|
|
||||||
#ifdef DIAGNOSTIC
|
|
||||||
if (addr == 0)
|
|
||||||
panic("pmap_init: Cannot allocate memory for pv_table\n");
|
|
||||||
#endif /* DIAGNOSTIC */
|
|
||||||
pv_table = (pv_entry_t) addr;
|
|
||||||
addr += sizeof(struct pv_entry) * npages;
|
|
||||||
pmap_attributes = (char *) addr;
|
|
||||||
bzero(pv_table, s);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Now it is safe to enable pv_entry recording.
|
|
||||||
*/
|
|
||||||
pmap_initialized = TRUE;
|
|
||||||
|
|
||||||
/* Initialise our L1 page table queues and counters */
|
|
||||||
SIMPLEQ_INIT(&l1pt_static_queue);
|
|
||||||
l1pt_static_queue_count = 0;
|
|
||||||
l1pt_static_create_count = 0;
|
|
||||||
SIMPLEQ_INIT(&l1pt_queue);
|
|
||||||
l1pt_queue_count = 0;
|
|
||||||
l1pt_create_count = 0;
|
|
||||||
l1pt_reuse_count = 0;
|
|
||||||
}
|
|
||||||
#endif /* MACHINE_NEW_NONCONTIG */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pmap_postinit()
|
* pmap_postinit()
|
||||||
*
|
*
|
||||||
@ -1514,16 +1446,12 @@ pmap_find_pv(phys)
|
|||||||
struct pv_entry *pv = 0;
|
struct pv_entry *pv = 0;
|
||||||
|
|
||||||
if (pmap_initialized) {
|
if (pmap_initialized) {
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
|
|
||||||
if ((bank = vm_physseg_find(atop(phys), &off)) == -1)
|
if ((bank = vm_physseg_find(atop(phys), &off)) == -1)
|
||||||
panic("pmap_find_pv: not a real page, phys=%lx\n",
|
panic("pmap_find_pv: not a real page, phys=%lx\n",
|
||||||
phys);
|
phys);
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
pv = &pv_table[pmap_page_index(phys)];
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return pv;
|
return pv;
|
||||||
}
|
}
|
||||||
@ -1627,107 +1555,6 @@ pmap_next_phys_page(addr)
|
|||||||
return(addr);
|
return(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
/*
|
|
||||||
* int pmap_next_page(vm_offset_t *addr)
|
|
||||||
*
|
|
||||||
* Allocate another physical page returning true or false depending
|
|
||||||
* on whether a page could be allocated.
|
|
||||||
*
|
|
||||||
* MARK - This needs optimising ... look at the amiga version
|
|
||||||
* but since it is only used during booting, who cares ?
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
pmap_next_page(addr)
|
|
||||||
vm_offset_t *addr;
|
|
||||||
{
|
|
||||||
if (free_pages == 0 || physical_freestart == physical_freeend) {
|
|
||||||
PDEBUG(0, printf("pmap_next_page: Trying to allocate beyond memory\n"));
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
*addr = physical_freestart;
|
|
||||||
--free_pages;
|
|
||||||
|
|
||||||
physical_freestart += NBPG;
|
|
||||||
if (physical_freestart == (bootconfig.dram[physical_memoryblock].address
|
|
||||||
+ bootconfig.dram[physical_memoryblock].pages * NBPG)) {
|
|
||||||
++physical_memoryblock;
|
|
||||||
if (bootconfig.dram[physical_memoryblock].address != 0)
|
|
||||||
physical_freestart = bootconfig.dram[physical_memoryblock].address;
|
|
||||||
}
|
|
||||||
|
|
||||||
PDEBUG(10, printf("pmap_next_page: Allocated physpage %lx\n", *addr));
|
|
||||||
PDEBUG(10, printf("pmap_next_page: Next page is %lx\n",
|
|
||||||
physical_freestart));
|
|
||||||
|
|
||||||
return(TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* unsigned int pmap_free_pages(void)
|
|
||||||
*
|
|
||||||
* Returns the number of free pages the system has.
|
|
||||||
* free_pages is set up during initarm and decremented every time a page
|
|
||||||
* is allocated.
|
|
||||||
*/
|
|
||||||
|
|
||||||
unsigned int
|
|
||||||
pmap_free_pages()
|
|
||||||
{
|
|
||||||
PDEBUG(5, printf("pmap_free_pages: %08x pages free\n", free_pages));
|
|
||||||
return(free_pages);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* int pmap_page_index(vm_offset_t pa)
|
|
||||||
*
|
|
||||||
* returns a linear index to the physical page. This routine has to take
|
|
||||||
* a physical address and work out the corresponding physical page number.
|
|
||||||
* There does not appear to be a simple way of doing this as the memory
|
|
||||||
* is split into a series of blocks. We search each block to determine
|
|
||||||
* which block the physical page is. Once we have scanned the blocks to
|
|
||||||
* this point we can calculate the physical page index.
|
|
||||||
*
|
|
||||||
* XXX This is called frequently can could do with some optimisation
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
pmap_page_index(pa)
|
|
||||||
vm_offset_t pa;
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
int loop;
|
|
||||||
vm_offset_t start, end;
|
|
||||||
|
|
||||||
PDEBUG(5, printf("pmap_page_index(pa=P%lx)", pa));
|
|
||||||
|
|
||||||
index = 0;
|
|
||||||
loop = 0;
|
|
||||||
while (loop < bootconfig.dramblocks) {
|
|
||||||
start = (vm_offset_t)bootconfig.dram[loop].address;
|
|
||||||
end = start + (bootconfig.dram[loop].pages * NBPG);
|
|
||||||
if (pa < end) {
|
|
||||||
if (pa < start)
|
|
||||||
return(-1);
|
|
||||||
index += (pa - start) >> PGSHIFT;
|
|
||||||
PDEBUG(5, printf(" index = %08x\n" ,index));
|
|
||||||
return(index);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
index += bootconfig.dram[loop].pages;
|
|
||||||
}
|
|
||||||
++loop;
|
|
||||||
}
|
|
||||||
|
|
||||||
PDEBUG(1, printf(" page invalid - no index %lx\n", pa));
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
#endif /* !MACHINE_NEW_NONCONTIG */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pmap_remove()
|
* pmap_remove()
|
||||||
*
|
*
|
||||||
@ -1799,11 +1626,7 @@ pmap_remove(pmap, sva, eva)
|
|||||||
|
|
||||||
/* We've found a valid PTE, so this page of PTEs has to go. */
|
/* We've found a valid PTE, so this page of PTEs has to go. */
|
||||||
if (pmap_pte_v(pte)) {
|
if (pmap_pte_v(pte)) {
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
/* Update statistics */
|
/* Update statistics */
|
||||||
pmap->pm_stats.resident_count--;
|
pmap->pm_stats.resident_count--;
|
||||||
|
|
||||||
@ -1857,7 +1680,6 @@ pmap_remove(pmap, sva, eva)
|
|||||||
* we could cluster a lot of these and do a
|
* we could cluster a lot of these and do a
|
||||||
* number of sequential pages in one go.
|
* number of sequential pages in one go.
|
||||||
*/
|
*/
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off))
|
if ((bank = vm_physseg_find(atop(pa), &off))
|
||||||
!= -1) {
|
!= -1) {
|
||||||
int flags;
|
int flags;
|
||||||
@ -1870,18 +1692,6 @@ pmap_remove(pmap, sva, eva)
|
|||||||
pmap->pm_stats.wired_count--;
|
pmap->pm_stats.wired_count--;
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(pa)) != -1) {
|
|
||||||
int flags;
|
|
||||||
|
|
||||||
flags = pmap_remove_pv(pmap, sva,
|
|
||||||
&pv_table[pind]);
|
|
||||||
pmap_attributes[pind]
|
|
||||||
|= flags & (PT_M | PT_H);
|
|
||||||
if (flags & PT_W)
|
|
||||||
pmap->pm_stats.wired_count--;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sva += NBPG;
|
sva += NBPG;
|
||||||
@ -1921,27 +1731,15 @@ pmap_remove_all(pa)
|
|||||||
struct pv_entry *ph, *pv, *npv;
|
struct pv_entry *ph, *pv, *npv;
|
||||||
pmap_t pmap;
|
pmap_t pmap;
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
PDEBUG(0, printf("pmap_remove_all: pa=%lx ", pa));
|
PDEBUG(0, printf("pmap_remove_all: pa=%lx ", pa));
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
bank = vm_physseg_find(atop(pa), &off);
|
bank = vm_physseg_find(atop(pa), &off);
|
||||||
if (bank == -1)
|
if (bank == -1)
|
||||||
return;
|
return;
|
||||||
pv = ph = &vm_physmem[bank].pmseg.pvent[off];
|
pv = ph = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1) {
|
|
||||||
PDEBUG(0, printf("no accounting\n"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pv = ph = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pmap_clean_page(pv);
|
pmap_clean_page(pv);
|
||||||
|
|
||||||
@ -1987,11 +1785,7 @@ reduce wiring count on page table pages as references drop
|
|||||||
* Update saved attributes for managed page
|
* Update saved attributes for managed page
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
vm_physmem[bank].pmseg.attrs[off] |= pv->pv_flags & (PT_M | PT_H);
|
vm_physmem[bank].pmseg.attrs[off] |= pv->pv_flags & (PT_M | PT_H);
|
||||||
#else
|
|
||||||
pmap_attributes[pind] |= pv->pv_flags & (PT_M | PT_H);
|
|
||||||
#endif
|
|
||||||
*pte = 0;
|
*pte = 0;
|
||||||
|
|
||||||
npv = pv->pv_next;
|
npv = pv->pv_next;
|
||||||
@ -2023,11 +1817,7 @@ pmap_protect(pmap, sva, eva, prot)
|
|||||||
int armprot;
|
int armprot;
|
||||||
int flush = 0;
|
int flush = 0;
|
||||||
vm_offset_t pa;
|
vm_offset_t pa;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure pmap is valid. -dct
|
* Make sure pmap is valid. -dct
|
||||||
@ -2086,14 +1876,9 @@ pmap_protect(pmap, sva, eva, prot)
|
|||||||
/* Get the physical page index */
|
/* Get the physical page index */
|
||||||
|
|
||||||
/* Clear write flag */
|
/* Clear write flag */
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
||||||
pmap_modify_pv(pmap, sva,
|
pmap_modify_pv(pmap, sva,
|
||||||
&vm_physmem[bank].pmseg.pvent[off], PT_Wr, 0);
|
&vm_physmem[bank].pmseg.pvent[off], PT_Wr, 0);
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(pa)) != -1)
|
|
||||||
pmap_modify_pv(pmap, sva, &pv_table[pind], PT_Wr, 0);
|
|
||||||
#endif
|
|
||||||
next:
|
next:
|
||||||
sva += NBPG;
|
sva += NBPG;
|
||||||
pte++;
|
pte++;
|
||||||
@ -2251,12 +2036,7 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
{
|
{
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
u_int npte;
|
u_int npte;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind = -2;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
struct pv_entry *pv = NULL;
|
struct pv_entry *pv = NULL;
|
||||||
u_int cacheable = 0;
|
u_int cacheable = 0;
|
||||||
vm_offset_t opa = -1;
|
vm_offset_t opa = -1;
|
||||||
@ -2321,13 +2101,8 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
PDEBUG(0, printf("Case 02 in pmap_enter (V%08lx P%08lx)\n",
|
PDEBUG(0, printf("Case 02 in pmap_enter (V%08lx P%08lx)\n",
|
||||||
va, pa));
|
va, pa));
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(pa)) != -1)
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
cacheable = (*pte) & PT_C;
|
cacheable = (*pte) & PT_C;
|
||||||
|
|
||||||
/* Has the wiring changed ? */
|
/* Has the wiring changed ? */
|
||||||
@ -2351,7 +2126,6 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
* If it is part of our managed memory then we
|
* If it is part of our managed memory then we
|
||||||
* must remove it from the PV list
|
* must remove it from the PV list
|
||||||
*/
|
*/
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(opa), &off)) != -1) {
|
if ((bank = vm_physseg_find(atop(opa), &off)) != -1) {
|
||||||
int flags;
|
int flags;
|
||||||
flags = pmap_remove_pv(pmap, va,
|
flags = pmap_remove_pv(pmap, va,
|
||||||
@ -2360,19 +2134,6 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
--pmap->pm_stats.wired_count;
|
--pmap->pm_stats.wired_count;
|
||||||
vm_physmem[bank].pmseg.attrs[off] |= flags & (PT_M | PT_H);
|
vm_physmem[bank].pmseg.attrs[off] |= flags & (PT_M | PT_H);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(opa)) != -1) {
|
|
||||||
int flags;
|
|
||||||
flags = pmap_remove_pv(pmap, va, &pv_table[pind]);
|
|
||||||
/*
|
|
||||||
* Adjust the wiring count if the page was
|
|
||||||
* wired
|
|
||||||
*/
|
|
||||||
if (flags & PT_W)
|
|
||||||
--pmap->pm_stats.wired_count;
|
|
||||||
pmap_attributes[pind] |= flags & (PT_M | PT_H);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* Update the wiring stats for the new page */
|
/* Update the wiring stats for the new page */
|
||||||
if (wired)
|
if (wired)
|
||||||
++pmap->pm_stats.wired_count;
|
++pmap->pm_stats.wired_count;
|
||||||
@ -2380,13 +2141,8 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
/*
|
/*
|
||||||
* Enter on the PV list if part of our managed memory
|
* Enter on the PV list if part of our managed memory
|
||||||
*/
|
*/
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(pa)) != -1)
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
if (pv) {
|
if (pv) {
|
||||||
if (pmap_enter_pv(pmap, va, pv, 0))
|
if (pmap_enter_pv(pmap, va, pv, 0))
|
||||||
cacheable = PT_C;
|
cacheable = PT_C;
|
||||||
@ -2405,13 +2161,8 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
/*
|
/*
|
||||||
* Enter on the PV list if part of our managed memory
|
* Enter on the PV list if part of our managed memory
|
||||||
*/
|
*/
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) != -1)
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
if ((pind = pmap_page_index(pa)) != -1)
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
if (pv) {
|
if (pv) {
|
||||||
if (pmap_enter_pv(pmap, va, pv, 0))
|
if (pmap_enter_pv(pmap, va, pv, 0))
|
||||||
cacheable = PT_C;
|
cacheable = PT_C;
|
||||||
@ -2423,16 +2174,12 @@ pmap_enter(pmap, va, pa, prot, wired)
|
|||||||
* memory then it must be device memory which
|
* memory then it must be device memory which
|
||||||
* may be volatile.
|
* may be volatile.
|
||||||
*/
|
*/
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if (bank == -1) {
|
if (bank == -1) {
|
||||||
#endif
|
|
||||||
cacheable = 0;
|
cacheable = 0;
|
||||||
PDEBUG(0, printf("pmap_enter: non-managed memory mapping va=%08lx pa=%08lx\n",
|
PDEBUG(0, printf("pmap_enter: non-managed memory mapping va=%08lx pa=%08lx\n",
|
||||||
va, pa));
|
va, pa));
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
} else
|
} else
|
||||||
cacheable = PT_C;
|
cacheable = PT_C;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2541,11 +2288,7 @@ pmap_change_wiring(pmap, va, wired)
|
|||||||
{
|
{
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
vm_offset_t pa;
|
vm_offset_t pa;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
int current;
|
int current;
|
||||||
struct pv_entry *pv;
|
struct pv_entry *pv;
|
||||||
|
|
||||||
@ -2563,16 +2306,9 @@ pmap_change_wiring(pmap, va, wired)
|
|||||||
/* Extract the physical address of the page */
|
/* Extract the physical address of the page */
|
||||||
pa = pmap_pte_pa(pte);
|
pa = pmap_pte_pa(pte);
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
||||||
return;
|
return;
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
/* Get the physical page index */
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1)
|
|
||||||
return;
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
/* Update the wired bit in the pv entry for this page. */
|
/* Update the wired bit in the pv entry for this page. */
|
||||||
current = pmap_modify_pv(pmap, va, pv, PT_W, wired ? PT_W : 0) & PT_W;
|
current = pmap_modify_pv(pmap, va, pv, PT_W, wired ? PT_W : 0) & PT_W;
|
||||||
|
|
||||||
@ -2746,22 +2482,16 @@ pmap_dump_pvlist(phys, m)
|
|||||||
char *m;
|
char *m;
|
||||||
{
|
{
|
||||||
struct pv_entry *pv;
|
struct pv_entry *pv;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!pmap_initialized)
|
if (!pmap_initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(phys), &off)) == -1) {
|
if ((bank = vm_physseg_find(atop(phys), &off)) == -1) {
|
||||||
printf("INVALID PA\n");
|
printf("INVALID PA\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
pv = &pv_table[pmap_page_index(phys)];
|
|
||||||
#endif
|
|
||||||
printf("%s %08lx:", m, phys);
|
printf("%s %08lx:", m, phys);
|
||||||
if (pv->pv_pmap == NULL) {
|
if (pv->pv_pmap == NULL) {
|
||||||
printf(" no mappings\n");
|
printf(" no mappings\n");
|
||||||
@ -2775,32 +2505,6 @@ pmap_dump_pvlist(phys, m)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
void
|
|
||||||
pmap_dump_pvs(multi)
|
|
||||||
int multi;
|
|
||||||
{
|
|
||||||
struct pv_entry *pv;
|
|
||||||
int loop;
|
|
||||||
|
|
||||||
if (!pmap_initialized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
printf("pv dump\n");
|
|
||||||
|
|
||||||
for (loop = 0; loop < npages; ++loop) {
|
|
||||||
pv = &pv_table[loop];
|
|
||||||
if (pv->pv_pmap != NULL && (multi == 0 || pv->pv_next != NULL)) {
|
|
||||||
printf("%4d : ", loop);
|
|
||||||
for (; pv; pv = pv->pv_next) {
|
|
||||||
printf(" pmap %p va %08lx flags %08x",
|
|
||||||
pv->pv_pmap, pv->pv_va, pv->pv_flags);
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* !MACHINE_NEW_NONCONTIG */
|
|
||||||
#endif /* PMAP_DEBUG */
|
#endif /* PMAP_DEBUG */
|
||||||
|
|
||||||
boolean_t
|
boolean_t
|
||||||
@ -2809,41 +2513,22 @@ pmap_testbit(pa, setbits)
|
|||||||
int setbits;
|
int setbits;
|
||||||
{
|
{
|
||||||
struct pv_entry *pv;
|
struct pv_entry *pv;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
PDEBUG(1, printf("pmap_testbit: pa=%08lx set=%08x\n", pa, setbits));
|
PDEBUG(1, printf("pmap_testbit: pa=%08lx set=%08x\n", pa, setbits));
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
if (!pmap_initialized)
|
|
||||||
return(FALSE);
|
|
||||||
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1)
|
|
||||||
return(FALSE);
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
s = splimp();
|
s = splimp();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check saved info first
|
* Check saved info first
|
||||||
*/
|
*/
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if (vm_physmem[bank].pmseg.attrs[off] & setbits) {
|
if (vm_physmem[bank].pmseg.attrs[off] & setbits) {
|
||||||
PDEBUG(0, printf("pmap_attributes = %02x\n",
|
PDEBUG(0, printf("pmap_attributes = %02x\n",
|
||||||
vm_physmem[bank].pmseg.attrs[off]));
|
vm_physmem[bank].pmseg.attrs[off]));
|
||||||
#else
|
|
||||||
if (pmap_attributes[pind] & setbits) {
|
|
||||||
PDEBUG(0, printf("pmap_attributes = %02x\n",
|
|
||||||
pmap_attributes[pind]));
|
|
||||||
#endif
|
|
||||||
(void)splx(s);
|
(void)splx(s);
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
@ -2892,46 +2577,22 @@ pmap_changebit(pa, setbits, maskbits)
|
|||||||
struct pv_entry *pv;
|
struct pv_entry *pv;
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
vm_offset_t va;
|
vm_offset_t va;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
PDEBUG(1, printf("pmap_changebit: pa=%08lx set=%08x mask=%08x\n",
|
PDEBUG(1, printf("pmap_changebit: pa=%08lx set=%08x mask=%08x\n",
|
||||||
pa, setbits, maskbits));
|
pa, setbits, maskbits));
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
||||||
return;
|
return;
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
if (!pmap_initialized)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1)
|
|
||||||
return;
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
s = splimp();
|
s = splimp();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clear saved attributes (modify, reference)
|
* Clear saved attributes (modify, reference)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
#ifdef PMAP_DEBUG
|
|
||||||
if (pmap_debug_level >= 0 && pmap_attributes[pind])
|
|
||||||
printf("pmap_attributes = %02x\n", pmap_attributes[pind]);
|
|
||||||
#endif /* PMAP_DEBUG */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (~maskbits)
|
if (~maskbits)
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
vm_physmem[bank].pmseg.attrs[off] &= maskbits;
|
vm_physmem[bank].pmseg.attrs[off] &= maskbits;
|
||||||
#else
|
|
||||||
pmap_attributes[pind] &= maskbits;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Loop over all current mappings setting/clearing as appropos
|
* Loop over all current mappings setting/clearing as appropos
|
||||||
@ -3029,11 +2690,7 @@ pmap_modified_emulation(pmap, va)
|
|||||||
{
|
{
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
vm_offset_t pa;
|
vm_offset_t pa;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
struct pv_entry *pv;
|
struct pv_entry *pv;
|
||||||
u_int flags;
|
u_int flags;
|
||||||
|
|
||||||
@ -3044,16 +2701,9 @@ pmap_modified_emulation(pmap, va)
|
|||||||
|
|
||||||
/* Extract the physical address of the page */
|
/* Extract the physical address of the page */
|
||||||
pa = pmap_pte_pa(pte);
|
pa = pmap_pte_pa(pte);
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
||||||
return(0);
|
return(0);
|
||||||
pv = &vm_physmem[bank].pmseg.pvent[off];
|
pv = &vm_physmem[bank].pmseg.pvent[off];
|
||||||
#else
|
|
||||||
/* Get the physical page index */
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1)
|
|
||||||
return(0);
|
|
||||||
pv = &pv_table[pind];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Get the current flags for this page. */
|
/* Get the current flags for this page. */
|
||||||
flags = pmap_modify_pv(pmap, va, pv, 0, 0);
|
flags = pmap_modify_pv(pmap, va, pv, 0, 0);
|
||||||
@ -3077,12 +2727,7 @@ pmap_modified_emulation(pmap, va)
|
|||||||
|
|
||||||
/* pmap_modify_pv(pmap, va, pv, PT_M, PT_M);*/
|
/* pmap_modify_pv(pmap, va, pv, PT_M, PT_M);*/
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
vm_physmem[bank].pmseg.attrs[off] |= PT_M;
|
vm_physmem[bank].pmseg.attrs[off] |= PT_M;
|
||||||
#else
|
|
||||||
if (pmap_attributes)
|
|
||||||
pmap_attributes[pind] |= PT_M;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Return, indicating the problem has been dealt with */
|
/* Return, indicating the problem has been dealt with */
|
||||||
return(1);
|
return(1);
|
||||||
@ -3096,11 +2741,7 @@ pmap_handled_emulation(pmap, va)
|
|||||||
{
|
{
|
||||||
pt_entry_t *pte;
|
pt_entry_t *pte;
|
||||||
vm_offset_t pa;
|
vm_offset_t pa;
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int bank, off;
|
int bank, off;
|
||||||
#else
|
|
||||||
int pind;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
PDEBUG(2, printf("pmap_handled_emulation\n"));
|
PDEBUG(2, printf("pmap_handled_emulation\n"));
|
||||||
|
|
||||||
@ -3128,14 +2769,8 @@ pmap_handled_emulation(pmap, va)
|
|||||||
/* Extract the physical address of the page */
|
/* Extract the physical address of the page */
|
||||||
pa = pmap_pte_pa(pte);
|
pa = pmap_pte_pa(pte);
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
if ((bank = vm_physseg_find(atop(pa), &off)) == -1)
|
||||||
return(0);
|
return(0);
|
||||||
#else
|
|
||||||
/* Get the physical page index */
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1)
|
|
||||||
return(0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ok we just enable the pte and mark the attibs as handled
|
* Ok we just enable the pte and mark the attibs as handled
|
||||||
@ -3147,40 +2782,12 @@ pmap_handled_emulation(pmap, va)
|
|||||||
|
|
||||||
cpu_tlb_flushID_SE(va);
|
cpu_tlb_flushID_SE(va);
|
||||||
|
|
||||||
#if defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
vm_physmem[bank].pmseg.attrs[off] |= PT_H;
|
vm_physmem[bank].pmseg.attrs[off] |= PT_H;
|
||||||
#else
|
|
||||||
if (pmap_attributes)
|
|
||||||
pmap_attributes[pind] |= PT_H;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Return, indicating the problem has been dealt with */
|
/* Return, indicating the problem has been dealt with */
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !defined(MACHINE_NEW_NONCONTIG)
|
|
||||||
int
|
|
||||||
pmap_page_attributes(va)
|
|
||||||
vm_offset_t va;
|
|
||||||
{
|
|
||||||
vm_offset_t pa;
|
|
||||||
int pind;
|
|
||||||
|
|
||||||
/* Get the physical page */
|
|
||||||
pa = (vm_offset_t)vtopte(va);
|
|
||||||
|
|
||||||
/* Get the physical page index */
|
|
||||||
if ((pind = pmap_page_index(pa)) == -1)
|
|
||||||
return(-1);
|
|
||||||
|
|
||||||
if (pmap_attributes)
|
|
||||||
return((int)pmap_attributes[pind]);
|
|
||||||
|
|
||||||
return(-1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pmap_collect: free resources held by a pmap
|
* pmap_collect: free resources held by a pmap
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user