svn commit: r256757 - stable/10/sys/dev/xen/blkfront

Justin T. Gibbs gibbs at FreeBSD.org
Fri Oct 18 22:48:38 UTC 2013


Author: gibbs
Date: Fri Oct 18 22:48:38 2013
New Revision: 256757
URL: http://svnweb.freebsd.org/changeset/base/256757

Log:
  MFC: r256425
  
  Centralize the detection logic for the Hyper-V hypervisor.
  
  Submitted by:	Roger Pau Monné
  Sponsored by:	Citrix Systems R&D
  Reviewed by:	gibbs, grehan
  Approved by:	re (gjb)
  
  sys/sys/systm.h:
   * Add a new VM_GUEST type, VM_GUEST_HV (HyperV guest).
  
  sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c:
  sys/dev/hyperv/vmbus/hv_hv.c:
  sys/dev/hyperv/stordisengage/hv_ata_pci_disengage.c:
   * Set vm_guest to VM_GUEST_HV and use that on other HyperV related
     devices instead of cloning the cpuid hypervisor check.
   * Cleanup the vmbus_identify function.

Modified:
  stable/10/sys/dev/xen/blkfront/blkfront.c
Directory Properties:
  stable/10/sys/   (props changed)

Modified: stable/10/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- stable/10/sys/dev/xen/blkfront/blkfront.c	Fri Oct 18 22:47:10 2013	(r256756)
+++ stable/10/sys/dev/xen/blkfront/blkfront.c	Fri Oct 18 22:48:38 2013	(r256757)
@@ -1381,14 +1381,42 @@ xbd_closing(device_t dev)
 static int
 xbd_probe(device_t dev)
 {
+	if (strcmp(xenbus_get_type(dev), "vbd") != 0)
+		return (ENXIO);
 
-	if (!strcmp(xenbus_get_type(dev), "vbd")) {
-		device_set_desc(dev, "Virtual Block Device");
-		device_quiet(dev);
-		return (0);
+	if (xen_hvm_domain()) {
+		int error;
+		char *type;
+
+		/*
+		 * When running in an HVM domain, IDE disk emulation is
+		 * disabled early in boot so that native drivers will
+		 * not see emulated hardware.  However, CDROM device
+		 * emulation cannot be disabled.
+		 *
+		 * Through use of FreeBSD's vm_guest and xen_hvm_domain()
+		 * APIs, we could modify the native CDROM driver to fail its
+		 * probe when running under Xen.  Unfortunatlely, the PV
+		 * CDROM support in XenServer (up through at least version
+		 * 6.2) isn't functional, so we instead rely on the emulated
+		 * CDROM instance, and fail to attach the PV one here in
+		 * the blkfront driver.
+		 */
+		error = xs_read(XST_NIL, xenbus_get_node(dev),
+		    "device-type", NULL, (void **) &type);
+		if (error)
+			return (ENXIO);
+
+		if (strncmp(type, "cdrom", 5) == 0) {
+			free(type, M_XENSTORE);
+			return (ENXIO);
+		}
+		free(type, M_XENSTORE);
 	}
 
-	return (ENXIO);
+	device_set_desc(dev, "Virtual Block Device");
+	device_quiet(dev);
+	return (0);
 }
 
 /*


More information about the svn-src-all mailing list