Changeset 64672 in vbox
- Timestamp:
- Nov 15, 2016 12:53:42 PM (8 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Storage/DevAHCI.cpp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevAHCI.cpp
r64660 r64672 261 261 /** SCSI status code. */ 262 262 uint8_t u8ScsiSts; 263 /** Flag when the buffer is mapped. */ 264 bool fMapped; 265 /** Page lock when the buffer is mapped. */ 266 PGMPAGEMAPLOCK PgLck; 263 267 } AHCIREQ; 264 268 … … 3652 3656 uTag, PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR); 3653 3657 if (RT_SUCCESS(rc)) 3654 pAhciReq->hIoReq = hIoReq; 3658 { 3659 pAhciReq->hIoReq = hIoReq; 3660 pAhciReq->fMapped = false; 3661 } 3655 3662 else 3656 3663 pAhciReq = NULL; … … 3693 3700 3694 3701 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); 3695 3706 3696 3707 if (rcReq != VERR_PDM_MEDIAEX_IOREQ_CANCELED) … … 3914 3925 if (pIoReq->fFlags & AHCI_REQ_OVERFLOW) 3915 3926 rc = VERR_PDM_MEDIAEX_IOBUF_UNDERRUN; 3927 3928 return rc; 3929 } 3930 3931 /** 3932 * @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqQueryBuf} 3933 */ 3934 static 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 } 3916 3969 3917 3970 return rc; … … 6013 6066 pAhciPort->IMediaExPort.pfnIoReqCopyFromBuf = ahciR3IoReqCopyFromBuf; 6014 6067 pAhciPort->IMediaExPort.pfnIoReqCopyToBuf = ahciR3IoReqCopyToBuf; 6015 pAhciPort->IMediaExPort.pfnIoReqQueryBuf = NULL;6068 pAhciPort->IMediaExPort.pfnIoReqQueryBuf = ahciR3IoReqQueryBuf; 6016 6069 pAhciPort->IMediaExPort.pfnIoReqQueryDiscardRanges = ahciR3IoReqQueryDiscardRanges; 6017 6070 pAhciPort->IMediaExPort.pfnIoReqStateChanged = ahciR3IoReqStateChanged;
Note:
See TracChangeset
for help on using the changeset viewer.

