Subject: Re: Exporting PCI devices to unpriviledged domains.
To: None <port-xen@netbsd.org>
From: Ceri Storey <cez@necrofish.org.uk>
List: port-xen
Date: 08/16/2005 23:14:02
--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Sun, Aug 14, 2005 at 10:16:20PM +0100, Ceri Storey wrote:
> Hi.
> 
> I'm currently attempting to export my wireless network card (suppoted by 
> ral(4)) to an unpriviledged Xen domain running under NetBSD, with Linux as 
> Domain 0. 

Well, some small amount of hacking later, I've gotten this to work, and
have been able to successfully use my wireless lan card from a domU.

The isa code could probably do with a simiar refactoring, too, perhaps.

Cheers.
-- 
Ceri Storey <cez@necrofish.org.uk>
'What I really want is "apt-get smite"' 
    --Rob Partington <http://rjp.frottage.org>

--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="xenU-pci.diff"

Index: conf/files.xen
===================================================================
RCS file: /cvsroot/src/sys/arch/xen/conf/files.xen,v
retrieving revision 1.26
diff -u -r1.26 files.xen
--- conf/files.xen	15 Jul 2005 07:56:22 -0000	1.26
+++ conf/files.xen	16 Aug 2005 22:04:22 -0000
@@ -265,7 +265,7 @@
 file 	arch/xen/i386/xen_shm_machdep.c	dom0ops
 file	arch/xen/xen/xbdback.c		dom0ops
 file	arch/xen/xen/xennetback.c	dom0ops
-file	arch/xen/xen/pci_machdep.c	hypervisor & dom0ops
+file	arch/xen/xen/pci_machdep.c	hypervisor & pci
 file	arch/xen/xen/isa_machdep.c	hypervisor & dom0ops
 file	arch/xen/xen/xenevt.c		xenevt & dom0ops
 
Index: xen/hypervisor.c
===================================================================
RCS file: /cvsroot/src/sys/arch/xen/xen/hypervisor.c,v
retrieving revision 1.14
diff -u -r1.14 hypervisor.c
--- xen/hypervisor.c	18 Apr 2005 21:33:21 -0000	1.14
+++ xen/hypervisor.c	16 Aug 2005 22:04:23 -0000
@@ -182,9 +182,11 @@
 	struct device *parent, *self;
 	void *aux;
 {
-#ifdef DOM0OPS
+#if NPCI > 0
 	struct pcibus_attach_args pba;
 	struct isabus_attach_args iba;
+	physdev_op_t physdev_op;
+	int i, j, busnum;
 #endif
 	union hypervisor_attach_cookie hac;
 
@@ -208,15 +210,12 @@
 	hac.hac_xennpx.xa_device = "npx";
 	config_found(self, &hac.hac_xennpx, hypervisor_print);
 #endif
-#ifdef DOM0OPS
-	if (xen_start_info.flags & SIF_PRIVILEGED) {
-		physdev_op_t physdev_op;
-		int i, j, busnum;
+#if NPCI > 0
 
-		physdev_op.cmd = PHYSDEVOP_PCI_PROBE_ROOT_BUSES;
-		if (HYPERVISOR_physdev_op(&physdev_op) < 0) {
-			printf("hypervisor: PHYSDEVOP_PCI_PROBE_ROOT_BUSES failed\n");
-		}
+	physdev_op.cmd = PHYSDEVOP_PCI_PROBE_ROOT_BUSES;
+	if ((i = HYPERVISOR_physdev_op(&physdev_op)) < 0) {
+		printf("hypervisor: PHYSDEVOP_PCI_PROBE_ROOT_BUSES failed with status %d\n", i);
+	} else {
 #ifdef DEBUG
 		printf("PCI_PROBE_ROOT_BUSES: ");
 		for (i = 0; i < 256/32; i++)
@@ -246,16 +245,20 @@
 				config_found_ia(self, "pcibus", &pba,
 				    pcibusprint);
 			}
-		}
-		if (isa_has_been_seen == 0) {
-			iba._iba_busname = "isa";
-			iba.iba_iot = X86_BUS_SPACE_IO;
-			iba.iba_memt = X86_BUS_SPACE_MEM;
-			iba.iba_dmat = &isa_bus_dma_tag;
-			iba.iba_ic = NULL; /* No isa DMA yet */
-			config_found_ia(self, "isabus", &iba, isabusprint);
-		}
+		} 
+	}
+	if (isa_has_been_seen == 0) {
+		iba._iba_busname = "isa";
+		iba.iba_iot = X86_BUS_SPACE_IO;
+		iba.iba_memt = X86_BUS_SPACE_MEM;
+		iba.iba_dmat = &isa_bus_dma_tag;
+		iba.iba_ic = NULL; /* No isa DMA yet */
+		config_found_ia(self, "isabus", &iba, isabusprint);
+	}
+#endif
 
+#ifdef DOM0OPS
+	if (xen_start_info.flags & SIF_PRIVILEGED) {
 		xenkernfs_init();
 		xenprivcmd_init();
 		xen_shm_init();

--bg08WKrSYDhXBjb5--