Changeset 43680 in vbox
- Timestamp:
- Oct 18, 2012 1:31:00 PM (12 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
r43659 r43680 51 51 52 52 /* Size of the reply buffer. */ 53 #define BUSLOGIC_REPLY_SIZE_MAX 6453 #define BUSLOGIC_REPLY_SIZE_MAX 64 54 54 55 55 /* … … 67 67 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_ERROR_HANDLING 1 68 68 69 /** The duration of software-initiated reset. Not documented, set to 2ms. */70 #define BUSLOGIC_RESET_DURATION_NS ( 2000*1000)69 /** The duration of software-initiated reset. Not documented, set to 500 ms. */ 70 #define BUSLOGIC_RESET_DURATION_NS (500*1000*1000UL) 71 71 72 72 /** … … 353 353 354 354 /** ISA I/O port base (disabled if zero). */ 355 RTIOPORT IOISABase; //@todo: recalculate when restoring state355 RTIOPORT IOISABase; 356 356 /** Default ISA I/O port base in FW-compatible format. */ 357 357 uint8_t uDefaultISABaseCode; … … 743 743 /** Device adapter status. */ 744 744 uint8_t uDeviceStatus; 745 /** The device the request is sen dto. */745 /** The device the request is sent to. */ 746 746 uint8_t uTargetId; 747 747 /**The LUN in the device. */ … … 970 970 * @returns nothing 971 971 * @param pBusLogic Pointer to the BusLogic device instance. 972 */ 973 static void buslogicIntiateHardReset(PBUSLOGIC pBusLogic) 974 { 975 LogFlowFunc(("pBusLogic=%#p\n", pBusLogic)); 976 977 /* Remember when the guest initiated a reset. */ 978 pBusLogic->u64ResetTime = PDMDevHlpTMTimeVirtGetNano(pBusLogic->CTX_SUFF(pDevIns)); 979 980 buslogicHwReset(pBusLogic, false); 981 982 /* We set the diagnostic active in the status register. */ 983 pBusLogic->regStatus |= BUSLOGIC_REGISTER_STATUS_DIAGNOSTIC_ACTIVE; 972 * @param fHardReset Flag initiating a hard (vs. soft) reset. 973 */ 974 static void buslogicInitiateReset(PBUSLOGIC pBusLogic, bool fHardReset) 975 { 976 LogFlowFunc(("pBusLogic=%#p fHardReset=%d\n", pBusLogic, fHardReset)); 977 978 buslogicHwReset(pBusLogic, fHardReset); 979 980 if (fHardReset) 981 { 982 /* Set the diagnostic active bit in the status register and clear the ready state. */ 983 pBusLogic->regStatus |= BUSLOGIC_REGISTER_STATUS_DIAGNOSTIC_ACTIVE; 984 pBusLogic->regStatus &= ~BUSLOGIC_REGISTER_STATUS_HOST_ADAPTER_READY; 985 986 /* Remember when the guest initiated a reset (after we're done resetting). */ 987 pBusLogic->u64ResetTime = PDMDevHlpTMTimeVirtGetNano(pBusLogic->CTX_SUFF(pDevIns)); 988 } 984 989 } 985 990 … … 1306 1311 } 1307 1312 1313 /* Convert sense buffer length taking into account shortcut values. */ 1314 static uint32_t buslogicConvertSenseBufferLength(uint32_t cbSense) 1315 { 1316 /* Convert special sense buffer length values. */ 1317 if (cbSense == 0) 1318 cbSense = 14; /* 0 means standard 14-byte buffer. */ 1319 else if (cbSense == 1) 1320 cbSense = 0; /* 1 means no sense data. */ 1321 else if (cbSense < 8) 1322 AssertMsgFailed(("Reserved cbSense value of %d used!\n", cbSense)); 1323 1324 return cbSense; 1325 } 1326 1308 1327 /** 1309 1328 * Free the sense buffer. … … 1315 1334 static void buslogicSenseBufferFree(PBUSLOGICTASKSTATE pTaskState, bool fCopy) 1316 1335 { 1317 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1318 RTGCPHYS GCPhysAddrSenseBuffer = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrSenseData; 1319 uint32_t cbSenseBuffer = pTaskState->CommandControlBlockGuest.cbSenseData; 1320 1321 /* Copy into guest memory. */ 1322 if (fCopy) 1336 uint32_t cbSenseBuffer; 1337 1338 cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.cbSenseData); 1339 1340 /* Copy the sense buffer into guest memory if requested. */ 1341 if (fCopy && cbSenseBuffer) 1342 { 1343 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1344 RTGCPHYS GCPhysAddrSenseBuffer = (RTGCPHYS)pTaskState->CommandControlBlockGuest.u32PhysAddrSenseData; 1345 uint32_t cbSenseBuffer = pTaskState->CommandControlBlockGuest.cbSenseData; 1346 1323 1347 PDMDevHlpPhysWrite(pDevIns, GCPhysAddrSenseBuffer, pTaskState->pbSenseBuffer, cbSenseBuffer); 1348 } 1324 1349 1325 1350 RTMemFree(pTaskState->pbSenseBuffer); … … 1337 1362 { 1338 1363 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 1339 uint32_t cbSenseBuffer = pTaskState->CommandControlBlockGuest.cbSenseData; 1364 uint32_t cbSenseBuffer; 1365 1366 cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.cbSenseData); 1340 1367 1341 1368 pTaskState->pbSenseBuffer = (uint8_t *)RTMemAllocZ(cbSenseBuffer); … … 1463 1490 1464 1491 pReply->uHostAdapterId = 7; /* The controller has always 7 as ID. */ 1465 //@todo: What should the DMA channel be? 1466 pReply->fDmaChannel6 = 1; 1492 pReply->fDmaChannel6 = 1; /* DMA channel 6 is a good default. */ 1467 1493 /* The PCI IRQ is not necessarily representable in this structure. 1468 1494 * If that is the case, the guest likely won't function correctly, … … 1512 1538 PReplyInquireSetupInformation pReply = (PReplyInquireSetupInformation)pBusLogic->aReplyBuffer; 1513 1539 memset(pReply, 0, sizeof(ReplyInquireSetupInformation)); 1540 pReply->fSynchronousInitiationEnabled = true; 1541 pReply->fParityCheckingEnabled = true; 1514 1542 pReply->cMailbox = pBusLogic->cMailbox; 1515 1543 pReply->uSignature = 'B'; … … 1705 1733 1706 1734 /* If the diagnostic active bit is set, we are in a guest-initiated 1707 * hard or soft reset. If the guest reads the status register and 1708 * waits for the host adapter ready bit to be set, we terminate the 1709 * reset right away. However, guests may also expect the reset 1710 * condition to clear automatically after a period of time. 1735 * hard reset. If the guest reads the status register and waits for 1736 * the host adapter ready bit to be set, we terminate the reset right 1737 * away. However, guests may also expect the reset condition to clear 1738 * automatically after a period of time, in which case we can't show 1739 * the DIAG bit at all. 1711 1740 */ 1712 1741 if (pBusLogic->regStatus & BUSLOGIC_REGISTER_STATUS_DIAGNOSTIC_ACTIVE) … … 1716 1745 pBusLogic->regStatus &= ~BUSLOGIC_REGISTER_STATUS_DIAGNOSTIC_ACTIVE; 1717 1746 pBusLogic->regStatus |= BUSLOGIC_REGISTER_STATUS_HOST_ADAPTER_READY; 1747 1718 1748 if (u64AccessTime - pBusLogic->u64ResetTime > BUSLOGIC_RESET_DURATION_NS) 1719 1749 { 1720 /* Let the guest see the ready condition right away. */ 1721 *pu32 &= ~BUSLOGIC_REGISTER_STATUS_DIAGNOSTIC_ACTIVE; 1722 *pu32 |= BUSLOGIC_REGISTER_STATUS_HOST_ADAPTER_READY; 1750 /* If reset already expired, let the guest see that right away. */ 1751 *pu32 = pBusLogic->regStatus; 1723 1752 pBusLogic->u64ResetTime = 0; 1724 1753 } … … 1789 1818 case BUSLOGIC_REGISTER_CONTROL: 1790 1819 { 1820 if ((uVal & BUSLOGIC_REGISTER_CONTROL_HARD_RESET) || (uVal & BUSLOGIC_REGISTER_CONTROL_SOFT_RESET)) 1821 { 1822 #ifdef IN_RING3 1823 bool fHardReset = !!(uVal & BUSLOGIC_REGISTER_CONTROL_HARD_RESET); 1824 1825 LogRel(("BusLogic: %s reset\n", fHardReset ? "hard" : "soft")); 1826 buslogicInitiateReset(pBusLogic, fHardReset); 1827 #else 1828 rc = VINF_IOM_R3_IOPORT_WRITE; 1829 #endif 1830 break; 1831 } 1832 1791 1833 rc = PDMCritSectEnter(&pBusLogic->CritSectIntr, VINF_IOM_R3_IOPORT_WRITE); 1792 1834 if (rc != VINF_SUCCESS) … … 1802 1844 1803 1845 PDMCritSectLeave(&pBusLogic->CritSectIntr); 1804 1805 if ((uVal & BUSLOGIC_REGISTER_CONTROL_HARD_RESET) || (uVal & BUSLOGIC_REGISTER_CONTROL_SOFT_RESET))1806 {1807 #ifdef IN_RING31808 buslogicIntiateHardReset(pBusLogic);1809 #else1810 rc = VINF_IOM_R3_IOPORT_WRITE;1811 #endif1812 }1813 1846 1814 1847 break; … … 2230 2263 { 2231 2264 Log(("ISA I/O base: %x\n", uNewBase)); 2232 LogRel((" buslogic: ISA I/O base: %x\n", uNewBase));2265 LogRel(("BusLogic: ISA I/O base: %x\n", uNewBase)); 2233 2266 } 2234 2267 else 2235 2268 { 2236 2269 Log(("Disabling ISA I/O ports.\n")); 2237 LogRel((" buslogic: ISA I/O disabled\n"));2270 LogRel(("BusLogic: ISA I/O disabled\n")); 2238 2271 } 2239 2272 } … … 2425 2458 AssertMsgFailed(("invalid completion status %d\n", rcCompletion)); 2426 2459 } 2460 #ifdef DEBUG 2461 buslogicDumpCCBInfo(&pTaskState->CommandControlBlockGuest); 2462 #endif 2463 2427 2464 /* Remove task from the cache. */ 2428 2465 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState); … … 2523 2560 pTaskState->PDMScsiRequest.paScatterGatherHead = NULL; 2524 2561 } 2525 pTaskState->PDMScsiRequest.cbSenseBuffer = pTaskState->CommandControlBlockGuest.cbSenseData;2562 pTaskState->PDMScsiRequest.cbSenseBuffer = buslogicConvertSenseBufferLength(pTaskState->CommandControlBlockGuest.cbSenseData); 2526 2563 pTaskState->PDMScsiRequest.pbSenseBuffer = pTaskState->pbSenseBuffer; 2527 2564 pTaskState->PDMScsiRequest.pvUser = pTaskState; … … 2975 3012 } 2976 3013 3014 /** 3015 * BusLogic debugger info callback. 3016 * 3017 * @param pDevIns The device instance. 3018 * @param pHlp The output helpers. 3019 * @param pszArgs The arguments. 3020 */ 3021 static DECLCALLBACK(void) buslogicInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 3022 { 3023 PBUSLOGIC pThis = PDMINS_2_DATA(pDevIns, PBUSLOGIC); 3024 bool fVerbose = false; 3025 3026 /* Parse arguments. */ 3027 if (pszArgs) 3028 fVerbose = strstr(pszArgs, "verbose") != NULL; 3029 3030 /* Show basic information. */ 3031 pHlp->pfnPrintf(pHlp, 3032 "%s#%d: PCI I/O=%RTiop ISA I/O=%RTiop MMIO=%RGp IRQ=%u GC=%RTbool R0=%RTbool\n", 3033 pDevIns->pReg->szName, 3034 pDevIns->iInstance, 3035 pThis->IOPortBase, pThis->IOISABase, pThis->MMIOBase, 3036 PCIDevGetInterruptLine(&pThis->dev), 3037 !!pThis->fGCEnabled, !!pThis->fR0Enabled); 3038 3039 /* Print mailbox state. */ 3040 if (pThis->regStatus & BUSLOGIC_REGISTER_STATUS_INITIALIZATION_REQUIRED) 3041 pHlp->pfnPrintf(pHlp, "Mailbox not initialized\n"); 3042 else 3043 { 3044 pHlp->pfnPrintf(pHlp, "%u-bit mailbox with %u entries at %RGp\n", 3045 pThis->fMbxIs24Bit ? 24 : 32, pThis->cMailbox, 3046 pThis->GCPhysAddrMailboxOutgoingBase); 3047 } 3048 3049 /* Print register contents. */ 3050 pHlp->pfnPrintf(pHlp, "Registers: STAT=%02x INTR=%02x GEOM=%02x\n", 3051 pThis->regStatus, pThis->regInterrupt, pThis->regGeometry); 3052 3053 /* Print the current command, if any. */ 3054 if (pThis->uOperationCode != 0xff ) 3055 pHlp->pfnPrintf(pHlp, "Current command: %02X\n", pThis->uOperationCode); 3056 } 3057 2977 3058 /* -=-=-=-=- Helper -=-=-=-=- */ 2978 3059 … … 3462 3543 if (RT_FAILURE(rc)) 3463 3544 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic cannot register save state handlers")); 3545 3546 /* 3547 * Register the debugger info callback. 3548 */ 3549 char szTmp[128]; 3550 RTStrPrintf(szTmp, sizeof(szTmp), "%s%d", pDevIns->pReg->szName, pDevIns->iInstance); 3551 PDMDevHlpDBGFInfoRegister(pDevIns, szTmp, "BusLogic HBA info", buslogicInfo); 3464 3552 3465 3553 rc = buslogicHwReset(pThis, true);
Note:
See TracChangeset
for help on using the changeset viewer.

