svn commit: r264921 - head/usr.sbin/bhyve
Peter Grehan
grehan at FreeBSD.org
Fri Apr 25 17:35:34 UTC 2014
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);
More information about the svn-src-all
mailing list