VirtualBox

Changeset 23356 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 28, 2009 7:46:48 AM (15 years ago)
Author:
vboxsync
Message:

SCSI: Add support for disks greater 2TB

File:
1 edited

Legend:

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

    r22850 r23356  
    261261}
    262262
     263DECLINLINE(void) drvscsiH2BE_U64(uint8_t *pbBuf, uint64_t val)
     264{
     265    pbBuf[0] = val >> 56;
     266    pbBuf[1] = val >> 48;
     267    pbBuf[2] = val >> 40;
     268    pbBuf[3] = val >> 32;
     269    pbBuf[4] = val >> 24;
     270    pbBuf[5] = val >> 16;
     271    pbBuf[6] = val >> 8;
     272    pbBuf[7] = val;
     273}
    263274
    264275DECLINLINE(uint16_t) drvscsiBE2H_U16(const uint8_t *pbBuf)
     
    447458                        iTxDir = PDMBLOCKTXDIR_FROM_DEVICE;
    448459                        *puOffset = drvscsiBE2H_U64(&pRequest->pbCDB[2]) * 512;
    449                         *pcbToTransfer = ((uint32_t)drvscsiBE2H_U32(&pRequest->pbCDB[6])) * 512;
     460                        *pcbToTransfer = ((uint32_t)drvscsiBE2H_U32(&pRequest->pbCDB[10])) * 512;
    450461                        break;
    451462                    }
     
    477488                        iTxDir = PDMBLOCKTXDIR_TO_DEVICE;
    478489                        *puOffset = drvscsiBE2H_U64(&pRequest->pbCDB[2]) * 512;
    479                         *pcbToTransfer = ((uint32_t)drvscsiBE2H_U32(&pRequest->pbCDB[6])) * 512;
     490                        *pcbToTransfer = ((uint32_t)drvscsiBE2H_U32(&pRequest->pbCDB[10])) * 512;
    480491                        break;
    481492                    }
     
    548559                            default:
    549560                                rc = drvscsiCmdError(pRequest, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);
     561                        }
     562                        break;
     563                    }
     564                    case SCSI_SERVICE_ACTION_IN_16:
     565                    {
     566                        switch (pRequest->pbCDB[1] & 0x1f)
     567                        {
     568                            case SCSI_SVC_ACTION_IN_READ_CAPACITY_16:
     569                            {
     570                                uint8_t aReply[32];
     571
     572                                memset(aReply, 0, sizeof(aReply));
     573                                drvscsiH2BE_U64(aReply, pThis->cSectors - 1);
     574                                drvscsiH2BE_U32(&aReply[8], 512);
     575                                /* Leave the rest 0 */
     576
     577                                drvscsiScatterGatherListCopyFromBuffer(pRequest, aReply, sizeof(aReply));
     578                                rc =  drvscsiCmdOk(pRequest);
     579                                break;
     580                            }
     581                            default:
     582                                rc = drvscsiCmdError(pRequest, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); /* Don't know if this is correct */
    550583                        }
    551584                        break;
     
    626659        }
    627660        AssertMsg(!cbToTransfer && !cSegmentsLeft,
    628                   ("Transfer incomplete cbToTransfer=%u cSegmentsLeft=%u", cbToTransfer, cSegmentsLeft));
     661                  ("Transfer incomplete cbToTransfer=%u cSegmentsLeft=%u\n", cbToTransfer, cSegmentsLeft));
    629662        drvscsiCmdOk(pRequest);
    630663    }
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