Changeset 81847 in vbox
- Timestamp:
- Nov 14, 2019 8:50:15 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134641
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevATA.cpp
r81845 r81847 274 274 uint32_t cbATAPISector; 275 275 /** ATAPI current command. */ 276 uint8_t a ATAPICmd[ATAPI_PACKET_SIZE];276 uint8_t abATAPICmd[ATAPI_PACKET_SIZE]; 277 277 /** ATAPI sense data. */ 278 278 uint8_t abATAPISense[ATAPI_SENSE_SIZE]; … … 2038 2038 memset(szBuf, 0, sizeof(szBuf)); 2039 2039 2040 switch (s->a ATAPICmd[0])2040 switch (s->abATAPICmd[0]) 2041 2041 { 2042 2042 case SCSI_MODE_SELECT_10: … … 2074 2074 * us to handle commands with up to 128KB of data. The usual 2075 2075 * imbalance of powers. */ 2076 uint8_t a ATAPICmd[ATAPI_PACKET_SIZE];2076 uint8_t abATAPICmd[ATAPI_PACKET_SIZE]; 2077 2077 uint32_t iATAPILBA, cSectors, cReqSectors, cbCurrTX; 2078 2078 uint8_t *pbBuf = s->abIOBuffer; … … 2082 2082 AssertStmt(cSectorsMax * s->cbATAPISector <= cbIOBuffer, cSectorsMax = cbIOBuffer / cbATAPISector); 2083 2083 2084 switch (s->a ATAPICmd[0])2084 switch (s->abATAPICmd[0]) 2085 2085 { 2086 2086 case SCSI_READ_10: 2087 2087 case SCSI_WRITE_10: 2088 2088 case SCSI_WRITE_AND_VERIFY_10: 2089 iATAPILBA = scsiBE2H_U32(s->a ATAPICmd + 2);2090 cSectors = scsiBE2H_U16(s->a ATAPICmd + 7);2089 iATAPILBA = scsiBE2H_U32(s->abATAPICmd + 2); 2090 cSectors = scsiBE2H_U16(s->abATAPICmd + 7); 2091 2091 break; 2092 2092 case SCSI_READ_12: 2093 2093 case SCSI_WRITE_12: 2094 iATAPILBA = scsiBE2H_U32(s->a ATAPICmd + 2);2095 cSectors = scsiBE2H_U32(s->a ATAPICmd + 6);2094 iATAPILBA = scsiBE2H_U32(s->abATAPICmd + 2); 2095 cSectors = scsiBE2H_U32(s->abATAPICmd + 6); 2096 2096 break; 2097 2097 case SCSI_READ_CD: 2098 iATAPILBA = scsiBE2H_U32(s->a ATAPICmd + 2);2099 cSectors = scsiBE2H_U24(s->a ATAPICmd + 6);2098 iATAPILBA = scsiBE2H_U32(s->abATAPICmd + 2); 2099 cSectors = scsiBE2H_U24(s->abATAPICmd + 6); 2100 2100 break; 2101 2101 case SCSI_READ_CD_MSF: 2102 iATAPILBA = scsiMSF2LBA(s->a ATAPICmd + 3);2103 cSectors = scsiMSF2LBA(s->a ATAPICmd + 6) - iATAPILBA;2102 iATAPILBA = scsiMSF2LBA(s->abATAPICmd + 3); 2103 cSectors = scsiMSF2LBA(s->abATAPICmd + 6) - iATAPILBA; 2104 2104 break; 2105 2105 default: 2106 AssertMsgFailed(("Don't know how to split command %#04x\n", s->a ATAPICmd[0]));2106 AssertMsgFailed(("Don't know how to split command %#04x\n", s->abATAPICmd[0])); 2107 2107 if (s->cErrors++ < MAX_LOG_REL_ERRORS) 2108 2108 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough split error\n", s->iLUN)); … … 2112 2112 } 2113 2113 cSectorsMax = RT_MIN(cSectorsMax, cSectors); 2114 memcpy(a ATAPICmd, s->aATAPICmd, ATAPI_PACKET_SIZE);2114 memcpy(abATAPICmd, s->abATAPICmd, ATAPI_PACKET_SIZE); 2115 2115 cReqSectors = 0; 2116 2116 for (uint32_t i = cSectorsMax; i > 0; i -= cReqSectors) … … 2121 2121 cReqSectors = i; 2122 2122 cbCurrTX = cbATAPISector * cReqSectors; 2123 switch (s->a ATAPICmd[0])2123 switch (s->abATAPICmd[0]) 2124 2124 { 2125 2125 case SCSI_READ_10: 2126 2126 case SCSI_WRITE_10: 2127 2127 case SCSI_WRITE_AND_VERIFY_10: 2128 scsiH2BE_U32(a ATAPICmd + 2, iATAPILBA);2129 scsiH2BE_U16(a ATAPICmd + 7, cReqSectors);2128 scsiH2BE_U32(abATAPICmd + 2, iATAPILBA); 2129 scsiH2BE_U16(abATAPICmd + 7, cReqSectors); 2130 2130 break; 2131 2131 case SCSI_READ_12: 2132 2132 case SCSI_WRITE_12: 2133 scsiH2BE_U32(a ATAPICmd + 2, iATAPILBA);2134 scsiH2BE_U32(a ATAPICmd + 6, cReqSectors);2133 scsiH2BE_U32(abATAPICmd + 2, iATAPILBA); 2134 scsiH2BE_U32(abATAPICmd + 6, cReqSectors); 2135 2135 break; 2136 2136 case SCSI_READ_CD: 2137 scsiH2BE_U32(a ATAPICmd + 2, iATAPILBA);2138 scsiH2BE_U24(a ATAPICmd + 6, cReqSectors);2137 scsiH2BE_U32(abATAPICmd + 2, iATAPILBA); 2138 scsiH2BE_U24(abATAPICmd + 6, cReqSectors); 2139 2139 break; 2140 2140 case SCSI_READ_CD_MSF: 2141 scsiLBA2MSF(a ATAPICmd + 3, iATAPILBA);2142 scsiLBA2MSF(a ATAPICmd + 6, iATAPILBA + cReqSectors);2141 scsiLBA2MSF(abATAPICmd + 3, iATAPILBA); 2142 scsiLBA2MSF(abATAPICmd + 6, iATAPILBA + cReqSectors); 2143 2143 break; 2144 2144 } 2145 2145 AssertLogRelReturn((uintptr_t)(pbBuf - &s->abIOBuffer[0]) + cbCurrTX <= sizeof(s->abIOBuffer), false); 2146 rc = s->pDrvMedia->pfnSendCmd(s->pDrvMedia, a ATAPICmd, ATAPI_PACKET_SIZE, (PDMMEDIATXDIR)s->uTxDir,2146 rc = s->pDrvMedia->pfnSendCmd(s->pDrvMedia, abATAPICmd, ATAPI_PACKET_SIZE, (PDMMEDIATXDIR)s->uTxDir, 2147 2147 pbBuf, &cbCurrTX, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */); 2148 2148 if (rc != VINF_SUCCESS) … … 2155 2155 { 2156 2156 /* Adjust ATAPI command for the next call. */ 2157 switch (s->a ATAPICmd[0])2157 switch (s->abATAPICmd[0]) 2158 2158 { 2159 2159 case SCSI_READ_10: 2160 2160 case SCSI_WRITE_10: 2161 2161 case SCSI_WRITE_AND_VERIFY_10: 2162 scsiH2BE_U32(s->a ATAPICmd + 2, iATAPILBA);2163 scsiH2BE_U16(s->a ATAPICmd + 7, cSectors - cSectorsMax);2162 scsiH2BE_U32(s->abATAPICmd + 2, iATAPILBA); 2163 scsiH2BE_U16(s->abATAPICmd + 7, cSectors - cSectorsMax); 2164 2164 break; 2165 2165 case SCSI_READ_12: 2166 2166 case SCSI_WRITE_12: 2167 scsiH2BE_U32(s->a ATAPICmd + 2, iATAPILBA);2168 scsiH2BE_U32(s->a ATAPICmd + 6, cSectors - cSectorsMax);2167 scsiH2BE_U32(s->abATAPICmd + 2, iATAPILBA); 2168 scsiH2BE_U32(s->abATAPICmd + 6, cSectors - cSectorsMax); 2169 2169 break; 2170 2170 case SCSI_READ_CD: 2171 scsiH2BE_U32(s->a ATAPICmd + 2, iATAPILBA);2172 scsiH2BE_U24(s->a ATAPICmd + 6, cSectors - cSectorsMax);2171 scsiH2BE_U32(s->abATAPICmd + 2, iATAPILBA); 2172 scsiH2BE_U24(s->abATAPICmd + 6, cSectors - cSectorsMax); 2173 2173 break; 2174 2174 case SCSI_READ_CD_MSF: 2175 scsiLBA2MSF(s->a ATAPICmd + 3, iATAPILBA);2176 scsiLBA2MSF(s->a ATAPICmd + 6, iATAPILBA + cSectors - cSectorsMax);2175 scsiLBA2MSF(s->abATAPICmd + 3, iATAPILBA); 2176 scsiLBA2MSF(s->abATAPICmd + 6, iATAPILBA + cSectors - cSectorsMax); 2177 2177 break; 2178 2178 default: 2179 AssertMsgFailed(("Don't know how to split command %#04x\n", s->a ATAPICmd[0]));2179 AssertMsgFailed(("Don't know how to split command %#04x\n", s->abATAPICmd[0])); 2180 2180 if (s->cErrors++ < MAX_LOG_REL_ERRORS) 2181 2181 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough split error\n", s->iLUN)); … … 2188 2188 { 2189 2189 AssertLogRelReturn(cbTransfer <= sizeof(s->abIOBuffer), false); 2190 rc = s->pDrvMedia->pfnSendCmd(s->pDrvMedia, s->a ATAPICmd, ATAPI_PACKET_SIZE, (PDMMEDIATXDIR)s->uTxDir,2190 rc = s->pDrvMedia->pfnSendCmd(s->pDrvMedia, s->abATAPICmd, ATAPI_PACKET_SIZE, (PDMMEDIATXDIR)s->uTxDir, 2191 2191 s->abIOBuffer, &cbTransfer, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */); 2192 2192 } … … 2213 2213 { 2214 2214 /* Do post processing for certain commands. */ 2215 switch (s->a ATAPICmd[0])2215 switch (s->abATAPICmd[0]) 2216 2216 { 2217 2217 case SCSI_SEND_CUE_SHEET: … … 2222 2222 2223 2223 if (RT_SUCCESS(rc)) 2224 rc = ATAPIPassthroughTrackListUpdate(s->pTrackList, s->a ATAPICmd, s->abIOBuffer, sizeof(s->abIOBuffer));2224 rc = ATAPIPassthroughTrackListUpdate(s->pTrackList, s->abATAPICmd, s->abIOBuffer, sizeof(s->abIOBuffer)); 2225 2225 2226 2226 if ( RT_FAILURE(rc) 2227 2227 && s->cErrors++ < MAX_LOG_REL_ERRORS) 2228 2228 LogRel(("ATA: Error (%Rrc) while updating the tracklist during %s, burning the disc might fail\n", 2229 rc, s->a ATAPICmd[0] == SCSI_SEND_CUE_SHEET ? "SEND CUE SHEET" : "READ TOC/PMA/ATIP"));2229 rc, s->abATAPICmd[0] == SCSI_SEND_CUE_SHEET ? "SEND CUE SHEET" : "READ TOC/PMA/ATIP")); 2230 2230 break; 2231 2231 } … … 2247 2247 s->cbTotalTransfer = cbTransfer; 2248 2248 2249 if ( s->a ATAPICmd[0] == SCSI_INQUIRY2249 if ( s->abATAPICmd[0] == SCSI_INQUIRY 2250 2250 && s->fOverwriteInquiry) 2251 2251 { … … 2279 2279 if (s->cErrors < MAX_LOG_REL_ERRORS) 2280 2280 { 2281 uint8_t u8Cmd = s->a ATAPICmd[0];2281 uint8_t u8Cmd = s->abATAPICmd[0]; 2282 2282 do 2283 2283 { … … 2302 2302 { 2303 2303 uint8_t *buf = s->abIOBuffer; 2304 int media = s->aATAPICmd[1]; 2305 int format = s->aATAPICmd[7]; 2306 2307 uint16_t max_len = (uint16_t)RT_MIN(scsiBE2H_U16(&s->aATAPICmd[8]), sizeof(s->abIOBuffer)); 2304 int media = s->abATAPICmd[1]; 2305 int format = s->abATAPICmd[7]; 2306 2307 AssertCompile(sizeof(s->abIOBuffer) > UINT16_MAX /* want a RT_MIN() below, but clang takes offence at always false stuff */); 2308 uint16_t max_len = scsiBE2H_U16(&s->abATAPICmd[8]); 2308 2309 memset(buf, 0, max_len); 2309 2310 … … 2338 2339 case 0x0: /* Physical format information */ 2339 2340 { 2340 int layer = s->a ATAPICmd[6];2341 int layer = s->abATAPICmd[6]; 2341 2342 uint64_t total_sectors; 2342 2343 … … 2508 2509 { 2509 2510 uint8_t *pbBuf = s->abIOBuffer; 2510 uint32_t u32LogAddr = scsiBE2H_U32(&s->a ATAPICmd[2]);2511 uint8_t u8LogAddrType = s->a ATAPICmd[1] & 0x03;2511 uint32_t u32LogAddr = scsiBE2H_U32(&s->abATAPICmd[2]); 2512 uint8_t u8LogAddrType = s->abATAPICmd[1] & 0x03; 2512 2513 2513 2514 int rc; … … 2765 2766 uint32_t cbBuf = cbIOBuffer; 2766 2767 uint32_t cbCopied = 0; 2767 uint16_t u16Sfn = scsiBE2H_U16(&s->a ATAPICmd[2]);2768 uint8_t u8Rt = s->a ATAPICmd[1] & 0x03;2768 uint16_t u16Sfn = scsiBE2H_U16(&s->abATAPICmd[2]); 2769 uint8_t u8Rt = s->abATAPICmd[1] & 0x03; 2769 2770 2770 2771 Assert(s->uTxDir == PDMMEDIATXDIR_FROM_DEVICE); … … 2829 2830 Assert(s->cbElementaryTransfer <= 8); 2830 2831 2831 if (!(s->a ATAPICmd[1] & 1))2832 if (!(s->abATAPICmd[1] & 1)) 2832 2833 { 2833 2834 /* no asynchronous operation supported */ … … 3049 3050 3050 3051 Assert(s->uTxDir == PDMMEDIATXDIR_FROM_DEVICE); 3051 fMSF = (s->a ATAPICmd[1] >> 1) & 1;3052 iStartTrack = s->a ATAPICmd[6];3052 fMSF = (s->abATAPICmd[1] >> 1) & 1; 3053 iStartTrack = s->abATAPICmd[6]; 3053 3054 if (iStartTrack == 0) 3054 3055 iStartTrack = 1; … … 3136 3137 Assert(s->uTxDir == PDMMEDIATXDIR_FROM_DEVICE); 3137 3138 Assert(s->cbElementaryTransfer <= 12); 3138 fMSF = (s->a ATAPICmd[1] >> 1) & 1;3139 fMSF = (s->abATAPICmd[1] >> 1) & 1; 3139 3140 /* multi session: only a single session defined */ 3140 3141 /** @todo double-check this stuff against what a real drive says for a CD-ROM (not a CD-R) … … 3182 3183 3183 3184 Assert(s->uTxDir == PDMMEDIATXDIR_FROM_DEVICE); 3184 fMSF = (s->a ATAPICmd[1] >> 1) & 1;3185 iStartTrack = s->a ATAPICmd[6];3185 fMSF = (s->abATAPICmd[1] >> 1) & 1; 3186 iStartTrack = s->abATAPICmd[6]; 3186 3187 3187 3188 q = pbBuf + 2; … … 3264 3265 static void atapiR3ParseCmdVirtualATAPI(ATADevState *s) 3265 3266 { 3266 const uint8_t *pbPacket = s->a ATAPICmd;3267 const uint8_t *pbPacket = s->abATAPICmd; 3267 3268 uint32_t cbMax; 3268 3269 uint32_t cSectors, iATAPILBA; … … 3727 3728 static void atapiR3ParseCmdPassthrough(ATADevState *s) 3728 3729 { 3729 const uint8_t *pbPacket = &s->a ATAPICmd[0];3730 const uint8_t *pbPacket = &s->abATAPICmd[0]; 3730 3731 3731 3732 /* Some cases we have to handle here. */ … … 3750 3751 cbBuf = s->uATARegLCyl | (s->uATARegHCyl << 8); /* use ATAPI transfer length */ 3751 3752 3752 bool fPassthrough = ATAPIPassthroughParseCdb(pbPacket, sizeof(s->a ATAPICmd), cbBuf, s->pTrackList,3753 bool fPassthrough = ATAPIPassthroughParseCdb(pbPacket, sizeof(s->abATAPICmd), cbBuf, s->pTrackList, 3753 3754 &s->abATAPISense[0], sizeof(s->abATAPISense), &uTxDir, &cbTransfer, 3754 3755 &cbATAPISector, &u8ScsiSts); … … 3797 3798 const uint8_t *pbPacket; 3798 3799 3799 pbPacket = s->a ATAPICmd;3800 pbPacket = s->abATAPICmd; 3800 3801 # ifdef DEBUG 3801 3802 Log(("%s: LUN#%d DMA=%d CMD=%#04x \"%s\"\n", __FUNCTION__, s->iLUN, s->fDMA, pbPacket[0], SCSICmdText(pbPacket[0]))); … … 3815 3816 { 3816 3817 s->fDMA = !!(s->uATARegFeature & 1); 3817 memcpy(s->a ATAPICmd, s->abIOBuffer, ATAPI_PACKET_SIZE);3818 memcpy(s->abATAPICmd, s->abIOBuffer, ATAPI_PACKET_SIZE); 3818 3819 s->uTxDir = PDMMEDIATXDIR_NONE; 3819 3820 s->cbTotalTransfer = 0; … … 6003 6004 */ 6004 6005 LogRel(("PIIX3 ATA: execution time for ATAPI command %#04x was %d seconds\n", 6005 pCtl->aIfs[pCtl->iAIOIf].a ATAPICmd[0], uWait / (1000 * 1000)));6006 pCtl->aIfs[pCtl->iAIOIf].abATAPICmd[0], uWait / (1000 * 1000))); 6006 6007 } 6007 6008 } … … 6979 6980 pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].iATAPILBA); 6980 6981 pHlp->pfnSSMPutU32(pSSM, pThis->aCts[i].aIfs[j].cbATAPISector); 6981 pHlp->pfnSSMPutMem(pSSM, &pThis->aCts[i].aIfs[j].a ATAPICmd, sizeof(pThis->aCts[i].aIfs[j].aATAPICmd));6982 pHlp->pfnSSMPutMem(pSSM, &pThis->aCts[i].aIfs[j].abATAPICmd, sizeof(pThis->aCts[i].aIfs[j].abATAPICmd)); 6982 6983 pHlp->pfnSSMPutMem(pSSM, &pThis->aCts[i].aIfs[j].abATAPISense, sizeof(pThis->aCts[i].aIfs[j].abATAPISense)); 6983 6984 pHlp->pfnSSMPutU8(pSSM, pThis->aCts[i].aIfs[j].cNotifiedMediaChange); … … 7157 7158 pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].iATAPILBA); 7158 7159 pHlp->pfnSSMGetU32(pSSM, &pThis->aCts[i].aIfs[j].cbATAPISector); 7159 pHlp->pfnSSMGetMem(pSSM, &pThis->aCts[i].aIfs[j].a ATAPICmd, sizeof(pThis->aCts[i].aIfs[j].aATAPICmd));7160 pHlp->pfnSSMGetMem(pSSM, &pThis->aCts[i].aIfs[j].abATAPICmd, sizeof(pThis->aCts[i].aIfs[j].abATAPICmd)); 7160 7161 if (uVersion > ATA_SAVED_STATE_VERSION_WITHOUT_FULL_SENSE) 7161 7162 pHlp->pfnSSMGetMem(pSSM, pThis->aCts[i].aIfs[j].abATAPISense, sizeof(pThis->aCts[i].aIfs[j].abATAPISense));
Note:
See TracChangeset
for help on using the changeset viewer.