]> Git Repo - qemu.git/blob - hw/scsi-disk.c
block: Rename bdrv_mon_event() & BlockMonEventAction
[qemu.git] / hw / scsi-disk.c
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  * Modifications:
9  *  2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10  *                                 when the allocation length of CDB is smaller
11  *                                 than 36.
12  *  2009-Oct-13 Artyom Tarasenko : implemented the block descriptor in the
13  *                                 MODE SENSE response.
14  *
15  * This code is licensed under the LGPL.
16  *
17  * Note that this file only handles the SCSI architecture model and device
18  * commands.  Emulation of interface/link layer protocols is handled by
19  * the host adapter emulator.
20  */
21
22 //#define DEBUG_SCSI
23
24 #ifdef DEBUG_SCSI
25 #define DPRINTF(fmt, ...) \
26 do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
27 #else
28 #define DPRINTF(fmt, ...) do {} while(0)
29 #endif
30
31 #define BADF(fmt, ...) \
32 do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
33
34 #include "qemu-common.h"
35 #include "qemu-error.h"
36 #include "scsi.h"
37 #include "scsi-defs.h"
38 #include "sysemu.h"
39 #include "blockdev.h"
40 #include "block_int.h"
41
42 #ifdef __linux
43 #include <scsi/sg.h>
44 #endif
45
46 #define SCSI_DMA_BUF_SIZE    131072
47 #define SCSI_MAX_INQUIRY_LEN 256
48
49 typedef struct SCSIDiskState SCSIDiskState;
50
51 typedef struct SCSIDiskReq {
52     SCSIRequest req;
53     /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */
54     uint64_t sector;
55     uint32_t sector_count;
56     uint32_t buflen;
57     struct iovec iov;
58     QEMUIOVector qiov;
59     BlockAcctCookie acct;
60 } SCSIDiskReq;
61
62 struct SCSIDiskState
63 {
64     SCSIDevice qdev;
65     uint32_t removable;
66     bool media_changed;
67     bool media_event;
68     bool eject_request;
69     QEMUBH *bh;
70     char *version;
71     char *serial;
72     bool tray_open;
73     bool tray_locked;
74 };
75
76 static int scsi_handle_rw_error(SCSIDiskReq *r, int error);
77
78 static void scsi_free_request(SCSIRequest *req)
79 {
80     SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
81
82     if (r->iov.iov_base) {
83         qemu_vfree(r->iov.iov_base);
84     }
85 }
86
87 /* Helper function for command completion with sense.  */
88 static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
89 {
90     DPRINTF("Command complete tag=0x%x sense=%d/%d/%d\n",
91             r->req.tag, sense.key, sense.asc, sense.ascq);
92     scsi_req_build_sense(&r->req, sense);
93     scsi_req_complete(&r->req, CHECK_CONDITION);
94 }
95
96 /* Cancel a pending data transfer.  */
97 static void scsi_cancel_io(SCSIRequest *req)
98 {
99     SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
100
101     DPRINTF("Cancel tag=0x%x\n", req->tag);
102     if (r->req.aiocb) {
103         bdrv_aio_cancel(r->req.aiocb);
104
105         /* This reference was left in by scsi_*_data.  We take ownership of
106          * it the moment scsi_req_cancel is called, independent of whether
107          * bdrv_aio_cancel completes the request or not.  */
108         scsi_req_unref(&r->req);
109     }
110     r->req.aiocb = NULL;
111 }
112
113 static uint32_t scsi_init_iovec(SCSIDiskReq *r)
114 {
115     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
116
117     if (!r->iov.iov_base) {
118         r->buflen = SCSI_DMA_BUF_SIZE;
119         r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
120     }
121     r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
122     qemu_iovec_init_external(&r->qiov, &r->iov, 1);
123     return r->qiov.size / 512;
124 }
125
126 static void scsi_read_complete(void * opaque, int ret)
127 {
128     SCSIDiskReq *r = (SCSIDiskReq *)opaque;
129     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
130     int n;
131
132     if (r->req.aiocb != NULL) {
133         r->req.aiocb = NULL;
134         bdrv_acct_done(s->qdev.conf.bs, &r->acct);
135     }
136
137     if (ret) {
138         if (scsi_handle_rw_error(r, -ret)) {
139             goto done;
140         }
141     }
142
143     DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->qiov.size);
144
145     n = r->qiov.size / 512;
146     r->sector += n;
147     r->sector_count -= n;
148     scsi_req_data(&r->req, r->qiov.size);
149
150 done:
151     if (!r->req.io_canceled) {
152         scsi_req_unref(&r->req);
153     }
154 }
155
156 static void scsi_flush_complete(void * opaque, int ret)
157 {
158     SCSIDiskReq *r = (SCSIDiskReq *)opaque;
159     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
160
161     if (r->req.aiocb != NULL) {
162         r->req.aiocb = NULL;
163         bdrv_acct_done(s->qdev.conf.bs, &r->acct);
164     }
165
166     if (ret < 0) {
167         if (scsi_handle_rw_error(r, -ret)) {
168             goto done;
169         }
170     }
171
172     scsi_req_complete(&r->req, GOOD);
173
174 done:
175     if (!r->req.io_canceled) {
176         scsi_req_unref(&r->req);
177     }
178 }
179
180 /* Read more data from scsi device into buffer.  */
181 static void scsi_read_data(SCSIRequest *req)
182 {
183     SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
184     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
185     uint32_t n;
186
187     if (r->sector_count == (uint32_t)-1) {
188         DPRINTF("Read buf_len=%zd\n", r->iov.iov_len);
189         r->sector_count = 0;
190         scsi_req_data(&r->req, r->iov.iov_len);
191         return;
192     }
193     DPRINTF("Read sector_count=%d\n", r->sector_count);
194     if (r->sector_count == 0) {
195         /* This also clears the sense buffer for REQUEST SENSE.  */
196         scsi_req_complete(&r->req, GOOD);
197         return;
198     }
199
200     /* No data transfer may already be in progress */
201     assert(r->req.aiocb == NULL);
202
203     /* The request is used as the AIO opaque value, so add a ref.  */
204     scsi_req_ref(&r->req);
205     if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
206         DPRINTF("Data transfer direction invalid\n");
207         scsi_read_complete(r, -EINVAL);
208         return;
209     }
210
211     if (s->tray_open) {
212         scsi_read_complete(r, -ENOMEDIUM);
213         return;
214     }
215
216     n = scsi_init_iovec(r);
217     bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
218     r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
219                               scsi_read_complete, r);
220 }
221
222 /*
223  * scsi_handle_rw_error has two return values.  0 means that the error
224  * must be ignored, 1 means that the error has been processed and the
225  * caller should not do anything else for this request.  Note that
226  * scsi_handle_rw_error always manages its reference counts, independent
227  * of the return value.
228  */
229 static int scsi_handle_rw_error(SCSIDiskReq *r, int error)
230 {
231     int is_read = (r->req.cmd.xfer == SCSI_XFER_FROM_DEV);
232     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
233     BlockErrorAction action = bdrv_get_on_error(s->qdev.conf.bs, is_read);
234
235     if (action == BLOCK_ERR_IGNORE) {
236         bdrv_emit_qmp_error_event(s->qdev.conf.bs, BDRV_ACTION_IGNORE, is_read);
237         return 0;
238     }
239
240     if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
241             || action == BLOCK_ERR_STOP_ANY) {
242
243         bdrv_emit_qmp_error_event(s->qdev.conf.bs, BDRV_ACTION_STOP, is_read);
244         vm_stop(RUN_STATE_IO_ERROR);
245         bdrv_iostatus_set_err(s->qdev.conf.bs, error);
246         scsi_req_retry(&r->req);
247     } else {
248         switch (error) {
249         case ENOMEDIUM:
250             scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
251             break;
252         case ENOMEM:
253             scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
254             break;
255         case EINVAL:
256             scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
257             break;
258         default:
259             scsi_check_condition(r, SENSE_CODE(IO_ERROR));
260             break;
261         }
262         bdrv_emit_qmp_error_event(s->qdev.conf.bs, BDRV_ACTION_REPORT, is_read);
263     }
264     return 1;
265 }
266
267 static void scsi_write_complete(void * opaque, int ret)
268 {
269     SCSIDiskReq *r = (SCSIDiskReq *)opaque;
270     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
271     uint32_t n;
272
273     if (r->req.aiocb != NULL) {
274         r->req.aiocb = NULL;
275         bdrv_acct_done(s->qdev.conf.bs, &r->acct);
276     }
277
278     if (ret) {
279         if (scsi_handle_rw_error(r, -ret)) {
280             goto done;
281         }
282     }
283
284     n = r->qiov.size / 512;
285     r->sector += n;
286     r->sector_count -= n;
287     if (r->sector_count == 0) {
288         scsi_req_complete(&r->req, GOOD);
289     } else {
290         scsi_init_iovec(r);
291         DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
292         scsi_req_data(&r->req, r->qiov.size);
293     }
294
295 done:
296     if (!r->req.io_canceled) {
297         scsi_req_unref(&r->req);
298     }
299 }
300
301 static void scsi_write_data(SCSIRequest *req)
302 {
303     SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
304     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
305     uint32_t n;
306
307     /* No data transfer may already be in progress */
308     assert(r->req.aiocb == NULL);
309
310     /* The request is used as the AIO opaque value, so add a ref.  */
311     scsi_req_ref(&r->req);
312     if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
313         DPRINTF("Data transfer direction invalid\n");
314         scsi_write_complete(r, -EINVAL);
315         return;
316     }
317
318     n = r->qiov.size / 512;
319     if (n) {
320         if (s->tray_open) {
321             scsi_write_complete(r, -ENOMEDIUM);
322             return;
323         }
324         bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
325         r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n,
326                                        scsi_write_complete, r);
327     } else {
328         /* Called for the first time.  Ask the driver to send us more data.  */
329         scsi_write_complete(r, 0);
330     }
331 }
332
333 /* Return a pointer to the data buffer.  */
334 static uint8_t *scsi_get_buf(SCSIRequest *req)
335 {
336     SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
337
338     return (uint8_t *)r->iov.iov_base;
339 }
340
341 static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
342 {
343     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
344     int buflen = 0;
345
346     if (req->cmd.buf[1] & 0x2) {
347         /* Command support data - optional, not implemented */
348         BADF("optional INQUIRY command support request not implemented\n");
349         return -1;
350     }
351
352     if (req->cmd.buf[1] & 0x1) {
353         /* Vital product data */
354         uint8_t page_code = req->cmd.buf[2];
355         if (req->cmd.xfer < 4) {
356             BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
357                  "less than 4\n", page_code, req->cmd.xfer);
358             return -1;
359         }
360
361         outbuf[buflen++] = s->qdev.type & 0x1f;
362         outbuf[buflen++] = page_code ; // this page
363         outbuf[buflen++] = 0x00;
364
365         switch (page_code) {
366         case 0x00: /* Supported page codes, mandatory */
367         {
368             int pages;
369             DPRINTF("Inquiry EVPD[Supported pages] "
370                     "buffer size %zd\n", req->cmd.xfer);
371             pages = buflen++;
372             outbuf[buflen++] = 0x00; // list of supported pages (this page)
373             if (s->serial) {
374                 outbuf[buflen++] = 0x80; // unit serial number
375             }
376             outbuf[buflen++] = 0x83; // device identification
377             if (s->qdev.type == TYPE_DISK) {
378                 outbuf[buflen++] = 0xb0; // block limits
379                 outbuf[buflen++] = 0xb2; // thin provisioning
380             }
381             outbuf[pages] = buflen - pages - 1; // number of pages
382             break;
383         }
384         case 0x80: /* Device serial number, optional */
385         {
386             int l;
387
388             if (!s->serial) {
389                 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
390                 return -1;
391             }
392
393             l = strlen(s->serial);
394             if (l > 20) {
395                 l = 20;
396             }
397
398             DPRINTF("Inquiry EVPD[Serial number] "
399                     "buffer size %zd\n", req->cmd.xfer);
400             outbuf[buflen++] = l;
401             memcpy(outbuf+buflen, s->serial, l);
402             buflen += l;
403             break;
404         }
405
406         case 0x83: /* Device identification page, mandatory */
407         {
408             int max_len = 255 - 8;
409             int id_len = strlen(bdrv_get_device_name(s->qdev.conf.bs));
410
411             if (id_len > max_len) {
412                 id_len = max_len;
413             }
414             DPRINTF("Inquiry EVPD[Device identification] "
415                     "buffer size %zd\n", req->cmd.xfer);
416
417             outbuf[buflen++] = 4 + id_len;
418             outbuf[buflen++] = 0x2; // ASCII
419             outbuf[buflen++] = 0;   // not officially assigned
420             outbuf[buflen++] = 0;   // reserved
421             outbuf[buflen++] = id_len; // length of data following
422
423             memcpy(outbuf+buflen, bdrv_get_device_name(s->qdev.conf.bs), id_len);
424             buflen += id_len;
425             break;
426         }
427         case 0xb0: /* block limits */
428         {
429             unsigned int unmap_sectors =
430                     s->qdev.conf.discard_granularity / s->qdev.blocksize;
431             unsigned int min_io_size =
432                     s->qdev.conf.min_io_size / s->qdev.blocksize;
433             unsigned int opt_io_size =
434                     s->qdev.conf.opt_io_size / s->qdev.blocksize;
435
436             if (s->qdev.type == TYPE_ROM) {
437                 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
438                         page_code);
439                 return -1;
440             }
441             /* required VPD size with unmap support */
442             outbuf[3] = buflen = 0x3c;
443
444             memset(outbuf + 4, 0, buflen - 4);
445
446             /* optimal transfer length granularity */
447             outbuf[6] = (min_io_size >> 8) & 0xff;
448             outbuf[7] = min_io_size & 0xff;
449
450             /* optimal transfer length */
451             outbuf[12] = (opt_io_size >> 24) & 0xff;
452             outbuf[13] = (opt_io_size >> 16) & 0xff;
453             outbuf[14] = (opt_io_size >> 8) & 0xff;
454             outbuf[15] = opt_io_size & 0xff;
455
456             /* optimal unmap granularity */
457             outbuf[28] = (unmap_sectors >> 24) & 0xff;
458             outbuf[29] = (unmap_sectors >> 16) & 0xff;
459             outbuf[30] = (unmap_sectors >> 8) & 0xff;
460             outbuf[31] = unmap_sectors & 0xff;
461             break;
462         }
463         case 0xb2: /* thin provisioning */
464         {
465             outbuf[3] = buflen = 8;
466             outbuf[4] = 0;
467             outbuf[5] = 0x40; /* write same with unmap supported */
468             outbuf[6] = 0;
469             outbuf[7] = 0;
470             break;
471         }
472         default:
473             BADF("Error: unsupported Inquiry (EVPD[%02X]) "
474                  "buffer size %zd\n", page_code, req->cmd.xfer);
475             return -1;
476         }
477         /* done with EVPD */
478         return buflen;
479     }
480
481     /* Standard INQUIRY data */
482     if (req->cmd.buf[2] != 0) {
483         BADF("Error: Inquiry (STANDARD) page or code "
484              "is non-zero [%02X]\n", req->cmd.buf[2]);
485         return -1;
486     }
487
488     /* PAGE CODE == 0 */
489     if (req->cmd.xfer < 5) {
490         BADF("Error: Inquiry (STANDARD) buffer size %zd "
491              "is less than 5\n", req->cmd.xfer);
492         return -1;
493     }
494
495     buflen = req->cmd.xfer;
496     if (buflen > SCSI_MAX_INQUIRY_LEN) {
497         buflen = SCSI_MAX_INQUIRY_LEN;
498     }
499     memset(outbuf, 0, buflen);
500
501     outbuf[0] = s->qdev.type & 0x1f;
502     outbuf[1] = s->removable ? 0x80 : 0;
503     if (s->qdev.type == TYPE_ROM) {
504         memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
505     } else {
506         memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
507     }
508     memcpy(&outbuf[8], "QEMU    ", 8);
509     memset(&outbuf[32], 0, 4);
510     memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
511     /*
512      * We claim conformance to SPC-3, which is required for guests
513      * to ask for modern features like READ CAPACITY(16) or the
514      * block characteristics VPD page by default.  Not all of SPC-3
515      * is actually implemented, but we're good enough.
516      */
517     outbuf[2] = 5;
518     outbuf[3] = 2; /* Format 2 */
519
520     if (buflen > 36) {
521         outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
522     } else {
523         /* If the allocation length of CDB is too small,
524                the additional length is not adjusted */
525         outbuf[4] = 36 - 5;
526     }
527
528     /* Sync data transfer and TCQ.  */
529     outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
530     return buflen;
531 }
532
533 static inline bool media_is_dvd(SCSIDiskState *s)
534 {
535     uint64_t nb_sectors;
536     if (s->qdev.type != TYPE_ROM) {
537         return false;
538     }
539     if (!bdrv_is_inserted(s->qdev.conf.bs)) {
540         return false;
541     }
542     bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
543     return nb_sectors > CD_MAX_SECTORS;
544 }
545
546 static inline bool media_is_cd(SCSIDiskState *s)
547 {
548     uint64_t nb_sectors;
549     if (s->qdev.type != TYPE_ROM) {
550         return false;
551     }
552     if (!bdrv_is_inserted(s->qdev.conf.bs)) {
553         return false;
554     }
555     bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
556     return nb_sectors <= CD_MAX_SECTORS;
557 }
558
559 static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
560                                    uint8_t *outbuf)
561 {
562     static const int rds_caps_size[5] = {
563         [0] = 2048 + 4,
564         [1] = 4 + 4,
565         [3] = 188 + 4,
566         [4] = 2048 + 4,
567     };
568
569     uint8_t media = r->req.cmd.buf[1];
570     uint8_t layer = r->req.cmd.buf[6];
571     uint8_t format = r->req.cmd.buf[7];
572     int size = -1;
573
574     if (s->qdev.type != TYPE_ROM) {
575         return -1;
576     }
577     if (media != 0) {
578         scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
579         return -1;
580     }
581
582     if (format != 0xff) {
583         if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
584             scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
585             return -1;
586         }
587         if (media_is_cd(s)) {
588             scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
589             return -1;
590         }
591         if (format >= ARRAY_SIZE(rds_caps_size)) {
592             return -1;
593         }
594         size = rds_caps_size[format];
595         memset(outbuf, 0, size);
596     }
597
598     switch (format) {
599     case 0x00: {
600         /* Physical format information */
601         uint64_t nb_sectors;
602         if (layer != 0) {
603             goto fail;
604         }
605         bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
606
607         outbuf[4] = 1;   /* DVD-ROM, part version 1 */
608         outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
609         outbuf[6] = 1;   /* one layer, read-only (per MMC-2 spec) */
610         outbuf[7] = 0;   /* default densities */
611
612         stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
613         stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
614         break;
615     }
616
617     case 0x01: /* DVD copyright information, all zeros */
618         break;
619
620     case 0x03: /* BCA information - invalid field for no BCA info */
621         return -1;
622
623     case 0x04: /* DVD disc manufacturing information, all zeros */
624         break;
625
626     case 0xff: { /* List capabilities */
627         int i;
628         size = 4;
629         for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
630             if (!rds_caps_size[i]) {
631                 continue;
632             }
633             outbuf[size] = i;
634             outbuf[size + 1] = 0x40; /* Not writable, readable */
635             stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
636             size += 4;
637         }
638         break;
639      }
640
641     default:
642         return -1;
643     }
644
645     /* Size of buffer, not including 2 byte size field */
646     stw_be_p(outbuf, size - 2);
647     return size;
648
649 fail:
650     return -1;
651 }
652
653 static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
654 {
655     uint8_t event_code, media_status;
656
657     media_status = 0;
658     if (s->tray_open) {
659         media_status = MS_TRAY_OPEN;
660     } else if (bdrv_is_inserted(s->qdev.conf.bs)) {
661         media_status = MS_MEDIA_PRESENT;
662     }
663
664     /* Event notification descriptor */
665     event_code = MEC_NO_CHANGE;
666     if (media_status != MS_TRAY_OPEN) {
667         if (s->media_event) {
668             event_code = MEC_NEW_MEDIA;
669             s->media_event = false;
670         } else if (s->eject_request) {
671             event_code = MEC_EJECT_REQUESTED;
672             s->eject_request = false;
673         }
674     }
675
676     outbuf[0] = event_code;
677     outbuf[1] = media_status;
678
679     /* These fields are reserved, just clear them. */
680     outbuf[2] = 0;
681     outbuf[3] = 0;
682     return 4;
683 }
684
685 static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
686                                               uint8_t *outbuf)
687 {
688     int size;
689     uint8_t *buf = r->req.cmd.buf;
690     uint8_t notification_class_request = buf[4];
691     if (s->qdev.type != TYPE_ROM) {
692         return -1;
693     }
694     if ((buf[1] & 1) == 0) {
695         /* asynchronous */
696         return -1;
697     }
698
699     size = 4;
700     outbuf[0] = outbuf[1] = 0;
701     outbuf[3] = 1 << GESN_MEDIA; /* supported events */
702     if (notification_class_request & (1 << GESN_MEDIA)) {
703         outbuf[2] = GESN_MEDIA;
704         size += scsi_event_status_media(s, &outbuf[size]);
705     } else {
706         outbuf[2] = 0x80;
707     }
708     stw_be_p(outbuf, size - 4);
709     return size;
710 }
711
712 static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
713 {
714     int current;
715
716     if (s->qdev.type != TYPE_ROM) {
717         return -1;
718     }
719     current = media_is_dvd(s) ? MMC_PROFILE_DVD_ROM : MMC_PROFILE_CD_ROM;
720     memset(outbuf, 0, 40);
721     stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
722     stw_be_p(&outbuf[6], current);
723     /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
724     outbuf[10] = 0x03; /* persistent, current */
725     outbuf[11] = 8; /* two profiles */
726     stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
727     outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
728     stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
729     outbuf[18] = (current == MMC_PROFILE_CD_ROM);
730     /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
731     stw_be_p(&outbuf[20], 1);
732     outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
733     outbuf[23] = 8;
734     stl_be_p(&outbuf[24], 1); /* SCSI */
735     outbuf[28] = 1; /* DBE = 1, mandatory */
736     /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
737     stw_be_p(&outbuf[32], 3);
738     outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
739     outbuf[35] = 4;
740     outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
741     /* TODO: Random readable, CD read, DVD read, drive serial number,
742        power management */
743     return 40;
744 }
745
746 static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
747 {
748     if (s->qdev.type != TYPE_ROM) {
749         return -1;
750     }
751     memset(outbuf, 0, 8);
752     outbuf[5] = 1; /* CD-ROM */
753     return 8;
754 }
755
756 static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
757                            int page_control)
758 {
759     static const int mode_sense_valid[0x3f] = {
760         [MODE_PAGE_HD_GEOMETRY]            = (1 << TYPE_DISK),
761         [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
762         [MODE_PAGE_CACHING]                = (1 << TYPE_DISK) | (1 << TYPE_ROM),
763         [MODE_PAGE_R_W_ERROR]              = (1 << TYPE_DISK) | (1 << TYPE_ROM),
764         [MODE_PAGE_AUDIO_CTL]              = (1 << TYPE_ROM),
765         [MODE_PAGE_CAPABILITIES]           = (1 << TYPE_ROM),
766     };
767
768     BlockDriverState *bdrv = s->qdev.conf.bs;
769     int cylinders, heads, secs;
770     uint8_t *p = *p_outbuf;
771
772     if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
773         return -1;
774     }
775
776     p[0] = page;
777
778     /*
779      * If Changeable Values are requested, a mask denoting those mode parameters
780      * that are changeable shall be returned. As we currently don't support
781      * parameter changes via MODE_SELECT all bits are returned set to zero.
782      * The buffer was already menset to zero by the caller of this function.
783      */
784     switch (page) {
785     case MODE_PAGE_HD_GEOMETRY:
786         p[1] = 0x16;
787         if (page_control == 1) { /* Changeable Values */
788             break;
789         }
790         /* if a geometry hint is available, use it */
791         bdrv_guess_geometry(bdrv, &cylinders, &heads, &secs);
792         p[2] = (cylinders >> 16) & 0xff;
793         p[3] = (cylinders >> 8) & 0xff;
794         p[4] = cylinders & 0xff;
795         p[5] = heads & 0xff;
796         /* Write precomp start cylinder, disabled */
797         p[6] = (cylinders >> 16) & 0xff;
798         p[7] = (cylinders >> 8) & 0xff;
799         p[8] = cylinders & 0xff;
800         /* Reduced current start cylinder, disabled */
801         p[9] = (cylinders >> 16) & 0xff;
802         p[10] = (cylinders >> 8) & 0xff;
803         p[11] = cylinders & 0xff;
804         /* Device step rate [ns], 200ns */
805         p[12] = 0;
806         p[13] = 200;
807         /* Landing zone cylinder */
808         p[14] = 0xff;
809         p[15] =  0xff;
810         p[16] = 0xff;
811         /* Medium rotation rate [rpm], 5400 rpm */
812         p[20] = (5400 >> 8) & 0xff;
813         p[21] = 5400 & 0xff;
814         break;
815
816     case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
817         p[1] = 0x1e;
818         if (page_control == 1) { /* Changeable Values */
819             break;
820         }
821         /* Transfer rate [kbit/s], 5Mbit/s */
822         p[2] = 5000 >> 8;
823         p[3] = 5000 & 0xff;
824         /* if a geometry hint is available, use it */
825         bdrv_guess_geometry(bdrv, &cylinders, &heads, &secs);
826         p[4] = heads & 0xff;
827         p[5] = secs & 0xff;
828         p[6] = s->qdev.blocksize >> 8;
829         p[8] = (cylinders >> 8) & 0xff;
830         p[9] = cylinders & 0xff;
831         /* Write precomp start cylinder, disabled */
832         p[10] = (cylinders >> 8) & 0xff;
833         p[11] = cylinders & 0xff;
834         /* Reduced current start cylinder, disabled */
835         p[12] = (cylinders >> 8) & 0xff;
836         p[13] = cylinders & 0xff;
837         /* Device step rate [100us], 100us */
838         p[14] = 0;
839         p[15] = 1;
840         /* Device step pulse width [us], 1us */
841         p[16] = 1;
842         /* Device head settle delay [100us], 100us */
843         p[17] = 0;
844         p[18] = 1;
845         /* Motor on delay [0.1s], 0.1s */
846         p[19] = 1;
847         /* Motor off delay [0.1s], 0.1s */
848         p[20] = 1;
849         /* Medium rotation rate [rpm], 5400 rpm */
850         p[28] = (5400 >> 8) & 0xff;
851         p[29] = 5400 & 0xff;
852         break;
853
854     case MODE_PAGE_CACHING:
855         p[0] = 8;
856         p[1] = 0x12;
857         if (page_control == 1) { /* Changeable Values */
858             break;
859         }
860         if (bdrv_enable_write_cache(s->qdev.conf.bs)) {
861             p[2] = 4; /* WCE */
862         }
863         break;
864
865     case MODE_PAGE_R_W_ERROR:
866         p[1] = 10;
867         p[2] = 0x80; /* Automatic Write Reallocation Enabled */
868         if (s->qdev.type == TYPE_ROM) {
869             p[3] = 0x20; /* Read Retry Count */
870         }
871         break;
872
873     case MODE_PAGE_AUDIO_CTL:
874         p[1] = 14;
875         break;
876
877     case MODE_PAGE_CAPABILITIES:
878         p[1] = 0x14;
879         if (page_control == 1) { /* Changeable Values */
880             break;
881         }
882
883         p[2] = 0x3b; /* CD-R & CD-RW read */
884         p[3] = 0; /* Writing not supported */
885         p[4] = 0x7f; /* Audio, composite, digital out,
886                         mode 2 form 1&2, multi session */
887         p[5] = 0xff; /* CD DA, DA accurate, RW supported,
888                         RW corrected, C2 errors, ISRC,
889                         UPC, Bar code */
890         p[6] = 0x2d | (s->tray_locked ? 2 : 0);
891         /* Locking supported, jumper present, eject, tray */
892         p[7] = 0; /* no volume & mute control, no
893                      changer */
894         p[8] = (50 * 176) >> 8; /* 50x read speed */
895         p[9] = (50 * 176) & 0xff;
896         p[10] = 2 >> 8; /* Two volume levels */
897         p[11] = 2 & 0xff;
898         p[12] = 2048 >> 8; /* 2M buffer */
899         p[13] = 2048 & 0xff;
900         p[14] = (16 * 176) >> 8; /* 16x read speed current */
901         p[15] = (16 * 176) & 0xff;
902         p[18] = (16 * 176) >> 8; /* 16x write speed */
903         p[19] = (16 * 176) & 0xff;
904         p[20] = (16 * 176) >> 8; /* 16x write speed current */
905         p[21] = (16 * 176) & 0xff;
906         break;
907
908     default:
909         return -1;
910     }
911
912     *p_outbuf += p[1] + 2;
913     return p[1] + 2;
914 }
915
916 static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
917 {
918     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
919     uint64_t nb_sectors;
920     int page, dbd, buflen, ret, page_control;
921     uint8_t *p;
922     uint8_t dev_specific_param;
923
924     dbd = r->req.cmd.buf[1]  & 0x8;
925     page = r->req.cmd.buf[2] & 0x3f;
926     page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
927     DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
928         (r->req.cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, r->req.cmd.xfer, page_control);
929     memset(outbuf, 0, r->req.cmd.xfer);
930     p = outbuf;
931
932     if (bdrv_is_read_only(s->qdev.conf.bs)) {
933         dev_specific_param = 0x80; /* Readonly.  */
934     } else {
935         dev_specific_param = 0x00;
936     }
937
938     if (r->req.cmd.buf[0] == MODE_SENSE) {
939         p[1] = 0; /* Default media type.  */
940         p[2] = dev_specific_param;
941         p[3] = 0; /* Block descriptor length.  */
942         p += 4;
943     } else { /* MODE_SENSE_10 */
944         p[2] = 0; /* Default media type.  */
945         p[3] = dev_specific_param;
946         p[6] = p[7] = 0; /* Block descriptor length.  */
947         p += 8;
948     }
949
950     /* MMC prescribes that CD/DVD drives have no block descriptors.  */
951     bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
952     if (!dbd && s->qdev.type == TYPE_DISK && nb_sectors) {
953         if (r->req.cmd.buf[0] == MODE_SENSE) {
954             outbuf[3] = 8; /* Block descriptor length  */
955         } else { /* MODE_SENSE_10 */
956             outbuf[7] = 8; /* Block descriptor length  */
957         }
958         nb_sectors /= (s->qdev.blocksize / 512);
959         if (nb_sectors > 0xffffff) {
960             nb_sectors = 0;
961         }
962         p[0] = 0; /* media density code */
963         p[1] = (nb_sectors >> 16) & 0xff;
964         p[2] = (nb_sectors >> 8) & 0xff;
965         p[3] = nb_sectors & 0xff;
966         p[4] = 0; /* reserved */
967         p[5] = 0; /* bytes 5-7 are the sector size in bytes */
968         p[6] = s->qdev.blocksize >> 8;
969         p[7] = 0;
970         p += 8;
971     }
972
973     if (page_control == 3) {
974         /* Saved Values */
975         scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
976         return -1;
977     }
978
979     if (page == 0x3f) {
980         for (page = 0; page <= 0x3e; page++) {
981             mode_sense_page(s, page, &p, page_control);
982         }
983     } else {
984         ret = mode_sense_page(s, page, &p, page_control);
985         if (ret == -1) {
986             return -1;
987         }
988     }
989
990     buflen = p - outbuf;
991     /*
992      * The mode data length field specifies the length in bytes of the
993      * following data that is available to be transferred. The mode data
994      * length does not include itself.
995      */
996     if (r->req.cmd.buf[0] == MODE_SENSE) {
997         outbuf[0] = buflen - 1;
998     } else { /* MODE_SENSE_10 */
999         outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1000         outbuf[1] = (buflen - 2) & 0xff;
1001     }
1002     return buflen;
1003 }
1004
1005 static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1006 {
1007     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1008     int start_track, format, msf, toclen;
1009     uint64_t nb_sectors;
1010
1011     msf = req->cmd.buf[1] & 2;
1012     format = req->cmd.buf[2] & 0xf;
1013     start_track = req->cmd.buf[6];
1014     bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1015     DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
1016     nb_sectors /= s->qdev.blocksize / 512;
1017     switch (format) {
1018     case 0:
1019         toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1020         break;
1021     case 1:
1022         /* multi session : only a single session defined */
1023         toclen = 12;
1024         memset(outbuf, 0, 12);
1025         outbuf[1] = 0x0a;
1026         outbuf[2] = 0x01;
1027         outbuf[3] = 0x01;
1028         break;
1029     case 2:
1030         toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1031         break;
1032     default:
1033         return -1;
1034     }
1035     return toclen;
1036 }
1037
1038 static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
1039 {
1040     SCSIRequest *req = &r->req;
1041     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1042     bool start = req->cmd.buf[4] & 1;
1043     bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
1044
1045     if (s->qdev.type == TYPE_ROM && loej) {
1046         if (!start && !s->tray_open && s->tray_locked) {
1047             scsi_check_condition(r,
1048                                  bdrv_is_inserted(s->qdev.conf.bs)
1049                                  ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1050                                  : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1051             return -1;
1052         }
1053         bdrv_eject(s->qdev.conf.bs, !start);
1054         s->tray_open = !start;
1055     }
1056     return 0;
1057 }
1058
1059 static int scsi_disk_emulate_command(SCSIDiskReq *r)
1060 {
1061     SCSIRequest *req = &r->req;
1062     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1063     uint64_t nb_sectors;
1064     uint8_t *outbuf;
1065     int buflen = 0;
1066
1067     if (!r->iov.iov_base) {
1068         /*
1069          * FIXME: we shouldn't return anything bigger than 4k, but the code
1070          * requires the buffer to be as big as req->cmd.xfer in several
1071          * places.  So, do not allow CDBs with a very large ALLOCATION
1072          * LENGTH.  The real fix would be to modify scsi_read_data and
1073          * dma_buf_read, so that they return data beyond the buflen
1074          * as all zeros.
1075          */
1076         if (req->cmd.xfer > 65536) {
1077             goto illegal_request;
1078         }
1079         r->buflen = MAX(4096, req->cmd.xfer);
1080         r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
1081     }
1082
1083     outbuf = r->iov.iov_base;
1084     switch (req->cmd.buf[0]) {
1085     case TEST_UNIT_READY:
1086         if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1087             goto not_ready;
1088         }
1089         break;
1090     case INQUIRY:
1091         buflen = scsi_disk_emulate_inquiry(req, outbuf);
1092         if (buflen < 0) {
1093             goto illegal_request;
1094         }
1095         break;
1096     case MODE_SENSE:
1097     case MODE_SENSE_10:
1098         buflen = scsi_disk_emulate_mode_sense(r, outbuf);
1099         if (buflen < 0) {
1100             goto illegal_request;
1101         }
1102         break;
1103     case READ_TOC:
1104         buflen = scsi_disk_emulate_read_toc(req, outbuf);
1105         if (buflen < 0) {
1106             goto illegal_request;
1107         }
1108         break;
1109     case RESERVE:
1110         if (req->cmd.buf[1] & 1) {
1111             goto illegal_request;
1112         }
1113         break;
1114     case RESERVE_10:
1115         if (req->cmd.buf[1] & 3) {
1116             goto illegal_request;
1117         }
1118         break;
1119     case RELEASE:
1120         if (req->cmd.buf[1] & 1) {
1121             goto illegal_request;
1122         }
1123         break;
1124     case RELEASE_10:
1125         if (req->cmd.buf[1] & 3) {
1126             goto illegal_request;
1127         }
1128         break;
1129     case START_STOP:
1130         if (scsi_disk_emulate_start_stop(r) < 0) {
1131             return -1;
1132         }
1133         break;
1134     case ALLOW_MEDIUM_REMOVAL:
1135         s->tray_locked = req->cmd.buf[4] & 1;
1136         bdrv_lock_medium(s->qdev.conf.bs, req->cmd.buf[4] & 1);
1137         break;
1138     case READ_CAPACITY_10:
1139         /* The normal LEN field for this command is zero.  */
1140         memset(outbuf, 0, 8);
1141         bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1142         if (!nb_sectors) {
1143             goto not_ready;
1144         }
1145         if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1146             goto illegal_request;
1147         }
1148         nb_sectors /= s->qdev.blocksize / 512;
1149         /* Returned value is the address of the last sector.  */
1150         nb_sectors--;
1151         /* Remember the new size for read/write sanity checking. */
1152         s->qdev.max_lba = nb_sectors;
1153         /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1154         if (nb_sectors > UINT32_MAX) {
1155             nb_sectors = UINT32_MAX;
1156         }
1157         outbuf[0] = (nb_sectors >> 24) & 0xff;
1158         outbuf[1] = (nb_sectors >> 16) & 0xff;
1159         outbuf[2] = (nb_sectors >> 8) & 0xff;
1160         outbuf[3] = nb_sectors & 0xff;
1161         outbuf[4] = 0;
1162         outbuf[5] = 0;
1163         outbuf[6] = s->qdev.blocksize >> 8;
1164         outbuf[7] = 0;
1165         buflen = 8;
1166         break;
1167     case REQUEST_SENSE:
1168         /* Just return "NO SENSE".  */
1169         buflen = scsi_build_sense(NULL, 0, outbuf, r->buflen,
1170                                   (req->cmd.buf[1] & 1) == 0);
1171         break;
1172     case MECHANISM_STATUS:
1173         buflen = scsi_emulate_mechanism_status(s, outbuf);
1174         if (buflen < 0) {
1175             goto illegal_request;
1176         }
1177         break;
1178     case GET_CONFIGURATION:
1179         buflen = scsi_get_configuration(s, outbuf);
1180         if (buflen < 0) {
1181             goto illegal_request;
1182         }
1183         break;
1184     case GET_EVENT_STATUS_NOTIFICATION:
1185         buflen = scsi_get_event_status_notification(s, r, outbuf);
1186         if (buflen < 0) {
1187             goto illegal_request;
1188         }
1189         break;
1190     case READ_DVD_STRUCTURE:
1191         buflen = scsi_read_dvd_structure(s, r, outbuf);
1192         if (buflen < 0) {
1193             goto illegal_request;
1194         }
1195         break;
1196     case SERVICE_ACTION_IN_16:
1197         /* Service Action In subcommands. */
1198         if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
1199             DPRINTF("SAI READ CAPACITY(16)\n");
1200             memset(outbuf, 0, req->cmd.xfer);
1201             bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1202             if (!nb_sectors) {
1203                 goto not_ready;
1204             }
1205             if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
1206                 goto illegal_request;
1207             }
1208             nb_sectors /= s->qdev.blocksize / 512;
1209             /* Returned value is the address of the last sector.  */
1210             nb_sectors--;
1211             /* Remember the new size for read/write sanity checking. */
1212             s->qdev.max_lba = nb_sectors;
1213             outbuf[0] = (nb_sectors >> 56) & 0xff;
1214             outbuf[1] = (nb_sectors >> 48) & 0xff;
1215             outbuf[2] = (nb_sectors >> 40) & 0xff;
1216             outbuf[3] = (nb_sectors >> 32) & 0xff;
1217             outbuf[4] = (nb_sectors >> 24) & 0xff;
1218             outbuf[5] = (nb_sectors >> 16) & 0xff;
1219             outbuf[6] = (nb_sectors >> 8) & 0xff;
1220             outbuf[7] = nb_sectors & 0xff;
1221             outbuf[8] = 0;
1222             outbuf[9] = 0;
1223             outbuf[10] = s->qdev.blocksize >> 8;
1224             outbuf[11] = 0;
1225             outbuf[12] = 0;
1226             outbuf[13] = get_physical_block_exp(&s->qdev.conf);
1227
1228             /* set TPE bit if the format supports discard */
1229             if (s->qdev.conf.discard_granularity) {
1230                 outbuf[14] = 0x80;
1231             }
1232
1233             /* Protection, exponent and lowest lba field left blank. */
1234             buflen = req->cmd.xfer;
1235             break;
1236         }
1237         DPRINTF("Unsupported Service Action In\n");
1238         goto illegal_request;
1239     case VERIFY_10:
1240         break;
1241     default:
1242         scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1243         return -1;
1244     }
1245     buflen = MIN(buflen, req->cmd.xfer);
1246     return buflen;
1247
1248 not_ready:
1249     if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1250         scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1251     } else {
1252         scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
1253     }
1254     return -1;
1255
1256 illegal_request:
1257     if (r->req.status == -1) {
1258         scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1259     }
1260     return -1;
1261 }
1262
1263 /* Execute a scsi command.  Returns the length of the data expected by the
1264    command.  This will be Positive for data transfers from the device
1265    (eg. disk reads), negative for transfers to the device (eg. disk writes),
1266    and zero if the command does not transfer any data.  */
1267
1268 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
1269 {
1270     SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1271     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1272     int32_t len;
1273     uint8_t command;
1274     int rc;
1275
1276     command = buf[0];
1277     DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", req->lun, req->tag, buf[0]);
1278
1279 #ifdef DEBUG_SCSI
1280     {
1281         int i;
1282         for (i = 1; i < r->req.cmd.len; i++) {
1283             printf(" 0x%02x", buf[i]);
1284         }
1285         printf("\n");
1286     }
1287 #endif
1288
1289     switch (command) {
1290     case TEST_UNIT_READY:
1291     case INQUIRY:
1292     case MODE_SENSE:
1293     case MODE_SENSE_10:
1294     case RESERVE:
1295     case RESERVE_10:
1296     case RELEASE:
1297     case RELEASE_10:
1298     case START_STOP:
1299     case ALLOW_MEDIUM_REMOVAL:
1300     case READ_CAPACITY_10:
1301     case READ_TOC:
1302     case READ_DVD_STRUCTURE:
1303     case GET_CONFIGURATION:
1304     case GET_EVENT_STATUS_NOTIFICATION:
1305     case MECHANISM_STATUS:
1306     case SERVICE_ACTION_IN_16:
1307     case REQUEST_SENSE:
1308     case VERIFY_10:
1309         rc = scsi_disk_emulate_command(r);
1310         if (rc < 0) {
1311             return 0;
1312         }
1313
1314         r->iov.iov_len = rc;
1315         break;
1316     case SYNCHRONIZE_CACHE:
1317         /* The request is used as the AIO opaque value, so add a ref.  */
1318         scsi_req_ref(&r->req);
1319         bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
1320         r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r);
1321         return 0;
1322     case READ_6:
1323     case READ_10:
1324     case READ_12:
1325     case READ_16:
1326         len = r->req.cmd.xfer / s->qdev.blocksize;
1327         DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
1328         if (r->req.cmd.lba > s->qdev.max_lba) {
1329             goto illegal_lba;
1330         }
1331         r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1332         r->sector_count = len * (s->qdev.blocksize / 512);
1333         break;
1334     case WRITE_6:
1335     case WRITE_10:
1336     case WRITE_12:
1337     case WRITE_16:
1338     case WRITE_VERIFY_10:
1339     case WRITE_VERIFY_12:
1340     case WRITE_VERIFY_16:
1341         len = r->req.cmd.xfer / s->qdev.blocksize;
1342         DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
1343                 (command & 0xe) == 0xe ? "And Verify " : "",
1344                 r->req.cmd.lba, len);
1345         if (r->req.cmd.lba > s->qdev.max_lba) {
1346             goto illegal_lba;
1347         }
1348         r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1349         r->sector_count = len * (s->qdev.blocksize / 512);
1350         break;
1351     case MODE_SELECT:
1352         DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
1353         /* We don't support mode parameter changes.
1354            Allow the mode parameter header + block descriptors only. */
1355         if (r->req.cmd.xfer > 12) {
1356             goto fail;
1357         }
1358         break;
1359     case MODE_SELECT_10:
1360         DPRINTF("Mode Select(10) (len %lu)\n", (long)r->req.cmd.xfer);
1361         /* We don't support mode parameter changes.
1362            Allow the mode parameter header + block descriptors only. */
1363         if (r->req.cmd.xfer > 16) {
1364             goto fail;
1365         }
1366         break;
1367     case SEEK_10:
1368         DPRINTF("Seek(10) (sector %" PRId64 ")\n", r->req.cmd.lba);
1369         if (r->req.cmd.lba > s->qdev.max_lba) {
1370             goto illegal_lba;
1371         }
1372         break;
1373     case WRITE_SAME_16:
1374         len = r->req.cmd.xfer / s->qdev.blocksize;
1375
1376         DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
1377                 r->req.cmd.lba, len);
1378
1379         if (r->req.cmd.lba > s->qdev.max_lba) {
1380             goto illegal_lba;
1381         }
1382
1383         /*
1384          * We only support WRITE SAME with the unmap bit set for now.
1385          */
1386         if (!(buf[1] & 0x8)) {
1387             goto fail;
1388         }
1389
1390         rc = bdrv_discard(s->qdev.conf.bs,
1391                           r->req.cmd.lba * (s->qdev.blocksize / 512),
1392                           len * (s->qdev.blocksize / 512));
1393         if (rc < 0) {
1394             /* XXX: better error code ?*/
1395             goto fail;
1396         }
1397
1398         break;
1399     default:
1400         DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1401         scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1402         return 0;
1403     fail:
1404         scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1405         return 0;
1406     illegal_lba:
1407         scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1408         return 0;
1409     }
1410     if (r->sector_count == 0 && r->iov.iov_len == 0) {
1411         scsi_req_complete(&r->req, GOOD);
1412     }
1413     len = r->sector_count * 512 + r->iov.iov_len;
1414     if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
1415         return -len;
1416     } else {
1417         if (!r->sector_count) {
1418             r->sector_count = -1;
1419         }
1420         return len;
1421     }
1422 }
1423
1424 static void scsi_disk_reset(DeviceState *dev)
1425 {
1426     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1427     uint64_t nb_sectors;
1428
1429     scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
1430
1431     bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1432     nb_sectors /= s->qdev.blocksize / 512;
1433     if (nb_sectors) {
1434         nb_sectors--;
1435     }
1436     s->qdev.max_lba = nb_sectors;
1437 }
1438
1439 static void scsi_destroy(SCSIDevice *dev)
1440 {
1441     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1442
1443     scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
1444     blockdev_mark_auto_del(s->qdev.conf.bs);
1445 }
1446
1447 static void scsi_cd_change_media_cb(void *opaque, bool load)
1448 {
1449     SCSIDiskState *s = opaque;
1450
1451     /*
1452      * When a CD gets changed, we have to report an ejected state and
1453      * then a loaded state to guests so that they detect tray
1454      * open/close and media change events.  Guests that do not use
1455      * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
1456      * states rely on this behavior.
1457      *
1458      * media_changed governs the state machine used for unit attention
1459      * report.  media_event is used by GET EVENT STATUS NOTIFICATION.
1460      */
1461     s->media_changed = load;
1462     s->tray_open = !load;
1463     s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM);
1464     s->media_event = true;
1465     s->eject_request = false;
1466 }
1467
1468 static void scsi_cd_eject_request_cb(void *opaque, bool force)
1469 {
1470     SCSIDiskState *s = opaque;
1471
1472     s->eject_request = true;
1473     if (force) {
1474         s->tray_locked = false;
1475     }
1476 }
1477
1478 static bool scsi_cd_is_tray_open(void *opaque)
1479 {
1480     return ((SCSIDiskState *)opaque)->tray_open;
1481 }
1482
1483 static bool scsi_cd_is_medium_locked(void *opaque)
1484 {
1485     return ((SCSIDiskState *)opaque)->tray_locked;
1486 }
1487
1488 static const BlockDevOps scsi_cd_block_ops = {
1489     .change_media_cb = scsi_cd_change_media_cb,
1490     .eject_request_cb = scsi_cd_eject_request_cb,
1491     .is_tray_open = scsi_cd_is_tray_open,
1492     .is_medium_locked = scsi_cd_is_medium_locked,
1493 };
1494
1495 static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
1496 {
1497     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1498     if (s->media_changed) {
1499         s->media_changed = false;
1500         s->qdev.unit_attention = SENSE_CODE(MEDIUM_CHANGED);
1501     }
1502 }
1503
1504 static int scsi_initfn(SCSIDevice *dev)
1505 {
1506     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1507     DriveInfo *dinfo;
1508
1509     if (!s->qdev.conf.bs) {
1510         error_report("drive property not set");
1511         return -1;
1512     }
1513
1514     if (!s->removable && !bdrv_is_inserted(s->qdev.conf.bs)) {
1515         error_report("Device needs media, but drive is empty");
1516         return -1;
1517     }
1518
1519     if (!s->serial) {
1520         /* try to fall back to value set with legacy -drive serial=... */
1521         dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
1522         if (*dinfo->serial) {
1523             s->serial = g_strdup(dinfo->serial);
1524         }
1525     }
1526
1527     if (!s->version) {
1528         s->version = g_strdup(QEMU_VERSION);
1529     }
1530
1531     if (bdrv_is_sg(s->qdev.conf.bs)) {
1532         error_report("unwanted /dev/sg*");
1533         return -1;
1534     }
1535
1536     if (s->removable) {
1537         bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_cd_block_ops, s);
1538     }
1539     bdrv_set_buffer_alignment(s->qdev.conf.bs, s->qdev.blocksize);
1540
1541     bdrv_iostatus_enable(s->qdev.conf.bs);
1542     add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, NULL);
1543     return 0;
1544 }
1545
1546 static int scsi_hd_initfn(SCSIDevice *dev)
1547 {
1548     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1549     s->qdev.blocksize = s->qdev.conf.logical_block_size;
1550     s->qdev.type = TYPE_DISK;
1551     return scsi_initfn(&s->qdev);
1552 }
1553
1554 static int scsi_cd_initfn(SCSIDevice *dev)
1555 {
1556     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1557     s->qdev.blocksize = 2048;
1558     s->qdev.type = TYPE_ROM;
1559     s->removable = true;
1560     return scsi_initfn(&s->qdev);
1561 }
1562
1563 static int scsi_disk_initfn(SCSIDevice *dev)
1564 {
1565     DriveInfo *dinfo;
1566
1567     if (!dev->conf.bs) {
1568         return scsi_initfn(dev);  /* ... and die there */
1569     }
1570
1571     dinfo = drive_get_by_blockdev(dev->conf.bs);
1572     if (dinfo->media_cd) {
1573         return scsi_cd_initfn(dev);
1574     } else {
1575         return scsi_hd_initfn(dev);
1576     }
1577 }
1578
1579 static const SCSIReqOps scsi_disk_reqops = {
1580     .size         = sizeof(SCSIDiskReq),
1581     .free_req     = scsi_free_request,
1582     .send_command = scsi_send_command,
1583     .read_data    = scsi_read_data,
1584     .write_data   = scsi_write_data,
1585     .cancel_io    = scsi_cancel_io,
1586     .get_buf      = scsi_get_buf,
1587 };
1588
1589 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
1590                                      uint8_t *buf, void *hba_private)
1591 {
1592     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1593     SCSIRequest *req;
1594
1595     req = scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, hba_private);
1596     return req;
1597 }
1598
1599 #ifdef __linux__
1600 static int get_device_type(SCSIDiskState *s)
1601 {
1602     BlockDriverState *bdrv = s->qdev.conf.bs;
1603     uint8_t cmd[16];
1604     uint8_t buf[36];
1605     uint8_t sensebuf[8];
1606     sg_io_hdr_t io_header;
1607     int ret;
1608
1609     memset(cmd, 0, sizeof(cmd));
1610     memset(buf, 0, sizeof(buf));
1611     cmd[0] = INQUIRY;
1612     cmd[4] = sizeof(buf);
1613
1614     memset(&io_header, 0, sizeof(io_header));
1615     io_header.interface_id = 'S';
1616     io_header.dxfer_direction = SG_DXFER_FROM_DEV;
1617     io_header.dxfer_len = sizeof(buf);
1618     io_header.dxferp = buf;
1619     io_header.cmdp = cmd;
1620     io_header.cmd_len = sizeof(cmd);
1621     io_header.mx_sb_len = sizeof(sensebuf);
1622     io_header.sbp = sensebuf;
1623     io_header.timeout = 6000; /* XXX */
1624
1625     ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
1626     if (ret < 0 || io_header.driver_status || io_header.host_status) {
1627         return -1;
1628     }
1629     s->qdev.type = buf[0];
1630     s->removable = (buf[1] & 0x80) != 0;
1631     return 0;
1632 }
1633
1634 static int scsi_block_initfn(SCSIDevice *dev)
1635 {
1636     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1637     int sg_version;
1638     int rc;
1639
1640     if (!s->qdev.conf.bs) {
1641         error_report("scsi-block: drive property not set");
1642         return -1;
1643     }
1644
1645     /* check we are using a driver managing SG_IO (version 3 and after) */
1646     if (bdrv_ioctl(s->qdev.conf.bs, SG_GET_VERSION_NUM, &sg_version) < 0 ||
1647         sg_version < 30000) {
1648         error_report("scsi-block: scsi generic interface too old");
1649         return -1;
1650     }
1651
1652     /* get device type from INQUIRY data */
1653     rc = get_device_type(s);
1654     if (rc < 0) {
1655         error_report("scsi-block: INQUIRY failed");
1656         return -1;
1657     }
1658
1659     /* Make a guess for the block size, we'll fix it when the guest sends.
1660      * READ CAPACITY.  If they don't, they likely would assume these sizes
1661      * anyway. (TODO: check in /sys).
1662      */
1663     if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
1664         s->qdev.blocksize = 2048;
1665     } else {
1666         s->qdev.blocksize = 512;
1667     }
1668     return scsi_initfn(&s->qdev);
1669 }
1670
1671 static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
1672                                            uint32_t lun, uint8_t *buf,
1673                                            void *hba_private)
1674 {
1675     SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1676
1677     switch (buf[0]) {
1678     case READ_6:
1679     case READ_10:
1680     case READ_12:
1681     case READ_16:
1682     case WRITE_6:
1683     case WRITE_10:
1684     case WRITE_12:
1685     case WRITE_16:
1686     case WRITE_VERIFY_10:
1687     case WRITE_VERIFY_12:
1688     case WRITE_VERIFY_16:
1689         /* MMC writing cannot be done via pread/pwrite, because it sometimes
1690          * involves writing beyond the maximum LBA or to negative LBA (lead-in).
1691          * And once you do these writes, reading from the block device is
1692          * unreliable, too.  It is even possible that reads deliver random data
1693          * from the host page cache (this is probably a Linux bug).
1694          *
1695          * We might use scsi_disk_reqops as long as no writing commands are
1696          * seen, but performance usually isn't paramount on optical media.  So,
1697          * just make scsi-block operate the same as scsi-generic for them.
1698          */
1699         if (s->qdev.type != TYPE_ROM) {
1700             return scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun,
1701                                   hba_private);
1702         }
1703     }
1704
1705     return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
1706                           hba_private);
1707 }
1708 #endif
1709
1710 #define DEFINE_SCSI_DISK_PROPERTIES()                           \
1711     DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),          \
1712     DEFINE_PROP_STRING("ver",  SCSIDiskState, version),         \
1713     DEFINE_PROP_STRING("serial",  SCSIDiskState, serial)
1714
1715 static Property scsi_hd_properties[] = {
1716     DEFINE_SCSI_DISK_PROPERTIES(),
1717     DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1718     DEFINE_PROP_END_OF_LIST(),
1719 };
1720
1721 static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
1722 {
1723     DeviceClass *dc = DEVICE_CLASS(klass);
1724     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1725
1726     sc->init         = scsi_hd_initfn;
1727     sc->destroy      = scsi_destroy;
1728     sc->alloc_req    = scsi_new_request;
1729     sc->unit_attention_reported = scsi_disk_unit_attention_reported;
1730     dc->fw_name = "disk";
1731     dc->desc = "virtual SCSI disk";
1732     dc->reset = scsi_disk_reset;
1733     dc->props = scsi_hd_properties;
1734 }
1735
1736 static TypeInfo scsi_hd_info = {
1737     .name          = "scsi-hd",
1738     .parent        = TYPE_SCSI_DEVICE,
1739     .instance_size = sizeof(SCSIDiskState),
1740     .class_init    = scsi_hd_class_initfn,
1741 };
1742
1743 static Property scsi_cd_properties[] = {
1744     DEFINE_SCSI_DISK_PROPERTIES(),
1745     DEFINE_PROP_END_OF_LIST(),
1746 };
1747
1748 static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
1749 {
1750     DeviceClass *dc = DEVICE_CLASS(klass);
1751     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1752
1753     sc->init         = scsi_cd_initfn;
1754     sc->destroy      = scsi_destroy;
1755     sc->alloc_req    = scsi_new_request;
1756     sc->unit_attention_reported = scsi_disk_unit_attention_reported;
1757     dc->fw_name = "disk";
1758     dc->desc = "virtual SCSI CD-ROM";
1759     dc->reset = scsi_disk_reset;
1760     dc->props = scsi_cd_properties;
1761 }
1762
1763 static TypeInfo scsi_cd_info = {
1764     .name          = "scsi-cd",
1765     .parent        = TYPE_SCSI_DEVICE,
1766     .instance_size = sizeof(SCSIDiskState),
1767     .class_init    = scsi_cd_class_initfn,
1768 };
1769
1770 #ifdef __linux__
1771 static Property scsi_block_properties[] = {
1772     DEFINE_SCSI_DISK_PROPERTIES(),
1773     DEFINE_PROP_END_OF_LIST(),
1774 };
1775
1776 static void scsi_block_class_initfn(ObjectClass *klass, void *data)
1777 {
1778     DeviceClass *dc = DEVICE_CLASS(klass);
1779     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1780
1781     sc->init         = scsi_block_initfn;
1782     sc->destroy      = scsi_destroy;
1783     sc->alloc_req    = scsi_block_new_request;
1784     dc->fw_name = "disk";
1785     dc->desc = "SCSI block device passthrough";
1786     dc->reset = scsi_disk_reset;
1787     dc->props = scsi_block_properties;
1788 }
1789
1790 static TypeInfo scsi_block_info = {
1791     .name          = "scsi-block",
1792     .parent        = TYPE_SCSI_DEVICE,
1793     .instance_size = sizeof(SCSIDiskState),
1794     .class_init    = scsi_block_class_initfn,
1795 };
1796 #endif
1797
1798 static Property scsi_disk_properties[] = {
1799     DEFINE_SCSI_DISK_PROPERTIES(),
1800     DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1801     DEFINE_PROP_END_OF_LIST(),
1802 };
1803
1804 static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
1805 {
1806     DeviceClass *dc = DEVICE_CLASS(klass);
1807     SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
1808
1809     sc->init         = scsi_disk_initfn;
1810     sc->destroy      = scsi_destroy;
1811     sc->alloc_req    = scsi_new_request;
1812     sc->unit_attention_reported = scsi_disk_unit_attention_reported;
1813     dc->fw_name = "disk";
1814     dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
1815     dc->reset = scsi_disk_reset;
1816     dc->props = scsi_disk_properties;
1817 }
1818
1819 static TypeInfo scsi_disk_info = {
1820     .name          = "scsi-disk",
1821     .parent        = TYPE_SCSI_DEVICE,
1822     .instance_size = sizeof(SCSIDiskState),
1823     .class_init    = scsi_disk_class_initfn,
1824 };
1825
1826 static void scsi_disk_register_types(void)
1827 {
1828     type_register_static(&scsi_hd_info);
1829     type_register_static(&scsi_cd_info);
1830 #ifdef __linux__
1831     type_register_static(&scsi_block_info);
1832 #endif
1833     type_register_static(&scsi_disk_info);
1834 }
1835
1836 type_init(scsi_disk_register_types)
This page took 0.12788 seconds and 4 git commands to generate.