Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jul 2014 07:18:38 +0000 (UTC)
From:      Roger Pau Monné <royger@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r268832 - stable/9/sys/dev/xen/blkfront
Message-ID:  <201407180718.s6I7Icma090832@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: royger
Date: Fri Jul 18 07:18:37 2014
New Revision: 268832
URL: http://svnweb.freebsd.org/changeset/base/268832

Log:
  MFC r256423:
  
  Allow FreeBSD to be booted from CDROM media on XenServer 6.2 and prior
  releases.
  
  PR:		164630

Modified:
  stable/9/sys/dev/xen/blkfront/blkfront.c

Modified: stable/9/sys/dev/xen/blkfront/blkfront.c
==============================================================================
--- stable/9/sys/dev/xen/blkfront/blkfront.c	Fri Jul 18 06:58:01 2014	(r268831)
+++ stable/9/sys/dev/xen/blkfront/blkfront.c	Fri Jul 18 07:18:37 2014	(r268832)
@@ -399,14 +399,44 @@ xb_dump(void *arg, void *virtual, vm_off
 static int
 blkfront_probe(device_t dev)
 {
+#ifdef XENHVM
+	int error;
+	char *type;
+#endif
 
-	if (!strcmp(xenbus_get_type(dev), "vbd")) {
-		device_set_desc(dev, "Virtual Block Device");
-		device_quiet(dev);
-		return (0);
+	if (strcmp(xenbus_get_type(dev), "vbd") != 0)
+		return (ENXIO);
+
+#ifdef XENHVM
+	/*
+	 * 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);
+#endif
 
-	return (ENXIO);
+	device_set_desc(dev, "Virtual Block Device");
+	device_quiet(dev);
+	return (0);
 }
 
 static void



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