Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Dec 2019 23:41:39 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355634 - head/usr.sbin/bhyve
Message-ID:  <201912112341.xBBNfdsE096677@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Wed Dec 11 23:41:39 2019
New Revision: 355634
URL: https://svnweb.freebsd.org/changeset/base/355634

Log:
  Emulate reads of the PCI command register for passthrough devices.
  
  VFs return zero for the memory enable bit even if it has been set by a
  prior write.  After r348779 this caused the annoying behavior that a
  guest OS would unintentionally disable memory decoding on a future
  read-modify-write operation on the command register.  Instead, return
  the shadow value of the command register for reads.  This ensures that
  the guest will only toggle the state of the memory enable bit when it
  specifically intends to do so.
  
  MFC after:	2 weeks
  Sponsored by:	Chelsio Communications

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

Modified: head/usr.sbin/bhyve/pci_passthru.c
==============================================================================
--- head/usr.sbin/bhyve/pci_passthru.c	Wed Dec 11 23:11:21 2019	(r355633)
+++ head/usr.sbin/bhyve/pci_passthru.c	Wed Dec 11 23:41:39 2019	(r355634)
@@ -803,6 +803,19 @@ passthru_cfgread(struct vmctx *ctx, int vcpu, struct p
 	}
 #endif
 
+	/*
+	 * Emulate the command register.  If a single read reads both the
+	 * command and status registers, read the status register from the
+	 * device's config space.
+	 */
+	if (coff == PCIR_COMMAND) {
+		if (bytes <= 2)
+			return (-1);
+		*rv = pci_get_cfgdata16(pi, PCIR_COMMAND) << 16 |
+		    read_config(&sc->psc_sel, PCIR_STATUS, 2);
+		return (0);
+	}
+
 	/* Everything else just read from the device's config space */
 	*rv = read_config(&sc->psc_sel, coff, bytes);
 



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