Module Name:    src
Committed By:   reinoud
Date:           Thu Aug 25 19:06:58 UTC 2011

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

Log Message:
Implement pmap_deactivate() and most importantly, share changes! i.e. it
should map in the SAME page and not a COW clone of the origional.


To generate a diff of this commit:
cvs rdiff -u -r1.35 -r1.36 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.35 src/sys/arch/usermode/usermode/pmap.c:1.36
--- src/sys/arch/usermode/usermode/pmap.c:1.35	Thu Aug 25 15:06:09 2011
+++ src/sys/arch/usermode/usermode/pmap.c	Thu Aug 25 19:06:58 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.35 2011/08/25 15:06:09 reinoud Exp $ */
+/* $NetBSD: pmap.c,v 1.36 2011/08/25 19:06:58 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.35 2011/08/25 15:06:09 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.36 2011/08/25 19:06:58 reinoud Exp $");
 
 #include "opt_memsize.h"
 #include "opt_kmempages.h"
@@ -86,6 +86,7 @@
 /* forwards */
 void		pmap_bootstrap(void);
 static void	pmap_page_activate(struct pv_entry *pv);
+static void	pmap_page_deactivate(struct pv_entry *pv);
 static void	pv_update(struct pv_entry *pv);
 static void	pmap_update_page(uintptr_t ppn);
 
@@ -428,7 +429,7 @@
 	void *addr;
 
 	addr = thunk_mmap((void *) va, PAGE_SIZE, pv->pv_mmap_ppl,
-		MAP_FILE | MAP_FIXED,
+		MAP_FILE | MAP_FIXED | MAP_SHARED,
 		mem_fh, pa);
 	aprint_debug("page_activate: (va %p, pa %p, ppl %d) -> %p\n",
 		(void *) va, (void *) pa, pv->pv_mmap_ppl, (void *) addr);
@@ -437,6 +438,22 @@
 }
 
 static void
+pmap_page_deactivate(struct pv_entry *pv)
+{
+	paddr_t pa = pv->pv_ppn * PAGE_SIZE;
+	vaddr_t va = pv->pv_lpn * PAGE_SIZE + VM_MIN_ADDRESS; /* L->V */
+	void *addr;
+
+	addr = thunk_mmap((void *) va, PAGE_SIZE, PROT_NONE,
+		MAP_FILE | MAP_FIXED | MAP_SHARED,
+		mem_fh, pa);
+	aprint_debug("page_deactivate: (va %p, pa %p, ppl %d) -> %p\n",
+		(void *) va, (void *) pa, pv->pv_mmap_ppl, (void *) addr);
+	if (addr != (void *) va)
+		panic("pmap_page_deactivate: mmap failed");
+}
+
+static void
 pv_update(struct pv_entry *pv)
 {
 	int pflags;
@@ -605,7 +622,7 @@
 		pv = pmap->pm_entries[lpn];
 		if (pv != NULL) {
 			if (pmap->pm_flags & PM_ACTIVE) {
-aprint_debug("pmap_remove: haven't removed old mmap yet\n");
+				pmap_page_deactivate(pv);
 //				MEMC_WRITE(pv->pv_deactivate);
 //				cpu_cache_flush();
 			}
@@ -722,7 +739,7 @@
 	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");
+			pmap_page_deactivate(pmap->pm_entries[i]);
 //			MEMC_WRITE(pmap->pm_entries[i]->pv_deactivate);
 		}
 	}

Reply via email to