VirtualBox

Changeset 34106 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
Nov 16, 2010 11:37:01 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67808
Message:

AHCI: Fix ahciHbaSetInterrupt from non R3 contexts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevAHCI.cpp

    r34009 r34106  
    943943 * Updates the IRQ level and sets port bit in the global interrupt status register of the HBA.
    944944 */
    945 static void ahciHbaSetInterrupt(PAHCI pAhci, uint8_t iPort)
     945static int ahciHbaSetInterrupt(PAHCI pAhci, uint8_t iPort, int rcBusy)
    946946{
    947947    Log(("P%u: %s: Setting interrupt\n", iPort, __FUNCTION__));
    948948
    949     PDMCritSectEnter(&pAhci->lock, VINF_SUCCESS);
     949    int rc = PDMCritSectEnter(&pAhci->lock, rcBusy);
     950    if (rc != VINF_SUCCESS)
     951        return rc;
    950952
    951953    if (pAhci->regHbaCtrl & AHCI_HBA_CTRL_IE)
     
    985987
    986988    PDMCritSectLeave(&pAhci->lock);
     989    return VINF_SUCCESS;
    987990}
    988991
     
    995998    PAHCI pAhci = (PAHCI)pvUser;
    996999
    997     ahciHbaSetInterrupt(pAhci, pAhci->uCccPortNr);
     1000    ahciHbaSetInterrupt(pAhci, pAhci->uCccPortNr, VINF_SUCCESS);
    9981001}
    9991002#endif
     
    11611164
    11621165                if (pAhciPort->regIE & AHCI_PORT_IE_DHRE)
    1163                     ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN);
     1166                    ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VINF_SUCCESS);
    11641167            }
    11651168       }
     
    13061309
    13071310                if (pAhciPort->regIE & AHCI_PORT_IE_DHRE)
    1308                     ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN);
     1311                    ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VINF_SUCCESS);
    13091312#endif
    13101313            }
     
    13711374static int PortIntrEnable_w(PAHCI ahci, PAHCIPort pAhciPort, uint32_t iReg, uint32_t u32Value)
    13721375{
     1376    int rc = VINF_SUCCESS;
    13731377    ahciLog(("%s: write u32Value=%#010x\n", __FUNCTION__, u32Value));
    13741378    ahciLog(("%s: CPDE=%d TFEE=%d HBFE=%d HBDE=%d IFE=%d INFE=%d OFE=%d IPME=%d PRCE=%d DIE=%d PCE=%d DPE=%d UFE=%d SDBE=%d DSE=%d PSE=%d DHRE=%d\n",
     
    13831387             (u32Value & AHCI_PORT_IE_DHRE)));
    13841388
    1385     pAhciPort->regIE = (u32Value & AHCI_PORT_IE_READONLY);
     1389    u32Value &= AHCI_PORT_IE_READONLY;
    13861390
    13871391    /* Check if some a interrupt status bit changed*/
    13881392    uint32_t u32IntrStatus = ASMAtomicReadU32(&pAhciPort->regIS);
    13891393
    1390     if (pAhciPort->regIE & u32IntrStatus)
    1391         ahciHbaSetInterrupt(ahci, pAhciPort->iLUN);
    1392 
    1393     return VINF_SUCCESS;
     1394    if (u32Value & u32IntrStatus)
     1395        rc = ahciHbaSetInterrupt(ahci, pAhciPort->iLUN, VINF_IOM_HC_MMIO_WRITE);
     1396
     1397    if (rc == VINF_SUCCESS)
     1398        pAhciPort->regIE = u32Value;
     1399
     1400    return rc;
    13941401}
    13951402
     
    44594466    ASMAtomicOrU32(&pAhciPort->u32TasksFinished, (1 << pAhciPortTaskState->uTag));
    44604467
    4461     ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN);
     4468    ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VINF_SUCCESS);
    44624469}
    44634470
     
    45404547
    45414548        if (fAssertIntr)
    4542             ahciHbaSetInterrupt(pAhci, pAhciPort->iLUN);
     4549            ahciHbaSetInterrupt(pAhci, pAhciPort->iLUN, VINF_SUCCESS);
    45434550    }
    45444551}
     
    46044611
    46054612        if (fAssertIntr)
    4606             ahciHbaSetInterrupt(pAhci, pAhciPort->iLUN);
     4613            ahciHbaSetInterrupt(pAhci, pAhciPort->iLUN, VINF_SUCCESS);
    46074614    }
    46084615}
     
    71917198        pAhciPort->regSERR |= AHCI_PORT_SERR_N;
    71927199        if (pAhciPort->regIE & AHCI_PORT_IE_CPDE)
    7193             ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN);
     7200            ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VINF_SUCCESS);
    71947201    }
    71957202}
     
    72287235        pAhciPort->regSERR |= AHCI_PORT_SERR_N;
    72297236        if (pAhciPort->regIE & AHCI_PORT_IE_CPDE)
    7230             ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN);
     7237            ahciHbaSetInterrupt(pAhciPort->CTX_SUFF(pAhci), pAhciPort->iLUN, VINF_SUCCESS);
    72317238    }
    72327239}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette