Module Name:    src
Committed By:   reinoud
Date:           Wed Aug 24 20:13:07 UTC 2011

Modified Files:
        src/sys/arch/usermode/usermode: pmap.c

Log Message:
Implement pmap_activate() and pmap_deactivate()
Also add some debug messages

Note that the UVM area is still unprotected (for you Jared)


To generate a diff of this commit:
cvs rdiff -u -r1.30 -r1.31 src/sys/arch/usermode/usermode/pmap.c

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/usermode/usermode/pmap.c
diff -u src/sys/arch/usermode/usermode/pmap.c:1.30 src/sys/arch/usermode/usermode/pmap.c:1.31
--- src/sys/arch/usermode/usermode/pmap.c:1.30	Wed Aug 24 12:54:46 2011
+++ src/sys/arch/usermode/usermode/pmap.c	Wed Aug 24 20:13:07 2011
@@ -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 <rein...@netbsd.org>
@@ -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 */

Reply via email to