svn commit: r237723 - projects/amd64_xen_pv/sys/amd64/xen

Cherry G. Mathew cherry at FreeBSD.org
Thu Jun 28 19:19:39 UTC 2012


Author: cherry
Date: Thu Jun 28 19:19:38 2012
New Revision: 237723
URL: http://svn.freebsd.org/changeset/base/237723

Log:
  Initialise kernel and process0 pmaps.
  
  Approved by:	gibbs (implicit)

Modified:
  projects/amd64_xen_pv/sys/amd64/xen/pmap.c

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Thu Jun 28 18:52:40 2012	(r237722)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Thu Jun 28 19:19:38 2012	(r237723)
@@ -119,6 +119,7 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/cpuset.h>
 #include <sys/ktr.h>
 #include <sys/lock.h>
 #include <sys/msgbuf.h>
@@ -615,14 +616,51 @@ pmap_init(void)
 void
 pmap_pinit0(pmap_t pmap)
 {
-	KASSERT(0, ("XXX: TODO\n"));
+	PMAP_LOCK_INIT(pmap);
+	pmap->pm_pml4 = (void *) KPML4phys;
+	pmap->pm_root = NULL;
+	CPU_ZERO(&pmap->pm_active);
+	PCPU_SET(curpmap, pmap);
+	TAILQ_INIT(&pmap->pm_pvchunk);
+	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
 }
 
 int
 pmap_pinit(pmap_t pmap)
 {
-	KASSERT(0, ("XXX: TODO\n"));
-	return -1;
+
+	KASSERT(pmap != kernel_pmap, 
+		("kernel map re-initialised!"));
+
+	PMAP_LOCK_INIT(pmap);
+
+	/*
+	 * allocate the page directory page
+	 */
+	pmap->pm_pml4 = (void *) kmem_alloc(kernel_map, PAGE_SIZE);
+	bzero(pmap->pm_pml4, PAGE_SIZE);
+
+	/* 
+	 * We do not wire in kernel space, or the self-referencial
+	 * entry in userspace pmaps for two reasons:
+	 * i)  both kernel and userland run in ring3 (same CPU
+	 *     privilege level). This means that userland that has kernel
+	 *     address space mapped in, can access kernel memory!
+	 *     Instead, we make the kernel pmap is exclusive and
+	 *     unshared, and we switch to it on *every* kernel
+	 *     entry. This is facilitated by the hypervisor.
+	 * ii) we access the user pmap from within kernel VA. The
+	 *     self-referencing entry is useful if we access the pmap
+	 *     from the *user* VA.
+	 * XXX: review this when userland is up.
+	 */
+
+	pmap->pm_root = NULL;
+	CPU_ZERO(&pmap->pm_active);
+	TAILQ_INIT(&pmap->pm_pvchunk);
+	bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
+
+	return 1;
 }
 
 void
@@ -737,6 +775,7 @@ void *
 pmap_kenter_temporary(vm_paddr_t pa, int i)
 {
 	KASSERT(0, ("XXX: TODO\n"));
+	return NULL;
 }
 
 void


More information about the svn-src-projects mailing list