VirtualBox

Changeset 360 in vbox for trunk/src/VBox/Devices/Network


Ignore:
Timestamp:
Jan 26, 2007 3:10:55 PM (18 years ago)
Author:
vboxsync
Message:

Fixed the no polling code.

File:
1 edited

Legend:

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

    r349 r360  
    219219
    220220#ifdef PCNET_NO_POLLING
    221     RTGCPHYS                            TRDAPhysOld;
    222     uint32_t                            cbTRDAOld;
     221    RTGCPHYS                            TDRAPhysOld;
     222    uint32_t                            cbTDRAOld;
    223223
    224224    RTGCPHYS                            RDRAPhysOld;
     
    984984    if (VBOX_SUCCESS(rc) && cb)
    985985    {
    986         if (GCPhysFault >= pData->GCTDRA && GCPhysFault + cb < pcnetTdraAddr(pData, 0))
     986        if (    (GCPhysFault >= pData->GCTDRA && GCPhysFault + cb < pcnetTdraAddr(pData, 0))
     987            ||  (GCPhysFault >= pData->GCRDRA && GCPhysFault + cb < pcnetRdraAddr(pData, 0)))
    987988        {
    988989            int rc = PDMCritSectEnter(&pData->CritSect, VERR_SEM_BUSY);
     
    11941195{
    11951196    PPDMDEVINS pDevIns = PCNETSTATE_2_DEVINS(pData);
    1196 
    1197     Log(("pcnetUpdateRingHandlers TD %VGp size %x -> %VGp size %x\n", pData->TRDAPhysOld, pData->cbTRDAOld, pData->GCTDRA, pcnetTdraAddr(pData, 0)));
     1197    int rc;
     1198
     1199    Log(("pcnetUpdateRingHandlers TD %VGp size %x -> %VGp size %x\n", pData->TDRAPhysOld, pData->cbTDRAOld, pData->GCTDRA, pcnetTdraAddr(pData, 0)));
    11981200    Log(("pcnetUpdateRingHandlers RX %VGp size %x -> %VGp size %x\n", pData->RDRAPhysOld, pData->cbRDRAOld, pData->GCRDRA, pcnetRdraAddr(pData, 0)));
    11991201
    1200 #if 0
    1201     if (pData->RDRAPhysOld != 0 && pData->GCRDRA != pData->RDRAPhysOld)
    1202         PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns),
    1203                                      pData->RDRAPhysOld & ~PAGE_OFFSET_MASK);
    1204     if (   pData->TRDAPhysOld != 0 && pData->GCTDRA != pData->TRDAPhysOld
    1205         && (pData->GCRDRA & ~PAGE_OFFSET_MASK) != (pData->GCTDRA & ~PAGE_OFFSET_MASK))
    1206 #endif
    1207 #if 0
    1208     if (pData->GCRDRA != oldrdra)
    1209     {
    1210         int rc;
     1202    if (pData->GCRDRA != pData->RDRAPhysOld || CSR_RCVRL(pData) != pData->cbRDRAOld)
     1203    {
     1204        if (pData->RDRAPhysOld != 0)
     1205            PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns),
     1206                                        pData->RDRAPhysOld & ~PAGE_OFFSET_MASK);
     1207
    12111208        rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
    12121209                                          PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
     
    12241221        pData->cbRDRAOld   = pcnetRdraAddr(pData, 0);
    12251222    }
    1226 #endif
    1227     if (pData->GCTDRA != pData->TRDAPhysOld || CSR_XMTRL(pData) != pData->cbTRDAOld)
    1228     {
    1229         if (pData->TRDAPhysOld != 0)
    1230             PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns),
    1231                                          pData->TRDAPhysOld & ~PAGE_OFFSET_MASK);
    1232 
    1233         int rc;
    1234 
    1235         rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
    1236                                           PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
    1237                                           pData->GCTDRA & ~PAGE_OFFSET_MASK,
    1238                                           RT_ALIGN(pcnetTdraAddr(pData, 0), PAGE_SIZE) - 1,
    1239                                           pcnetHandleRingWrite, pDevIns,
    1240                                           g_DevicePCNet.szR0Mod, "pcnetHandleRingWrite",
    1241                                           pData->pDevInsHC->pvInstanceDataHC,
    1242                                           g_DevicePCNet.szGCMod, "pcnetHandleRingWrite",
    1243                                           pData->pDevInsHC->pvInstanceDataGC,
    1244                                           "PCNet transmit ring write access handler");
    1245         AssertRC(rc);
    1246 
    1247         pData->TRDAPhysOld = pData->GCTDRA;
    1248         pData->cbTRDAOld   = pcnetTdraAddr(pData, 0);
    1249     }
     1223
     1224    /* 3 possibilities:
     1225     * 1) TDRA on different physical page as RDRA
     1226     * 2) TDRA completely on same physical page as RDRA
     1227     * 3) TDRA & RDRA overlap partly with different physical pages
     1228     */
     1229    RTGCPHYS RDRAPageStart = pData->GCRDRA & ~PAGE_OFFSET_MASK;
     1230    RTGCPHYS RDRAPageEnd   = (pcnetRdraAddr(pData, 0) - 1) & ~PAGE_OFFSET_MASK;
     1231    RTGCPHYS TDRAPageStart = pData->GCTDRA & ~PAGE_OFFSET_MASK;
     1232    RTGCPHYS TDRAPageEnd   = (pcnetTdraAddr(pData, 0) - 1) & ~PAGE_OFFSET_MASK;
     1233   
     1234    if (    RDRAPageStart > TDRAPageEnd
     1235        ||  TDRAPageStart > RDRAPageEnd)
     1236    {
     1237        /* 1) */
     1238        if (pData->GCTDRA != pData->TDRAPhysOld || CSR_XMTRL(pData) != pData->cbTDRAOld)
     1239        {
     1240            if (pData->TDRAPhysOld != 0)
     1241                PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns),
     1242                                             pData->TDRAPhysOld & ~PAGE_OFFSET_MASK);
     1243
     1244            rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
     1245                                              PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
     1246                                              pData->GCTDRA & ~PAGE_OFFSET_MASK,
     1247                                              RT_ALIGN(pcnetTdraAddr(pData, 0), PAGE_SIZE) - 1,
     1248                                              pcnetHandleRingWrite, pDevIns,
     1249                                              g_DevicePCNet.szR0Mod, "pcnetHandleRingWrite",
     1250                                              pData->pDevInsHC->pvInstanceDataHC,
     1251                                              g_DevicePCNet.szGCMod, "pcnetHandleRingWrite",
     1252                                              pData->pDevInsHC->pvInstanceDataGC,
     1253                                              "PCNet transmit ring write access handler");
     1254            AssertRC(rc);
     1255
     1256            pData->TDRAPhysOld = pData->GCTDRA;
     1257            pData->cbTDRAOld   = pcnetTdraAddr(pData, 0);
     1258        }
     1259    }
     1260    else
     1261    if (    RDRAPageStart != TDRAPageStart
     1262        &&  (   TDRAPageStart == RDRAPageEnd
     1263             || TDRAPageEnd   == RDRAPageStart
     1264            )
     1265        )
     1266    {
     1267        /* 3) */
     1268        AssertFailed();
     1269    }
     1270    /* else 2) */
    12501271}
    12511272#endif /* PCNET_NO_POLLING */
     
    21112132#ifdef LOG_ENABLED
    21122133    TMD dummy;
    2113     Log2(("#%d pcnetPollTimer time=%08x TDMD=%d TXON=%d POLL=%d TDTE=%d TRDA=%x\n",
     2134    Log2(("#%d pcnetPollTimer time=%08x TDMD=%d TXON=%d POLL=%d TDTE=%d TDRA=%x\n",
    21142135          PCNETSTATE_2_DEVINS(pData)->iInstance, RTTimeMilliTS(), CSR_TDMD(pData), CSR_TXON(pData),
    21152136          !CSR_DPOLL(pData), pcnetTdtePoll(pData, &dummy), pData->GCTDRA));
     
    35463567        pData->pDrv->pfnSetPromiscuousMode(pData->pDrv, CSR_PROM(pData));
    35473568
     3569#ifdef PCNET_NO_POLLING
     3570    /* Enable physical monitoring again (!) */
     3571    pcnetUpdateRingHandlers(pData);
     3572#endif
    35483573    /* Indicate link down to the guest OS that all network connections have been lost. */
    35493574    if (pData->fLinkUp)
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