VirtualBox

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


Ignore:
Timestamp:
Jan 24, 2022 2:46:17 PM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
149513
Message:

DevATA: Keep track of current LBA for ATA R/W commands, too, not just ATAPI. Fixes problem with NetWare IDE.DSK which may overwrite CHS head of an in-progress command. See bugref:5869.

File:
1 edited

Legend:

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

    r93115 r93411  
    6060 */
    6161/** The current saved state version. */
    62 #define ATA_SAVED_STATE_VERSION                         20
     62#define ATA_SAVED_STATE_VERSION                         21
     63/** Saved state version without iCurLBA for ATA commands. */
     64#define ATA_SAVED_STATE_VERSION_WITHOUT_ATA_ILBA        20
    6365/** The saved state version used by VirtualBox 3.0.
    6466 * This lacks the config part and has the type at the and.  */
     
    282284    uint32_t                            iIOBufferPIODataEnd;
    283285
    284     /** ATAPI current LBA position. */
    285     uint32_t                            iATAPILBA;
     286    /** Current LBA position (both ATA/ATAPI). */
     287    uint32_t                            iCurLBA;
    286288    /** ATAPI current sector size. */
    287289    uint32_t                            cbATAPISector;
     
    18461848    cSectors = s->cbElementaryTransfer / cbSector;
    18471849    Assert(cSectors);
    1848     iLBA = ataR3GetSector(s);
     1850    iLBA = s->iCurLBA;
    18491851    Log(("%s: %d sectors at LBA %d\n", __FUNCTION__, cSectors, iLBA));
    18501852    rc = ataR3ReadSectors(pDevIns, pCtl, s, pDevR3, iLBA, s->abIOBuffer, cSectors, &fRedo);
     
    18641866            ataR3SetSector(s, iLBA + cSectors);
    18651867        s->uATARegNSector -= cSectors;
     1868        s->iCurLBA += cSectors;
    18661869        ataR3CmdOK(pCtl, s, ATA_STAT_SEEK);
    18671870    }
     
    18981901    cSectors = s->cbElementaryTransfer / cbSector;
    18991902    Assert(cSectors);
    1900     iLBA = ataR3GetSector(s);
     1903    iLBA = s->iCurLBA;
    19011904    Log(("%s: %d sectors at LBA %d\n", __FUNCTION__, cSectors, iLBA));
    19021905    rc = ataR3WriteSectors(pDevIns, pCtl, s, pDevR3, iLBA, s->abIOBuffer, cSectors, &fRedo);
     
    19041907    {
    19051908        ataR3SetSector(s, iLBA + cSectors);
     1909        s->iCurLBA = iLBA + cSectors;
    19061910        if (!s->cbTotalTransfer)
    19071911            s->iSourceSink = ATAFN_SS_NULL;
     
    20102014
    20112015    Assert(s->uTxDir == PDMMEDIATXDIR_FROM_DEVICE);
    2012     uint32_t const iATAPILBA     = s->iATAPILBA;
     2016    uint32_t const iATAPILBA     = s->iCurLBA;
    20132017    uint32_t const cbTransfer    = RT_MIN(s->cbTotalTransfer, RT_MIN(s->cbIOBuffer, ATA_MAX_IO_BUFFER_SIZE));
    20142018    uint32_t const cbATAPISector = s->cbATAPISector;
     
    21202124            s->iSourceSink = ATAFN_SS_NULL;
    21212125        atapiR3CmdOK(pCtl, s);
    2122         s->iATAPILBA = iATAPILBA + cSectors;
     2126        s->iCurLBA = iATAPILBA + cSectors;
    21232127    }
    21242128    else
     
    26122616{
    26132617    Assert(cSectors > 0);
    2614     s->iATAPILBA = iATAPILBA;
     2618    s->iCurLBA = iATAPILBA;
    26152619    s->cbATAPISector = cbSector;
    26162620    ataR3StartTransfer(pDevIns, pCtl, s, cSectors * cbSector,
     
    43984402                goto abort_cmd;
    43994403            s->cSectorsPerIRQ = 1;
     4404            s->iCurLBA = ataR3GetSector(s);
    44004405            ataR3StartTransfer(pDevIns, pCtl, s, ataR3GetNSectors(s) * s->cbSector, PDMMEDIATXDIR_FROM_DEVICE, ATAFN_BT_READ_WRITE_SECTORS, ATAFN_SS_READ_SECTORS, false);
    44014406            break;
     
    44084413                goto abort_cmd;
    44094414            s->cSectorsPerIRQ = 1;
     4415            s->iCurLBA = ataR3GetSector(s);
    44104416            ataR3StartTransfer(pDevIns, pCtl, s, ataR3GetNSectors(s) * s->cbSector, PDMMEDIATXDIR_TO_DEVICE, ATAFN_BT_READ_WRITE_SECTORS, ATAFN_SS_WRITE_SECTORS, false);
    44114417            break;
     
    44174423                goto abort_cmd;
    44184424            s->cSectorsPerIRQ = s->cMultSectors;
     4425            s->iCurLBA = ataR3GetSector(s);
    44194426            ataR3StartTransfer(pDevIns, pCtl, s, ataR3GetNSectors(s) * s->cbSector, PDMMEDIATXDIR_FROM_DEVICE, ATAFN_BT_READ_WRITE_SECTORS, ATAFN_SS_READ_SECTORS, false);
    44204427            break;
     
    44264433                goto abort_cmd;
    44274434            s->cSectorsPerIRQ = s->cMultSectors;
     4435            s->iCurLBA = ataR3GetSector(s);
    44284436            ataR3StartTransfer(pDevIns, pCtl, s, ataR3GetNSectors(s) * s->cbSector, PDMMEDIATXDIR_TO_DEVICE, ATAFN_BT_READ_WRITE_SECTORS, ATAFN_SS_WRITE_SECTORS, false);
    44294437            break;
     
    44364444                goto abort_cmd;
    44374445            s->cSectorsPerIRQ = ATA_MAX_MULT_SECTORS;
     4446            s->iCurLBA = ataR3GetSector(s);
    44384447            s->fDMA = true;
    44394448            ataR3StartTransfer(pDevIns, pCtl, s, ataR3GetNSectors(s) * s->cbSector, PDMMEDIATXDIR_FROM_DEVICE, ATAFN_BT_READ_WRITE_SECTORS, ATAFN_SS_READ_SECTORS, false);
     
    44474456                goto abort_cmd;
    44484457            s->cSectorsPerIRQ = ATA_MAX_MULT_SECTORS;
     4458            s->iCurLBA = ataR3GetSector(s);
    44494459            s->fDMA = true;
    44504460            ataR3StartTransfer(pDevIns, pCtl, s, ataR3GetNSectors(s) * s->cbSector, PDMMEDIATXDIR_TO_DEVICE, ATAFN_BT_READ_WRITE_SECTORS, ATAFN_SS_WRITE_SECTORS, false);
     
    72607270            pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].iIOBufferPIODataStart);
    72617271            pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].iIOBufferPIODataEnd);
    7262             pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].iATAPILBA);
     7272            pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].iCurLBA);
    72637273            pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].cbATAPISector);
    72647274            pHlp->pfnSSMPutMem(pSSM, &pThis->aCts[i].aIfs[j].abATAPICmd, sizeof(pThis->aCts[i].aIfs[j].abATAPICmd));
     
    73037313
    73047314    if (   uVersion != ATA_SAVED_STATE_VERSION
     7315        && uVersion != ATA_SAVED_STATE_VERSION_WITHOUT_ATA_ILBA
    73057316        && uVersion != ATA_SAVED_STATE_VERSION_VBOX_30
    73067317        && uVersion != ATA_SAVED_STATE_VERSION_WITHOUT_FULL_SENSE
     
    74487459            pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].iIOBufferPIODataStart);
    74497460            pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].iIOBufferPIODataEnd);
    7450             pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].iATAPILBA);
     7461            pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].iCurLBA);
    74517462            pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].cbATAPISector);
    74527463            pHlp->pfnSSMGetMem(pSSM, &pThis->aCts[i].aIfs[j].abATAPICmd, sizeof(pThis->aCts[i].aIfs[j].abATAPICmd));
     
    74757486            rc = pHlp->pfnSSMGetU32(pSSM, &cbIOBuffer);
    74767487            AssertRCReturn(rc, rc);
     7488
     7489            if (   (uVersion <= ATA_SAVED_STATE_VERSION_WITHOUT_ATA_ILBA)
     7490                && !pThis->aCts[i].aIfs[j].fATAPI)
     7491            {
     7492                pThis->aCts[i].aIfs[j].iCurLBA = ataR3GetSector(&pThis->aCts[i].aIfs[j]);
     7493            }
    74777494
    74787495            if (cbIOBuffer)
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