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 <[email protected]>
@@ -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);
}
}