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