svn commit: r348694 - head/usr.sbin/bhyve
John Baldwin
jhb at FreeBSD.org
Wed Jun 5 19:29:03 UTC 2019
Author: jhb
Date: Wed Jun 5 19:29:02 2019
New Revision: 348694
URL: https://svnweb.freebsd.org/changeset/base/348694
Log:
Don't simulate PBA access if the PBA is in a separate BAR.
bhyve has to virtualize the MSI-X table to trap reads and writes to
that table and map those to virtual interrupts that it maps real host
interrupts on to. For the pending-bit-array (PBA), bhyve passes
accesses from the guest directly to the hardware.
bhyve's virtualization of the MSI-X table is done by intercepting all
reads and writes to the BAR holding the MSI-X table. However, if the
PBA is stored in the same BAR as the MSI-X table, accesses to the PBA
portion of this BAR have to be forwarded to the real BAR.
However, in the case that the PBA was stored in a separate BAR and
it's offset in that separate BAR overlapped with the portion of the
MSI-X table BAR that the table used, the handlers for the table BAR
would incorrectly think that some accesses were PBA reads and writes.
This caused a crash in bhyve when it indirected a NULL pointer. Fix
this case by never trying to handle PBA access if the PBA lives in a
separate BAR.
Reported by: gallatin
Tested by: gallatin
Reviewed by: markj, Patrick Mooney
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D20523
Modified:
head/usr.sbin/bhyve/pci_passthru.c
Modified: head/usr.sbin/bhyve/pci_passthru.c
==============================================================================
--- head/usr.sbin/bhyve/pci_passthru.c Wed Jun 5 16:01:05 2019 (r348693)
+++ head/usr.sbin/bhyve/pci_passthru.c Wed Jun 5 19:29:02 2019 (r348694)
@@ -295,7 +295,7 @@ msix_table_read(struct passthru_softc *sc, uint64_t of
int index;
pi = sc->psc_pi;
- if (offset >= pi->pi_msix.pba_offset &&
+ if (pi->pi_msix.pba_page != NULL && offset >= pi->pi_msix.pba_offset &&
offset < pi->pi_msix.pba_offset + pi->pi_msix.pba_size) {
switch(size) {
case 1:
@@ -374,7 +374,7 @@ msix_table_write(struct vmctx *ctx, int vcpu, struct p
int index;
pi = sc->psc_pi;
- if (offset >= pi->pi_msix.pba_offset &&
+ if (pi->pi_msix.pba_page != NULL && offset >= pi->pi_msix.pba_offset &&
offset < pi->pi_msix.pba_offset + pi->pi_msix.pba_size) {
switch(size) {
case 1:
More information about the svn-src-all
mailing list