Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/uebayasi-xip]: src/sys/arch/arm/arm32 Start changing this to be ready fo...
details: https://anonhg.NetBSD.org/src/rev/021fbfdf671f
branches: uebayasi-xip
changeset: 751554:021fbfdf671f
user: uebayasi <uebayasi%NetBSD.org@localhost>
date: Wed Feb 10 12:53:26 2010 +0000
description:
Start changing this to be ready for device page (XIP). The basic rule is
device pages don't have struct vm_page * objects. Instead per-page data
(mainly PV mappings) is rooted from the global struct vm_page_md array.
Convert 2 functions to take struct vm_page_md * instead of struct vm_page *.
diffstat:
sys/arch/arm/arm32/pmap.c | 44 ++++++++++++++++++++++----------------------
1 files changed, 22 insertions(+), 22 deletions(-)
diffs (165 lines):
diff -r 9d5cd4aed739 -r 021fbfdf671f sys/arch/arm/arm32/pmap.c
--- a/sys/arch/arm/arm32/pmap.c Wed Feb 10 08:12:02 2010 +0000
+++ b/sys/arch/arm/arm32/pmap.c Wed Feb 10 12:53:26 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.211 2010/01/02 07:53:29 he Exp $ */
+/* $NetBSD: pmap.c,v 1.211.2.1 2010/02/10 12:53:26 uebayasi Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@@ -211,7 +211,7 @@
#include <machine/param.h>
#include <arm/arm32/katelib.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211 2010/01/02 07:53:29 he Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.211.2.1 2010/02/10 12:53:26 uebayasi Exp $");
#ifdef PMAP_DEBUG
@@ -638,7 +638,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_find_pv(struct vm_page_md *, pmap_t, vaddr_t);
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);
@@ -667,7 +667,7 @@
static int pmap_clean_page(struct pv_entry *, bool);
#endif
#ifdef PMAP_CACHE_VIPT
-static void pmap_syncicache_page(struct vm_page *);
+static void pmap_syncicache_page(struct vm_page_md *, paddr_t);
enum pmap_flush_op {
PMAP_FLUSH_PRIMARY,
PMAP_FLUSH_SECONDARY,
@@ -916,7 +916,7 @@
*/
if (PV_IS_EXEC_P(flags)) {
if (!PV_IS_EXEC_P(pg->mdpage.pvh_attrs)) {
- pmap_syncicache_page(pg);
+ pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
PMAPCOUNT(exec_synced_map);
}
PMAPCOUNT(exec_mappings);
@@ -937,11 +937,11 @@
* => caller should hold lock on vm_page
*/
static inline struct pv_entry *
-pmap_find_pv(struct vm_page *pg, pmap_t pm, vaddr_t va)
+pmap_find_pv(struct vm_page_md *md, pmap_t pm, vaddr_t va)
{
struct pv_entry *pv;
- SLIST_FOREACH(pv, &pg->mdpage.pvh_list, pv_link) {
+ SLIST_FOREACH(pv, &md->pvh_list, pv_link) {
if (pm == pv->pv_pmap && va == pv->pv_va)
break;
}
@@ -1005,7 +1005,7 @@
pg->mdpage.pvh_attrs &= ~PVF_EXEC;
PMAPCOUNT(exec_discarded_unmap);
} else {
- pmap_syncicache_page(pg);
+ pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
PMAPCOUNT(exec_synced_unmap);
}
}
@@ -1060,7 +1060,7 @@
KASSERT((clr_mask & PVF_KENTRY) == 0);
KASSERT((set_mask & PVF_KENTRY) == 0);
- if ((npv = pmap_find_pv(pg, pm, va)) == NULL)
+ if ((npv = pmap_find_pv(&pg->mdpage, pm, va)) == NULL)
return (0);
NPDEBUG(PDB_PVDUMP,
@@ -1120,7 +1120,7 @@
if ((PV_IS_EXEC_P(flags) && !PV_IS_EXEC_P(pg->mdpage.pvh_attrs))
|| (PV_IS_EXEC_P(pg->mdpage.pvh_attrs)
|| (!(flags & PVF_WRITE) && (oflags & PVF_WRITE)))) {
- pmap_syncicache_page(pg);
+ pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
PMAPCOUNT(exec_synced_remap);
}
KASSERT((pg->mdpage.pvh_attrs & PVF_DMOD) == 0 || (pg->mdpage.pvh_attrs & (PVF_DIRTY|PVF_NC)));
@@ -2315,7 +2315,7 @@
* If we need to sync the I-cache and we haven't done it yet, do it.
*/
if (need_syncicache && !did_syncicache) {
- pmap_syncicache_page(pg);
+ pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
PMAPCOUNT(exec_synced_clearbit);
}
/*
@@ -2427,26 +2427,26 @@
* right cache alias to make sure we flush the right stuff.
*/
void
-pmap_syncicache_page(struct vm_page *pg)
+pmap_syncicache_page(struct vm_page_md *md, paddr_t pa)
{
- const vsize_t va_offset = pg->mdpage.pvh_attrs & arm_cache_prefer_mask;
+ const vsize_t va_offset = md->pvh_attrs & arm_cache_prefer_mask;
pt_entry_t * const ptep = &cdst_pte[va_offset >> PGSHIFT];
- NPDEBUG(PDB_EXEC, printf("pmap_syncicache_page: pg=%p (attrs=%#x)\n",
- pg, pg->mdpage.pvh_attrs));
+ NPDEBUG(PDB_EXEC, printf("pmap_syncicache_page: md=%p (attrs=%#x)\n",
+ md, md->pvh_attrs));
/*
* No need to clean the page if it's non-cached.
*/
- if (pg->mdpage.pvh_attrs & PVF_NC)
+ if (md->pvh_attrs & PVF_NC)
return;
- KASSERT(arm_cache_prefer_mask == 0 || pg->mdpage.pvh_attrs & PVF_COLORED);
+ KASSERT(arm_cache_prefer_mask == 0 || md->pvh_attrs & PVF_COLORED);
pmap_tlb_flushID_SE(pmap_kernel(), cdstp + va_offset);
/*
* Set up a PTE with the right coloring to flush existing cache lines.
*/
*ptep = L2_S_PROTO |
- VM_PAGE_TO_PHYS(pg)
+ pa
| L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE)
| pte_l2_s_cache_mode;
PTE_SYNC(ptep);
@@ -2462,7 +2462,7 @@
PTE_SYNC(ptep);
pmap_tlb_flushID_SE(pmap_kernel(), cdstp + va_offset);
- pg->mdpage.pvh_attrs |= PVF_EXEC;
+ md->pvh_attrs |= PVF_EXEC;
PMAPCOUNT(exec_synced);
}
@@ -3294,7 +3294,7 @@
pg->mdpage.pvh_attrs &= ~PVF_EXEC;
PMAPCOUNT(exec_discarded_kremove);
} else {
- pmap_syncicache_page(pg);
+ pmap_syncicache_page(&pg->mdpage, VM_PAGE_TO_PHYS(pg));
PMAPCOUNT(exec_synced_kremove);
}
}
@@ -3858,7 +3858,7 @@
/* Get the current flags for this page. */
simple_lock(&pg->mdpage.pvh_slock);
- pv = pmap_find_pv(pg, pm, va);
+ pv = pmap_find_pv(&pg->mdpage, pm, va);
if (pv == NULL) {
simple_unlock(&pg->mdpage.pvh_slock);
goto out;
@@ -3917,7 +3917,7 @@
/* Get the current flags for this page. */
simple_lock(&pg->mdpage.pvh_slock);
- pv = pmap_find_pv(pg, pm, va);
+ pv = pmap_find_pv(&pg->mdpage, pm, va);
if (pv == NULL) {
simple_unlock(&pg->mdpage.pvh_slock);
goto out;
Home |
Main Index |
Thread Index |
Old Index