VirtualBox

Changeset 7317 in vbox


Ignore:
Timestamp:
Mar 6, 2008 10:58:07 AM (17 years ago)
Author:
vboxsync
Message:

pcnet: save some cycles by returning early if we don't own the descriptor

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevPCNet.cpp

    r7314 r7317  
    597597 * Load transmit message descriptor
    598598 * Make sure we read the own flag first.
    599  */
    600 DECLINLINE(void) pcnetTmdLoad(PCNetState *pData, TMD *tmd, RTGCPHYS32 addr)
     599 *
     600 * @param pData         adapter private data
     601 * @param addr          physical address of the descriptor
     602 * @param fRetIfNotOwn  return immediately after reading the own flag if we don't own the descriptor
     603 */
     604DECLINLINE(void) pcnetTmdLoad(PCNetState *pData, TMD *tmd, RTGCPHYS32 addr, bool fRetIfNotOwn)
    601605{
    602606    PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pData);
     
    608612
    609613        PDMDevHlpPhysRead(pDevIns, addr+3, &ownbyte, 1);
     614        if (!(ownbyte & 0x80) && fRetIfNotOwn)
     615            return;
    610616        PDMDevHlpPhysRead(pDevIns, addr, (void*)&xda[0], sizeof(xda));
    611617        ((uint32_t *)tmd)[0] = (uint32_t)xda[0] | ((uint32_t)(xda[1] & 0x00ff) << 16);
     
    614620        ((uint32_t *)tmd)[3] = 0;
    615621    }
    616     else if (BCR_SWSTYLE(pData) != 3)
     622    else if (RT_LIKELY(BCR_SWSTYLE(pData) != 3))
    617623    {
    618624        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
     625        if (!(ownbyte & 0x80) && fRetIfNotOwn)
     626            return;
    619627        PDMDevHlpPhysRead(pDevIns, addr, (void*)tmd, 16);
    620628    }
     
    623631        uint32_t xda[4];
    624632        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
     633        if (!(ownbyte & 0x80) && fRetIfNotOwn)
     634            return;
    625635        PDMDevHlpPhysRead(pDevIns, addr, (void*)&xda[0], sizeof(xda));
    626636        ((uint32_t *)tmd)[0] = xda[2];
     
    658668        PDMDevHlpPhysWrite(pDevIns, addr+3, (uint8_t*)xda + 3, 1);
    659669    }
    660     else if (BCR_SWSTYLE(pData) != 3)
     670    else if (RT_LIKELY(BCR_SWSTYLE(pData) != 3))
    661671    {
    662672        ((uint32_t*)tmd)[1] |=  0x80000000;
     
    683693 * Load receive message descriptor
    684694 * Make sure we read the own flag first.
    685  */
    686 DECLINLINE(void) pcnetRmdLoad(PCNetState *pData, RMD *rmd, RTGCPHYS32 addr)
     695 *
     696 * @param pData         adapter private data
     697 * @param addr          physical address of the descriptor
     698 * @param fRetIfNotOwn  return immediately after reading the own flag if we don't own the descriptor
     699 */
     700DECLINLINE(void) pcnetRmdLoad(PCNetState *pData, RMD *rmd, RTGCPHYS32 addr, bool fRetIfNotOwn)
    687701{
    688702    PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pData);
     
    693707        uint16_t rda[4];
    694708        PDMDevHlpPhysRead(pDevIns, addr+3, &ownbyte, 1);
     709        if ((!ownbyte & 0x80) && fRetIfNotOwn)
     710            return;
    695711        PDMDevHlpPhysRead(pDevIns, addr, (void*)&rda[0], sizeof(rda));
    696712        ((uint32_t *)rmd)[0] = (uint32_t)rda[0] | ((rda[1] & 0x00ff) << 16);
     
    699715        ((uint32_t *)rmd)[3] = 0;
    700716    }
    701     else if (BCR_SWSTYLE(pData) != 3)
     717    else if (RT_LIKELY(BCR_SWSTYLE(pData) != 3))
    702718    {
    703719        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
     720        if ((!ownbyte & 0x80) && fRetIfNotOwn)
     721            return;
    704722        PDMDevHlpPhysRead(pDevIns, addr, (void*)rmd, 16);
    705723    }
     
    708726        uint32_t rda[4];
    709727        PDMDevHlpPhysRead(pDevIns, addr+7, &ownbyte, 1);
     728        if ((!ownbyte & 0x80) && fRetIfNotOwn)
     729            return;
    710730        PDMDevHlpPhysRead(pDevIns, addr, (void*)&rda[0], sizeof(rda));
    711731        ((uint32_t *)rmd)[0] = rda[2];
     
    717737#ifdef DEBUG
    718738    if (rmd->rmd1.own == 1 && !(ownbyte & 0x80))
    719         Log(("pcnetTmdLoad: own bit flipped while reading!!\n"));
     739        Log(("pcnetRmdLoad: own bit flipped while reading!!\n"));
    720740#endif
    721741    if (!(ownbyte & 0x80))
     
    742762        PDMDevHlpPhysWrite(pDevIns, addr+3, (uint8_t*)rda + 3, 1);
    743763    }
    744     else if (BCR_SWSTYLE(pData) != 3)
     764    else if (RT_LIKELY(BCR_SWSTYLE(pData) != 3))
    745765    {
    746766        ((uint32_t*)rmd)[1] |=  0x80000000;
     
    15001520        {
    15011521            addr = pcnetRdraAddr(pData, i);
    1502             pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr));
     1522            pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr), true);
    15031523            CSR_CRDA(pData) = CSR_CRBA(pData) = 0;
    15041524            CSR_CRBC(pData) = CSR_CRST(pData) = 0;
     
    15391559            i = CSR_RCVRL(pData);
    15401560        addr = pcnetRdraAddr(pData, i);
    1541         pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr));
     1561        pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, addr), true);
    15421562        CSR_NRDA(pData) = CSR_NRBA(pData) = 0;
    15431563        CSR_NRBC(pData) = 0;
     
    15861606        RTGCPHYS32 cxda = pcnetTdraAddr(pData, CSR_XMTRC(pData));
    15871607
    1588         pcnetTmdLoad(pData, tmd, PHYSADDR(pData, cxda));
     1608        pcnetTmdLoad(pData, tmd, PHYSADDR(pData, cxda), true);
    15891609
    15901610        if (!tmd->tmd1.own)
     
    16911711            {
    16921712                RMD rmd;
    1693                 pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, GCPhys));
     1713                pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, GCPhys), false);
    16941714                LogRel(("  %#010x\n", rmd.rmd1));
    16951715                GCPhys += cb;
     
    17261746#endif
    17271747
    1728             pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, crda));
     1748            pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, crda), false);
    17291749            /*if (!CSR_LAPPEN(pData))*/
    17301750                rmd.rmd1.stp = 1;
     
    17461766                    i = CSR_RCVRL(pData);
    17471767                next_crda = pcnetRdraAddr(pData, i);
    1748                 pcnetRmdLoad(pData, &next_rmd, PHYSADDR(pData, next_crda));
     1768                pcnetRmdLoad(pData, &next_rmd, PHYSADDR(pData, next_crda), true);
    17491769
    17501770                /* Check next descriptor's own bit. If we don't own it, we have
     
    22192239                cBuffers++;
    22202240#endif
    2221                 pcnetTmdLoad(pData, &tmd, PHYSADDR(pData, CSR_CXDA(pData)));
     2241                pcnetTmdLoad(pData, &tmd, PHYSADDR(pData, CSR_CXDA(pData)), false);
    22222242                cb = 4096 - tmd.tmd1.bcnt;
    22232243                if (    pData->SendFrame.cb + cb < cbMaxFrame
     
    24132433    {
    24142434        TMD tmd;
    2415         pcnetTmdLoad(pData, &tmd, PHYSADDR(pData, CSR_CXDA(pData)));
     2435        pcnetTmdLoad(pData, &tmd, PHYSADDR(pData, CSR_CXDA(pData)), false);
    24162436        Log2(("#%d pcnetPollTimer: TMDLOAD %#010x\n", PCNETSTATE_2_DEVINS(pData)->iInstance, PHYSADDR(pData, CSR_CXDA(pData))));
    24172437        PRINT_TMD(&tmd);
     
    38553875        {
    38563876            RMD rmd;
    3857             pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, GCPhys));
     3877            pcnetRmdLoad(pData, &rmd, PHYSADDR(pData, GCPhys), false);
    38583878            pHlp->pfnPrintf(pHlp,
    38593879                            "%04x %RGp:%c%c RBADR=%08RX32 BCNT=%03x MCNT=%03x "
     
    38953915        {
    38963916            TMD tmd;
    3897             pcnetTmdLoad(pData, &tmd, PHYSADDR(pData, GCPhys));
     3917            pcnetTmdLoad(pData, &tmd, PHYSADDR(pData, GCPhys), false);
    38983918            pHlp->pfnPrintf(pHlp,
    38993919                            "%04x %RGp:%c%c TBADR=%08RX32 BCNT=%03x OWN=%d "
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