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:
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to