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++;