Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/usermode/usermode Implement pmap_activate() and pma...
details: https://anonhg.NetBSD.org/src/rev/dc22b4bfe7f2
branches: trunk
changeset: 768685:dc22b4bfe7f2
user: reinoud <reinoud%NetBSD.org@localhost>
date: Wed Aug 24 20:13:07 2011 +0000
description:
Implement pmap_activate() and pmap_deactivate()
Also add some debug messages
Note that the UVM area is still unprotected (for you Jared)
diffstat:
sys/arch/usermode/usermode/pmap.c | 55 ++++++++++++++++++++++++++++++++++----
1 files changed, 48 insertions(+), 7 deletions(-)
diffs (121 lines):
diff -r c60d11c102b1 -r dc22b4bfe7f2 sys/arch/usermode/usermode/pmap.c
--- a/sys/arch/usermode/usermode/pmap.c Wed Aug 24 20:03:19 2011 +0000
+++ b/sys/arch/usermode/usermode/pmap.c Wed Aug 24 20:13:07 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.30 2011/08/24 12:54:46 reinoud Exp $ */
+/* $NetBSD: pmap.c,v 1.31 2011/08/24 20:13:07 reinoud Exp $ */
/*-
* Copyright (c) 2011 Reinoud Zandijk <reinoud%NetBSD.org@localhost>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.30 2011/08/24 12:54:46 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.31 2011/08/24 20:13:07 reinoud Exp $");
#include "opt_memsize.h"
#include "opt_kmempages.h"
@@ -71,6 +71,8 @@
static struct pmap pmap_kernel_store;
struct pmap * const kernel_pmap_ptr = &pmap_kernel_store;
+static pmap_t active_pmap = NULL;
+
static char mem_name[20] = "";
static int mem_fh;
static void *mem_uvm; /* keeps all memory managed by UVM */
@@ -141,7 +143,9 @@
uvm_len = kmem_len + barrier_len + user_len + barrier_len + 2*PAGE_SIZE;
mem_uvm = thunk_malloc(uvm_len);
/* make page aligned */
- mpos = round_page((vaddr_t) mem_uvm) + PAGE_SIZE;
+ mpos = round_page((vaddr_t) mem_uvm);// + PAGE_SIZE;
+ if (!((void *) mpos >= mem_uvm))
+ panic("pmap_bootstrap: mpos miscalculation");
/* low barrier (---) */
mpos += barrier_len;
@@ -337,6 +341,7 @@
pmap->pm_entries = (struct pv_entry **) malloc(
pm_entries_size, M_VMPMAP,
M_WAITOK | M_ZERO);
+ aprint_debug("\tpmap %p\n", pmap);
return pmap;
}
@@ -427,7 +432,6 @@
panic("pmap_page_activate: mmap failed");
}
-
static void
pv_update(struct pv_entry *pv)
{
@@ -456,6 +460,8 @@
struct pv_entry *pv;
for (pv = &pv_table[ppn]; pv != NULL; pv = pv->pv_next) {
+ aprint_debug("pmap_update_page: ppn %"PRIdPTR", pv->pv_map = %p\n",
+ ppn, pv->pv_pmap);
if (pv->pv_pmap != NULL) {
pv_update(pv);
pmap_page_activate(pv);
@@ -668,19 +674,54 @@
void
pmap_update(pmap_t pmap)
{
-aprint_debug("pmap_update not implemented\n");
+ aprint_debug("pmap_update (dummy)\n");
}
void
pmap_activate(struct lwp *l)
{
-aprint_debug("pmap_activate not implemented\n");
+ struct proc *p = l->l_proc;
+ pmap_t pmap;
+
+ pmap = p->p_vmspace->vm_map.pmap;
+ aprint_debug("pmap_activate for lwp %p, pmap = %p\n", l, pmap);
+
+ if (pmap == pmap_kernel())
+ return; /* kernel pmap is always active */
+
+ KASSERT(active_pmap == NULL);
+ KASSERT((pmap->pm_flags & PM_ACTIVE) == 0);
+
+ active_pmap = pmap;
+ pmap->pm_flags |= PM_ACTIVE;
}
void
pmap_deactivate(struct lwp *l)
{
-aprint_debug("pmap_deactivate not implemented\n");
+ struct proc *p = l->l_proc;
+ pmap_t pmap;
+ int i;
+
+ pmap = p->p_vmspace->vm_map.pmap;
+ aprint_debug("pmap_DEactivate for lwp %p, pmap = %p\n", l, pmap);
+
+ if (pmap == pmap_kernel())
+ return; /* kernel pmap is always active */
+
+ KASSERT(pmap == active_pmap);
+ KASSERT(pmap->pm_flags & PM_ACTIVE);
+
+ active_pmap = NULL;
+ pmap->pm_flags &=~ PM_ACTIVE;
+ for (i = 0; i < 1024; i++) {
+ if (pmap->pm_entries[i] != NULL) {
+ aprint_debug("pmap_deactivate: TODO unmap memory!\n");
+// MEMC_WRITE(pmap->pm_entries[i]->pv_deactivate);
+ }
+ }
+ /* dummy */
+ cpu_cache_flush();
}
/* XXX braindead zero_page implementation but it works for now */
Home |
Main Index |
Thread Index |
Old Index