Module Name: src
Committed By: thorpej
Date: Wed Aug 26 00:30:03 UTC 2009
Modified Files:
src/sys/arch/amiga/amiga: pmap.c
src/sys/arch/amiga/include: vmparam.h
src/sys/arch/atari/atari: pmap.c
src/sys/arch/atari/include: vmparam.h
src/sys/arch/cesfic/include: vmparam.h
src/sys/arch/hp300/include: vmparam.h
src/sys/arch/luna68k/include: vmparam.h
src/sys/arch/m68k/include: pmap_motorola.h
src/sys/arch/m68k/m68k: pmap_motorola.c
src/sys/arch/mac68k/include: vmparam.h
src/sys/arch/mvme68k/include: vmparam.h
src/sys/arch/news68k/include: vmparam.h
src/sys/arch/next68k/include: vmparam.h
src/sys/arch/x68k/include: vmparam.h
Log Message:
Minor tweak to the pv_table management in the Hibler-derived m68k pmaps:
The head of the list is now a pv_header, which contains the first pv_entry
as well as a 16-bit attributes field (replaces the pmap_attributes array
plus the pv_entry::pv_flags field) as a 16-bit count of caller-specified
cache-inhibited mappings.
Tested on hp300 (shared pmap_motorola.c), changes to atari and amiga copies
are purely mechanical.
To generate a diff of this commit:
cvs rdiff -u -r1.153 -r1.154 src/sys/arch/amiga/amiga/pmap.c
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/amiga/include/vmparam.h
cvs rdiff -u -r1.119 -r1.120 src/sys/arch/atari/atari/pmap.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/atari/include/vmparam.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/cesfic/include/vmparam.h
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/hp300/include/vmparam.h
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/luna68k/include/vmparam.h
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/m68k/include/pmap_motorola.h
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/m68k/m68k/pmap_motorola.c
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/mac68k/include/vmparam.h
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/mvme68k/include/vmparam.h
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/news68k/include/vmparam.h
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/next68k/include/vmparam.h
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/x68k/include/vmparam.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amiga/amiga/pmap.c
diff -u src/sys/arch/amiga/amiga/pmap.c:1.153 src/sys/arch/amiga/amiga/pmap.c:1.154
--- src/sys/arch/amiga/amiga/pmap.c:1.153 Tue Aug 18 18:06:53 2009
+++ src/sys/arch/amiga/amiga/pmap.c Wed Aug 26 00:30:01 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.153 2009/08/18 18:06:53 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.154 2009/08/26 00:30:01 thorpej Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -100,7 +100,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.153 2009/08/18 18:06:53 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.154 2009/08/26 00:30:01 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -273,7 +273,19 @@
st_entry_t *Segtabzero, *Segtabzeropa;
vsize_t Sysptsize = VM_KERNEL_PT_PAGES;
-struct pv_entry *pv_table; /* array of entries, one per page */
+struct pv_header {
+ struct pv_entry pvh_first; /* first PV entry */
+ uint16_t pvh_attrs; /* attributes:
+ bits 0-7: PTE bits
+ bits 8-15: flags */
+ uint16_t pvh_cimappings; /* # caller-specified CI
+ mappings */
+};
+
+#define PVH_CI 0x10 /* all entries are cache-inhibited */
+#define PVH_PTPAGE 0x20 /* entry maps a page table page */
+
+struct pv_header *pv_table; /* array of entries, one per page */
static struct pmap kernel_pmap_store;
struct pmap *const kernel_pmap_ptr = &kernel_pmap_store;
@@ -287,7 +299,6 @@
vaddr_t virtual_end; /* VA of last avail page (end of kernel AS) */
int page_cnt; /* number of pages managed by the VM system */
bool pmap_initialized = false; /* Has pmap_init completed? */
-char *pmap_attributes; /* reference and modify bits */
TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist;
int pv_nfree;
#if defined(M68040) || defined(M68060)
@@ -323,25 +334,13 @@
#define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa))
-static inline struct pv_entry *pa_to_pvh(paddr_t pa);
-static inline char *pa_to_attribute(paddr_t pa);
-
-static inline struct pv_entry *
+static inline struct pv_header *
pa_to_pvh(paddr_t pa)
{
int bank, pg = 0; /* XXX gcc4 -Wuninitialized */
bank = vm_physseg_find(atop((pa)), &pg);
- return &vm_physmem[bank].pmseg.pvent[pg];
-}
-
-static inline char *
-pa_to_attribute(paddr_t pa)
-{
- int bank, pg = 0; /* XXX gcc4 -Wuninitialized */
-
- bank = vm_physseg_find(atop((pa)), &pg);
- return &vm_physmem[bank].pmseg.attrs[pg];
+ return &vm_physmem[bank].pmseg.pvheader[pg];
}
/*
@@ -355,8 +354,7 @@
vaddr_t addr, addr2;
vsize_t s;
u_int npg;
- struct pv_entry *pv;
- char *attr;
+ struct pv_header *pvh;
int rv, bank;
#if defined(M68060)
struct kpt_page *kptp;
@@ -397,8 +395,7 @@
#endif
}
s = M68K_STSIZE; /* Segtabzero */
- s += page_cnt * sizeof(struct pv_entry); /* pv table */
- s += page_cnt * sizeof(char); /* attribute table */
+ s += page_cnt * sizeof(struct pv_header); /* pv table */
s = round_page(s);
addr = uvm_km_alloc(kernel_map, s, 0, UVM_KMF_WIRED | UVM_KMF_ZERO);
@@ -408,30 +405,26 @@
(void) pmap_extract(pmap_kernel(), addr, (paddr_t *)(void *)&Segtabzeropa);
addr += M68K_STSIZE;
- pv_table = (struct pv_entry *) addr;
- addr += page_cnt * sizeof(struct pv_entry);
+ pv_table = (struct pv_header *) addr;
+ addr += page_cnt * sizeof(struct pv_header);
- pmap_attributes = (char *) addr;
#ifdef DEBUG
if (pmapdebug & PDB_INIT)
printf("pmap_init: %lx bytes: page_cnt %x s0 %p(%p) "
- "tbl %p atr %p\n",
+ "tbl %p\n",
s, page_cnt, Segtabzero, Segtabzeropa,
- pv_table, pmap_attributes);
+ pv_table);
#endif
/*
* Now that the pv and attribute tables have been allocated,
* assign them to the memory segments.
*/
- pv = pv_table;
- attr = pmap_attributes;
+ pvh = pv_table;
for (bank = 0; bank < vm_nphysseg; bank++) {
npg = vm_physmem[bank].end - vm_physmem[bank].start;
- vm_physmem[bank].pmseg.pvent = pv;
- vm_physmem[bank].pmseg.attrs = attr;
- pv += npg;
- attr += npg;
+ vm_physmem[bank].pmseg.pvheader = pvh;
+ pvh += npg;
}
/*
@@ -796,6 +789,7 @@
void
pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
int s;
paddr_t pa = VM_PAGE_TO_PHYS(pg);
@@ -815,7 +809,8 @@
break;
/* remove_all */
default:
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
while (pv->pv_pmap != NULL) {
pt_entry_t *pte;
@@ -1030,13 +1025,15 @@
* since pmap_enter can be called at interrupt time.
*/
if (PAGE_IS_MANAGED(pa)) {
+ struct pv_header *pvh;
struct pv_entry *pv, *npv;
int s;
#ifdef DEBUG
enter_stats.managed++;
#endif
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
#ifdef DEBUG
if (pmapdebug & PDB_ENTER)
@@ -1055,7 +1052,6 @@
pv->pv_next = NULL;
pv->pv_ptste = NULL;
pv->pv_ptpmap = NULL;
- pv->pv_flags = 0;
}
/*
* There is at least one other VA mapping this page.
@@ -1278,10 +1274,12 @@
while (sva < nssva) {
if (pmap_pte_v(pte)) {
#ifdef DEBUG
+ struct pv_header *pvh;
struct pv_entry *pv;
int s;
- pv = pa_to_pvh(pmap_pte_pa(pte));
+ pvh = pa_to_pvh(pmap_pte_pa(pte));
+ pv = &pvh->pvh_first;
s = splvm();
while (pv->pv_pmap != NULL) {
KASSERT(pv->pv_pmap != pmap_kernel() ||
@@ -1472,6 +1470,7 @@
pmap_collect1(pmap_t pmap, paddr_t startpa, paddr_t endpa)
{
paddr_t pa;
+ struct pv_header *pvh;
struct pv_entry *pv;
pt_entry_t *pte;
paddr_t kpa;
@@ -1487,8 +1486,10 @@
* Locate physical pages which are being used as kernel
* page table pages.
*/
- pv = pa_to_pvh(pa);
- if (pv->pv_pmap != pmap_kernel() || !(pv->pv_flags & PV_PTPAGE))
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
+ if (pv->pv_pmap != pmap_kernel() ||
+ !(pvh->pvh_attrs & PVH_PTPAGE))
continue;
do {
if (pv->pv_ptste && pv->pv_ptpmap == pmap_kernel())
@@ -1812,6 +1813,7 @@
pmap_remove_mapping(pmap_t pmap, vaddr_t va, pt_entry_t *pte, int flags)
{
paddr_t pa;
+ struct pv_header *pvh;
struct pv_entry *pv, *npv;
pmap_t ptpmap;
st_entry_t *ste;
@@ -1878,6 +1880,7 @@
*/
if (refs == 0 && (flags & PRM_KEEPPTPAGE) == 0) {
#ifdef DIAGNOSTIC
+ struct pv_header *_pvh;
struct pv_entry *_pv;
#endif
paddr_t _pa;
@@ -1886,7 +1889,8 @@
#ifdef DIAGNOSTIC
if (PAGE_IS_MANAGED(_pa) == 0)
panic("pmap_remove_mapping: unmanaged PT page");
- _pv = pa_to_pvh(_pa);
+ _pvh = pa_to_pvh(_pa);
+ _pv = &_pvh->pvh_first;
if (_pv->pv_ptste == NULL)
panic("pmap_remove_mapping: ptste == NULL");
if (_pv->pv_pmap != pmap_kernel() ||
@@ -1918,7 +1922,8 @@
* Otherwise remove it from the PV table
* (raise IPL since we may be called at interrupt time).
*/
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
ste = ST_ENTRY_NULL;
s = splvm();
/*
@@ -1932,7 +1937,6 @@
ptpmap = pv->pv_ptpmap;
npv = pv->pv_next;
if (npv) {
- npv->pv_flags = pv->pv_flags;
*pv = *npv;
pmap_free_pv(npv);
} else
@@ -1957,7 +1961,8 @@
ptpmap = npv->pv_ptpmap;
pv->pv_next = npv->pv_next;
pmap_free_pv(npv);
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
}
/*
@@ -2040,13 +2045,13 @@
else
TBIAU();
#endif
- pv->pv_flags &= ~PV_PTPAGE;
+ pvh->pvh_attrs &= ~PVH_PTPAGE;
ptpmap->pm_ptpages--;
}
/*
* Update saved attributes for managed page
*/
- *pa_to_attribute(pa) |= bits;
+ pvh->pvh_attrs |= bits;
splx(s);
}
@@ -2088,18 +2093,20 @@
bool
pmap_testbit(paddr_t pa, int bit)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
int *pte;
int s;
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
/*
* Check saved info first
*/
- if (*pa_to_attribute(pa) & bit) {
+ if (pvh->pvh_attrs & bit) {
splx(s);
return(true);
}
@@ -2125,6 +2132,7 @@
static void
pmap_changebit(paddr_t pa, int bit, bool setem)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
int *pte, npte;
vaddr_t va;
@@ -2139,7 +2147,8 @@
pa, bit, setem ? "set" : "clear");
#endif
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
/*
@@ -2147,7 +2156,7 @@
*/
if (!setem)
- *pa_to_attribute(pa) &= ~bit;
+ pvh->pvh_attrs &= ~bit;
/*
* Loop over all current mappings setting/clearing as appropos
@@ -2195,6 +2204,7 @@
{
paddr_t ptpa;
struct vm_page *pg;
+ struct pv_header *pvh;
struct pv_entry *pv;
#ifdef M68060
u_int stpa;
@@ -2398,14 +2408,17 @@
* record the STE address. This is so that we can invalidate
* the STE when we remove the mapping for the page.
*/
- pv = pa_to_pvh(ptpa);
+ pvh = pa_to_pvh(ptpa);
s = splvm();
- if (pv) {
- pv->pv_flags |= PV_PTPAGE;
+ if (pvh) {
+ pv = &pvh->pvh_first;
+ pvh->pvh_attrs |= PVH_PTPAGE;
do {
if (pv->pv_pmap == pmap_kernel() && pv->pv_va == va)
break;
} while ((pv = pv->pv_next) > 0);
+ } else {
+ pv = NULL;
}
#ifdef DEBUG
if (pv == NULL) {
@@ -2464,13 +2477,13 @@
void
pmap_pvdump(paddr_t pa)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
printf("pa %lx", pa);
- for (pv = pa_to_pvh(pa); pv; pv = pv->pv_next)
- printf(" -> pmap %p, va %lx, ptste %p, ptpmap %p, flags %x",
- pv->pv_pmap, pv->pv_va, pv->pv_ptste, pv->pv_ptpmap,
- pv->pv_flags);
+ for (pvh = pa_to_pvh(pa), pv = &pvh->pvh_first; pv; pv = pv->pv_next)
+ printf(" -> pmap %p, va %lx, ptste %p, ptpmap %p",
+ pv->pv_pmap, pv->pv_va, pv->pv_ptste, pv->pv_ptpmap);
printf("\n");
}
Index: src/sys/arch/amiga/include/vmparam.h
diff -u src/sys/arch/amiga/include/vmparam.h:1.37 src/sys/arch/amiga/include/vmparam.h:1.38
--- src/sys/arch/amiga/include/vmparam.h:1.37 Fri Mar 6 20:31:47 2009
+++ src/sys/arch/amiga/include/vmparam.h Wed Aug 26 00:30:01 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.37 2009/03/06 20:31:47 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.38 2009/08/26 00:30:01 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
@@ -178,8 +178,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
/*
Index: src/sys/arch/atari/atari/pmap.c
diff -u src/sys/arch/atari/atari/pmap.c:1.119 src/sys/arch/atari/atari/pmap.c:1.120
--- src/sys/arch/atari/atari/pmap.c:1.119 Tue Aug 18 18:06:53 2009
+++ src/sys/arch/atari/atari/pmap.c Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.119 2009/08/18 18:06:53 thorpej Exp $ */
+/* $NetBSD: pmap.c,v 1.120 2009/08/26 00:30:02 thorpej Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -100,7 +100,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.119 2009/08/18 18:06:53 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.120 2009/08/26 00:30:02 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -272,7 +272,19 @@
st_entry_t *Segtabzero, *Segtabzeropa;
vsize_t Sysptsize = VM_KERNEL_PT_PAGES;
-struct pv_entry *pv_table; /* array of entries, one per page */
+struct pv_header {
+ struct pv_entry pvh_first; /* first PV entry */
+ uint16_t pvh_attrs; /* attributes:
+ bits 0-7: PTE bits
+ bits 8-15: flags */
+ uint16_t pvh_cimappings; /* # caller-specified CI
+ mappings */
+};
+
+#define PVH_CI 0x10 /* all entries are cache-inhibited */
+#define PVH_PTPAGE 0x20 /* entry maps a page table page */
+
+struct pv_header *pv_table; /* array of entries, one per page */
static struct pmap kernel_pmap_store;
struct pmap *const kernel_pmap_ptr = &kernel_pmap_store;
@@ -286,7 +298,6 @@
vaddr_t virtual_end; /* VA of last avail page (end of kernel AS) */
int page_cnt; /* number of pages managed by the VM system */
bool pmap_initialized = false; /* Has pmap_init completed? */
-char *pmap_attributes; /* reference and modify bits */
TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist;
int pv_nfree;
#if defined(M68040) || defined(M68060)
@@ -318,25 +329,13 @@
#define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa))
-static inline struct pv_entry *pa_to_pvh(paddr_t pa);
-static inline char *pa_to_attribute(paddr_t pa);
-
-static inline struct pv_entry *
+static inline struct pv_header *
pa_to_pvh(paddr_t pa)
{
int bank, pg = 0; /* XXX gcc4 -Wuninitialized */
bank = vm_physseg_find(atop((pa)), &pg);
- return &vm_physmem[bank].pmseg.pvent[pg];
-}
-
-static inline char *
-pa_to_attribute(paddr_t pa)
-{
- int bank, pg = 0; /* XXX gcc4 -Wuninitialized */
-
- bank = vm_physseg_find(atop((pa)), &pg);
- return &vm_physmem[bank].pmseg.attrs[pg];
+ return &vm_physmem[bank].pmseg.pvheader[pg];
}
/*
@@ -350,8 +349,7 @@
vaddr_t addr, addr2;
vsize_t s;
u_int npg;
- struct pv_entry *pv;
- char *attr;
+ struct pv_header *pvh;
int rv, bank;
#if defined(M68060)
struct kpt_page *kptp;
@@ -392,8 +390,7 @@
#endif
}
s = M68K_STSIZE; /* Segtabzero */
- s += page_cnt * sizeof(struct pv_entry); /* pv table */
- s += page_cnt * sizeof(char); /* attribute table */
+ s += page_cnt * sizeof(struct pv_header); /* pv table */
s = round_page(s);
addr = uvm_km_alloc(kernel_map, s, 0, UVM_KMF_WIRED | UVM_KMF_ZERO);
@@ -403,30 +400,26 @@
(void) pmap_extract(pmap_kernel(), addr, (paddr_t *)(void *)&Segtabzeropa);
addr += M68K_STSIZE;
- pv_table = (struct pv_entry *) addr;
- addr += page_cnt * sizeof(struct pv_entry);
+ pv_table = (struct pv_header *) addr;
+ addr += page_cnt * sizeof(struct pv_header);
- pmap_attributes = (char *) addr;
#ifdef DEBUG
if (pmapdebug & PDB_INIT)
printf("pmap_init: %lx bytes: page_cnt %x s0 %p(%p) "
- "tbl %p atr %p\n",
+ "tbl %p\n",
s, page_cnt, Segtabzero, Segtabzeropa,
- pv_table, pmap_attributes);
+ pv_table);
#endif
/*
* Now that the pv and attribute tables have been allocated,
* assign them to the memory segments.
*/
- pv = pv_table;
- attr = pmap_attributes;
+ pvh = pv_table;
for (bank = 0; bank < vm_nphysseg; bank++) {
npg = vm_physmem[bank].end - vm_physmem[bank].start;
- vm_physmem[bank].pmseg.pvent = pv;
- vm_physmem[bank].pmseg.attrs = attr;
- pv += npg;
- attr += npg;
+ vm_physmem[bank].pmseg.pvheader = pvh;
+ pvh += npg;
}
/*
@@ -791,6 +784,7 @@
void
pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
int s;
paddr_t pa = VM_PAGE_TO_PHYS(pg);
@@ -810,7 +804,8 @@
break;
/* remove_all */
default:
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
while (pv->pv_pmap != NULL) {
pt_entry_t *pte;
@@ -1025,13 +1020,15 @@
* since pmap_enter can be called at interrupt time.
*/
if (PAGE_IS_MANAGED(pa)) {
+ struct pv_header *pvh;
struct pv_entry *pv, *npv;
int s;
#ifdef DEBUG
enter_stats.managed++;
#endif
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
#ifdef DEBUG
if (pmapdebug & PDB_ENTER)
@@ -1050,7 +1047,6 @@
pv->pv_next = NULL;
pv->pv_ptste = NULL;
pv->pv_ptpmap = NULL;
- pv->pv_flags = 0;
}
/*
* There is at least one other VA mapping this page.
@@ -1273,10 +1269,12 @@
while (sva < nssva) {
if (pmap_pte_v(pte)) {
#ifdef DEBUG
+ struct pv_header *pvh;
struct pv_entry *pv;
int s;
- pv = pa_to_pvh(pmap_pte_pa(pte));
+ pvh = pa_to_pvh(pmap_pte_pa(pte));
+ pv = &pvh->pvh_first;
s = splvm();
while (pv->pv_pmap != NULL) {
KASSERT(pv->pv_pmap != pmap_kernel() ||
@@ -1467,6 +1465,7 @@
pmap_collect1(pmap_t pmap, paddr_t startpa, paddr_t endpa)
{
paddr_t pa;
+ struct pv_header *pvh;
struct pv_entry *pv;
pt_entry_t *pte;
paddr_t kpa;
@@ -1482,8 +1481,10 @@
* Locate physical pages which are being used as kernel
* page table pages.
*/
- pv = pa_to_pvh(pa);
- if (pv->pv_pmap != pmap_kernel() || !(pv->pv_flags & PV_PTPAGE))
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
+ if (pv->pv_pmap != pmap_kernel() ||
+ !(pvh->pvh_attrs & PVH_PTPAGE))
continue;
do {
if (pv->pv_ptste && pv->pv_ptpmap == pmap_kernel())
@@ -1807,6 +1808,7 @@
pmap_remove_mapping(pmap_t pmap, vaddr_t va, pt_entry_t *pte, int flags)
{
paddr_t pa;
+ struct pv_header *pvh;
struct pv_entry *pv, *npv;
pmap_t ptpmap;
st_entry_t *ste;
@@ -1873,6 +1875,7 @@
*/
if (refs == 0 && (flags & PRM_KEEPPTPAGE) == 0) {
#ifdef DIAGNOSTIC
+ struct pv_header *_pvh;
struct pv_entry *_pv;
#endif
paddr_t _pa;
@@ -1881,7 +1884,8 @@
#ifdef DIAGNOSTIC
if (PAGE_IS_MANAGED(_pa) == 0)
panic("pmap_remove_mapping: unmanaged PT page");
- _pv = pa_to_pvh(_pa);
+ _pvh = pa_to_pvh(_pa);
+ _pv = &_pvh->pvh_first;
if (_pv->pv_ptste == NULL)
panic("pmap_remove_mapping: ptste == NULL");
if (_pv->pv_pmap != pmap_kernel() ||
@@ -1913,7 +1917,8 @@
* Otherwise remove it from the PV table
* (raise IPL since we may be called at interrupt time).
*/
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
ste = ST_ENTRY_NULL;
s = splvm();
/*
@@ -1927,7 +1932,6 @@
ptpmap = pv->pv_ptpmap;
npv = pv->pv_next;
if (npv) {
- npv->pv_flags = pv->pv_flags;
*pv = *npv;
pmap_free_pv(npv);
} else
@@ -1952,7 +1956,8 @@
ptpmap = npv->pv_ptpmap;
pv->pv_next = npv->pv_next;
pmap_free_pv(npv);
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
}
/*
@@ -2035,13 +2040,13 @@
else
TBIAU();
#endif
- pv->pv_flags &= ~PV_PTPAGE;
+ pvh->pvh_attrs &= ~PVH_PTPAGE;
ptpmap->pm_ptpages--;
}
/*
* Update saved attributes for managed page
*/
- *pa_to_attribute(pa) |= bits;
+ pvh->pvh_attrs |= bits;
splx(s);
}
@@ -2083,18 +2088,20 @@
bool
pmap_testbit(paddr_t pa, int bit)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
int *pte;
int s;
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
/*
* Check saved info first
*/
- if (*pa_to_attribute(pa) & bit) {
+ if (pvh->pvh_attrs & bit) {
splx(s);
return(true);
}
@@ -2120,6 +2127,7 @@
static void
pmap_changebit(paddr_t pa, int bit, bool setem)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
int *pte, npte;
vaddr_t va;
@@ -2134,7 +2142,8 @@
pa, bit, setem ? "set" : "clear");
#endif
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
/*
@@ -2142,7 +2151,7 @@
*/
if (!setem)
- *pa_to_attribute(pa) &= ~bit;
+ pvh->pvh_attrs &= ~bit;
/*
* Loop over all current mappings setting/clearing as appropos
@@ -2190,6 +2199,7 @@
{
paddr_t ptpa;
struct vm_page *pg;
+ struct pv_header *pvh;
struct pv_entry *pv;
#ifdef M68060
u_int stpa;
@@ -2393,14 +2403,17 @@
* record the STE address. This is so that we can invalidate
* the STE when we remove the mapping for the page.
*/
- pv = pa_to_pvh(ptpa);
+ pvh = pa_to_pvh(ptpa);
s = splvm();
- if (pv) {
- pv->pv_flags |= PV_PTPAGE;
+ if (pvh) {
+ pv = &pvh->pvh_first;
+ pvh->pvh_attrs |= PVH_PTPAGE;
do {
if (pv->pv_pmap == pmap_kernel() && pv->pv_va == va)
break;
} while ((pv = pv->pv_next) > 0);
+ } else {
+ pv = NULL;
}
#ifdef DEBUG
if (pv == NULL) {
@@ -2459,10 +2472,11 @@
void
pmap_pvdump(paddr_t pa)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
printf("pa %lx", pa);
- for (pv = pa_to_pvh(pa); pv; pv = pv->pv_next)
+ for (pvh = pa_to_pvh(pa), pv = &pvh->pvh_first; pv; pv = pv->pv_next)
printf(" -> pmap %p, va %lx, ptste %p, ptpmap %p, flags %x",
pv->pv_pmap, pv->pv_va, pv->pv_ptste, pv->pv_ptpmap,
pv->pv_flags);
Index: src/sys/arch/atari/include/vmparam.h
diff -u src/sys/arch/atari/include/vmparam.h:1.24 src/sys/arch/atari/include/vmparam.h:1.25
--- src/sys/arch/atari/include/vmparam.h:1.24 Fri Mar 13 19:08:20 2009
+++ src/sys/arch/atari/include/vmparam.h Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.24 2009/03/13 19:08:20 abs Exp $ */
+/* $NetBSD: vmparam.h,v 1.25 2009/08/26 00:30:02 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
@@ -169,8 +169,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
Index: src/sys/arch/cesfic/include/vmparam.h
diff -u src/sys/arch/cesfic/include/vmparam.h:1.10 src/sys/arch/cesfic/include/vmparam.h:1.11
--- src/sys/arch/cesfic/include/vmparam.h:1.10 Fri Mar 6 20:31:47 2009
+++ src/sys/arch/cesfic/include/vmparam.h Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.10 2009/03/06 20:31:47 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.11 2009/08/26 00:30:02 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -188,8 +188,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _MACHINE_VMPARAM_H_ */
Index: src/sys/arch/hp300/include/vmparam.h
diff -u src/sys/arch/hp300/include/vmparam.h:1.33 src/sys/arch/hp300/include/vmparam.h:1.34
--- src/sys/arch/hp300/include/vmparam.h:1.33 Fri Mar 6 20:31:49 2009
+++ src/sys/arch/hp300/include/vmparam.h Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.33 2009/03/06 20:31:49 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.34 2009/08/26 00:30:02 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -182,8 +182,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _HP300_VMPARAM_H_ */
Index: src/sys/arch/luna68k/include/vmparam.h
diff -u src/sys/arch/luna68k/include/vmparam.h:1.12 src/sys/arch/luna68k/include/vmparam.h:1.13
--- src/sys/arch/luna68k/include/vmparam.h:1.12 Fri Mar 6 20:31:49 2009
+++ src/sys/arch/luna68k/include/vmparam.h Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.12 2009/03/06 20:31:49 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.13 2009/08/26 00:30:02 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -162,8 +162,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _MACHINE_VMPARAM_H_ */
Index: src/sys/arch/m68k/include/pmap_motorola.h
diff -u src/sys/arch/m68k/include/pmap_motorola.h:1.20 src/sys/arch/m68k/include/pmap_motorola.h:1.21
--- src/sys/arch/m68k/include/pmap_motorola.h:1.20 Sat Jan 17 07:17:36 2009
+++ src/sys/arch/m68k/include/pmap_motorola.h Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_motorola.h,v 1.20 2009/01/17 07:17:36 tsutsui Exp $ */
+/* $NetBSD: pmap_motorola.h,v 1.21 2009/08/26 00:30:02 thorpej Exp $ */
/*
* Copyright (c) 1991, 1993
@@ -136,12 +136,8 @@
vaddr_t pv_va; /* virtual address for mapping */
st_entry_t *pv_ptste; /* non-zero if VA maps a PT page */
struct pmap *pv_ptpmap; /* if pv_ptste, pmap for PT page */
- int pv_flags; /* flags */
};
-#define PV_CI 0x01 /* header: all entries are cache inhibited */
-#define PV_PTPAGE 0x02 /* header: entry maps a page table page */
-
struct pv_page;
struct pv_page_info {
@@ -171,7 +167,7 @@
(curproc && \
(pm) != pmap_kernel() && (pm) == curproc->p_vmspace->vm_map.pmap)
-extern struct pv_entry *pv_table; /* array of entries, one per page */
+extern struct pv_header *pv_table; /* array of entries, one per page */
#define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
#define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count)
Index: src/sys/arch/m68k/m68k/pmap_motorola.c
diff -u src/sys/arch/m68k/m68k/pmap_motorola.c:1.45 src/sys/arch/m68k/m68k/pmap_motorola.c:1.46
--- src/sys/arch/m68k/m68k/pmap_motorola.c:1.45 Tue Aug 18 18:06:53 2009
+++ src/sys/arch/m68k/m68k/pmap_motorola.c Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_motorola.c,v 1.45 2009/08/18 18:06:53 thorpej Exp $ */
+/* $NetBSD: pmap_motorola.c,v 1.46 2009/08/26 00:30:02 thorpej Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -117,7 +117,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.45 2009/08/18 18:06:53 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.46 2009/08/26 00:30:02 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -249,8 +249,20 @@
int page_cnt; /* number of pages managed by VM system */
bool pmap_initialized = false; /* Has pmap_init completed? */
-struct pv_entry *pv_table;
-char *pmap_attributes; /* reference and modify bits */
+
+struct pv_header {
+ struct pv_entry pvh_first; /* first PV entry */
+ uint16_t pvh_attrs; /* attributes:
+ bits 0-7: PTE bits
+ bits 8-15: flags */
+ uint16_t pvh_cimappings; /* # caller-specified CI
+ mappings */
+};
+
+#define PVH_CI 0x10 /* all entries are cache-inhibited */
+#define PVH_PTPAGE 0x20 /* entry maps a page table page */
+
+struct pv_header *pv_table;
TAILQ_HEAD(pv_page_list, pv_page) pv_page_freelist;
int pv_nfree;
@@ -272,25 +284,13 @@
#define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa))
-static inline struct pv_entry *pa_to_pvh(paddr_t pa);
-static inline char *pa_to_attribute(paddr_t pa);
-
-static inline struct pv_entry *
+static inline struct pv_header *
pa_to_pvh(paddr_t pa)
{
int bank, pg = 0; /* XXX gcc4 -Wuninitialized */
bank = vm_physseg_find(atop((pa)), &pg);
- return &vm_physmem[bank].pmseg.pvent[pg];
-}
-
-static inline char *
-pa_to_attribute(paddr_t pa)
-{
- int bank, pg = 0; /* XXX gcc4 -Wuninitialized */
-
- bank = vm_physseg_find(atop((pa)), &pg);
- return &vm_physmem[bank].pmseg.attrs[pg];
+ return &vm_physmem[bank].pmseg.pvheader[pg];
}
/*
@@ -349,8 +349,7 @@
{
vaddr_t addr, addr2;
vsize_t s;
- struct pv_entry *pv;
- char *attr;
+ struct pv_header *pvh;
int rv;
int npages;
int bank;
@@ -378,8 +377,7 @@
for (page_cnt = 0, bank = 0; bank < vm_nphysseg; bank++)
page_cnt += vm_physmem[bank].end - vm_physmem[bank].start;
s = M68K_STSIZE; /* Segtabzero */
- s += page_cnt * sizeof(struct pv_entry); /* pv table */
- s += page_cnt * sizeof(char); /* attribute table */
+ s += page_cnt * sizeof(struct pv_header); /* pv table */
s = round_page(s);
addr = uvm_km_alloc(kernel_map, s, 0, UVM_KMF_WIRED | UVM_KMF_ZERO);
if (addr == 0)
@@ -390,28 +388,23 @@
(paddr_t *)(void *)&Segtabzeropa);
addr += M68K_STSIZE;
- pv_table = (struct pv_entry *) addr;
- addr += page_cnt * sizeof(struct pv_entry);
-
- pmap_attributes = (char *)addr;
+ pv_table = (struct pv_header *) addr;
+ addr += page_cnt * sizeof(struct pv_header);
PMAP_DPRINTF(PDB_INIT, ("pmap_init: %lx bytes: page_cnt %x s0 %p(%p) "
- "tbl %p atr %p\n",
+ "tbl %p\n",
s, page_cnt, Segtabzero, Segtabzeropa,
- pv_table, pmap_attributes));
+ pv_table));
/*
* Now that the pv and attribute tables have been allocated,
* assign them to the memory segments.
*/
- pv = pv_table;
- attr = pmap_attributes;
+ pvh = pv_table;
for (bank = 0; bank < vm_nphysseg; bank++) {
npages = vm_physmem[bank].end - vm_physmem[bank].start;
- vm_physmem[bank].pmseg.pvent = pv;
- vm_physmem[bank].pmseg.attrs = attr;
- pv += npages;
- attr += npages;
+ vm_physmem[bank].pmseg.pvheader = pvh;
+ pvh += npages;
}
/*
@@ -606,6 +599,7 @@
struct pv_page_list pv_page_collectlist;
struct pv_page *pvp, *npvp;
struct pv_entry *ph, *ppv, *pv, *npv;
+ struct pv_header *pvh;
int s;
TAILQ_INIT(&pv_page_collectlist);
@@ -626,7 +620,8 @@
if (TAILQ_FIRST(&pv_page_collectlist) == NULL)
return;
- for (ph = &pv_table[page_cnt - 1]; ph >= &pv_table[0]; ph--) {
+ for (pvh = &pv_table[page_cnt - 1]; pvh >= &pv_table[0]; pvh--) {
+ ph = &pvh->pvh_first;
if (ph->pv_pmap == NULL)
continue;
s = splvm();
@@ -974,6 +969,7 @@
pmap_page_protect(struct vm_page *pg, vm_prot_t prot)
{
paddr_t pa = VM_PAGE_TO_PHYS(pg);
+ struct pv_header *pvh;
struct pv_entry *pv;
pt_entry_t *pte;
int s;
@@ -1000,7 +996,8 @@
break;
}
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
while (pv->pv_pmap != NULL) {
@@ -1229,10 +1226,12 @@
* since pmap_enter can be called at interrupt time.
*/
if (PAGE_IS_MANAGED(pa)) {
+ struct pv_header *pvh;
struct pv_entry *pv, *npv;
int s;
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
PMAP_DPRINTF(PDB_ENTER,
@@ -1247,7 +1246,7 @@
pv->pv_next = NULL;
pv->pv_ptste = NULL;
pv->pv_ptpmap = NULL;
- pv->pv_flags = 0;
+ pvh->pvh_attrs = 0;
}
/*
* There is at least one other VA mapping this page.
@@ -1265,7 +1264,6 @@
npv->pv_next = pv->pv_next;
npv->pv_ptste = NULL;
npv->pv_ptpmap = NULL;
- npv->pv_flags = 0;
pv->pv_next = npv;
#ifdef M68K_MMU_HP
@@ -1294,7 +1292,7 @@
*/
if (pmap_aliasmask) {
- if (pv->pv_flags & PV_CI) {
+ if (pvh->pvh_attrs & PVH_CI) {
PMAP_DPRINTF(PDB_CACHE,
("enter: pa %lx already CI'ed\n",
pa));
@@ -1309,7 +1307,7 @@
("enter: pa %lx CI'ing all\n",
pa));
cacheable = false;
- pv->pv_flags |= PV_CI;
+ pvh->pvh_attrs |= PVH_CI;
}
}
#endif
@@ -1324,9 +1322,9 @@
panic("pmap_enter: access_type exceeds prot");
#endif
if (flags & VM_PROT_WRITE)
- *pa_to_attribute(pa) |= (PG_U|PG_M);
+ pvh->pvh_attrs |= (PG_U|PG_M);
else if (flags & VM_PROT_ALL)
- *pa_to_attribute(pa) |= PG_U;
+ pvh->pvh_attrs |= PG_U;
splx(s);
}
@@ -1725,6 +1723,7 @@
pmap_collect1(pmap_t pmap, paddr_t startpa, paddr_t endpa)
{
paddr_t pa;
+ struct pv_header *pvh;
struct pv_entry *pv;
pt_entry_t *pte;
paddr_t kpa;
@@ -1741,8 +1740,10 @@
* page table pages.
*/
- pv = pa_to_pvh(pa);
- if (pv->pv_pmap != pmap_kernel() || !(pv->pv_flags & PV_PTPAGE))
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
+ if (pv->pv_pmap != pmap_kernel() ||
+ !(pvh->pvh_attrs & PVH_PTPAGE))
continue;
do {
if (pv->pv_ptste && pv->pv_ptpmap == pmap_kernel())
@@ -2065,6 +2066,7 @@
pmap_remove_mapping(pmap_t pmap, vaddr_t va, pt_entry_t *pte, int flags)
{
paddr_t pa;
+ struct pv_header *pvh;
struct pv_entry *pv, *npv;
struct pmap *ptpmap;
st_entry_t *ste;
@@ -2162,6 +2164,7 @@
if (refs == 0 && (flags & PRM_KEEPPTPAGE) == 0) {
#ifdef DIAGNOSTIC
+ struct pv_header *ptppvh;
struct pv_entry *ptppv;
#endif
paddr_t ptppa;
@@ -2170,7 +2173,8 @@
#ifdef DIAGNOSTIC
if (PAGE_IS_MANAGED(ptppa) == 0)
panic("pmap_remove_mapping: unmanaged PT page");
- ptppv = pa_to_pvh(ptppa);
+ ptppvh = pa_to_pvh(ptppa);
+ ptppv = &ptppvh->pvh_first;
if (ptppv->pv_ptste == NULL)
panic("pmap_remove_mapping: ptste == NULL");
if (ptppv->pv_pmap != pmap_kernel() ||
@@ -2204,7 +2208,8 @@
* (raise IPL since we may be called at interrupt time).
*/
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
ste = NULL;
s = splvm();
@@ -2220,7 +2225,6 @@
ptpmap = pv->pv_ptpmap;
npv = pv->pv_next;
if (npv) {
- npv->pv_flags = pv->pv_flags;
*pv = *npv;
pmap_free_pv(npv);
} else
@@ -2239,7 +2243,8 @@
ptpmap = npv->pv_ptpmap;
pv->pv_next = npv->pv_next;
pmap_free_pv(npv);
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
}
#ifdef M68K_MMU_HP
@@ -2249,10 +2254,10 @@
*/
if (pmap_aliasmask &&
- pv->pv_pmap && pv->pv_next == NULL && (pv->pv_flags & PV_CI)) {
+ pv->pv_pmap && pv->pv_next == NULL && (pvh->pvh_attrs & PVH_CI)) {
PMAP_DPRINTF(PDB_CACHE,
("remove: clearing CI for pa %lx\n", pa));
- pv->pv_flags &= ~PV_CI;
+ pvh->pvh_attrs &= ~PVH_CI;
pmap_changebit(pa, 0, ~PG_CI);
#ifdef DEBUG
if ((pmapdebug & (PDB_CACHE|PDB_PVDUMP)) ==
@@ -2333,7 +2338,7 @@
PMAP_ACTIVATE(ptpmap, 1);
}
}
- pv->pv_flags &= ~PV_PTPAGE;
+ pvh->pvh_attrs &= ~PVH_PTPAGE;
ptpmap->pm_ptpages--;
}
@@ -2341,7 +2346,7 @@
* Update saved attributes for managed page
*/
- *pa_to_attribute(pa) |= bits;
+ pvh->pvh_attrs |= bits;
splx(s);
}
@@ -2354,18 +2359,20 @@
bool
pmap_testbit(paddr_t pa, int bit)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
pt_entry_t *pte;
int s;
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
/*
* Check saved info first
*/
- if (*pa_to_attribute(pa) & bit) {
+ if (pvh->pvh_attrs & bit) {
splx(s);
return true;
}
@@ -2389,7 +2396,7 @@
for (; pv; pv = pv->pv_next) {
pte = pmap_pte(pv->pv_pmap, pv->pv_va);
if (*pte & bit) {
- *pa_to_attribute(pa) |= bit;
+ pvh->pvh_attrs |= bit;
splx(s);
return true;
}
@@ -2409,10 +2416,10 @@
bool
pmap_changebit(paddr_t pa, int set, int mask)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
pt_entry_t *pte, npte;
vaddr_t va;
- char *attrp;
int s;
#if defined(M68K_MMU_HP) || defined(M68040) || defined(M68060)
bool firstpage = true;
@@ -2422,16 +2429,16 @@
PMAP_DPRINTF(PDB_BITS,
("pmap_changebit(%lx, %x, %x)\n", pa, set, mask));
- pv = pa_to_pvh(pa);
+ pvh = pa_to_pvh(pa);
+ pv = &pvh->pvh_first;
s = splvm();
/*
* Clear saved attributes (modify, reference)
*/
- attrp = pa_to_attribute(pa);
- r = *attrp & ~mask;
- *attrp &= mask;
+ r = (pvh->pvh_attrs & ~mask) != 0;
+ pvh->pvh_attrs &= mask;
/*
* Loop over all current mappings setting/clearing as appropos
@@ -2502,6 +2509,7 @@
{
paddr_t ptpa;
struct vm_page *pg;
+ struct pv_header *pvh;
struct pv_entry *pv;
st_entry_t *ste;
int s;
@@ -2687,14 +2695,17 @@
* record the STE address. This is so that we can invalidate
* the STE when we remove the mapping for the page.
*/
- pv = pa_to_pvh(ptpa);
+ pvh = pa_to_pvh(ptpa);
s = splvm();
- if (pv) {
- pv->pv_flags |= PV_PTPAGE;
+ if (pvh) {
+ pv = &pvh->pvh_first;
+ pvh->pvh_attrs |= PVH_PTPAGE;
do {
if (pv->pv_pmap == pmap_kernel() && pv->pv_va == va)
break;
} while ((pv = pv->pv_next));
+ } else {
+ pv = NULL;
}
#ifdef DEBUG
if (pv == NULL)
@@ -2868,10 +2879,12 @@
void
pmap_pvdump(paddr_t pa)
{
+ struct pv_header *pvh;
struct pv_entry *pv;
printf("pa %lx", pa);
- for (pv = pa_to_pvh(pa); pv; pv = pv->pv_next)
+ pvh = pa_to_pvh(pa);
+ for (pv = &pvh->pvh_first; pv; pv = pv->pv_next)
printf(" -> pmap %p, va %lx, ptste %p, ptpmap %p, flags %x",
pv->pv_pmap, pv->pv_va, pv->pv_ptste, pv->pv_ptpmap,
pv->pv_flags);
Index: src/sys/arch/mac68k/include/vmparam.h
diff -u src/sys/arch/mac68k/include/vmparam.h:1.38 src/sys/arch/mac68k/include/vmparam.h:1.39
--- src/sys/arch/mac68k/include/vmparam.h:1.38 Fri Mar 6 20:31:50 2009
+++ src/sys/arch/mac68k/include/vmparam.h Wed Aug 26 00:30:02 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.38 2009/03/06 20:31:50 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.39 2009/08/26 00:30:02 thorpej Exp $ */
/*
* Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -208,8 +208,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _MAC68K_VMPARAM_H_ */
Index: src/sys/arch/mvme68k/include/vmparam.h
diff -u src/sys/arch/mvme68k/include/vmparam.h:1.29 src/sys/arch/mvme68k/include/vmparam.h:1.30
--- src/sys/arch/mvme68k/include/vmparam.h:1.29 Fri Mar 6 20:31:50 2009
+++ src/sys/arch/mvme68k/include/vmparam.h Wed Aug 26 00:30:03 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.29 2009/03/06 20:31:50 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.30 2009/08/26 00:30:03 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -174,8 +174,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _MVME68K_VMPARAM_H_ */
Index: src/sys/arch/news68k/include/vmparam.h
diff -u src/sys/arch/news68k/include/vmparam.h:1.14 src/sys/arch/news68k/include/vmparam.h:1.15
--- src/sys/arch/news68k/include/vmparam.h:1.14 Fri Mar 6 20:31:51 2009
+++ src/sys/arch/news68k/include/vmparam.h Wed Aug 26 00:30:03 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.14 2009/03/06 20:31:51 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.15 2009/08/26 00:30:03 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -172,8 +172,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _NEWS68K_VMPARAM_H_ */
Index: src/sys/arch/next68k/include/vmparam.h
diff -u src/sys/arch/next68k/include/vmparam.h:1.19 src/sys/arch/next68k/include/vmparam.h:1.20
--- src/sys/arch/next68k/include/vmparam.h:1.19 Fri Mar 6 20:31:51 2009
+++ src/sys/arch/next68k/include/vmparam.h Wed Aug 26 00:30:03 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.19 2009/03/06 20:31:51 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.20 2009/08/26 00:30:03 thorpej Exp $ */
/*
* This file was taken from from mvme68k/include/vmparam.h and
@@ -177,8 +177,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _MVME68K_VMPARAM_H_ */
Index: src/sys/arch/x68k/include/vmparam.h
diff -u src/sys/arch/x68k/include/vmparam.h:1.29 src/sys/arch/x68k/include/vmparam.h:1.30
--- src/sys/arch/x68k/include/vmparam.h:1.29 Fri Mar 6 20:31:54 2009
+++ src/sys/arch/x68k/include/vmparam.h Wed Aug 26 00:30:03 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vmparam.h,v 1.29 2009/03/06 20:31:54 joerg Exp $ */
+/* $NetBSD: vmparam.h,v 1.30 2009/08/26 00:30:03 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -164,8 +164,7 @@
* pmap-specific data stored in the vm_physmem[] array.
*/
struct pmap_physseg {
- struct pv_entry *pvent; /* pv table for this seg */
- char *attrs; /* page attributes for this seg */
+ struct pv_header *pvheader; /* pv table for this seg */
};
#endif /* _X68K_VMPARAM_H_ */