Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Apr 2014 17:35:34 +0000 (UTC)
From:      Peter Grehan <grehan@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r264921 - head/usr.sbin/bhyve
Message-ID:  <201404251735.s3PHZYSd048297@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: grehan
Date: Fri Apr 25 17:35:34 2014
New Revision: 264921
URL: http://svnweb.freebsd.org/changeset/base/264921

Log:
  Respect and track the enable bit in the PCI configuration address word.
  Ignore writes, and return 0xff's, on config accesses when not set.
  Behaviour now matches that seen on h/w.
  
  Found with a NetBSD/amd64 guest.
  
  Reviewed by:	tychon
  MFC after:	3 weeks

Modified:
  head/usr.sbin/bhyve/pci_emul.c

Modified: head/usr.sbin/bhyve/pci_emul.c
==============================================================================
--- head/usr.sbin/bhyve/pci_emul.c	Fri Apr 25 16:54:28 2014	(r264920)
+++ head/usr.sbin/bhyve/pci_emul.c	Fri Apr 25 17:35:34 2014	(r264921)
@@ -1508,7 +1508,7 @@ pci_emul_hdrtype_fixup(int bus, int slot
 	}
 }
 
-static int cfgbus, cfgslot, cfgfunc, cfgoff;
+static int cfgenable, cfgbus, cfgslot, cfgfunc, cfgoff;
 
 static int
 pci_emul_cfgaddr(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
@@ -1527,9 +1527,12 @@ pci_emul_cfgaddr(struct vmctx *ctx, int 
 		    (cfgslot << 11) |
 		    (cfgfunc << 8) |
 		    cfgoff;
-		*eax = x | CONF1_ENABLE;
+                if (cfgenable)
+			x |= CONF1_ENABLE;	       
+		*eax = x;
 	} else {
 		x = *eax;
+		cfgenable = (x & CONF1_ENABLE) == CONF1_ENABLE;
 		cfgoff = x & PCI_REGMAX;
 		cfgfunc = (x >> 8) & PCI_FUNCMAX;
 		cfgslot = (x >> 11) & PCI_SLOTMAX;
@@ -1629,10 +1632,11 @@ pci_emul_cfgdata(struct vmctx *ctx, int 
 #endif
 
 	/*
-	 * Just return if there is no device at this cfgslot:cfgfunc or
-	 * if the guest is doing an un-aligned access
+	 * Just return if there is no device at this cfgslot:cfgfunc,
+	 * if the guest is doing an un-aligned access, or if the config
+	 * address word isn't enabled.
 	 */
-	if (pi == NULL || (coff & (bytes - 1)) != 0) {
+	if (!cfgenable || pi == NULL || (coff & (bytes - 1)) != 0) {
 		if (in)
 			*eax = 0xffffffff;
 		return (0);



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