VirtualBox

Changeset 64672 in vbox


Ignore:
Timestamp:
Nov 15, 2016 12:53:42 PM (8 years ago)
Author:
vboxsync
Message:

AHCI: Add support for pfnIoReqQueryBuf for 4KB page aligned guest buffers

File:
1 edited

Legend:

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

    r64660 r64672  
    261261    /** SCSI status code. */
    262262    uint8_t                    u8ScsiSts;
     263    /** Flag when the buffer is mapped. */
     264    bool                       fMapped;
     265    /** Page lock when the buffer is mapped. */
     266    PGMPAGEMAPLOCK             PgLck;
    263267} AHCIREQ;
    264268
     
    36523656                                                   uTag, PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR);
    36533657    if (RT_SUCCESS(rc))
    3654         pAhciReq->hIoReq = hIoReq;
     3658    {
     3659        pAhciReq->hIoReq  = hIoReq;
     3660        pAhciReq->fMapped = false;
     3661    }
    36553662    else
    36563663        pAhciReq = NULL;
     
    36933700
    36943701    VBOXDD_AHCI_REQ_COMPLETED(pAhciReq, rcReq, pAhciReq->uOffset, pAhciReq->cbTransfer);
     3702
     3703    if (pAhciReq->fMapped)
     3704        PDMDevHlpPhysReleasePageMappingLock(pAhciPort->CTX_SUFF(pAhci)->CTX_SUFF(pDevIns),
     3705                                            &pAhciReq->PgLck);
    36953706
    36963707    if (rcReq != VERR_PDM_MEDIAEX_IOREQ_CANCELED)
     
    39143925    if (pIoReq->fFlags & AHCI_REQ_OVERFLOW)
    39153926        rc = VERR_PDM_MEDIAEX_IOBUF_UNDERRUN;
     3927
     3928    return rc;
     3929}
     3930
     3931/**
     3932 * @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqQueryBuf}
     3933 */
     3934static DECLCALLBACK(int) ahciR3IoReqQueryBuf(PPDMIMEDIAEXPORT pInterface, PDMMEDIAEXIOREQ hIoReq,
     3935                                             void *pvIoReqAlloc, void **ppvBuf, size_t *pcbBuf)
     3936{
     3937    RT_NOREF(hIoReq);
     3938    int rc              = VERR_NOT_SUPPORTED;
     3939    PAHCIPort pAhciPort = RT_FROM_MEMBER(pInterface, AHCIPort, IMediaExPort);
     3940    PAHCIREQ pIoReq     = (PAHCIREQ)pvIoReqAlloc;
     3941    PAHCI pThis         = pAhciPort->CTX_SUFF(pAhci);
     3942
     3943    /* Only allow single 4KB page aligned buffers at the moment. */
     3944    if (   pIoReq->cPrdtlEntries == 1
     3945        && pIoReq->cbTransfer    == _4K)
     3946    {
     3947        RTGCPHYS GCPhysPrdt = pIoReq->GCPhysPrdtl;
     3948        SGLEntry PrdtEntry;
     3949
     3950        PDMDevHlpPhysRead(pThis->pDevInsR3, GCPhysPrdt, &PrdtEntry, sizeof(SGLEntry));
     3951
     3952        RTGCPHYS GCPhysAddrDataBase = AHCI_RTGCPHYS_FROM_U32(PrdtEntry.u32DBAUp, PrdtEntry.u32DBA);
     3953        uint32_t cbData = (PrdtEntry.u32DescInf & SGLENTRY_DESCINF_DBC) + 1;
     3954
     3955        if (   cbData >= _4K
     3956            && !(GCPhysAddrDataBase & (_4K - 1)))
     3957        {
     3958            rc = PDMDevHlpPhysGCPhys2CCPtr(pThis->pDevInsR3, GCPhysAddrDataBase,
     3959                                           0, ppvBuf, &pIoReq->PgLck);
     3960            if (RT_SUCCESS(rc))
     3961            {
     3962                pIoReq->fMapped = true;
     3963                *pcbBuf = cbData;
     3964            }
     3965            else
     3966                rc = VERR_NOT_SUPPORTED;
     3967        }
     3968    }
    39163969
    39173970    return rc;
     
    60136066        pAhciPort->IMediaExPort.pfnIoReqCopyFromBuf        = ahciR3IoReqCopyFromBuf;
    60146067        pAhciPort->IMediaExPort.pfnIoReqCopyToBuf          = ahciR3IoReqCopyToBuf;
    6015         pAhciPort->IMediaExPort.pfnIoReqQueryBuf           = NULL;
     6068        pAhciPort->IMediaExPort.pfnIoReqQueryBuf           = ahciR3IoReqQueryBuf;
    60166069        pAhciPort->IMediaExPort.pfnIoReqQueryDiscardRanges = ahciR3IoReqQueryDiscardRanges;
    60176070        pAhciPort->IMediaExPort.pfnIoReqStateChanged       = ahciR3IoReqStateChanged;
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