Lines Matching refs:pTaskState

1173  * @param   pTaskState                Pointer to the task state with the mailbox to send.
1178 static void buslogicR3SendIncomingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState,
1182 pTaskState->MailboxGuest.u.in.uHostAdapterStatus = uHostAdapterStatus;
1183 pTaskState->MailboxGuest.u.in.uTargetDeviceStatus = uDeviceStatus;
1184 pTaskState->MailboxGuest.u.in.uCompletionCode = uMailboxCompletionCode;
1191 * (pTaskState->fIs24Bit ? sizeof(Mailbox24) : sizeof(Mailbox32)) );
1195 RTGCPHYS GCPhysAddrCCB = pTaskState->MailboxGuest.u32PhysAddrCCB;
1200 pTaskState->CommandControlBlockGuest.c.uHostAdapterStatus = uHostAdapterStatus;
1201 pTaskState->CommandControlBlockGuest.c.uDeviceStatus = uDeviceStatus;
1204 &pTaskState->CommandControlBlockGuest, RT_OFFSETOF(CCBC, abCDB));
1209 unsigned uCodeOffs = pTaskState->fIs24Bit ? RT_OFFSETOF(Mailbox24, uCmdState) : RT_OFFSETOF(Mailbox32, u.out.uActionCode);
1215 if (pTaskState->fIs24Bit)
1219 Mbx24.uCmdState = pTaskState->MailboxGuest.u.in.uCompletionCode;
1220 U32_TO_ADDR(Mbx24.aPhysAddrCCB, pTaskState->MailboxGuest.u32PhysAddrCCB);
1226 Log(("32-bit mailbox: completion code=%u, CCB at %RGp\n", pTaskState->MailboxGuest.u.in.uCompletionCode, (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB));
1228 &pTaskState->MailboxGuest, sizeof(Mailbox32));
1316 * @param pTaskState Pointer to the task state.
1321 static void buslogicR3ReadSGEntries(PBUSLOGICTASKSTATE pTaskState, RTGCPHYS GCSGList, uint32_t cEntries, SGE32 *pSGEList)
1323 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1328 if (pTaskState->fIs24Bit)
1346 * @param pTaskState Pointer to the task state.
1348 static int buslogicR3DataBufferAlloc(PBUSLOGICTASKSTATE pTaskState)
1350 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1355 if (pTaskState->fIs24Bit)
1357 u32PhysAddrCCB = ADDR_TO_U32(pTaskState->CommandControlBlockGuest.o.aPhysAddrData);
1358 cbDataCCB = LEN_TO_U32(pTaskState->CommandControlBlockGuest.o.acbData);
1362 u32PhysAddrCCB = pTaskState->CommandControlBlockGuest.n.u32PhysAddrData;
1363 cbDataCCB = pTaskState->CommandControlBlockGuest.n.cbData;
1366 if ( (pTaskState->CommandControlBlockGuest.c.uDataDirection != BUSLOGIC_CCB_DIRECTION_NO_DATA)
1376 if ( (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_SCATTER_GATHER)
1377 || (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER))
1382 uint32_t cScatterGatherGCLeft = cbDataCCB / pTaskState->cbSGEntry;
1394 buslogicR3ReadSGEntries(pTaskState, GCPhysAddrScatterGatherCurrent, cScatterGatherGCRead, aScatterGatherReadGC);
1411 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * pTaskState->cbSGEntry;
1417 pTaskState->DataSeg.cbSeg = cbDataToTransfer;
1418 pTaskState->DataSeg.pvSeg = RTMemAlloc(pTaskState->DataSeg.cbSeg);
1419 if (!pTaskState->DataSeg.pvSeg)
1423 if ( (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_OUT)
1424 || (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN))
1426 cScatterGatherGCLeft = cbDataCCB / pTaskState->cbSGEntry;
1428 uint8_t *pbData = (uint8_t *)pTaskState->DataSeg.pvSeg;
1437 buslogicR3ReadSGEntries(pTaskState, GCPhysAddrScatterGatherCurrent, cScatterGatherGCRead, aScatterGatherReadGC);
1455 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * pTaskState->cbSGEntry;
1460 else if ( pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB
1461 || pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH)
1468 pTaskState->DataSeg.cbSeg = cbDataCCB;
1469 pTaskState->DataSeg.pvSeg = RTMemAlloc(pTaskState->DataSeg.cbSeg);
1470 if (!pTaskState->DataSeg.pvSeg)
1479 PDMDevHlpPhysRead(pDevIns, GCPhysAddrDataBase, pTaskState->DataSeg.pvSeg, pTaskState->DataSeg.cbSeg);
1490 * @param pTaskState Pointer to the task state.
1492 static void buslogicR3DataBufferFree(PBUSLOGICTASKSTATE pTaskState)
1494 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1499 if (pTaskState->fIs24Bit)
1501 u32PhysAddrCCB = ADDR_TO_U32(pTaskState->CommandControlBlockGuest.o.aPhysAddrData);
1502 cbDataCCB = LEN_TO_U32(pTaskState->CommandControlBlockGuest.o.acbData);
1506 u32PhysAddrCCB = pTaskState->CommandControlBlockGuest.n.u32PhysAddrData;
1507 cbDataCCB = pTaskState->CommandControlBlockGuest.n.cbData;
1514 if (pTaskState->CommandControlBlockGuest.c.abCDB[0] == 0)
1518 LogFlowFunc(("pTaskState=%#p cbDataCCB=%u direction=%u cbSeg=%u\n", pTaskState, cbDataCCB,
1519 pTaskState->CommandControlBlockGuest.c.uDataDirection, pTaskState->DataSeg.cbSeg));
1522 && ( (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_IN)
1523 || (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN)))
1525 if ( (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_SCATTER_GATHER)
1526 || (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER))
1531 uint32_t cScatterGatherGCLeft = cbDataCCB / pTaskState->cbSGEntry;
1533 uint8_t *pbData = (uint8_t *)pTaskState->DataSeg.pvSeg;
1542 buslogicR3ReadSGEntries(pTaskState, GCPhysAddrScatterGatherCurrent, cScatterGatherGCRead, aScatterGatherReadGC);
1561 GCPhysAddrScatterGatherCurrent += cScatterGatherGCRead * pTaskState->cbSGEntry;
1565 else if ( pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB
1566 || pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH)
1579 PDMDevHlpPCIPhysWrite(pDevIns, GCPhysAddrDataBase, pTaskState->DataSeg.pvSeg, pTaskState->DataSeg.cbSeg);
1584 if ( (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH)
1585 || (pTaskState->CommandControlBlockGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER))
1590 cbResidual = 0; //LEN_TO_U32(pTaskState->CCBGuest.acbData) - ???;
1591 if (pTaskState->fIs24Bit)
1592 U32_TO_LEN(pTaskState->CommandControlBlockGuest.o.acbData, cbResidual);
1594 pTaskState->CommandControlBlockGuest.n.cbData = cbResidual;
1597 RTMemFree(pTaskState->DataSeg.pvSeg);
1598 pTaskState->DataSeg.pvSeg = NULL;
1599 pTaskState->DataSeg.cbSeg = 0;
1620 * @param pTaskState Pointer to the task state.
1623 static void buslogicR3SenseBufferFree(PBUSLOGICTASKSTATE pTaskState, bool fCopy)
1627 cbSenseBuffer = buslogicR3ConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c.cbSenseData);
1632 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1639 if (pTaskState->fIs24Bit)
1641 GCPhysAddrSenseBuffer = pTaskState->MailboxGuest.u32PhysAddrCCB;
1642 GCPhysAddrSenseBuffer += pTaskState->CommandControlBlockGuest.c.cbCDB + RT_OFFSETOF(CCB24, abCDB);
1645 GCPhysAddrSenseBuffer = pTaskState->CommandControlBlockGuest.n.u32PhysAddrSenseData;
1647 Log3(("%s: sense buffer: %.*Rhxs\n", __FUNCTION__, cbSenseBuffer, pTaskState->pbSenseBuffer));
1648 PDMDevHlpPCIPhysWrite(pDevIns, GCPhysAddrSenseBuffer, pTaskState->pbSenseBuffer, cbSenseBuffer);
1651 RTMemFree(pTaskState->pbSenseBuffer);
1652 pTaskState->pbSenseBuffer = NULL;
1659 * @param pTaskState Pointer to the task state.
1662 static int buslogicR3SenseBufferAlloc(PBUSLOGICTASKSTATE pTaskState)
1664 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1667 pTaskState->pbSenseBuffer = NULL;
1669 cbSenseBuffer = buslogicR3ConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c.cbSenseData);
1672 pTaskState->pbSenseBuffer = (uint8_t *)RTMemAllocZ(cbSenseBuffer);
1673 if (!pTaskState->pbSenseBuffer)
2465 PBUSLOGICTASKSTATE pTaskState;
2468 rc = RTMemCacheAllocEx(pBusLogic->hTaskCache, (void **)&pTaskState);
2471 pTaskState->fBIOS = true;
2473 rc = vboxscsiSetupRequest(&pBusLogic->VBoxSCSI, &pTaskState->PDMScsiRequest, &uTargetDevice);
2476 pTaskState->PDMScsiRequest.pvUser = pTaskState;
2478 pTaskState->CTX_SUFF(pTargetDevice) = &pBusLogic->aDeviceStates[uTargetDevice];
2480 if (!pTaskState->CTX_SUFF(pTargetDevice)->fPresent)
2483 AssertMsg(pTaskState->PDMScsiRequest.pbCDB[0] == SCSI_INQUIRY,
2494 rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, &pTaskState->PDMScsiRequest, SCSI_STATUS_OK);
2497 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
2501 LogFlowFunc(("before increment %u\n", pTaskState->CTX_SUFF(pTargetDevice)->cOutstandingRequests));
2502 ASMAtomicIncU32(&pTaskState->CTX_SUFF(pTargetDevice)->cOutstandingRequests);
2503 LogFlowFunc(("after increment %u\n", pTaskState->CTX_SUFF(pTargetDevice)->cOutstandingRequests));
2505 rc = pTaskState->CTX_SUFF(pTargetDevice)->pDrvSCSIConnector->pfnSCSIRequestSend(pTaskState->CTX_SUFF(pTargetDevice)->pDrvSCSIConnector,
2506 &pTaskState->PDMScsiRequest);
2800 PBUSLOGICTASKSTATE pTaskState = (PBUSLOGICTASKSTATE)pSCSIRequest->pvUser;
2801 PBUSLOGICDEVICE pBusLogicDevice = pTaskState->CTX_SUFF(pTargetDevice);
2810 if (!pTaskState->fBIOS)
2812 buslogicR3DataBufferFree(pTaskState);
2814 if (pTaskState->pbSenseBuffer)
2815 buslogicR3SenseBufferFree(pTaskState, false /* fCopy */);
2821 pTaskState->pRedoNext = ASMAtomicReadPtrT(&pBusLogic->pTasksRedoHead, PBUSLOGICTASKSTATE);
2822 } while (!ASMAtomicCmpXchgPtr(&pBusLogic->pTasksRedoHead, pTaskState, pTaskState->pRedoNext));
2830 if (pTaskState->fBIOS)
2837 buslogicR3DataBufferFree(pTaskState);
2839 if (pTaskState->pbSenseBuffer)
2840 buslogicR3SenseBufferFree(pTaskState, (rcCompletion != SCSI_STATUS_OK));
2843 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2848 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2856 buslogicR3DumpCCBInfo(&pTaskState->CommandControlBlockGuest, pTaskState->fIs24Bit);
2860 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
2886 static int buslogicR3DeviceSCSIRequestSetup(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState)
2894 RTGCPHYS GCPhysAddrCCB = (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB;
2896 &pTaskState->CommandControlBlockGuest, sizeof(CCB32));
2898 uTargetIdCCB = pTaskState->fIs24Bit ? pTaskState->CommandControlBlockGuest.o.uTargetId : pTaskState->CommandControlBlockGuest.n.uTargetId;
2900 pTaskState->CTX_SUFF(pTargetDevice) = pTargetDevice;
2903 buslogicR3DumpCCBInfo(&pTaskState->CommandControlBlockGuest, pTaskState->fIs24Bit);
2907 rc = buslogicR3DataBufferAlloc(pTaskState);
2910 rc = buslogicR3SenseBufferAlloc(pTaskState);
2916 buslogicR3DataBufferFree(pTaskState);
2918 if (pTaskState->pbSenseBuffer)
2919 buslogicR3SenseBufferFree(pTaskState, true);
2921 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2926 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
2931 pTaskState->PDMScsiRequest.uLogicalUnit = pTaskState->fIs24Bit ? pTaskState->CommandControlBlockGuest.o.uLogicalUnit
2932 : pTaskState->CommandControlBlockGuest.n.uLogicalUnit;
2934 if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_UNKNOWN)
2935 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_UNKNOWN;
2936 else if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_IN)
2937 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_FROM_DEVICE;
2938 else if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_OUT)
2939 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_TO_DEVICE;
2940 else if (pTaskState->CommandControlBlockGuest.c.uDataDirection == BUSLOGIC_CCB_DIRECTION_NO_DATA)
2941 pTaskState->PDMScsiRequest.uDataDirection = PDMSCSIREQUESTTXDIR_NONE;
2943 AssertMsgFailed(("Invalid data direction type %d\n", pTaskState->CommandControlBlockGuest.c.uDataDirection));
2945 pTaskState->PDMScsiRequest.cbCDB = pTaskState->CommandControlBlockGuest.c.cbCDB;
2946 pTaskState->PDMScsiRequest.pbCDB = pTaskState->CommandControlBlockGuest.c.abCDB;
2947 if (pTaskState->DataSeg.cbSeg)
2949 pTaskState->PDMScsiRequest.cbScatterGather = pTaskState->DataSeg.cbSeg;
2950 pTaskState->PDMScsiRequest.cScatterGatherEntries = 1;
2951 pTaskState->PDMScsiRequest.paScatterGatherHead = &pTaskState->DataSeg;
2955 pTaskState->PDMScsiRequest.cbScatterGather = 0;
2956 pTaskState->PDMScsiRequest.cScatterGatherEntries = 0;
2957 pTaskState->PDMScsiRequest.paScatterGatherHead = NULL;
2959 pTaskState->PDMScsiRequest.cbSenseBuffer = buslogicR3ConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.c.cbSenseData);
2960 pTaskState->PDMScsiRequest.pbSenseBuffer = pTaskState->pbSenseBuffer;
2961 pTaskState->PDMScsiRequest.pvUser = pTaskState;
2964 rc = pTargetDevice->pDrvSCSIConnector->pfnSCSIRequestSend(pTargetDevice->pDrvSCSIConnector, &pTaskState->PDMScsiRequest);
2971 static int buslogicR3DeviceSCSIRequestAbort(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState)
2976 RTGCPHYS GCPhysAddrCCB = (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB;
2979 &pTaskState->CommandControlBlockGuest, sizeof(CCB32));
2981 uTargetIdCCB = pTaskState->fIs24Bit ? pTaskState->CommandControlBlockGuest.o.uTargetId : pTaskState->CommandControlBlockGuest.n.uTargetId;
2983 pTaskState->CTX_SUFF(pTargetDevice) = pTargetDevice;
2985 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2990 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
3003 static RTGCPHYS buslogicR3ReadOutgoingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState)
3013 pTaskState->MailboxGuest.u32PhysAddrCCB = ADDR_TO_U32(Mbx24.aPhysAddrCCB);
3014 pTaskState->MailboxGuest.u.out.uActionCode = Mbx24.uCmdState;
3019 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCMailbox, &pTaskState->MailboxGuest, sizeof(Mailbox32));
3033 PBUSLOGICTASKSTATE pTaskState = NULL;
3037 rc = RTMemCacheAllocEx(pBusLogic->hTaskCache, (void **)&pTaskState);
3038 AssertMsgReturn(RT_SUCCESS(rc) && (pTaskState != NULL), ("Failed to get task state from cache\n"), rc);
3040 pTaskState->fBIOS = false;
3041 pTaskState->fIs24Bit = pBusLogic->fMbxIs24Bit;
3042 pTaskState->cbSGEntry = pBusLogic->fMbxIs24Bit ? sizeof(SGE24) : sizeof(SGE32);
3052 GCPhysAddrMailboxCurrent = buslogicR3ReadOutgoingMailbox(pBusLogic,pTaskState);
3056 } while ( pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE
3062 GCPhysAddrMailboxCurrent = buslogicR3ReadOutgoingMailbox(pBusLogic,pTaskState);
3071 if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE)
3074 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
3078 LogFlow(("Got loaded mailbox at slot %u, CCB phys %RGp\n", pBusLogic->uMailboxOutgoingPositionCurrent, (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB));
3080 buslogicR3DumpMailboxInfo(&pTaskState->MailboxGuest, true);
3085 unsigned uCodeOffs = pTaskState->fIs24Bit ? RT_OFFSETOF(Mailbox24, uCmdState) : RT_OFFSETOF(Mailbox32, u.out.uActionCode);
3088 if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_START_COMMAND)
3089 rc = buslogicR3DeviceSCSIRequestSetup(pBusLogic, pTaskState);
3090 else if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_ABORT_COMMAND)
3093 rc = buslogicR3DeviceSCSIRequestAbort(pBusLogic, pTaskState);
3096 AssertMsgFailed(("Invalid outgoing mailbox action code %u\n", pTaskState->MailboxGuest.u.out.uActionCode));
3158 PBUSLOGICTASKSTATE pTaskState = pThis->pTasksRedoHead;
3162 while (pTaskState)
3164 PBUSLOGICTASKSTATE pCur = pTaskState;
3169 pTaskState = pTaskState->pRedoNext;
3249 PBUSLOGICTASKSTATE pTaskState = pBusLogic->pTasksRedoHead;
3252 while (pTaskState)
3255 pTaskState = pTaskState->pRedoNext;
3261 pTaskState = pBusLogic->pTasksRedoHead;
3262 while (pTaskState)
3264 SSMR3PutU32(pSSM, pTaskState->MailboxGuest.u32PhysAddrCCB);
3265 pTaskState = pTaskState->pRedoNext;
3378 PBUSLOGICTASKSTATE pTaskState = (PBUSLOGICTASKSTATE)RTMemCacheAlloc(pBusLogic->hTaskCache);
3379 if (!pTaskState)
3385 rc = SSMR3GetU32(pSSM, &pTaskState->MailboxGuest.u32PhysAddrCCB);
3388 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
3393 pTaskState->pRedoNext = pBusLogic->pTasksRedoHead;
3394 pBusLogic->pTasksRedoHead = pTaskState;
3647 PBUSLOGICTASKSTATE pTaskState = pThis->pTasksRedoHead;
3651 while (pTaskState)
3655 pFree = pTaskState;
3656 pTaskState = pTaskState->pRedoNext;
3859 PBUSLOGICTASKSTATE pTaskState = pThis->pTasksRedoHead;
3863 while (pTaskState)
3867 pFree = pTaskState;
3868 pTaskState = pTaskState->pRedoNext;