VirtualBox

Changeset 27734 in vbox


Ignore:
Timestamp:
Mar 26, 2010 12:20:00 PM (15 years ago)
Author:
vboxsync
Message:

AHCI: Report I/O errors to the guest

Location:
trunk/src/VBox/Devices
Files:
2 edited

Legend:

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

    r27276 r27734  
    490490    /** The revision string for SCSI INQUIRY commands. */
    491491    char                            szInquiryRevision[AHCI_ATAPI_INQUIRY_REVISION_LENGTH+1];
    492 
    493     uint32_t                        Alignment7;
     492    /** Error counter */
     493    uint32_t                        cErrors;
    494494
    495495} AHCIPort;
     
    41594159
    41604160    /* Allocate new buffers and SG lists. */
    4161     pAhciPortTaskState->pvBufferUnaligned = RTMemAlloc(pAhciPortTaskState->cbSGBuffers);
     4161    pAhciPortTaskState->pvBufferUnaligned = RTMemPageAlloc(pAhciPortTaskState->cbSGBuffers);
    41624162    if (!pAhciPortTaskState->pvBufferUnaligned)
    41634163        return VERR_NO_MEMORY;
     
    50975097        case ATA_SMART:
    50985098        case ATA_NV_CACHE:
     5099        case ATA_READ_LOG_EXT:
    50995100            pAhciPortTaskState->uATARegError = ABRT_ERR;
    51005101            pAhciPortTaskState->uATARegStatus = ATA_STAT_READY | ATA_STAT_ERR;
     
    55245525                            pAhciPort->Led.Actual.s.fReading = 0;
    55255526                            if (RT_FAILURE(rc))
    5526                                 AssertMsgFailed(("%s: Failed to read data %Rrc\n", __FUNCTION__, rc));
     5527                                break;
    55275528
    55285529                            STAM_REL_COUNTER_ADD(&pAhciPort->StatBytesRead, cbProcess);
     
    55355536                            pAhciPort->Led.Actual.s.fWriting = 0;
    55365537                            if (RT_FAILURE(rc))
    5537                                 AssertMsgFailed(("%s: Failed to write data %Rrc\n", __FUNCTION__, rc));
     5538                                break;
    55385539
    55395540                            STAM_REL_COUNTER_ADD(&pAhciPort->StatBytesWritten, cbProcess);
     
    55495550                    STAM_PROFILE_STOP(&pAhciPort->StatProfileReadWrite, b);
    55505551
     5552                    /* Log the error. */
     5553                    if (   RT_FAILURE(rc)
     5554                        && pAhciPort->cErrors++ < MAX_LOG_REL_ERRORS)
     5555                    {
     5556                        LogRel(("AHCI#%u: %s at offset %llu (%u bytes left) returned rc=%Rrc\n",
     5557                                pAhciPort->iLUN,
     5558                                iTxDir == PDMBLOCKTXDIR_FROM_DEVICE
     5559                                ? "Read"
     5560                                : "Write",
     5561                                uOffset, cbTransfer, rc));
     5562                    }
     5563
    55515564                    /* Cleanup. */
    5552                     rc = ahciScatterGatherListDestroy(pAhciPort, pAhciPortTaskState);
    5553                     if (RT_FAILURE(rc))
     5565                    int rc2 = ahciScatterGatherListDestroy(pAhciPort, pAhciPortTaskState);
     5566                    if (RT_FAILURE(rc2))
    55545567                        AssertMsgFailed(("Destroying task list failed rc=%Rrc\n", rc));
    55555568
    55565569                    if (RT_LIKELY(!pAhciPort->fPortReset))
    55575570                    {
    5558                         pAhciPortTaskState->cmdHdr.u32PRDBC = pAhciPortTaskState->cbTransfer;
    5559                         pAhciPortTaskState->uATARegError = 0;
    5560                         pAhciPortTaskState->uATARegStatus = ATA_STAT_READY | ATA_STAT_SEEK;
     5571                        pAhciPortTaskState->cmdHdr.u32PRDBC = pAhciPortTaskState->cbTransfer - cbTransfer;
     5572                        if (RT_FAILURE(rc))
     5573                        {
     5574                            pAhciPortTaskState->uATARegError = ID_ERR;
     5575                            pAhciPortTaskState->uATARegStatus = ATA_STAT_READY | ATA_STAT_ERR;
     5576                        }
     5577                        else
     5578                        {
     5579                            pAhciPortTaskState->uATARegError = 0;
     5580                            pAhciPortTaskState->uATARegStatus = ATA_STAT_READY | ATA_STAT_SEEK;
     5581                        }
    55615582                        /* Write updated command header into memory of the guest. */
    55625583                        PDMDevHlpPhysWrite(pAhciPort->CTX_SUFF(pDevIns), pAhciPortTaskState->GCPhysCmdHdrAddr,
     
    55985619            ahciLog(("%s: After uActReadPos=%u\n", __FUNCTION__, pAhciPort->uActReadPos));
    55995620            cTasksToProcess--;
    5600             if (!cTasksToProcess)
     5621
     5622            /* If we encountered an error notify the guest and continue with the next task. */
     5623            if (RT_FAILURE(rc))
     5624            {
     5625                if (uQueuedTasksFinished && RT_LIKELY(!pAhciPort->fPortReset))
     5626                    ahciSendSDBFis(pAhciPort, uQueuedTasksFinished, pAhciPortTaskState, true);
     5627
     5628                uQueuedTasksFinished = 0;
     5629            }
     5630            else if (!cTasksToProcess)
    56015631                cTasksToProcess = ASMAtomicXchgU32(&pAhciPort->uActTasksActive, 0);
    56025632        }
     
    56195649            pAhciPort->StatIORequestsPerSecond.c = uIOsPerSec;
    56205650        }
    5621     }
     5651    } /* While running */
    56225652
    56235653    if (pAhci->fSignalIdle)
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp

    r27628 r27734  
    12101210    GEN_CHECK_OFF(AHCIPort, szInquiryRevision);
    12111211    GEN_CHECK_OFF(AHCIPort, szInquiryRevision[AHCI_ATAPI_INQUIRY_REVISION_LENGTH]);
     1212    GEN_CHECK_OFF(AHCIPort, cErrors);
    12121213
    12131214    GEN_CHECK_SIZE(AHCI);
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