Home | History | Annotate | Download | only in hw
      1 /*
      2  * SCSI Device emulation
      3  *
      4  * Copyright (c) 2006 CodeSourcery.
      5  * Based on code by Fabrice Bellard
      6  *
      7  * Written by Paul Brook
      8  *
      9  * This code is licenced under the LGPL.
     10  *
     11  * Note that this file only handles the SCSI architecture model and device
     12  * commands.  Emulation of interface/link layer protocols is handled by
     13  * the host adapter emulator.
     14  */
     15 
     16 #include <qemu-common.h>
     17 #include <sysemu.h>
     18 //#define DEBUG_SCSI
     19 
     20 #ifdef DEBUG_SCSI
     21 #define DPRINTF(fmt, ...) \
     22 do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
     23 #else
     24 #define DPRINTF(fmt, ...) do {} while(0)
     25 #endif
     26 
     27 #define BADF(fmt, ...) \
     28 do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
     29 
     30 #include "qemu-common.h"
     31 #include "block.h"
     32 #include "scsi-disk.h"
     33 
     34 #define SENSE_NO_SENSE        0
     35 #define SENSE_NOT_READY       2
     36 #define SENSE_HARDWARE_ERROR  4
     37 #define SENSE_ILLEGAL_REQUEST 5
     38 
     39 #define STATUS_GOOD            0
     40 #define STATUS_CHECK_CONDITION 2
     41 
     42 #define SCSI_DMA_BUF_SIZE    131072
     43 #define SCSI_MAX_INQUIRY_LEN 256
     44 
     45 #define SCSI_REQ_STATUS_RETRY 0x01
     46 
     47 typedef struct SCSIRequest {
     48     SCSIDeviceState *dev;
     49     uint32_t tag;
     50     /* ??? We should probably keep track of whether the data transfer is
     51        a read or a write.  Currently we rely on the host getting it right.  */
     52     /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */
     53     uint64_t sector;
     54     uint32_t sector_count;
     55     struct iovec iov;
     56     QEMUIOVector qiov;
     57     BlockDriverAIOCB *aiocb;
     58     struct SCSIRequest *next;
     59     uint32_t status;
     60 } SCSIRequest;
     61 
     62 struct SCSIDeviceState
     63 {
     64     BlockDriverState *bdrv;
     65     SCSIRequest *requests;
     66     /* The qemu block layer uses a fixed 512 byte sector size.
     67        This is the number of 512 byte blocks in a single scsi sector.  */
     68     int cluster_size;
     69     uint64_t max_lba;
     70     int sense;
     71     int tcq;
     72     /* Completion functions may be called from either scsi_{read,write}_data
     73        or from the AIO completion routines.  */
     74     scsi_completionfn completion;
     75     void *opaque;
     76     char drive_serial_str[21];
     77 };
     78 
     79 /* Global pool of SCSIRequest structures.  */
     80 static SCSIRequest *free_requests = NULL;
     81 
     82 static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
     83 {
     84     SCSIRequest *r;
     85 
     86     if (free_requests) {
     87         r = free_requests;
     88         free_requests = r->next;
     89     } else {
     90         r = qemu_malloc(sizeof(SCSIRequest));
     91         r->iov.iov_base = qemu_memalign(512, SCSI_DMA_BUF_SIZE);
     92     }
     93     r->dev = s;
     94     r->tag = tag;
     95     r->sector_count = 0;
     96     r->iov.iov_len = 0;
     97     r->aiocb = NULL;
     98     r->status = 0;
     99 
    100     r->next = s->requests;
    101     s->requests = r;
    102     return r;
    103 }
    104 
    105 static void scsi_remove_request(SCSIRequest *r)
    106 {
    107     SCSIRequest *last;
    108     SCSIDeviceState *s = r->dev;
    109 
    110     if (s->requests == r) {
    111         s->requests = r->next;
    112     } else {
    113         last = s->requests;
    114         while (last && last->next != r)
    115             last = last->next;
    116         if (last) {
    117             last->next = r->next;
    118         } else {
    119             BADF("Orphaned request\n");
    120         }
    121     }
    122     r->next = free_requests;
    123     free_requests = r;
    124 }
    125 
    126 static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
    127 {
    128     SCSIRequest *r;
    129 
    130     r = s->requests;
    131     while (r && r->tag != tag)
    132         r = r->next;
    133 
    134     return r;
    135 }
    136 
    137 /* Helper function for command completion.  */
    138 static void scsi_command_complete(SCSIRequest *r, int status, int sense)
    139 {
    140     SCSIDeviceState *s = r->dev;
    141     uint32_t tag;
    142     DPRINTF("Command complete tag=0x%x status=%d sense=%d\n", r->tag, status, sense);
    143     s->sense = sense;
    144     tag = r->tag;
    145     scsi_remove_request(r);
    146     s->completion(s->opaque, SCSI_REASON_DONE, tag, status);
    147 }
    148 
    149 /* Cancel a pending data transfer.  */
    150 static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
    151 {
    152     SCSIDeviceState *s = d->state;
    153     SCSIRequest *r;
    154     DPRINTF("Cancel tag=0x%x\n", tag);
    155     r = scsi_find_request(s, tag);
    156     if (r) {
    157         if (r->aiocb)
    158             bdrv_aio_cancel(r->aiocb);
    159         r->aiocb = NULL;
    160         scsi_remove_request(r);
    161     }
    162 }
    163 
    164 static void scsi_read_complete(void * opaque, int ret)
    165 {
    166     SCSIRequest *r = (SCSIRequest *)opaque;
    167     SCSIDeviceState *s = r->dev;
    168 
    169     if (ret) {
    170         DPRINTF("IO error\n");
    171         s->completion(s->opaque, SCSI_REASON_DATA, r->tag, 0);
    172         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE);
    173         return;
    174     }
    175     DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->iov.iov_len);
    176 
    177     s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->iov.iov_len);
    178 }
    179 
    180 /* Read more data from scsi device into buffer.  */
    181 static void scsi_read_data(SCSIDevice *d, uint32_t tag)
    182 {
    183     SCSIDeviceState *s = d->state;
    184     SCSIRequest *r;
    185     uint32_t n;
    186 
    187     r = scsi_find_request(s, tag);
    188     if (!r) {
    189         BADF("Bad read tag 0x%x\n", tag);
    190         /* ??? This is the wrong error.  */
    191         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
    192         return;
    193     }
    194     if (r->sector_count == (uint32_t)-1) {
    195         DPRINTF("Read buf_len=%d\n", r->iov.iov_len);
    196         r->sector_count = 0;
    197         s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->iov.iov_len);
    198         return;
    199     }
    200     DPRINTF("Read sector_count=%d\n", r->sector_count);
    201     if (r->sector_count == 0) {
    202         scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
    203         return;
    204     }
    205 
    206     n = r->sector_count;
    207     if (n > SCSI_DMA_BUF_SIZE / 512)
    208         n = SCSI_DMA_BUF_SIZE / 512;
    209 
    210     r->iov.iov_len = n * 512;
    211     qemu_iovec_init_external(&r->qiov, &r->iov, 1);
    212     r->aiocb = bdrv_aio_readv(s->bdrv, r->sector, &r->qiov, n,
    213                               scsi_read_complete, r);
    214     if (r->aiocb == NULL)
    215         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
    216     r->sector += n;
    217     r->sector_count -= n;
    218 }
    219 
    220 static int scsi_handle_write_error(SCSIRequest *r, int error)
    221 {
    222     BlockInterfaceErrorAction action = drive_get_onerror(r->dev->bdrv);
    223 
    224     if (action == BLOCK_ERR_IGNORE)
    225         return 0;
    226 
    227     if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
    228             || action == BLOCK_ERR_STOP_ANY) {
    229         r->status |= SCSI_REQ_STATUS_RETRY;
    230         vm_stop(0);
    231     } else {
    232         scsi_command_complete(r, STATUS_CHECK_CONDITION,
    233                 SENSE_HARDWARE_ERROR);
    234     }
    235 
    236     return 1;
    237 }
    238 
    239 static void scsi_write_complete(void * opaque, int ret)
    240 {
    241     SCSIRequest *r = (SCSIRequest *)opaque;
    242     SCSIDeviceState *s = r->dev;
    243     uint32_t len;
    244     uint32_t n;
    245 
    246     r->aiocb = NULL;
    247 
    248     if (ret) {
    249         if (scsi_handle_write_error(r, -ret))
    250             return;
    251     }
    252 
    253     n = r->iov.iov_len / 512;
    254     r->sector += n;
    255     r->sector_count -= n;
    256     if (r->sector_count == 0) {
    257         scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
    258     } else {
    259         len = r->sector_count * 512;
    260         if (len > SCSI_DMA_BUF_SIZE) {
    261             len = SCSI_DMA_BUF_SIZE;
    262         }
    263         r->iov.iov_len = len;
    264         DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);
    265         s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
    266     }
    267 }
    268 
    269 static void scsi_write_request(SCSIRequest *r)
    270 {
    271     SCSIDeviceState *s = r->dev;
    272     uint32_t n;
    273 
    274     n = r->iov.iov_len / 512;
    275     if (n) {
    276         qemu_iovec_init_external(&r->qiov, &r->iov, 1);
    277         r->aiocb = bdrv_aio_writev(s->bdrv, r->sector, &r->qiov, n,
    278                                    scsi_write_complete, r);
    279         if (r->aiocb == NULL)
    280             scsi_command_complete(r, STATUS_CHECK_CONDITION,
    281                                   SENSE_HARDWARE_ERROR);
    282     } else {
    283         /* Invoke completion routine to fetch data from host.  */
    284         scsi_write_complete(r, 0);
    285     }
    286 }
    287 
    288 /* Write data to a scsi device.  Returns nonzero on failure.
    289    The transfer may complete asynchronously.  */
    290 static int scsi_write_data(SCSIDevice *d, uint32_t tag)
    291 {
    292     SCSIDeviceState *s = d->state;
    293     SCSIRequest *r;
    294 
    295     DPRINTF("Write data tag=0x%x\n", tag);
    296     r = scsi_find_request(s, tag);
    297     if (!r) {
    298         BADF("Bad write tag 0x%x\n", tag);
    299         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
    300         return 1;
    301     }
    302 
    303     if (r->aiocb)
    304         BADF("Data transfer already in progress\n");
    305 
    306     scsi_write_request(r);
    307 
    308     return 0;
    309 }
    310 
    311 static void scsi_dma_restart_cb(void *opaque, int running, int reason)
    312 {
    313     SCSIDeviceState *s = opaque;
    314     SCSIRequest *r = s->requests;
    315     if (!running)
    316         return;
    317 
    318     while (r) {
    319         if (r->status & SCSI_REQ_STATUS_RETRY) {
    320             r->status &= ~SCSI_REQ_STATUS_RETRY;
    321             scsi_write_request(r);
    322         }
    323         r = r->next;
    324     }
    325 }
    326 
    327 /* Return a pointer to the data buffer.  */
    328 static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
    329 {
    330     SCSIDeviceState *s = d->state;
    331     SCSIRequest *r;
    332 
    333     r = scsi_find_request(s, tag);
    334     if (!r) {
    335         BADF("Bad buffer tag 0x%x\n", tag);
    336         return NULL;
    337     }
    338     return (uint8_t *)r->iov.iov_base;
    339 }
    340 
    341 /* Execute a scsi command.  Returns the length of the data expected by the
    342    command.  This will be Positive for data transfers from the device
    343    (eg. disk reads), negative for transfers to the device (eg. disk writes),
    344    and zero if the command does not transfer any data.  */
    345 
    346 static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
    347                                  uint8_t *buf, int lun)
    348 {
    349     SCSIDeviceState *s = d->state;
    350     uint64_t nb_sectors;
    351     uint64_t lba;
    352     uint32_t len;
    353     int cmdlen;
    354     int is_write;
    355     uint8_t command;
    356     uint8_t *outbuf;
    357     SCSIRequest *r;
    358 
    359     command = buf[0];
    360     r = scsi_find_request(s, tag);
    361     if (r) {
    362         BADF("Tag 0x%x already in use\n", tag);
    363         scsi_cancel_io(d, tag);
    364     }
    365     /* ??? Tags are not unique for different luns.  We only implement a
    366        single lun, so this should not matter.  */
    367     r = scsi_new_request(s, tag);
    368     outbuf = (uint8_t *)r->iov.iov_base;
    369     is_write = 0;
    370     DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
    371     switch (command >> 5) {
    372     case 0:
    373         lba = (uint64_t) buf[3] | ((uint64_t) buf[2] << 8) |
    374               (((uint64_t) buf[1] & 0x1f) << 16);
    375         len = buf[4];
    376         cmdlen = 6;
    377         break;
    378     case 1:
    379     case 2:
    380         lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
    381               ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
    382         len = buf[8] | (buf[7] << 8);
    383         cmdlen = 10;
    384         break;
    385     case 4:
    386         lba = (uint64_t) buf[9] | ((uint64_t) buf[8] << 8) |
    387               ((uint64_t) buf[7] << 16) | ((uint64_t) buf[6] << 24) |
    388               ((uint64_t) buf[5] << 32) | ((uint64_t) buf[4] << 40) |
    389               ((uint64_t) buf[3] << 48) | ((uint64_t) buf[2] << 56);
    390         len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
    391         cmdlen = 16;
    392         break;
    393     case 5:
    394         lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
    395               ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
    396         len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
    397         cmdlen = 12;
    398         break;
    399     default:
    400         BADF("Unsupported command length, command %x\n", command);
    401         goto fail;
    402     }
    403 #ifdef DEBUG_SCSI
    404     {
    405         int i;
    406         for (i = 1; i < cmdlen; i++) {
    407             printf(" 0x%02x", buf[i]);
    408         }
    409         printf("\n");
    410     }
    411 #endif
    412     if (lun || buf[1] >> 5) {
    413         /* Only LUN 0 supported.  */
    414         DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
    415         if (command != 0x03 && command != 0x12) /* REQUEST SENSE and INQUIRY */
    416             goto fail;
    417     }
    418     switch (command) {
    419     case 0x0:
    420 	DPRINTF("Test Unit Ready\n");
    421         if (!bdrv_is_inserted(s->bdrv))
    422             goto notready;
    423 	break;
    424     case 0x03:
    425         DPRINTF("Request Sense (len %d)\n", len);
    426         if (len < 4)
    427             goto fail;
    428         memset(outbuf, 0, 4);
    429         r->iov.iov_len = 4;
    430         if (s->sense == SENSE_NOT_READY && len >= 18) {
    431             memset(outbuf, 0, 18);
    432             r->iov.iov_len = 18;
    433             outbuf[7] = 10;
    434             /* asc 0x3a, ascq 0: Medium not present */
    435             outbuf[12] = 0x3a;
    436             outbuf[13] = 0;
    437         }
    438         outbuf[0] = 0xf0;
    439         outbuf[1] = 0;
    440         outbuf[2] = s->sense;
    441         break;
    442     case 0x12:
    443         DPRINTF("Inquiry (len %d)\n", len);
    444         if (buf[1] & 0x2) {
    445             /* Command support data - optional, not implemented */
    446             BADF("optional INQUIRY command support request not implemented\n");
    447             goto fail;
    448         }
    449         else if (buf[1] & 0x1) {
    450             /* Vital product data */
    451             uint8_t page_code = buf[2];
    452             if (len < 4) {
    453                 BADF("Error: Inquiry (EVPD[%02X]) buffer size %d is "
    454                      "less than 4\n", page_code, len);
    455                 goto fail;
    456             }
    457 
    458             switch (page_code) {
    459                 case 0x00:
    460                     {
    461                         /* Supported page codes, mandatory */
    462                         DPRINTF("Inquiry EVPD[Supported pages] "
    463                                 "buffer size %d\n", len);
    464 
    465                         r->iov.iov_len = 0;
    466 
    467                         if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
    468                             outbuf[r->iov.iov_len++] = 5;
    469                         } else {
    470                             outbuf[r->iov.iov_len++] = 0;
    471                         }
    472 
    473                         outbuf[r->iov.iov_len++] = 0x00; // this page
    474                         outbuf[r->iov.iov_len++] = 0x00;
    475                         outbuf[r->iov.iov_len++] = 3;    // number of pages
    476                         outbuf[r->iov.iov_len++] = 0x00; // list of supported pages (this page)
    477                         outbuf[r->iov.iov_len++] = 0x80; // unit serial number
    478                         outbuf[r->iov.iov_len++] = 0x83; // device identification
    479                     }
    480                     break;
    481                 case 0x80:
    482                     {
    483                         int l;
    484 
    485                         /* Device serial number, optional */
    486                         if (len < 4) {
    487                             BADF("Error: EVPD[Serial number] Inquiry buffer "
    488                                  "size %d too small, %d needed\n", len, 4);
    489                             goto fail;
    490                         }
    491 
    492                         DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len);
    493                         l = MIN(len, strlen(s->drive_serial_str));
    494 
    495                         r->iov.iov_len = 0;
    496 
    497                         /* Supported page codes */
    498                         if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
    499                             outbuf[r->iov.iov_len++] = 5;
    500                         } else {
    501                             outbuf[r->iov.iov_len++] = 0;
    502                         }
    503 
    504                         outbuf[r->iov.iov_len++] = 0x80; // this page
    505                         outbuf[r->iov.iov_len++] = 0x00;
    506                         outbuf[r->iov.iov_len++] = l;
    507                         memcpy(&outbuf[r->iov.iov_len], s->drive_serial_str, l);
    508                         r->iov.iov_len += l;
    509                     }
    510 
    511                     break;
    512                 case 0x83:
    513                     {
    514                         /* Device identification page, mandatory */
    515                         int max_len = 255 - 8;
    516                         int id_len = strlen(bdrv_get_device_name(s->bdrv));
    517                         if (id_len > max_len)
    518                             id_len = max_len;
    519 
    520                         DPRINTF("Inquiry EVPD[Device identification] "
    521                                 "buffer size %d\n", len);
    522                         r->iov.iov_len = 0;
    523                         if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
    524                             outbuf[r->iov.iov_len++] = 5;
    525                         } else {
    526                             outbuf[r->iov.iov_len++] = 0;
    527                         }
    528 
    529                         outbuf[r->iov.iov_len++] = 0x83; // this page
    530                         outbuf[r->iov.iov_len++] = 0x00;
    531                         outbuf[r->iov.iov_len++] = 3 + id_len;
    532 
    533                         outbuf[r->iov.iov_len++] = 0x2; // ASCII
    534                         outbuf[r->iov.iov_len++] = 0;   // not officially assigned
    535                         outbuf[r->iov.iov_len++] = 0;   // reserved
    536                         outbuf[r->iov.iov_len++] = id_len; // length of data following
    537 
    538                         memcpy(&outbuf[r->iov.iov_len],
    539                                bdrv_get_device_name(s->bdrv), id_len);
    540                         r->iov.iov_len += id_len;
    541                     }
    542                     break;
    543                 default:
    544                     BADF("Error: unsupported Inquiry (EVPD[%02X]) "
    545                          "buffer size %d\n", page_code, len);
    546                     goto fail;
    547             }
    548             /* done with EVPD */
    549             break;
    550         }
    551         else {
    552             /* Standard INQUIRY data */
    553             if (buf[2] != 0) {
    554                 BADF("Error: Inquiry (STANDARD) page or code "
    555                      "is non-zero [%02X]\n", buf[2]);
    556                 goto fail;
    557             }
    558 
    559             /* PAGE CODE == 0 */
    560             if (len < 5) {
    561                 BADF("Error: Inquiry (STANDARD) buffer size %d "
    562                      "is less than 5\n", len);
    563                 goto fail;
    564             }
    565 
    566             if (len < 36) {
    567                 BADF("Error: Inquiry (STANDARD) buffer size %d "
    568                      "is less than 36 (TODO: only 5 required)\n", len);
    569             }
    570         }
    571 
    572         if(len > SCSI_MAX_INQUIRY_LEN)
    573             len = SCSI_MAX_INQUIRY_LEN;
    574 
    575         memset(outbuf, 0, len);
    576 
    577         if (lun || buf[1] >> 5) {
    578             outbuf[0] = 0x7f;	/* LUN not supported */
    579 	} else if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
    580 	    outbuf[0] = 5;
    581             outbuf[1] = 0x80;
    582 	    memcpy(&outbuf[16], "QEMU CD-ROM    ", 16);
    583 	} else {
    584 	    outbuf[0] = 0;
    585 	    memcpy(&outbuf[16], "QEMU HARDDISK  ", 16);
    586 	}
    587 	memcpy(&outbuf[8], "QEMU   ", 8);
    588         memcpy(&outbuf[32], QEMU_VERSION, 4);
    589         /* Identify device as SCSI-3 rev 1.
    590            Some later commands are also implemented. */
    591 	outbuf[2] = 3;
    592 	outbuf[3] = 2; /* Format 2 */
    593 	outbuf[4] = len - 5; /* Additional Length = (Len - 1) - 4 */
    594         /* Sync data transfer and TCQ.  */
    595         outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0);
    596 	r->iov.iov_len = len;
    597 	break;
    598     case 0x16:
    599         DPRINTF("Reserve(6)\n");
    600         if (buf[1] & 1)
    601             goto fail;
    602         break;
    603     case 0x17:
    604         DPRINTF("Release(6)\n");
    605         if (buf[1] & 1)
    606             goto fail;
    607         break;
    608     case 0x1a:
    609     case 0x5a:
    610         {
    611             uint8_t *p;
    612             int page;
    613 
    614             page = buf[2] & 0x3f;
    615             DPRINTF("Mode Sense (page %d, len %d)\n", page, len);
    616             p = outbuf;
    617             memset(p, 0, 4);
    618             outbuf[1] = 0; /* Default media type.  */
    619             outbuf[3] = 0; /* Block descriptor length.  */
    620             if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
    621                 outbuf[2] = 0x80; /* Readonly.  */
    622             }
    623             p += 4;
    624             if (page == 4) {
    625                 int cylinders, heads, secs;
    626 
    627                 /* Rigid disk device geometry page. */
    628                 p[0] = 4;
    629                 p[1] = 0x16;
    630                 /* if a geometry hint is available, use it */
    631                 bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
    632                 p[2] = (cylinders >> 16) & 0xff;
    633                 p[3] = (cylinders >> 8) & 0xff;
    634                 p[4] = cylinders & 0xff;
    635                 p[5] = heads & 0xff;
    636                 /* Write precomp start cylinder, disabled */
    637                 p[6] = (cylinders >> 16) & 0xff;
    638                 p[7] = (cylinders >> 8) & 0xff;
    639                 p[8] = cylinders & 0xff;
    640                 /* Reduced current start cylinder, disabled */
    641                 p[9] = (cylinders >> 16) & 0xff;
    642                 p[10] = (cylinders >> 8) & 0xff;
    643                 p[11] = cylinders & 0xff;
    644                 /* Device step rate [ns], 200ns */
    645                 p[12] = 0;
    646                 p[13] = 200;
    647                 /* Landing zone cylinder */
    648                 p[14] = 0xff;
    649                 p[15] =  0xff;
    650                 p[16] = 0xff;
    651                 /* Medium rotation rate [rpm], 5400 rpm */
    652                 p[20] = (5400 >> 8) & 0xff;
    653                 p[21] = 5400 & 0xff;
    654                 p += 0x16;
    655             } else if (page == 5) {
    656                 int cylinders, heads, secs;
    657 
    658                 /* Flexible disk device geometry page. */
    659                 p[0] = 5;
    660                 p[1] = 0x1e;
    661                 /* Transfer rate [kbit/s], 5Mbit/s */
    662                 p[2] = 5000 >> 8;
    663                 p[3] = 5000 & 0xff;
    664                 /* if a geometry hint is available, use it */
    665                 bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
    666                 p[4] = heads & 0xff;
    667                 p[5] = secs & 0xff;
    668                 p[6] = s->cluster_size * 2;
    669                 p[8] = (cylinders >> 8) & 0xff;
    670                 p[9] = cylinders & 0xff;
    671                 /* Write precomp start cylinder, disabled */
    672                 p[10] = (cylinders >> 8) & 0xff;
    673                 p[11] = cylinders & 0xff;
    674                 /* Reduced current start cylinder, disabled */
    675                 p[12] = (cylinders >> 8) & 0xff;
    676                 p[13] = cylinders & 0xff;
    677                 /* Device step rate [100us], 100us */
    678                 p[14] = 0;
    679                 p[15] = 1;
    680                 /* Device step pulse width [us], 1us */
    681                 p[16] = 1;
    682                 /* Device head settle delay [100us], 100us */
    683                 p[17] = 0;
    684                 p[18] = 1;
    685                 /* Motor on delay [0.1s], 0.1s */
    686                 p[19] = 1;
    687                 /* Motor off delay [0.1s], 0.1s */
    688                 p[20] = 1;
    689                 /* Medium rotation rate [rpm], 5400 rpm */
    690                 p[28] = (5400 >> 8) & 0xff;
    691                 p[29] = 5400 & 0xff;
    692                 p += 0x1e;
    693             } else if ((page == 8 || page == 0x3f)) {
    694                 /* Caching page.  */
    695                 memset(p,0,20);
    696                 p[0] = 8;
    697                 p[1] = 0x12;
    698                 p[2] = 4; /* WCE */
    699                 p += 20;
    700             }
    701             if ((page == 0x3f || page == 0x2a)
    702                     && (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM)) {
    703                 /* CD Capabilities and Mechanical Status page. */
    704                 p[0] = 0x2a;
    705                 p[1] = 0x14;
    706                 p[2] = 3; // CD-R & CD-RW read
    707                 p[3] = 0; // Writing not supported
    708                 p[4] = 0x7f; /* Audio, composite, digital out,
    709                                          mode 2 form 1&2, multi session */
    710                 p[5] = 0xff; /* CD DA, DA accurate, RW supported,
    711                                          RW corrected, C2 errors, ISRC,
    712                                          UPC, Bar code */
    713                 p[6] = 0x2d | (bdrv_is_locked(s->bdrv)? 2 : 0);
    714                 /* Locking supported, jumper present, eject, tray */
    715                 p[7] = 0; /* no volume & mute control, no
    716                                       changer */
    717                 p[8] = (50 * 176) >> 8; // 50x read speed
    718                 p[9] = (50 * 176) & 0xff;
    719                 p[10] = 0 >> 8; // No volume
    720                 p[11] = 0 & 0xff;
    721                 p[12] = 2048 >> 8; // 2M buffer
    722                 p[13] = 2048 & 0xff;
    723                 p[14] = (16 * 176) >> 8; // 16x read speed current
    724                 p[15] = (16 * 176) & 0xff;
    725                 p[18] = (16 * 176) >> 8; // 16x write speed
    726                 p[19] = (16 * 176) & 0xff;
    727                 p[20] = (16 * 176) >> 8; // 16x write speed current
    728                 p[21] = (16 * 176) & 0xff;
    729                 p += 22;
    730             }
    731             r->iov.iov_len = p - outbuf;
    732             outbuf[0] = r->iov.iov_len - 4;
    733             if (r->iov.iov_len > len)
    734                 r->iov.iov_len = len;
    735         }
    736         break;
    737     case 0x1b:
    738         DPRINTF("Start Stop Unit\n");
    739         if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM &&
    740             (buf[4] & 2))
    741             /* load/eject medium */
    742             bdrv_eject(s->bdrv, !(buf[4] & 1));
    743 	break;
    744     case 0x1e:
    745         DPRINTF("Prevent Allow Medium Removal (prevent = %d)\n", buf[4] & 3);
    746         bdrv_set_locked(s->bdrv, buf[4] & 1);
    747 	break;
    748     case 0x25:
    749 	DPRINTF("Read Capacity\n");
    750         /* The normal LEN field for this command is zero.  */
    751 	memset(outbuf, 0, 8);
    752 	bdrv_get_geometry(s->bdrv, &nb_sectors);
    753         nb_sectors /= s->cluster_size;
    754         /* Returned value is the address of the last sector.  */
    755         if (nb_sectors) {
    756             nb_sectors--;
    757             /* Remember the new size for read/write sanity checking. */
    758             s->max_lba = nb_sectors;
    759             /* Clip to 2TB, instead of returning capacity modulo 2TB. */
    760             if (nb_sectors > UINT32_MAX)
    761                 nb_sectors = UINT32_MAX;
    762             outbuf[0] = (nb_sectors >> 24) & 0xff;
    763             outbuf[1] = (nb_sectors >> 16) & 0xff;
    764             outbuf[2] = (nb_sectors >> 8) & 0xff;
    765             outbuf[3] = nb_sectors & 0xff;
    766             outbuf[4] = 0;
    767             outbuf[5] = 0;
    768             outbuf[6] = s->cluster_size * 2;
    769             outbuf[7] = 0;
    770             r->iov.iov_len = 8;
    771         } else {
    772         notready:
    773             scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
    774             return 0;
    775         }
    776 	break;
    777     case 0x08:
    778     case 0x28:
    779     case 0x88:
    780         DPRINTF("Read (sector %lld, count %d)\n", lba, len);
    781         if (lba > s->max_lba)
    782             goto illegal_lba;
    783         r->sector = lba * s->cluster_size;
    784         r->sector_count = len * s->cluster_size;
    785         break;
    786     case 0x0a:
    787     case 0x2a:
    788     case 0x8a:
    789         DPRINTF("Write (sector %lld, count %d)\n", lba, len);
    790         if (lba > s->max_lba)
    791             goto illegal_lba;
    792         r->sector = lba * s->cluster_size;
    793         r->sector_count = len * s->cluster_size;
    794         is_write = 1;
    795         break;
    796     case 0x35:
    797         DPRINTF("Synchronise cache (sector %d, count %d)\n", lba, len);
    798         bdrv_flush(s->bdrv);
    799         break;
    800     case 0x43:
    801         {
    802             int start_track, format, msf, toclen;
    803 
    804             msf = buf[1] & 2;
    805             format = buf[2] & 0xf;
    806             start_track = buf[6];
    807             bdrv_get_geometry(s->bdrv, &nb_sectors);
    808             DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
    809             nb_sectors /= s->cluster_size;
    810             switch(format) {
    811             case 0:
    812                 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
    813                 break;
    814             case 1:
    815                 /* multi session : only a single session defined */
    816                 toclen = 12;
    817                 memset(outbuf, 0, 12);
    818                 outbuf[1] = 0x0a;
    819                 outbuf[2] = 0x01;
    820                 outbuf[3] = 0x01;
    821                 break;
    822             case 2:
    823                 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
    824                 break;
    825             default:
    826                 goto error_cmd;
    827             }
    828             if (toclen > 0) {
    829                 if (len > toclen)
    830                   len = toclen;
    831                 r->iov.iov_len = len;
    832                 break;
    833             }
    834         error_cmd:
    835             DPRINTF("Read TOC error\n");
    836             goto fail;
    837         }
    838     case 0x46:
    839         DPRINTF("Get Configuration (rt %d, maxlen %d)\n", buf[1] & 3, len);
    840         memset(outbuf, 0, 8);
    841         /* ??? This should probably return much more information.  For now
    842            just return the basic header indicating the CD-ROM profile.  */
    843         outbuf[7] = 8; // CD-ROM
    844         r->iov.iov_len = 8;
    845         break;
    846     case 0x56:
    847         DPRINTF("Reserve(10)\n");
    848         if (buf[1] & 3)
    849             goto fail;
    850         break;
    851     case 0x57:
    852         DPRINTF("Release(10)\n");
    853         if (buf[1] & 3)
    854             goto fail;
    855         break;
    856     case 0x9e:
    857         /* Service Action In subcommands. */
    858         if ((buf[1] & 31) == 0x10) {
    859             DPRINTF("SAI READ CAPACITY(16)\n");
    860             memset(outbuf, 0, len);
    861             bdrv_get_geometry(s->bdrv, &nb_sectors);
    862             nb_sectors /= s->cluster_size;
    863             /* Returned value is the address of the last sector.  */
    864             if (nb_sectors) {
    865                 nb_sectors--;
    866                 /* Remember the new size for read/write sanity checking. */
    867                 s->max_lba = nb_sectors;
    868                 outbuf[0] = (nb_sectors >> 56) & 0xff;
    869                 outbuf[1] = (nb_sectors >> 48) & 0xff;
    870                 outbuf[2] = (nb_sectors >> 40) & 0xff;
    871                 outbuf[3] = (nb_sectors >> 32) & 0xff;
    872                 outbuf[4] = (nb_sectors >> 24) & 0xff;
    873                 outbuf[5] = (nb_sectors >> 16) & 0xff;
    874                 outbuf[6] = (nb_sectors >> 8) & 0xff;
    875                 outbuf[7] = nb_sectors & 0xff;
    876                 outbuf[8] = 0;
    877                 outbuf[9] = 0;
    878                 outbuf[10] = s->cluster_size * 2;
    879                 outbuf[11] = 0;
    880                 /* Protection, exponent and lowest lba field left blank. */
    881                 r->iov.iov_len = len;
    882             } else {
    883                 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
    884                 return 0;
    885             }
    886             break;
    887         }
    888         DPRINTF("Unsupported Service Action In\n");
    889         goto fail;
    890     case 0xa0:
    891         DPRINTF("Report LUNs (len %d)\n", len);
    892         if (len < 16)
    893             goto fail;
    894         memset(outbuf, 0, 16);
    895         outbuf[3] = 8;
    896         r->iov.iov_len = 16;
    897         break;
    898     case 0x2f:
    899         DPRINTF("Verify (sector %d, count %d)\n", lba, len);
    900         break;
    901     default:
    902 	DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
    903     fail:
    904         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_ILLEGAL_REQUEST);
    905 	return 0;
    906     illegal_lba:
    907         scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
    908         return 0;
    909     }
    910     if (r->sector_count == 0 && r->iov.iov_len == 0) {
    911         scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
    912     }
    913     len = r->sector_count * 512 + r->iov.iov_len;
    914     if (is_write) {
    915         return -len;
    916     } else {
    917         if (!r->sector_count)
    918             r->sector_count = -1;
    919         return len;
    920     }
    921 }
    922 
    923 static void scsi_destroy(SCSIDevice *d)
    924 {
    925     qemu_free(d->state);
    926     qemu_free(d);
    927 }
    928 
    929 SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq,
    930                            scsi_completionfn completion, void *opaque)
    931 {
    932     SCSIDevice *d;
    933     SCSIDeviceState *s;
    934     uint64_t nb_sectors;
    935 
    936     s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
    937     s->bdrv = bdrv;
    938     s->tcq = tcq;
    939     s->completion = completion;
    940     s->opaque = opaque;
    941     if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
    942         s->cluster_size = 4;
    943     } else {
    944         s->cluster_size = 1;
    945     }
    946     bdrv_get_geometry(s->bdrv, &nb_sectors);
    947     nb_sectors /= s->cluster_size;
    948     if (nb_sectors)
    949         nb_sectors--;
    950     s->max_lba = nb_sectors;
    951     strncpy(s->drive_serial_str, drive_get_serial(s->bdrv),
    952             sizeof(s->drive_serial_str));
    953     if (strlen(s->drive_serial_str) == 0)
    954         pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), "0");
    955     qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
    956     d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
    957     d->state = s;
    958     d->destroy = scsi_destroy;
    959     d->send_command = scsi_send_command;
    960     d->read_data = scsi_read_data;
    961     d->write_data = scsi_write_data;
    962     d->cancel_io = scsi_cancel_io;
    963     d->get_buf = scsi_get_buf;
    964 
    965     return d;
    966 }
    967