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