VirtualBox

Changeset 28980 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
May 3, 2010 2:45:14 PM (15 years ago)
Author:
vboxsync
Message:

Devices/Storage: fix extremely sporadic bogus triggering of "I/O state inconsistent" release assertion due to BMDMA transfers getting started twice

File:
1 edited

Legend:

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

    r28800 r28980  
    55
    66/*
    7  * Copyright (C) 2006-2008 Oracle Corporation
     7 * Copyright (C) 2006-2010 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    417417    ATARequest          aAsyncIORequests[4];
    418418    /** The position at which to insert a new request for the AIO thread. */
    419     uint8_t             AsyncIOReqHead;
     419    volatile uint8_t    AsyncIOReqHead;
    420420    /** The position at which to get a new request for the AIO thread. */
    421     uint8_t             AsyncIOReqTail;
     421    volatile uint8_t    AsyncIOReqTail;
    422422    /** Whether to call PDMDevHlpAsyncNotificationCompleted when idle. */
    423423    bool volatile       fSignalIdle;
     
    11331133{
    11341134    Log(("%s: code=%#x\n", __FUNCTION__, uErrorCode));
     1135    Assert(uErrorCode);
    11351136    s->uATARegError = uErrorCode;
    11361137    ataSetStatusValue(s, ATA_STAT_READY | ATA_STAT_ERR);
     
    50635064         * mid-flight. Not allowed, according to the PIIX3 specs. */
    50645065        Assert(!(pCtl->BmDma.u8Status & BM_STATUS_DMAING) || !((val ^ pCtl->BmDma.u8Cmd) & 0x04));
     5066        uint8_t uOldBmDmaStatus = pCtl->BmDma.u8Status;
    50655067        pCtl->BmDma.u8Status |= BM_STATUS_DMAING;
    50665068        pCtl->BmDma.u8Cmd = val & (BM_CMD_START | BM_CMD_WRITE);
     
    50735075        }
    50745076
    5075         /* Do not start DMA transfers if there's a PIO transfer going on. */
    5076         if (!pCtl->aIfs[pCtl->iSelectedIf].fDMA)
     5077        /* Do not start DMA transfers if there's a PIO transfer going on,
     5078         * or if there is already a transfer started on this controller. */
     5079        if (   !pCtl->aIfs[pCtl->iSelectedIf].fDMA
     5080            || (uOldBmDmaStatus & BM_STATUS_DMAING))
    50775081            return;
    50785082
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