Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Oct 2013 22:48:38 +0000 (UTC)
From:      "Justin T. Gibbs" <gibbs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r256757 - stable/10/sys/dev/xen/blkfront
Message-ID:  <201310182248.r9IMmceh068194@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310182248.r9IMmceh068194>