From owner-svn-src-projects@FreeBSD.ORG  Tue Jan  8 01:40:01 2013
Return-Path: <owner-svn-src-projects@FreeBSD.ORG>
Delivered-To: svn-src-projects@freebsd.org
Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115])
 by hub.freebsd.org (Postfix) with ESMTP id 6C01CAF4;
 Tue,  8 Jan 2013 01:40:01 +0000 (UTC)
 (envelope-from cherry@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org
 [IPv6:2001:1900:2254:2068::e6a:0])
 by mx1.freebsd.org (Postfix) with ESMTP id 5E2E61B8;
 Tue,  8 Jan 2013 01:40:01 +0000 (UTC)
Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70])
 by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id r081e1Sc062773;
 Tue, 8 Jan 2013 01:40:01 GMT (envelope-from cherry@svn.freebsd.org)
Received: (from cherry@localhost)
 by svn.freebsd.org (8.14.5/8.14.5/Submit) id r081e05a062768;
 Tue, 8 Jan 2013 01:40:00 GMT (envelope-from cherry@svn.freebsd.org)
Message-Id: <201301080140.r081e05a062768@svn.freebsd.org>
From: "Cherry G. Mathew" <cherry@FreeBSD.org>
Date: Tue, 8 Jan 2013 01:40:00 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject: svn commit: r245143 - in projects/amd64_xen_pv/sys/amd64: include xen
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.14
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
 tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/options/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
 <mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Tue, 08 Jan 2013 01:40:01 -0000

Author: cherry
Date: Tue Jan  8 01:40:00 2013
New Revision: 245143
URL: http://svnweb.freebsd.org/changeset/base/245143

Log:
  Since we don't yet have dmap, we temporarily map in pte space before modifying it.
  
  Approved by: gibbs (implicit)

Modified:
  projects/amd64_xen_pv/sys/amd64/include/pmap.h
  projects/amd64_xen_pv/sys/amd64/xen/machdep.c
  projects/amd64_xen_pv/sys/amd64/xen/pmap.c

Modified: projects/amd64_xen_pv/sys/amd64/include/pmap.h
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/include/pmap.h	Tue Jan  8 01:33:22 2013	(r245142)
+++ projects/amd64_xen_pv/sys/amd64/include/pmap.h	Tue Jan  8 01:40:00 2013	(r245143)
@@ -190,7 +190,13 @@ extern u_int64_t KPML4phys;	/* physical 
  * Note: these work recursively, thus vtopte of a pte will give
  * the corresponding pde that in turn maps it.
  */
+
+#ifdef XEN
+pt_entry_t *vtopte_hold(vm_offset_t, void *);
+void vtopte_release(vm_offset_t, void *);
+#else
 pt_entry_t *vtopte(vm_offset_t);
+#endif
 #define	vtophys(va)	pmap_kextract(((vm_offset_t) (va)))
 
 static __inline pt_entry_t

Modified: projects/amd64_xen_pv/sys/amd64/xen/machdep.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/machdep.c	Tue Jan  8 01:33:22 2013	(r245142)
+++ projects/amd64_xen_pv/sys/amd64/xen/machdep.c	Tue Jan  8 01:40:00 2013	(r245143)
@@ -554,7 +554,7 @@ initxen(struct start_info *si)
 
 	/* setup proc 0's pcb */
 	thread0.td_pcb->pcb_flags = 0;
-	thread0.td_pcb->pcb_cr3 = KPML4phys;
+	thread0.td_pcb->pcb_cr3 = VTOP(KPML4phys);
 	thread0.td_frame = &proc0_tf;
 
         env = getenv("kernelname");

Modified: projects/amd64_xen_pv/sys/amd64/xen/pmap.c
==============================================================================
--- projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Tue Jan  8 01:33:22 2013	(r245142)
+++ projects/amd64_xen_pv/sys/amd64/xen/pmap.c	Tue Jan  8 01:40:00 2013	(r245143)
@@ -669,7 +669,7 @@ pmap_init(void)
 	va = kmem_alloc_nofault(kernel_map, PAGE_SIZE);
 	KASSERT(va != 0, ("Could not allocate KVA for console page!\n"));
 
-	pmap_kenter(va, xpmap_mtop(console_ma));
+	pmap_kenter_ma(va, console_ma);
 	console_page = (void *)va;
 }
 
@@ -730,12 +730,11 @@ pmap_release(pmap_t pmap)
 }
 
 pt_entry_t *
-vtopte(uintptr_t va)
+vtopte_hold(uintptr_t va, void *addr)
 {
-	KASSERT(tsz != 0, ("tsz != 0"));
-	char tbuf[tsz]; /* Safe to do this on the stack since tsz is
-			 * effectively const.
-			 */
+	KASSERT(addr != NULL, ("addr == NULL"));
+
+	mmu_map_t tptr = *(mmu_map_t *)addr;
 
 	const uint64_t SIGNMASK = (1UL << 48) - 1;
 
@@ -743,15 +742,13 @@ vtopte(uintptr_t va)
 
 	pd_entry_t *pte; /* PTE address to return */
 
-
-	mmu_map_t tptr = tbuf;
-
 	struct mmu_map_mbackend mb = {
 		ptmb_mappedalloc,
 		ptmb_mappedfree,
 		ptmb_ptov,
 		ptmb_vtop
 	};
+
 	mmu_map_t_init(tptr, &mb);
 
 	if (!mmu_map_inspect_va(kernel_pmap, tptr, va)) {
@@ -763,10 +760,20 @@ vtopte(uintptr_t va)
 	/* add VA offset */
 	pte += (va & PDRMASK) >> PAGE_SHIFT;
 
+	return pte;
+}
+
+void
+vtopte_release(uintptr_t va, void *addr)
+{
+	mmu_map_t tptr = *(mmu_map_t *)addr;
+	const uint64_t SIGNMASK = (1UL << 48) - 1;
+
+	va &= SIGNMASK; /* Remove sign extension */
+
 	mmu_map_release_va(kernel_pmap, tptr, va);
 	mmu_map_t_fini(tptr);
 
-	return pte;
 }
 
 #ifdef SMP
@@ -968,8 +975,7 @@ pmap_kextract_ma(vm_offset_t va)
 	mmu_map_t_fini(tptr);
 
 nomapping:
-	/* XXX: why do we need to  enforce alignment ? */
-	return ma & ~0x7UL;
+	return (ma & PG_FRAME) | (va & ~PG_FRAME);
 }
 
 /***************************************************
@@ -1029,7 +1035,6 @@ pmap_kenter_ma(vm_offset_t va, vm_paddr_
 	PT_SET_MA(va, ma | PG_RW | PG_V | PG_U);
 	PT_UPDATES_FLUSH();
 
-	mmu_map_release_va(kernel_pmap, tptr, va);
 	mmu_map_t_fini(tptr);
 }
 
@@ -1045,14 +1050,21 @@ pmap_kremove(vm_offset_t va)
 {
 	pt_entry_t *pte;
 
-	pte = vtopte(va);
+	char tbuf[tsz]; /* Safe to do this on the stack since tsz is
+			 * effectively const.
+			 */
+
+	mmu_map_t tptr = tbuf;
+
+	pte = vtopte_hold(va, &tptr);
 	if (pte == NULL) { /* Mapping doesn't exist */
 		return;
 	}
 
-	PT_CLEAR_VA(pte, FALSE);
-
+	PT_CLEAR_VA(pte, TRUE);
 	PT_UPDATES_FLUSH();
+
+	//	vtopte_release(va, &tptr);
 }
 
 /*