Simplify pmap_remove() a little by avoiding pmap_do_remove() layer, since
possibility to skip wired mappings is not needed anymore. Apart from that, no functional differences are intended.
This commit is contained in:
parent
da0d530a06
commit
10758cb0f9
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap.c,v 1.244 2009/10/21 21:11:58 rmind Exp $ */
|
||||
/* $NetBSD: pmap.c,v 1.245 2009/10/22 19:50:55 rmind Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1998, 1999, 2000, 2001, 2007, 2008 The NetBSD Foundation, Inc.
|
||||
|
@ -140,7 +140,7 @@
|
|||
|
||||
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.244 2009/10/21 21:11:58 rmind Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.245 2009/10/22 19:50:55 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -439,7 +439,6 @@ static struct pool_cache pmap_tlb_shootdown_job_cache;
|
|||
* Internal routines
|
||||
*/
|
||||
static void alpha_protection_init(void);
|
||||
static void pmap_do_remove(pmap_t, vaddr_t, vaddr_t, bool);
|
||||
static bool pmap_remove_mapping(pmap_t, vaddr_t, pt_entry_t *, bool, long);
|
||||
static void pmap_changebit(struct vm_page *, pt_entry_t, pt_entry_t, long);
|
||||
|
||||
|
@ -1254,25 +1253,6 @@ pmap_reference(pmap_t pmap)
|
|||
*/
|
||||
void
|
||||
pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva)
|
||||
{
|
||||
|
||||
#ifdef DEBUG
|
||||
if (pmapdebug & (PDB_FOLLOW|PDB_REMOVE|PDB_PROTECT))
|
||||
printf("pmap_remove(%p, %lx, %lx)\n", pmap, sva, eva);
|
||||
#endif
|
||||
|
||||
pmap_do_remove(pmap, sva, eva, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_do_remove:
|
||||
*
|
||||
* This actually removes the range of addresses from the
|
||||
* specified map. It is used by and pmap_remove() (does
|
||||
* want to remove wired mappings).
|
||||
*/
|
||||
static void
|
||||
pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, bool dowired)
|
||||
{
|
||||
pt_entry_t *l1pte, *l2pte, *l3pte;
|
||||
pt_entry_t *saved_l1pte, *saved_l2pte, *saved_l3pte;
|
||||
|
@ -1297,8 +1277,6 @@ pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, bool dowired)
|
|||
PMAP_MAP_TO_HEAD_LOCK();
|
||||
PMAP_LOCK(pmap);
|
||||
|
||||
KASSERT(dowired == true);
|
||||
|
||||
while (sva < eva) {
|
||||
l3pte = PMAP_KERNEL_PTE(sva);
|
||||
if (pmap_pte_v(l3pte)) {
|
||||
|
@ -1380,16 +1358,15 @@ pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, bool dowired)
|
|||
|
||||
for (; sva < l2eva && sva < eva;
|
||||
sva += PAGE_SIZE, l3pte++) {
|
||||
if (pmap_pte_v(l3pte) &&
|
||||
(dowired == true ||
|
||||
pmap_pte_w(l3pte) == 0)) {
|
||||
if (!pmap_pte_v(l3pte)) {
|
||||
continue;
|
||||
}
|
||||
needisync |=
|
||||
pmap_remove_mapping(
|
||||
pmap, sva,
|
||||
l3pte, true,
|
||||
cpu_id);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove the reference to the L3
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap.c,v 1.199 2009/10/21 21:11:59 rmind Exp $ */
|
||||
/* $NetBSD: pmap.c,v 1.200 2009/10/22 19:50:55 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright 2003 Wasabi Systems, Inc.
|
||||
|
@ -212,7 +212,7 @@
|
|||
#include <machine/param.h>
|
||||
#include <arm/arm32/katelib.h>
|
||||
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.199 2009/10/21 21:11:59 rmind Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.200 2009/10/22 19:50:55 rmind Exp $");
|
||||
|
||||
#ifdef PMAP_DEBUG
|
||||
|
||||
|
@ -640,7 +640,7 @@ static bool pmap_is_cached(pmap_t);
|
|||
static void pmap_enter_pv(struct vm_page *, struct pv_entry *,
|
||||
pmap_t, vaddr_t, u_int);
|
||||
static struct pv_entry *pmap_find_pv(struct vm_page *, pmap_t, vaddr_t);
|
||||
static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vaddr_t, int);
|
||||
static struct pv_entry *pmap_remove_pv(struct vm_page *, pmap_t, vaddr_t);
|
||||
static u_int pmap_modify_pv(struct vm_page *, pmap_t, vaddr_t,
|
||||
u_int, u_int);
|
||||
|
||||
|
@ -960,7 +960,7 @@ pmap_find_pv(struct vm_page *pg, pmap_t pm, vaddr_t va)
|
|||
* => we return the removed pve
|
||||
*/
|
||||
static struct pv_entry *
|
||||
pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va, int skip_wired)
|
||||
pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va)
|
||||
{
|
||||
struct pv_entry *pve, **prevptr;
|
||||
|
||||
|
@ -975,8 +975,6 @@ pmap_remove_pv(struct vm_page *pg, pmap_t pm, vaddr_t va, int skip_wired)
|
|||
NPDEBUG(PDB_PVDUMP, printf("pmap_remove_pv: pm %p, pg "
|
||||
"%p, flags 0x%x\n", pm, pg, pve->pv_flags));
|
||||
if (pve->pv_flags & PVF_WIRED) {
|
||||
if (skip_wired)
|
||||
return (NULL);
|
||||
--pm->pm_stats.wired_count;
|
||||
}
|
||||
*prevptr = SLIST_NEXT(pve, pv_link); /* remove it! */
|
||||
|
@ -2891,7 +2889,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
|
|||
* must remove it from the PV list
|
||||
*/
|
||||
simple_lock(&opg->mdpage.pvh_slock);
|
||||
pve = pmap_remove_pv(opg, pm, va, 0);
|
||||
pve = pmap_remove_pv(opg, pm, va);
|
||||
pmap_vac_me_harder(opg, pm, 0);
|
||||
simple_unlock(&opg->mdpage.pvh_slock);
|
||||
oflags = pve->pv_flags;
|
||||
|
@ -2954,7 +2952,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
|
|||
* at this address.
|
||||
*/
|
||||
simple_lock(&opg->mdpage.pvh_slock);
|
||||
pve = pmap_remove_pv(opg, pm, va, 0);
|
||||
pve = pmap_remove_pv(opg, pm, va);
|
||||
pmap_vac_me_harder(opg, pm, 0);
|
||||
simple_unlock(&opg->mdpage.pvh_slock);
|
||||
oflags = pve->pv_flags;
|
||||
|
@ -3078,7 +3076,7 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
|
|||
#define PMAP_REMOVE_CLEAN_LIST_SIZE 3
|
||||
|
||||
void
|
||||
pmap_do_remove(pmap_t pm, vaddr_t sva, vaddr_t eva, int skip_wired)
|
||||
pmap_remove(pmap_t pm, vaddr_t sva, vaddr_t eva)
|
||||
{
|
||||
struct l2_bucket *l2b;
|
||||
vaddr_t next_bucket;
|
||||
|
@ -3148,7 +3146,7 @@ pmap_do_remove(pmap_t pm, vaddr_t sva, vaddr_t eva, int skip_wired)
|
|||
if ((pg = PHYS_TO_VM_PAGE(pa)) != NULL) {
|
||||
struct pv_entry *pve;
|
||||
simple_lock(&pg->mdpage.pvh_slock);
|
||||
pve = pmap_remove_pv(pg, pm, sva, skip_wired);
|
||||
pve = pmap_remove_pv(pg, pm, sva);
|
||||
pmap_vac_me_harder(pg, pm, 0);
|
||||
simple_unlock(&pg->mdpage.pvh_slock);
|
||||
if (pve != NULL) {
|
||||
|
@ -3159,17 +3157,8 @@ pmap_do_remove(pmap_t pm, vaddr_t sva, vaddr_t eva, int skip_wired)
|
|||
PV_BEEN_REFD(pve->pv_flags);
|
||||
}
|
||||
pool_put(&pmap_pv_pool, pve);
|
||||
} else
|
||||
if (skip_wired) {
|
||||
/* The mapping is wired. Skip it */
|
||||
continue;
|
||||
}
|
||||
} else
|
||||
if (skip_wired) {
|
||||
/* Unmanaged pages are always wired. */
|
||||
continue;
|
||||
}
|
||||
|
||||
mappings++;
|
||||
|
||||
if (!l2pte_valid(pte)) {
|
||||
|
@ -3285,7 +3274,7 @@ pmap_kremove_pg(struct vm_page *pg, vaddr_t va)
|
|||
KASSERT(pg->mdpage.pvh_attrs & (PVF_COLORED|PVF_NC));
|
||||
KASSERT((pg->mdpage.pvh_attrs & PVF_KMPAGE) == 0);
|
||||
|
||||
pv = pmap_remove_pv(pg, pmap_kernel(), va, false);
|
||||
pv = pmap_remove_pv(pg, pmap_kernel(), va);
|
||||
KASSERT(pv);
|
||||
KASSERT(pv->pv_flags & PVF_KENTRY);
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap.h,v 1.92 2009/08/19 23:54:33 thorpej Exp $ */
|
||||
/* $NetBSD: pmap.h,v 1.93 2009/10/22 19:50:55 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2002, 2003 Wasabi Systems, Inc.
|
||||
|
@ -268,8 +268,6 @@ extern int pmap_debug_level; /* Only exists if PMAP_DEBUG */
|
|||
#define pmap_resident_count(pmap) ((pmap)->pm_stats.resident_count)
|
||||
#define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count)
|
||||
|
||||
#define pmap_remove(pmap,sva,eva) pmap_do_remove((pmap),(sva),(eva),0)
|
||||
|
||||
#define pmap_is_modified(pg) \
|
||||
(((pg)->mdpage.pvh_attrs & PVF_MOD) != 0)
|
||||
#define pmap_is_referenced(pg) \
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap_motorola.c,v 1.48 2009/10/21 21:12:00 rmind Exp $ */
|
||||
/* $NetBSD: pmap_motorola.c,v 1.49 2009/10/22 19:50:55 rmind 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.48 2009/10/21 21:12:00 rmind Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.49 2009/10/22 19:50:55 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
|
@ -280,7 +280,6 @@ struct pool pmap_pmap_pool; /* memory pool for pmap structures */
|
|||
|
||||
struct pv_entry *pmap_alloc_pv(void);
|
||||
void pmap_free_pv(struct pv_entry *);
|
||||
static void pmap_collect_pv(void);
|
||||
|
||||
#define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa))
|
||||
|
||||
|
@ -297,13 +296,11 @@ pa_to_pvh(paddr_t pa)
|
|||
* Internal routines
|
||||
*/
|
||||
void pmap_remove_mapping(pmap_t, vaddr_t, pt_entry_t *, int);
|
||||
void pmap_do_remove(pmap_t, vaddr_t, vaddr_t, int);
|
||||
bool pmap_testbit(paddr_t, int);
|
||||
bool pmap_changebit(paddr_t, int, int);
|
||||
int pmap_enter_ptpage(pmap_t, vaddr_t, bool);
|
||||
void pmap_ptpage_addref(vaddr_t);
|
||||
int pmap_ptpage_delref(vaddr_t);
|
||||
void pmap_collect1(pmap_t, paddr_t, paddr_t);
|
||||
void pmap_pinit(pmap_t);
|
||||
void pmap_release(pmap_t);
|
||||
|
||||
|
@ -593,7 +590,8 @@ pmap_free_pv(struct pv_entry *pv)
|
|||
*
|
||||
* Perform compaction on the PV list, called via pmap_collect().
|
||||
*/
|
||||
static void
|
||||
#ifdef notyet
|
||||
void
|
||||
pmap_collect_pv(void)
|
||||
{
|
||||
struct pv_page_list pv_page_collectlist;
|
||||
|
@ -654,6 +652,7 @@ pmap_collect_pv(void)
|
|||
uvm_km_free(kernel_map, (vaddr_t)pvp, PAGE_SIZE, UVM_KMF_WIRED);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* pmap_map:
|
||||
|
@ -851,13 +850,6 @@ pmap_deactivate(struct lwp *l)
|
|||
*/
|
||||
void
|
||||
pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva)
|
||||
{
|
||||
|
||||
pmap_do_remove(pmap, sva, eva, 1);
|
||||
}
|
||||
|
||||
void
|
||||
pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, int remove_wired)
|
||||
{
|
||||
vaddr_t nssva;
|
||||
pt_entry_t *pte;
|
||||
|
@ -877,7 +869,6 @@ pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, int remove_wired)
|
|||
|
||||
/*
|
||||
* Invalidate every valid mapping within this segment.
|
||||
* If remove_wired is zero, skip the wired pages.
|
||||
*/
|
||||
|
||||
pte = pmap_pte(pmap, sva);
|
||||
|
@ -893,10 +884,7 @@ pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, int remove_wired)
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (pmap_pte_v(pte) &&
|
||||
(remove_wired || !pmap_pte_w(pte))) {
|
||||
if (pmap_pte_v(pte)) {
|
||||
#ifdef M68K_MMU_HP
|
||||
if (pmap_aliasmask) {
|
||||
|
||||
|
@ -1664,50 +1652,6 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vaddr_t dst_addr, vsize_t len,
|
|||
dst_pmap, src_pmap, dst_addr, len, src_addr));
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_collect: [ INTERFACE ]
|
||||
*
|
||||
* Garbage collects the physical map system for pages which are no
|
||||
* longer used. Success need not be guaranteed -- that is, there
|
||||
* may well be pages which are not referenced, but others may be
|
||||
* collected.
|
||||
*/
|
||||
static void
|
||||
pmap_collect(pmap_t pmap)
|
||||
{
|
||||
|
||||
PMAP_DPRINTF(PDB_FOLLOW, ("pmap_collect(%p)\n", pmap));
|
||||
|
||||
if (pmap == pmap_kernel()) {
|
||||
int bank, s;
|
||||
|
||||
/*
|
||||
* XXX This is very bogus. We should handle kernel PT
|
||||
* XXX pages much differently.
|
||||
*/
|
||||
|
||||
s = splvm();
|
||||
for (bank = 0; bank < vm_nphysseg; bank++)
|
||||
pmap_collect1(pmap, ptoa(vm_physmem[bank].start),
|
||||
ptoa(vm_physmem[bank].end));
|
||||
splx(s);
|
||||
} else {
|
||||
/*
|
||||
* This process is about to be swapped out; free all of
|
||||
* the PT pages by removing the physical mappings for its
|
||||
* entire address space. Note: pmap_remove() performs
|
||||
* all necessary locking.
|
||||
*/
|
||||
pmap_do_remove(pmap, VM_MIN_ADDRESS, VM_MAX_ADDRESS, 0);
|
||||
pmap_update(pmap);
|
||||
}
|
||||
|
||||
#ifdef notyet
|
||||
/* Go compact and garbage-collect the pv_table. */
|
||||
pmap_collect_pv();
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_collect1():
|
||||
*
|
||||
|
@ -1717,7 +1661,7 @@ pmap_collect(pmap_t pmap)
|
|||
* Note: THIS SHOULD GO AWAY, AND BE REPLACED WITH A BETTER
|
||||
* WAY OF HANDLING PT PAGES!
|
||||
*/
|
||||
static void
|
||||
static inline void
|
||||
pmap_collect1(pmap_t pmap, paddr_t startpa, paddr_t endpa)
|
||||
{
|
||||
paddr_t pa;
|
||||
|
@ -1819,6 +1763,39 @@ pmap_collect1(pmap_t pmap, paddr_t startpa, paddr_t endpa)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_collect:
|
||||
*
|
||||
* Helper for pmap_enter_ptpage().
|
||||
*
|
||||
* Garbage collects the physical map system for pages which are no
|
||||
* longer used. Success need not be guaranteed -- that is, there
|
||||
* may well be pages which are not referenced, but others may be
|
||||
* collected.
|
||||
*/
|
||||
static void
|
||||
pmap_collect(void)
|
||||
{
|
||||
int bank, s;
|
||||
|
||||
/*
|
||||
* XXX This is very bogus. We should handle kernel PT
|
||||
* XXX pages much differently.
|
||||
*/
|
||||
|
||||
s = splvm();
|
||||
for (bank = 0; bank < vm_nphysseg; bank++) {
|
||||
pmap_collect1(pmap_kernel(), ptoa(vm_physmem[bank].start),
|
||||
ptoa(vm_physmem[bank].end));
|
||||
}
|
||||
splx(s);
|
||||
|
||||
#ifdef notyet
|
||||
/* Go compact and garbage-collect the pv_table. */
|
||||
pmap_collect_pv();
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_zero_page: [ INTERFACE ]
|
||||
*
|
||||
|
@ -2615,7 +2592,7 @@ pmap_enter_ptpage(pmap_t pmap, vaddr_t va, bool can_fail)
|
|||
*/
|
||||
PMAP_DPRINTF(PDB_COLLECT,
|
||||
("enter: no KPT pages, collecting...\n"));
|
||||
pmap_collect(pmap_kernel());
|
||||
pmap_collect();
|
||||
if ((kpt = kpt_free_list) == NULL)
|
||||
panic("pmap_enter_ptpage: can't get KPT page");
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap.c,v 1.93 2009/10/21 21:12:04 rmind Exp $ */
|
||||
/* $NetBSD: pmap.c,v 1.94 2009/10/22 19:50:56 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007 Manuel Bouyer.
|
||||
|
@ -149,7 +149,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.93 2009/10/21 21:12:04 rmind Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.94 2009/10/22 19:50:56 rmind Exp $");
|
||||
|
||||
#include "opt_user_ldt.h"
|
||||
#include "opt_lockdebug.h"
|
||||
|
@ -583,15 +583,12 @@ static bool pmap_is_curpmap(struct pmap *);
|
|||
static bool pmap_is_active(struct pmap *, struct cpu_info *, bool);
|
||||
static void pmap_map_ptes(struct pmap *, struct pmap **,
|
||||
pt_entry_t **, pd_entry_t * const **);
|
||||
static void pmap_do_remove(struct pmap *, vaddr_t, vaddr_t, u_int);
|
||||
static bool pmap_remove_pte(struct pmap *, struct vm_page *,
|
||||
pt_entry_t *, vaddr_t, u_int,
|
||||
pt_entry_t *, vaddr_t,
|
||||
struct pv_entry **);
|
||||
static pt_entry_t pmap_remove_ptes(struct pmap *, struct vm_page *,
|
||||
vaddr_t, vaddr_t, vaddr_t, u_int,
|
||||
vaddr_t, vaddr_t, vaddr_t,
|
||||
struct pv_entry **);
|
||||
#define PMAP_REMOVE_ALL 0 /* remove all mappings */
|
||||
#define PMAP_REMOVE_SKIPWIRED 1 /* skip wired mappings */
|
||||
|
||||
static void pmap_unmap_ptes(struct pmap *, struct pmap *);
|
||||
static bool pmap_get_physpage(vaddr_t, int, paddr_t *);
|
||||
|
@ -3249,8 +3246,7 @@ pmap_unmap_pte(void)
|
|||
|
||||
static pt_entry_t
|
||||
pmap_remove_ptes(struct pmap *pmap, struct vm_page *ptp, vaddr_t ptpva,
|
||||
vaddr_t startva, vaddr_t endva, u_int flags,
|
||||
struct pv_entry **pv_tofree)
|
||||
vaddr_t startva, vaddr_t endva, struct pv_entry **pv_tofree)
|
||||
{
|
||||
struct pv_entry *pve;
|
||||
pt_entry_t *pte = (pt_entry_t *) ptpva;
|
||||
|
@ -3275,9 +3271,6 @@ pmap_remove_ptes(struct pmap *pmap, struct vm_page *ptp, vaddr_t ptpva,
|
|||
|
||||
if (!pmap_valid_entry(*pte))
|
||||
continue; /* VA not mapped */
|
||||
if ((flags & PMAP_REMOVE_SKIPWIRED) && (*pte & PG_W)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* atomically save the old PTE and zap! it */
|
||||
opte = pmap_pte_testset(pte, 0);
|
||||
|
@ -3349,7 +3342,7 @@ pmap_remove_ptes(struct pmap *pmap, struct vm_page *ptp, vaddr_t ptpva,
|
|||
|
||||
static bool
|
||||
pmap_remove_pte(struct pmap *pmap, struct vm_page *ptp, pt_entry_t *pte,
|
||||
vaddr_t va, u_int flags, struct pv_entry **pv_tofree)
|
||||
vaddr_t va, struct pv_entry **pv_tofree)
|
||||
{
|
||||
pt_entry_t opte;
|
||||
struct pv_entry *pve;
|
||||
|
@ -3361,9 +3354,6 @@ pmap_remove_pte(struct pmap *pmap, struct vm_page *ptp, pt_entry_t *pte,
|
|||
|
||||
if (!pmap_valid_entry(*pte))
|
||||
return(false); /* VA not mapped */
|
||||
if ((flags & PMAP_REMOVE_SKIPWIRED) && (*pte & PG_W)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
/* atomically save the old PTE and zap! it */
|
||||
opte = pmap_pte_testset(pte, 0);
|
||||
|
@ -3421,25 +3411,13 @@ pmap_remove_pte(struct pmap *pmap, struct vm_page *ptp, pt_entry_t *pte,
|
|||
}
|
||||
|
||||
/*
|
||||
* pmap_remove: top level mapping removal function
|
||||
* pmap_remove: mapping removal function.
|
||||
*
|
||||
* => caller should not be holding any pmap locks
|
||||
*/
|
||||
|
||||
void
|
||||
pmap_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva)
|
||||
{
|
||||
pmap_do_remove(pmap, sva, eva, PMAP_REMOVE_ALL);
|
||||
}
|
||||
|
||||
/*
|
||||
* pmap_do_remove: mapping removal guts
|
||||
*
|
||||
* => caller should not be holding any pmap locks
|
||||
*/
|
||||
|
||||
static void
|
||||
pmap_do_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva, u_int flags)
|
||||
{
|
||||
pt_entry_t *ptes, xpte = 0;
|
||||
pd_entry_t pde;
|
||||
|
@ -3479,7 +3457,7 @@ pmap_do_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva, u_int flags)
|
|||
|
||||
/* do it! */
|
||||
result = pmap_remove_pte(pmap, ptp,
|
||||
&ptes[pl1_i(va)], va, flags, &pv_tofree);
|
||||
&ptes[pl1_i(va)], va, &pv_tofree);
|
||||
|
||||
/*
|
||||
* if mapping removed and the PTP is no longer
|
||||
|
@ -3540,8 +3518,7 @@ pmap_do_remove(struct pmap *pmap, vaddr_t sva, vaddr_t eva, u_int flags)
|
|||
#endif
|
||||
}
|
||||
xpte |= pmap_remove_ptes(pmap, ptp,
|
||||
(vaddr_t)&ptes[pl1_i(va)], va, blkendva,
|
||||
flags, &pv_tofree);
|
||||
(vaddr_t)&ptes[pl1_i(va)], va, blkendva, &pv_tofree);
|
||||
|
||||
/* if PTP is no longer being used, free it! */
|
||||
if (ptp && ptp->wire_count <= 1) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: pmap_stub.c,v 1.20 2009/09/18 18:31:53 pooka Exp $ */
|
||||
/* $NetBSD: pmap_stub.c,v 1.21 2009/10/22 19:50:56 rmind Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
|
||||
|
@ -29,7 +29,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap_stub.c,v 1.20 2009/09/18 18:31:53 pooka Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: pmap_stub.c,v 1.21 2009/10/22 19:50:56 rmind Exp $");
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
|
@ -111,25 +111,17 @@ pmap_enter(pmap_t pmap, vaddr_t va, paddr_t pa, vm_prot_t prot, u_int flags)
|
|||
}
|
||||
|
||||
/*
|
||||
* It's a brave new world. arm32 pmap is different (even from arm26)
|
||||
* It's a brave new world.
|
||||
*/
|
||||
#if defined(__arm__) && !defined(__PROG26)
|
||||
void
|
||||
pmap_do_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva, int eger)
|
||||
{
|
||||
#if !defined(__vax__)
|
||||
|
||||
panic("%s: unavailable", __func__);
|
||||
}
|
||||
#elif !defined(__vax__)
|
||||
void
|
||||
pmap_remove(pmap_t pmap, vaddr_t sva, vaddr_t eva)
|
||||
{
|
||||
|
||||
panic("%s: unavailable", __func__);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __vax__
|
||||
bool
|
||||
pmap_extract(pmap_t pmap, vaddr_t va, paddr_t *pap)
|
||||
{
|
||||
|
@ -137,6 +129,7 @@ pmap_extract(pmap_t pmap, vaddr_t va, paddr_t *pap)
|
|||
*pap = va;
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue