Module Name:    src
Committed By:   jym
Date:           Sat Jun 30 22:50:37 UTC 2012

Modified Files:
        src/sys/arch/amd64/include: pmap.h
        src/sys/arch/xen/include: xenpmap.h
        src/sys/arch/xen/x86: x86_xpmap.c xen_bus_dma.c
        src/sys/arch/xen/xen: balloon.c if_xennet_xenbus.c xen_machdep.c
            xennetback_xenbus.c

Log Message:
Extend the xpmap API, as described in [1]. This change is mechanical and
avoids exposing the MD phys_to_machine/machine_to_phys tables directly.
Added:

- xpmap_ptom handles PFN (pseudo physical) to MFN (machine frame number)
translations, and is under control of the domain.
- xpmap_mtop is its counterpart (MFN to PFN), and is under control of
hypervisor.

xpmap_ptom_map()      map a pseudo-phys address to a machine address
xpmap_ptom_unmap()    unmap a pseudo-phys address (invalidation)
xpmap_ptom_isvalid()  check for pseudo-phys address validity

The parameters are physical/machine addresses, like bus_dma/bus_space(9).
As x86 MFNs are tracked by u_long (Xen's choice) while machine addresses
can be 64 bits entities (PAE), use ptoa() to avoid truncation when bit
shifting by PAGE_SHIFT.

I kept the same namespace (xpmap_) to avoid code churn.

[1] http://mail-index.netbsd.org/port-xen/2009/05/09/msg004951.html

XXX will document ptoa/atop/trunc_page separately.


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/amd64/include/pmap.h
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/xen/include/xenpmap.h
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/xen/x86/x86_xpmap.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/xen/x86/xen_bus_dma.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/xen/xen/balloon.c
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/xen/xen/if_xennet_xenbus.c
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/xen/xen/xen_machdep.c
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/xen/xen/xennetback_xenbus.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/amd64/include/pmap.h
diff -u src/sys/arch/amd64/include/pmap.h:1.33 src/sys/arch/amd64/include/pmap.h:1.34
--- src/sys/arch/amd64/include/pmap.h:1.33	Mon Jun 11 15:18:26 2012
+++ src/sys/arch/amd64/include/pmap.h	Sat Jun 30 22:50:36 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap.h,v 1.33 2012/06/11 15:18:26 chs Exp $	*/
+/*	$NetBSD: pmap.h,v 1.34 2012/06/30 22:50:36 jym Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -258,6 +258,7 @@ pmap_pte2pa(pt_entry_t pte)
 {
 	return xpmap_mtop_masked(pte & PG_FRAME);
 }
+
 static __inline void
 pmap_pte_set(pt_entry_t *pte, pt_entry_t npte)
 {

Index: src/sys/arch/xen/include/xenpmap.h
diff -u src/sys/arch/xen/include/xenpmap.h:1.36 src/sys/arch/xen/include/xenpmap.h:1.37
--- src/sys/arch/xen/include/xenpmap.h:1.36	Wed Jun 27 00:37:09 2012
+++ src/sys/arch/xen/include/xenpmap.h	Sat Jun 30 22:50:36 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: xenpmap.h,v 1.36 2012/06/27 00:37:09 jym Exp $	*/
+/*	$NetBSD: xenpmap.h,v 1.37 2012/06/30 22:50:36 jym Exp $	*/
 
 /*
  *
@@ -76,9 +76,6 @@ void xen_kpm_sync(struct pmap *, int);
 
 extern unsigned long *xpmap_phys_to_machine_mapping;
 
-#define mfn_to_pfn(mfn) (machine_to_phys_mapping[(mfn)])
-#define pfn_to_mfn(pfn) (xpmap_phys_to_machine_mapping[(pfn)])
-
 static __inline paddr_t
 xpmap_mtop_masked(paddr_t mpa)
 {
@@ -95,7 +92,8 @@ xpmap_mtop(paddr_t mpa)
 static __inline paddr_t
 xpmap_ptom_masked(paddr_t ppa)
 {
-	return (((paddr_t)xpmap_phys_to_machine_mapping[(ppa) >> PAGE_SHIFT])
+	return (
+	    (paddr_t)xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT]
 	    << PAGE_SHIFT);
 }
 
@@ -105,6 +103,26 @@ xpmap_ptom(paddr_t ppa)
 	return (xpmap_ptom_masked(ppa) | (ppa & ~PG_FRAME));
 }
 
+static __inline void
+xpmap_ptom_map(paddr_t ppa, paddr_t mpa)
+{
+	xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] = mpa >> PAGE_SHIFT;
+}
+
+static __inline void
+xpmap_ptom_unmap(paddr_t ppa)
+{
+	xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] = INVALID_P2M_ENTRY;
+}
+
+static __inline bool
+xpmap_ptom_isvalid(paddr_t ppa)
+{
+	return (
+	    xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT]
+	    != INVALID_P2M_ENTRY);
+}
+
 static inline void
 MULTI_update_va_mapping(
 	multicall_entry_t *mcl, vaddr_t va,

Index: src/sys/arch/xen/x86/x86_xpmap.c
diff -u src/sys/arch/xen/x86/x86_xpmap.c:1.45 src/sys/arch/xen/x86/x86_xpmap.c:1.46
--- src/sys/arch/xen/x86/x86_xpmap.c:1.45	Wed Jun 27 00:37:10 2012
+++ src/sys/arch/xen/x86/x86_xpmap.c	Sat Jun 30 22:50:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: x86_xpmap.c,v 1.45 2012/06/27 00:37:10 jym Exp $	*/
+/*	$NetBSD: x86_xpmap.c,v 1.46 2012/06/30 22:50:37 jym Exp $	*/
 
 /*
  * Copyright (c) 2006 Mathieu Ropert <m...@adviseo.fr>
@@ -69,7 +69,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.45 2012/06/27 00:37:10 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_xpmap.c,v 1.46 2012/06/30 22:50:37 jym Exp $");
 
 #include "opt_xen.h"
 #include "opt_ddb.h"
@@ -1092,7 +1092,7 @@ xen_set_user_pgd(paddr_t page)
 
 	xpq_flush_queue();
 	op.cmd = MMUEXT_NEW_USER_BASEPTR;
-	op.arg1.mfn = pfn_to_mfn(page >> PAGE_SHIFT);
+	op.arg1.mfn = xpmap_ptom_masked(page) >> PAGE_SHIFT;
         if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0)
 		panic("xen_set_user_pgd: failed to install new user page"
 			" directory %#" PRIxPADDR, page);

Index: src/sys/arch/xen/x86/xen_bus_dma.c
diff -u src/sys/arch/xen/x86/xen_bus_dma.c:1.24 src/sys/arch/xen/x86/xen_bus_dma.c:1.25
--- src/sys/arch/xen/x86/xen_bus_dma.c:1.24	Wed Jun 27 00:37:10 2012
+++ src/sys/arch/xen/x86/xen_bus_dma.c	Sat Jun 30 22:50:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: xen_bus_dma.c,v 1.24 2012/06/27 00:37:10 jym Exp $	*/
+/*	$NetBSD: xen_bus_dma.c,v 1.25 2012/06/30 22:50:37 jym Exp $	*/
 /*	NetBSD bus_dma.c,v 1.21 2005/04/16 07:53:35 yamt Exp */
 
 /*-
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_bus_dma.c,v 1.24 2012/06/27 00:37:10 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_bus_dma.c,v 1.25 2012/06/30 22:50:37 jym Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -90,8 +90,7 @@ _xen_alloc_contig(bus_size_t size, bus_s
 	for (pg = mlistp->tqh_first; pg != NULL; pg = pg->pageq.queue.tqe_next) {
 		pa = VM_PAGE_TO_PHYS(pg);
 		mfn = xpmap_ptom(pa) >> PAGE_SHIFT;
-		xpmap_phys_to_machine_mapping[
-		    pa >> PAGE_SHIFT] = INVALID_P2M_ENTRY;
+		xpmap_ptom_unmap(pa);
 		xenguest_handle(res.extent_start) = &mfn;
 		res.nr_extents = 1;
 		res.extent_order = 0;
@@ -104,7 +103,7 @@ _xen_alloc_contig(bus_size_t size, bus_s
 			    "failed: err %d (pa %#" PRIxPADDR " mfn %#lx)\n",
 			    error, pa, mfn);
 #endif
-			xpmap_phys_to_machine_mapping[pa >> PAGE_SHIFT] = mfn;
+			xpmap_ptom_map(pa, ptoa(mfn));
 
 			error = ENOMEM;
 			goto failed;
@@ -132,7 +131,7 @@ _xen_alloc_contig(bus_size_t size, bus_s
 	for (pg = mlistp->tqh_first, i = 0; pg != NULL; pg = pgnext, i++) {
 		pgnext = pg->pageq.queue.tqe_next;
 		pa = VM_PAGE_TO_PHYS(pg);
-		xpmap_phys_to_machine_mapping[pa >> PAGE_SHIFT] = mfn+i;
+		xpmap_ptom_map(pa, ptoa(mfn+i));
 		xpq_queue_machphys_update(((paddr_t)(mfn+i)) << PAGE_SHIFT, pa);
 		/* while here, give extra pages back to UVM */
 		if (i >= npagesreq) {
@@ -176,7 +175,7 @@ failed:
 			break;
 		}
 		pa = VM_PAGE_TO_PHYS(pg);
-		xpmap_phys_to_machine_mapping[pa >> PAGE_SHIFT] = mfn;
+		xpmap_ptom_map(pa, ptoa(mfn));
 		xpq_queue_machphys_update(((paddr_t)mfn) << PAGE_SHIFT, pa);
 		TAILQ_REMOVE(mlistp, pg, pageq.queue);
 		uvm_pagefree(pg);

Index: src/sys/arch/xen/xen/balloon.c
diff -u src/sys/arch/xen/xen/balloon.c:1.14 src/sys/arch/xen/xen/balloon.c:1.15
--- src/sys/arch/xen/xen/balloon.c:1.14	Wed Jun 27 00:37:10 2012
+++ src/sys/arch/xen/xen/balloon.c	Sat Jun 30 22:50:37 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: balloon.c,v 1.14 2012/06/27 00:37:10 jym Exp $ */
+/* $NetBSD: balloon.c,v 1.15 2012/06/30 22:50:37 jym Exp $ */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
 #define BALLOONDEBUG 0
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: balloon.c,v 1.14 2012/06/27 00:37:10 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: balloon.c,v 1.15 2012/06/30 22:50:37 jym Exp $");
 
 #include <sys/inttypes.h>
 #include <sys/device.h>
@@ -397,11 +397,8 @@ balloon_inflate(struct balloon_xenbus_so
 		mfn_list[rpages] = xpmap_ptom(pa) >> PAGE_SHIFT;
 
 		s = splvm();
-
 		/* Invalidate pg */
-		xpmap_phys_to_machine_mapping[
-		    pa >> PAGE_SHIFT] = INVALID_P2M_ENTRY;
-
+		xpmap_ptom_unmap(pa);
 		splx(s);
 
 		SLIST_INSERT_HEAD(&balloon_sc->balloon_page_entries, 
@@ -516,11 +513,8 @@ balloon_deflate(struct balloon_xenbus_so
 
 		s = splvm();
 
-		xpmap_phys_to_machine_mapping[
-		    pa >> PAGE_SHIFT] = mfn_list[rpages];
-
-		xpq_queue_machphys_update(
-		    ((paddr_t) (mfn_list[rpages])) << PAGE_SHIFT, pa);
+		xpmap_ptom_map(pa, ptoa(mfn_list[rpages]));
+		xpq_queue_machphys_update(ptoa(mfn_list[rpages]), pa);
 
 		splx(s);
 

Index: src/sys/arch/xen/xen/if_xennet_xenbus.c
diff -u src/sys/arch/xen/xen/if_xennet_xenbus.c:1.60 src/sys/arch/xen/xen/if_xennet_xenbus.c:1.61
--- src/sys/arch/xen/xen/if_xennet_xenbus.c:1.60	Wed Jun 27 00:37:10 2012
+++ src/sys/arch/xen/xen/if_xennet_xenbus.c	Sat Jun 30 22:50:37 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: if_xennet_xenbus.c,v 1.60 2012/06/27 00:37:10 jym Exp $      */
+/*      $NetBSD: if_xennet_xenbus.c,v 1.61 2012/06/30 22:50:37 jym Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -85,7 +85,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.60 2012/06/27 00:37:10 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.61 2012/06/30 22:50:37 jym Exp $");
 
 #include "opt_xen.h"
 #include "opt_nfs_boot.h"
@@ -686,7 +686,6 @@ xennet_alloc_rx_buffer(struct xennet_xen
 	struct xennet_rxreq *req;
 	struct xen_memory_reservation reservation;
 	int s, otherend_id, notify;
-	paddr_t pfn;
 
 	otherend_id = sc->sc_xbusd->xbusd_otherend_id;
 
@@ -731,9 +730,9 @@ xennet_alloc_rx_buffer(struct xennet_xen
 			 * Remove this page from pseudo phys map before
 			 * passing back to Xen.
 			 */
-			pfn = req->rxreq_pa >> PAGE_SHIFT;
-			xennet_pages[i] = xpmap_phys_to_machine_mapping[pfn];
-			xpmap_phys_to_machine_mapping[pfn] = INVALID_P2M_ENTRY;
+			xennet_pages[i] =
+			    xpmap_ptom(req->rxreq_pa) >> PAGE_SHIFT;
+			xpmap_ptom_unmap(req->rxreq_pa);
 		}
 	}
 
@@ -842,8 +841,7 @@ xennet_free_rx_buffer(struct xennet_xenb
 				MULTI_update_va_mapping(&mcl[0], va, 
 				    (ma << PAGE_SHIFT) | PG_V | PG_KW,
 				    UVMF_TLB_FLUSH|UVMF_ALL);
-				xpmap_phys_to_machine_mapping[
-				    pa >> PAGE_SHIFT] = ma;
+				xpmap_ptom_map(pa, ptoa(ma));
 				mcl[1].op = __HYPERVISOR_mmu_update;
 				mcl[1].args[0] = (unsigned long)mmu;
 				mcl[1].args[1] = 1;
@@ -1039,7 +1037,7 @@ again:
 			mmu[0].val = pa >> PAGE_SHIFT;
 			MULTI_update_va_mapping(&mcl[0], va, 
 			    (ma << PAGE_SHIFT) | PG_V | PG_KW, UVMF_TLB_FLUSH|UVMF_ALL);
-			xpmap_phys_to_machine_mapping[pa >> PAGE_SHIFT] = ma;
+			xpmap_ptom_map(pa, ptoa(ma));
 			mcl[1].op = __HYPERVISOR_mmu_update;
 			mcl[1].args[0] = (unsigned long)mmu;
 			mcl[1].args[1] = 1;

Index: src/sys/arch/xen/xen/xen_machdep.c
diff -u src/sys/arch/xen/xen/xen_machdep.c:1.10 src/sys/arch/xen/xen/xen_machdep.c:1.11
--- src/sys/arch/xen/xen/xen_machdep.c:1.10	Sun Feb 12 14:38:18 2012
+++ src/sys/arch/xen/xen/xen_machdep.c	Sat Jun 30 22:50:37 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: xen_machdep.c,v 1.10 2012/02/12 14:38:18 jym Exp $	*/
+/*	$NetBSD: xen_machdep.c,v 1.11 2012/06/30 22:50:37 jym Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -53,7 +53,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.10 2012/02/12 14:38:18 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.11 2012/06/30 22:50:37 jym Exp $");
 
 #include "opt_xen.h"
 
@@ -283,6 +283,7 @@ sysctl_xen_suspend(SYSCTLFN_ARGS)
 static void
 xen_prepare_suspend(void)
 {
+
 	kpreempt_disable();
 
 	pmap_xen_suspend();
@@ -292,8 +293,10 @@ xen_prepare_suspend(void)
 	 * save/restore code does not translate these MFNs to their
 	 * associated PFNs, so we must do it
 	 */
-	xen_start_info.store_mfn = mfn_to_pfn(xen_start_info.store_mfn);
-	xen_start_info.console_mfn = mfn_to_pfn(xen_start_info.console_mfn);
+	xen_start_info.store_mfn =
+	    atop(xpmap_mtop(ptoa(xen_start_info.store_mfn)));
+	xen_start_info.console_mfn =
+	    atop(xpmap_mtop(ptoa(xen_start_info.console_mfn)));
 
 	DPRINTK(("suspending domain\n"));
 	aprint_verbose("suspending domain\n");

Index: src/sys/arch/xen/xen/xennetback_xenbus.c
diff -u src/sys/arch/xen/xen/xennetback_xenbus.c:1.48 src/sys/arch/xen/xen/xennetback_xenbus.c:1.49
--- src/sys/arch/xen/xen/xennetback_xenbus.c:1.48	Wed Jun 27 00:37:10 2012
+++ src/sys/arch/xen/xen/xennetback_xenbus.c	Sat Jun 30 22:50:37 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: xennetback_xenbus.c,v 1.48 2012/06/27 00:37:10 jym Exp $      */
+/*      $NetBSD: xennetback_xenbus.c,v 1.49 2012/06/30 22:50:37 jym Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.48 2012/06/27 00:37:10 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.49 2012/06/30 22:50:37 jym Exp $");
 
 #include "opt_xen.h"
 
@@ -1048,8 +1048,7 @@ xennetback_ifsoftstart_transfer(void *ar
 			 * transfers the page containing the packet to the
 			 * remote domain, and map newp in place.
 			 */
-			xpmap_phys_to_machine_mapping[xmit_pa >> PAGE_SHIFT]
-			    = newp_ma >> PAGE_SHIFT;
+			xpmap_ptom_map(xmit_pa, newp_ma);
 			MULTI_update_va_mapping(mclp, xmit_va,
 			    newp_ma | PG_V | PG_RW | PG_U | PG_M, 0);
 			mclp++;

Reply via email to