Module Name:    src
Committed By:   bouyer
Date:           Thu Sep  1 12:29:00 UTC 2022

Modified Files:
        src/sys/arch/xen/x86: xen_shm_machdep.c
        src/sys/arch/xen/xen: pciback.c xbdback_xenbus.c xennetback_xenbus.c

Log Message:
Add PVH support for backend drivers grant operation.
Now a domU in a PVH dom0 boots multiuser.


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/xen/x86/xen_shm_machdep.c
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/xen/xen/pciback.c
cvs rdiff -u -r1.99 -r1.100 src/sys/arch/xen/xen/xbdback_xenbus.c
cvs rdiff -u -r1.105 -r1.106 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/xen/x86/xen_shm_machdep.c
diff -u src/sys/arch/xen/x86/xen_shm_machdep.c:1.17 src/sys/arch/xen/x86/xen_shm_machdep.c:1.18
--- src/sys/arch/xen/x86/xen_shm_machdep.c:1.17	Sun Feb 21 20:11:59 2021
+++ src/sys/arch/xen/x86/xen_shm_machdep.c	Thu Sep  1 12:29:00 2022
@@ -1,4 +1,4 @@
-/*      $NetBSD: xen_shm_machdep.c,v 1.17 2021/02/21 20:11:59 jdolecek Exp $      */
+/*      $NetBSD: xen_shm_machdep.c,v 1.18 2022/09/01 12:29:00 bouyer Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -25,7 +25,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_shm_machdep.c,v 1.17 2021/02/21 20:11:59 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_shm_machdep.c,v 1.18 2022/09/01 12:29:00 bouyer Exp $");
+
+#include "opt_xen.h"
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -39,6 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: xen_shm_mach
 #include <xen/hypervisor.h>
 #include <xen/xen.h>
 #include <xen/evtchn.h>
+#include <xen/xenmem.h>
 #include <xen/xen_shm.h>
 
 /*
@@ -58,15 +61,28 @@ xen_shm_map(int nentries, int domid, gra
 {
 	gnttab_map_grant_ref_t op[XENSHM_MAX_PAGES_PER_REQUEST];
 	int ret, i;
+#ifndef XENPV
+	paddr_t base_paddr;
+#endif
+	
 
 #ifdef DIAGNOSTIC
 	if (nentries > XENSHM_MAX_PAGES_PER_REQUEST) {
 		panic("xen_shm_map: %d entries", nentries);
 	}
 #endif
+#ifndef XENPV
+	base_paddr = xenmem_alloc_pa(nentries * PAGE_SIZE, PAGE_SIZE, false);
+	if (base_paddr == 0)
+		return ENOMEM;
+#endif
 
 	for (i = 0; i < nentries; i++) {
+#ifndef XENPV
+		op[i].host_addr = base_paddr + i * PAGE_SIZE;
+#else
 		op[i].host_addr = va + i * PAGE_SIZE;
+#endif
 		op[i].dom = domid;
 		op[i].ref = grefp[i];
 		op[i].flags = GNTMAP_host_map |
@@ -79,7 +95,8 @@ xen_shm_map(int nentries, int domid, gra
 		printf("%s: HYPERVISOR_grant_table_op failed %d\n", __func__,
 		    ret);
 #endif
-		return EINVAL;
+		ret = EINVAL;
+		goto err1;
 	}
 
 	/*
@@ -116,7 +133,12 @@ xen_shm_map(int nentries, int domid, gra
 		 */
 		for (i = uncnt = 0; i < nentries; i++) {
 			if (op[i].status == 0) {
+#ifndef XENPV
+				unop[uncnt].host_addr =
+				    base_paddr + i * PAGE_SIZE;
+#else
 				unop[uncnt].host_addr = va + i * PAGE_SIZE;
+#endif
 				unop[uncnt].dev_bus_addr = 0;
 				unop[uncnt].handle = handlep[i];
 				uncnt++;
@@ -134,10 +156,23 @@ xen_shm_map(int nentries, int domid, gra
 		printf("%s: HYPERVISOR_grant_table_op bad entry\n",
 		    __func__);
 #endif
-		return EINVAL;
+		ret =  EINVAL;
+		goto err1;
+	}
+#ifndef XENPV
+	for (i = 0; i < nentries; i++) {
+		pmap_kenter_pa(va + i * PAGE_SIZE,
+		    base_paddr + i * PAGE_SIZE,
+		    VM_PROT_READ | VM_PROT_WRITE, 0);
 	}
+#endif
 
 	return 0;
+err1:
+#ifndef XENPV
+	xenmem_free_pa(base_paddr, nentries * PAGE_SIZE);
+#endif
+	return ret;
 }
 
 void
@@ -145,6 +180,11 @@ xen_shm_unmap(vaddr_t va, int nentries, 
 {
 	gnttab_unmap_grant_ref_t op[XENSHM_MAX_PAGES_PER_REQUEST];
 	int ret, i;
+#ifndef XENPV
+	paddr_t base_paddr;
+	if (pmap_extract(pmap_kernel(), va, &base_paddr) != true)
+		panic("xen_shm_unmap: unmapped va");
+#endif
 
 #ifdef DIAGNOSTIC
 	if (nentries > XENSHM_MAX_PAGES_PER_REQUEST) {
@@ -153,7 +193,12 @@ xen_shm_unmap(vaddr_t va, int nentries, 
 #endif
 
 	for (i = 0; i < nentries; i++) {
+#ifndef XENPV
+		pmap_kremove(va + i * PAGE_SIZE, PAGE_SIZE);
+		op[i].host_addr = base_paddr + i * PAGE_SIZE;
+#else
 		op[i].host_addr = va + i * PAGE_SIZE;
+#endif
 		op[i].dev_bus_addr = 0;
 		op[i].handle = handlep[i];
 	}
@@ -163,4 +208,7 @@ xen_shm_unmap(vaddr_t va, int nentries, 
 	if (__predict_false(ret)) {
 		panic("xen_shm_unmap: unmap failed");
 	}
+#ifndef XENPV
+	xenmem_free_pa(base_paddr, PAGE_SIZE * nentries);
+#endif
 }

Index: src/sys/arch/xen/xen/pciback.c
diff -u src/sys/arch/xen/xen/pciback.c:1.21 src/sys/arch/xen/xen/pciback.c:1.22
--- src/sys/arch/xen/xen/pciback.c:1.21	Tue Apr  7 11:47:06 2020
+++ src/sys/arch/xen/xen/pciback.c	Thu Sep  1 12:29:00 2022
@@ -1,4 +1,4 @@
-/*      $NetBSD: pciback.c,v 1.21 2020/04/07 11:47:06 jdolecek Exp $      */
+/*      $NetBSD: pciback.c,v 1.22 2022/09/01 12:29:00 bouyer Exp $      */
 
 /*
  * Copyright (c) 2009 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.21 2020/04/07 11:47:06 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.22 2022/09/01 12:29:00 bouyer Exp $");
 
 #include "opt_xen.h"
 
@@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: pciback.c,v 
 #include <xen/hypervisor.h>
 #include <xen/evtchn.h>
 #include <xen/granttables.h>
+#include <xen/xenmem.h>
 #include <xen/include/public/io/pciif.h>
 #include <xen/xenbus.h>
 
@@ -188,6 +189,7 @@ struct pb_xenbus_instance {
 	/* communication with the domU */
         unsigned int pbx_evtchn; /* our even channel */
 	struct intrhand *pbx_ih;
+        paddr_t *pbx_sh_info_pa;
         struct xen_pci_sharedinfo *pbx_sh_info;
         struct xen_pci_op op;
         grant_handle_t pbx_shinfo_handle; /* to unmap shared page */
@@ -529,8 +531,13 @@ pciback_xenbus_destroy(void *arg)
 	    pbxi, pb_xenbus_instance, pbx_next);
 	mutex_exit(&pb_xenbus_lock);
 
+
 	if (pbxi->pbx_sh_info) {
+#ifndef XENPV
+		op.host_addr = pbxi->pbx_sh_info_pa;
+#else
 		op.host_addr = (vaddr_t)pbxi->pbx_sh_info;
+#endif
 		op.handle = pbxi->pbx_shinfo_handle;
 		op.dev_bus_addr = 0;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -539,6 +546,12 @@ pciback_xenbus_destroy(void *arg)
 			aprint_error("pciback: unmap_grant_ref failed: %d\n",
 			    err);
 	}
+#ifndef XENPV
+	if (pbxi->pbx_sh_info_pa) {
+		pmap_kremove((vaddr_t)pbxi->pbx_sh_info, PAGE_SIZE);
+		xenmem_free_pa(pbxi->pbx_sh_info_pa, PAGE_SIZE);
+	}
+#endif
 	SLIST_FOREACH(pbd, &pbxi->pbx_pb_pci_dev, pb_guest_next) {
 		pbd->pbx_instance = NULL;
 	}
@@ -593,7 +606,20 @@ pciback_xenbus_frontend_changed(void *ar
 			    xbusd->xbusd_otherend);
 			break;
 		}
+#ifndef XENPV
+		pbxi->pbx_sh_info_pa =
+		    xenmem_alloc_pa(PAGE_SIZE, PAGE_SIZE, false);
+		if (pbxi->pbx_sh_info_pa == 0) {
+			xenbus_dev_fatal(xbusd, ENOMEM,
+			    "can't get PA for ring", xbusd->xbusd_otherend);
+			goto err2;
+		}
+		pmap_kenter_pa((vaddr_t)pbxi->pbx_sh_info, pbxi->pbx_sh_info_pa,
+		    VM_PROT_READ | VM_PROT_WRITE, 0);
+		op.host_addr = pbxi->pbx_sh_info_pa;
+#else
 		op.host_addr = (vaddr_t)pbxi->pbx_sh_info;
+#endif
 		op.flags = GNTMAP_host_map;
 		op.ref = shared_ref;
 		op.dom = pbxi->pbx_domid;
@@ -640,6 +666,11 @@ pciback_xenbus_frontend_changed(void *ar
 	}
 	return;
 err1:
+#ifndef XENPV
+	pmap_kremove((vaddr_t)pbxi->pbx_sh_info, PAGE_SIZE);
+	xenmem_free_pa(pbxi->pbx_sh_info_pa, PAGE_SIZE);
+err2:
+#endif
 	uvm_km_free(kernel_map, (vaddr_t)pbxi->pbx_sh_info,
 	    PAGE_SIZE, UVM_KMF_VAONLY);
 }

Index: src/sys/arch/xen/xen/xbdback_xenbus.c
diff -u src/sys/arch/xen/xen/xbdback_xenbus.c:1.99 src/sys/arch/xen/xen/xbdback_xenbus.c:1.100
--- src/sys/arch/xen/xen/xbdback_xenbus.c:1.99	Wed Jul 28 22:17:49 2021
+++ src/sys/arch/xen/xen/xbdback_xenbus.c	Thu Sep  1 12:29:00 2022
@@ -1,4 +1,4 @@
-/*      $NetBSD: xbdback_xenbus.c,v 1.99 2021/07/28 22:17:49 jdolecek Exp $      */
+/*      $NetBSD: xbdback_xenbus.c,v 1.100 2022/09/01 12:29:00 bouyer Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.99 2021/07/28 22:17:49 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.100 2022/09/01 12:29:00 bouyer Exp $");
+
+#include "opt_xen.h"
 
 #include <sys/buf.h>
 #include <sys/condvar.h>
@@ -46,8 +48,10 @@ __KERNEL_RCSID(0, "$NetBSD: xbdback_xenb
 #include <sys/types.h>
 #include <sys/vnode.h>
 
+#include <xen/intr.h>
 #include <xen/hypervisor.h>
 #include <xen/xen.h>
+#include <xen/xenmem.h>
 #include <xen/xen_shm.h>
 #include <xen/evtchn.h>
 #include <xen/xenbus.h>
@@ -207,6 +211,7 @@ struct xbdback_instance {
 	enum xbdi_proto xbdi_proto;
 	grant_handle_t xbdi_ring_handle; /* to unmap the ring */
 	vaddr_t xbdi_ring_va; /* to unmap the ring */
+	paddr_t xbdi_ring_pa; /* to unmap the ring */
 	/* disconnection must be postponed until all I/O is done */
 	int xbdi_refcnt;
 	/* 
@@ -432,10 +437,18 @@ xbdback_xenbus_destroy(void *arg)
 	/* unregister watch */
 	if (xbdi->xbdi_watch.node)
 		xenbus_unwatch_path(&xbdi->xbdi_watch);
-
 	/* unmap ring */
-	if (xbdi->xbdi_ring_va != 0) {
-		ungrop.host_addr = xbdi->xbdi_ring_va;
+#ifndef XENPV
+	ungrop.host_addr = xbdi->xbdi_ring_pa;
+	if (xbdi->xbdi_ring_pa != 0) {
+		KASSERT(xbdi->xbdi_ring_va != 0);
+		pmap_kremove(xbdi->xbdi_ring_va, PAGE_SIZE);
+	}
+#else
+	ungrop.host_addr = xbdi->xbdi_ring_va;
+#endif
+	
+	if (ungrop.host_addr != 0) {
 		ungrop.handle = xbdi->xbdi_ring_handle;
 		ungrop.dev_bus_addr = 0;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -443,9 +456,16 @@ xbdback_xenbus_destroy(void *arg)
 		if (err)
 		    printf("xbdback %s: unmap_grant_ref failed: %d\n",
 			xbusd->xbusd_otherend, err);
+#ifndef XENPV
+		xenmem_free_pa(xbdi->xbdi_ring_pa, PAGE_SIZE);
+#endif
+	}
+
+	if (xbdi->xbdi_ring_va != 0) {
 		uvm_km_free(kernel_map, xbdi->xbdi_ring_va,
 		    PAGE_SIZE, UVM_KMF_VAONLY);
 	}
+
 	/* close device */
 	if (xbdi->xbdi_size) {
 		const char *name;
@@ -542,8 +562,19 @@ xbdback_connect(struct xbdback_instance 
 		return -1;
 	}
 	XENPRINTF(("xbdback %s: connect va 0x%" PRIxVADDR "\n", xbusd->xbusd_path, xbdi->xbdi_ring_va));
-
+#ifndef XENPV
+	xbdi->xbdi_ring_pa = xenmem_alloc_pa(PAGE_SIZE, PAGE_SIZE, false);
+	if (xbdi->xbdi_ring_pa == 0) {
+		xenbus_dev_fatal(xbusd, ENOMEM,
+		    "can't get PA for ring", xbusd->xbusd_otherend);
+		goto err;
+	}
+	pmap_kenter_pa(xbdi->xbdi_ring_va, xbdi->xbdi_ring_pa,
+		    VM_PROT_READ | VM_PROT_WRITE, 0);
+	grop.host_addr = xbdi->xbdi_ring_pa;
+#else
 	grop.host_addr = xbdi->xbdi_ring_va;
+#endif
 	grop.flags = GNTMAP_host_map;
 	grop.ref = ring_ref;
 	grop.dom = xbdi->xbdi_domid;
@@ -554,7 +585,7 @@ xbdback_connect(struct xbdback_instance 
 		    xbusd->xbusd_path, err, grop.status);
 		xenbus_dev_fatal(xbusd, EINVAL,
 		    "can't map ring", xbusd->xbusd_otherend);
-		goto err;
+		goto err1;
 	}
 	xbdi->xbdi_ring_handle = grop.handle;
 	XENPRINTF(("xbdback %s: connect grhandle %d\n", xbusd->xbusd_path, grop.handle));
@@ -592,12 +623,12 @@ xbdback_connect(struct xbdback_instance 
 		    "can't bind event channel", xbusd->xbusd_otherend);
 		goto err2;
 	}
-	XENPRINTF(("xbdback %s: connect evchannel %d\n", xbusd->xbusd_path, xbdi->xbdi_evtchn));
 	xbdi->xbdi_evtchn = evop.u.bind_interdomain.local_port;
+	XENPRINTF(("xbdback %s: connect evchannel %d\n", xbusd->xbusd_path, xbdi->xbdi_evtchn));
 
-	xbdi->xbdi_ih = intr_establish_xname(-1, &xen_pic, xbdi->xbdi_evtchn,
-	    IST_LEVEL, IPL_BIO, xbdback_evthandler, xbdi, true,
-	    xbdi->xbdi_name);
+	xbdi->xbdi_ih = xen_intr_establish_xname(-1, &xen_pic,
+	    xbdi->xbdi_evtchn, IST_LEVEL, IPL_BIO, xbdback_evthandler, xbdi,
+	    true, xbdi->xbdi_name);
 	KASSERT(xbdi->xbdi_ih != NULL);
 	aprint_verbose("xbd backend domain %d handle %#x (%d) "
 	    "using event channel %d, protocol %s\n", xbdi->xbdi_domid,
@@ -614,7 +645,11 @@ xbdback_connect(struct xbdback_instance 
 
 err2:
 	/* unmap ring */
+#ifndef XENPV
+	ungrop.host_addr = xbdi->xbdi_ring_pa;
+#else
 	ungrop.host_addr = xbdi->xbdi_ring_va;
+#endif
 	ungrop.handle = xbdi->xbdi_ring_handle;
 	ungrop.dev_bus_addr = 0;
 	err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -623,7 +658,12 @@ err2:
 	    aprint_error("xbdback %s: unmap_grant_ref failed: %d\n",
 		xbusd->xbusd_path, err);
 
+err1:
+#ifndef XENPV
+	pmap_kremove(xbdi->xbdi_ring_va, PAGE_SIZE);
+	xenmem_free_pa(xbdi->xbdi_ring_pa, PAGE_SIZE);
 err:
+#endif
 	/* free ring VA space */
 	uvm_km_free(kernel_map, xbdi->xbdi_ring_va, PAGE_SIZE, UVM_KMF_VAONLY);
 	return -1;
@@ -651,7 +691,7 @@ xbdback_disconnect(struct xbdback_instan
 		cv_wait(&xbdi->xbdi_cv, &xbdi->xbdi_lock);
 
 	mutex_exit(&xbdi->xbdi_lock);
-	intr_disestablish(xbdi->xbdi_ih);
+	xen_intr_disestablish(xbdi->xbdi_ih);
 
 	xenbus_switch_state(xbdi->xbdi_xbusd, NULL, XenbusStateClosing);
 }

Index: src/sys/arch/xen/xen/xennetback_xenbus.c
diff -u src/sys/arch/xen/xen/xennetback_xenbus.c:1.105 src/sys/arch/xen/xen/xennetback_xenbus.c:1.106
--- src/sys/arch/xen/xen/xennetback_xenbus.c:1.105	Tue May  5 17:02:01 2020
+++ src/sys/arch/xen/xen/xennetback_xenbus.c	Thu Sep  1 12:29:00 2022
@@ -1,4 +1,4 @@
-/*      $NetBSD: xennetback_xenbus.c,v 1.105 2020/05/05 17:02:01 bouyer Exp $      */
+/*      $NetBSD: xennetback_xenbus.c,v 1.106 2022/09/01 12:29:00 bouyer Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.105 2020/05/05 17:02:01 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.106 2022/09/01 12:29:00 bouyer Exp $");
 
 #include "opt_xen.h"
 
@@ -41,7 +41,6 @@ __KERNEL_RCSID(0, "$NetBSD: xennetback_x
 #include <sys/ioctl.h>
 #include <sys/errno.h>
 #include <sys/device.h>
-#include <sys/intr.h>
 
 #include <net/if.h>
 #include <net/if_types.h>
@@ -52,12 +51,14 @@ __KERNEL_RCSID(0, "$NetBSD: xennetback_x
 
 #include <net/if_ether.h>
 
+#include <xen/intr.h>
 #include <xen/hypervisor.h>
 #include <xen/xen.h>
 #include <xen/xen_shm.h>
 #include <xen/evtchn.h>
 #include <xen/xenbus.h>
 #include <xen/xennet_checksum.h>
+#include <xen/xenmem.h>
 
 #include <uvm/uvm.h>
 
@@ -119,8 +120,10 @@ struct xnetback_instance {
 	netif_rx_back_ring_t xni_rxring;
 	grant_handle_t xni_tx_ring_handle; /* to unmap the ring */
 	grant_handle_t xni_rx_ring_handle;
+	paddr_t xni_tx_ring_pa; /* to unmap the ring */
 	vaddr_t xni_tx_ring_va; /* to unmap the ring */
-	vaddr_t xni_rx_ring_va;
+	paddr_t xni_rx_ring_pa; 
+	vaddr_t xni_rx_ring_va; 
 
 	/* arrays used in xennetback_ifstart(), used for both Rx and Tx */
 	gnttab_copy_t     	xni_gop_copy[NB_XMIT_PAGES_BATCH];
@@ -362,7 +365,7 @@ xennetback_xenbus_destroy(void *arg)
 
 	if (xneti->xni_ih != NULL) {
 		hypervisor_mask_event(xneti->xni_evtchn);
-		intr_disestablish(xneti->xni_ih);
+		xen_intr_disestablish(xneti->xni_ih);
 		xneti->xni_ih = NULL;
 	}
 
@@ -387,7 +390,11 @@ xennetback_xenbus_destroy(void *arg)
 	}
 
 	if (xneti->xni_txring.sring) {
+#ifndef XENPV
+		op.host_addr = xneti->xni_tx_ring_pa;
+#else
 		op.host_addr = xneti->xni_tx_ring_va;
+#endif
 		op.handle = xneti->xni_tx_ring_handle;
 		op.dev_bus_addr = 0;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -397,7 +404,11 @@ xennetback_xenbus_destroy(void *arg)
 					"unmap_grant_ref failed: %d\n", err);
 	}
 	if (xneti->xni_rxring.sring) {
+#ifndef XENPV
+		op.host_addr = xneti->xni_rx_ring_pa;
+#else
 		op.host_addr = xneti->xni_rx_ring_va;
+#endif
 		op.handle = xneti->xni_rx_ring_handle;
 		op.dev_bus_addr = 0;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -406,6 +417,18 @@ xennetback_xenbus_destroy(void *arg)
 			aprint_error_ifnet(&xneti->xni_if,
 					"unmap_grant_ref failed: %d\n", err);
 	}
+#ifndef XENPV
+	if (xneti->xni_rx_ring_pa != 0) {
+		pmap_kremove(xneti->xni_rx_ring_va, PAGE_SIZE);
+		xenmem_free_pa(xneti->xni_rx_ring_pa, PAGE_SIZE);
+		xneti->xni_rx_ring_pa = 0;
+	}
+	if (xneti->xni_tx_ring_pa != 0) {
+		pmap_kremove(xneti->xni_tx_ring_va, PAGE_SIZE);
+		xenmem_free_pa(xneti->xni_tx_ring_pa, PAGE_SIZE);
+		xneti->xni_tx_ring_pa = 0;
+	}
+#endif
 	if (xneti->xni_tx_ring_va != 0) {
 		uvm_km_free(kernel_map, xneti->xni_tx_ring_va,
 		    PAGE_SIZE, UVM_KMF_VAONLY);
@@ -487,7 +510,19 @@ xennetback_connect(struct xnetback_insta
 	}
 	rx_ring = (void *)xneti->xni_rx_ring_va;
 
+#ifndef XENPV
+	xneti->xni_tx_ring_pa = xenmem_alloc_pa(PAGE_SIZE, PAGE_SIZE, false);
+	if (xneti->xni_tx_ring_pa == 0) {
+			xenbus_dev_fatal(xbusd, ENOMEM,
+			    "can't get PA for TX ring", xbusd->xbusd_otherend);
+			goto err2;
+	}
+	op.host_addr = xneti->xni_tx_ring_pa;
+        pmap_kenter_pa(xneti->xni_tx_ring_va, xneti->xni_tx_ring_pa,
+	    VM_PROT_READ | VM_PROT_WRITE, 0);
+#else
 	op.host_addr = xneti->xni_tx_ring_va;
+#endif
 	op.flags = GNTMAP_host_map;
 	op.ref = tx_ring_ref;
 	op.dom = xneti->xni_domid;
@@ -501,7 +536,19 @@ xennetback_connect(struct xnetback_insta
 	xneti->xni_tx_ring_handle = op.handle;
 	BACK_RING_INIT(&xneti->xni_txring, tx_ring, PAGE_SIZE);
 
+#ifndef XENPV
+	xneti->xni_rx_ring_pa = xenmem_alloc_pa(PAGE_SIZE, PAGE_SIZE, false);
+	if (xneti->xni_rx_ring_pa == 0) {
+			xenbus_dev_fatal(xbusd, ENOMEM,
+			    "can't get PA for RX ring", xbusd->xbusd_otherend);
+			goto err2;
+	}
+	op.host_addr = xneti->xni_rx_ring_pa;
+        pmap_kenter_pa(xneti->xni_rx_ring_va, xneti->xni_rx_ring_pa,
+	    VM_PROT_READ | VM_PROT_WRITE, 0);
+#else
 	op.host_addr = xneti->xni_rx_ring_va;
+#endif
 	op.flags = GNTMAP_host_map;
 	op.ref = rx_ring_ref;
 	op.dom = xneti->xni_domid;
@@ -529,9 +576,9 @@ xennetback_connect(struct xnetback_insta
 	xneti->xni_status = CONNECTED;
 	xen_wmb();
 
-	xneti->xni_ih = intr_establish_xname(-1, &xen_pic, xneti->xni_evtchn,
-	    IST_LEVEL, IPL_NET, xennetback_evthandler, xneti, false,
-	    xneti->xni_if.if_xname);
+	xneti->xni_ih = xen_intr_establish_xname(-1, &xen_pic,
+	    xneti->xni_evtchn, IST_LEVEL, IPL_NET, xennetback_evthandler,
+	    xneti, false, xneti->xni_if.if_xname);
 	KASSERT(xneti->xni_ih != NULL);
 	xennetback_ifinit(&xneti->xni_if);
 	hypervisor_unmask_event(xneti->xni_evtchn);
@@ -541,7 +588,11 @@ xennetback_connect(struct xnetback_insta
 err2:
 	/* unmap rings */
 	if (xneti->xni_tx_ring_handle != 0) {
+#ifndef XENPV
+		uop.host_addr = xneti->xni_tx_ring_pa;
+#else
 		uop.host_addr = xneti->xni_tx_ring_va;
+#endif
 		uop.handle = xneti->xni_tx_ring_handle;
 		uop.dev_bus_addr = 0;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -552,7 +603,11 @@ err2:
 	}
 
 	if (xneti->xni_rx_ring_handle != 0) {
+#ifndef XENPV
+		uop.host_addr = xneti->xni_rx_ring_pa;
+#else
 		uop.host_addr = xneti->xni_rx_ring_va;
+#endif
 		uop.handle = xneti->xni_rx_ring_handle;
 		uop.dev_bus_addr = 0;
 		err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
@@ -561,7 +616,16 @@ err2:
 			aprint_error_ifnet(&xneti->xni_if,
 			    "unmap_grant_ref failed: %d\n", err);
 	}
-
+#ifndef XENPV
+	if (xneti->xni_rx_ring_pa != 0) {
+		pmap_kremove(xneti->xni_rx_ring_va, PAGE_SIZE);
+		xenmem_free_pa(xneti->xni_rx_ring_pa, PAGE_SIZE);
+	}
+	if (xneti->xni_tx_ring_pa != 0) {
+		pmap_kremove(xneti->xni_tx_ring_va, PAGE_SIZE);
+		xenmem_free_pa(xneti->xni_tx_ring_pa, PAGE_SIZE);
+	}
+#endif
 err1:
 	/* free rings VA space */
 	if (xneti->xni_rx_ring_va != 0)
@@ -982,7 +1046,7 @@ mbuf_fail:
 
 		XENPRINTF(("%s pkt offset %d size %d id %d req_cons %d\n",
 		    xneti->xni_if.if_xname, txreq.offset,
-		    txreq.size, txreq.id, MASK_NETIF_TX_IDX(req_cons)));
+		    txreq.size, txreq.id, req_cons & (RING_SIZE(&xneti->xni_txring) - 1)));
 
 		xst = &xneti->xni_xstate[queued];
 		xst->xs_m = (m0 == NULL || m == m0) ? m : NULL;
@@ -1362,10 +1426,6 @@ xennetback_ifstop(struct ifnet *ifp, int
 	ifp->if_flags &= ~IFF_RUNNING;
 	ifp->if_timer = 0;
 	if (xneti->xni_status == CONNECTED) {
-		XENPRINTF(("%s: req_prod 0x%x resp_prod 0x%x req_cons 0x%x "
-		    "event 0x%x\n", ifp->if_xname, xneti->xni_txring->req_prod,
-		    xneti->xni_txring->resp_prod, xneti->xni_txring->req_cons,
-		    xneti->xni_txring->event));
 		xennetback_evthandler(ifp->if_softc); /* flush pending RX requests */
 	}
 	splx(s);

Reply via email to