Remove unnecessary casts from PCI DMA code in lsi53c895a
[qemu/qmp-unstable.git] / hw / scsi-disk.c
blob673948c51f86c1ec70767c78b0593eca54800705
1 /*
2 * SCSI Device emulation
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
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.
15 * This code is licensed under the LGPL.
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.
22 //#define DEBUG_SCSI
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
31 #define BADF(fmt, ...) \
32 do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
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"
42 #ifdef __linux
43 #include <scsi/sg.h>
44 #endif
46 #define SCSI_DMA_BUF_SIZE 131072
47 #define SCSI_MAX_INQUIRY_LEN 256
49 typedef struct SCSIDiskState SCSIDiskState;
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;
62 struct SCSIDiskState
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;
76 static int scsi_handle_rw_error(SCSIDiskReq *r, int error);
78 static void scsi_free_request(SCSIRequest *req)
80 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
82 if (r->iov.iov_base) {
83 qemu_vfree(r->iov.iov_base);
87 /* Helper function for command completion with sense. */
88 static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
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);
96 /* Cancel a pending data transfer. */
97 static void scsi_cancel_io(SCSIRequest *req)
99 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
101 DPRINTF("Cancel tag=0x%x\n", req->tag);
102 if (r->req.aiocb) {
103 bdrv_aio_cancel(r->req.aiocb);
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);
110 r->req.aiocb = NULL;
113 static uint32_t scsi_init_iovec(SCSIDiskReq *r)
115 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
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);
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;
126 static void scsi_read_complete(void * opaque, int ret)
128 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
129 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
130 int n;
132 if (r->req.aiocb != NULL) {
133 r->req.aiocb = NULL;
134 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
137 if (ret) {
138 if (scsi_handle_rw_error(r, -ret)) {
139 goto done;
143 DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->qiov.size);
145 n = r->qiov.size / 512;
146 r->sector += n;
147 r->sector_count -= n;
148 scsi_req_data(&r->req, r->qiov.size);
150 done:
151 if (!r->req.io_canceled) {
152 scsi_req_unref(&r->req);
156 static void scsi_flush_complete(void * opaque, int ret)
158 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
159 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
161 if (r->req.aiocb != NULL) {
162 r->req.aiocb = NULL;
163 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
166 if (ret < 0) {
167 if (scsi_handle_rw_error(r, -ret)) {
168 goto done;
172 scsi_req_complete(&r->req, GOOD);
174 done:
175 if (!r->req.io_canceled) {
176 scsi_req_unref(&r->req);
180 /* Read more data from scsi device into buffer. */
181 static void scsi_read_data(SCSIRequest *req)
183 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
184 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
185 uint32_t n;
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;
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;
200 /* No data transfer may already be in progress */
201 assert(r->req.aiocb == NULL);
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;
211 if (s->tray_open) {
212 scsi_read_complete(r, -ENOMEDIUM);
213 return;
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 if (r->req.aiocb == NULL) {
221 scsi_read_complete(r, -EIO);
226 * scsi_handle_rw_error has two return values. 0 means that the error
227 * must be ignored, 1 means that the error has been processed and the
228 * caller should not do anything else for this request. Note that
229 * scsi_handle_rw_error always manages its reference counts, independent
230 * of the return value.
232 static int scsi_handle_rw_error(SCSIDiskReq *r, int error)
234 int is_read = (r->req.cmd.xfer == SCSI_XFER_FROM_DEV);
235 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
236 BlockErrorAction action = bdrv_get_on_error(s->qdev.conf.bs, is_read);
238 if (action == BLOCK_ERR_IGNORE) {
239 bdrv_mon_event(s->qdev.conf.bs, BDRV_ACTION_IGNORE, is_read);
240 return 0;
243 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
244 || action == BLOCK_ERR_STOP_ANY) {
246 bdrv_mon_event(s->qdev.conf.bs, BDRV_ACTION_STOP, is_read);
247 vm_stop(RUN_STATE_IO_ERROR);
248 bdrv_iostatus_set_err(s->qdev.conf.bs, error);
249 scsi_req_retry(&r->req);
250 } else {
251 switch (error) {
252 case ENOMEDIUM:
253 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
254 break;
255 case ENOMEM:
256 scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
257 break;
258 case EINVAL:
259 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
260 break;
261 default:
262 scsi_check_condition(r, SENSE_CODE(IO_ERROR));
263 break;
265 bdrv_mon_event(s->qdev.conf.bs, BDRV_ACTION_REPORT, is_read);
267 return 1;
270 static void scsi_write_complete(void * opaque, int ret)
272 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
273 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
274 uint32_t n;
276 if (r->req.aiocb != NULL) {
277 r->req.aiocb = NULL;
278 bdrv_acct_done(s->qdev.conf.bs, &r->acct);
281 if (ret) {
282 if (scsi_handle_rw_error(r, -ret)) {
283 goto done;
287 n = r->qiov.size / 512;
288 r->sector += n;
289 r->sector_count -= n;
290 if (r->sector_count == 0) {
291 scsi_req_complete(&r->req, GOOD);
292 } else {
293 scsi_init_iovec(r);
294 DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
295 scsi_req_data(&r->req, r->qiov.size);
298 done:
299 if (!r->req.io_canceled) {
300 scsi_req_unref(&r->req);
304 static void scsi_write_data(SCSIRequest *req)
306 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
307 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
308 uint32_t n;
310 /* No data transfer may already be in progress */
311 assert(r->req.aiocb == NULL);
313 /* The request is used as the AIO opaque value, so add a ref. */
314 scsi_req_ref(&r->req);
315 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
316 DPRINTF("Data transfer direction invalid\n");
317 scsi_write_complete(r, -EINVAL);
318 return;
321 n = r->qiov.size / 512;
322 if (n) {
323 if (s->tray_open) {
324 scsi_write_complete(r, -ENOMEDIUM);
325 return;
327 bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
328 r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n,
329 scsi_write_complete, r);
330 if (r->req.aiocb == NULL) {
331 scsi_write_complete(r, -ENOMEM);
333 } else {
334 /* Called for the first time. Ask the driver to send us more data. */
335 scsi_write_complete(r, 0);
339 /* Return a pointer to the data buffer. */
340 static uint8_t *scsi_get_buf(SCSIRequest *req)
342 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
344 return (uint8_t *)r->iov.iov_base;
347 static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
349 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
350 int buflen = 0;
352 if (req->cmd.buf[1] & 0x2) {
353 /* Command support data - optional, not implemented */
354 BADF("optional INQUIRY command support request not implemented\n");
355 return -1;
358 if (req->cmd.buf[1] & 0x1) {
359 /* Vital product data */
360 uint8_t page_code = req->cmd.buf[2];
361 if (req->cmd.xfer < 4) {
362 BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
363 "less than 4\n", page_code, req->cmd.xfer);
364 return -1;
367 outbuf[buflen++] = s->qdev.type & 0x1f;
368 outbuf[buflen++] = page_code ; // this page
369 outbuf[buflen++] = 0x00;
371 switch (page_code) {
372 case 0x00: /* Supported page codes, mandatory */
374 int pages;
375 DPRINTF("Inquiry EVPD[Supported pages] "
376 "buffer size %zd\n", req->cmd.xfer);
377 pages = buflen++;
378 outbuf[buflen++] = 0x00; // list of supported pages (this page)
379 if (s->serial) {
380 outbuf[buflen++] = 0x80; // unit serial number
382 outbuf[buflen++] = 0x83; // device identification
383 if (s->qdev.type == TYPE_DISK) {
384 outbuf[buflen++] = 0xb0; // block limits
385 outbuf[buflen++] = 0xb2; // thin provisioning
387 outbuf[pages] = buflen - pages - 1; // number of pages
388 break;
390 case 0x80: /* Device serial number, optional */
392 int l;
394 if (!s->serial) {
395 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
396 return -1;
399 l = strlen(s->serial);
400 if (l > req->cmd.xfer) {
401 l = req->cmd.xfer;
403 if (l > 20) {
404 l = 20;
407 DPRINTF("Inquiry EVPD[Serial number] "
408 "buffer size %zd\n", req->cmd.xfer);
409 outbuf[buflen++] = l;
410 memcpy(outbuf+buflen, s->serial, l);
411 buflen += l;
412 break;
415 case 0x83: /* Device identification page, mandatory */
417 int max_len = 255 - 8;
418 int id_len = strlen(bdrv_get_device_name(s->qdev.conf.bs));
420 if (id_len > max_len) {
421 id_len = max_len;
423 DPRINTF("Inquiry EVPD[Device identification] "
424 "buffer size %zd\n", req->cmd.xfer);
426 outbuf[buflen++] = 4 + id_len;
427 outbuf[buflen++] = 0x2; // ASCII
428 outbuf[buflen++] = 0; // not officially assigned
429 outbuf[buflen++] = 0; // reserved
430 outbuf[buflen++] = id_len; // length of data following
432 memcpy(outbuf+buflen, bdrv_get_device_name(s->qdev.conf.bs), id_len);
433 buflen += id_len;
434 break;
436 case 0xb0: /* block limits */
438 unsigned int unmap_sectors =
439 s->qdev.conf.discard_granularity / s->qdev.blocksize;
440 unsigned int min_io_size =
441 s->qdev.conf.min_io_size / s->qdev.blocksize;
442 unsigned int opt_io_size =
443 s->qdev.conf.opt_io_size / s->qdev.blocksize;
445 if (s->qdev.type == TYPE_ROM) {
446 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
447 page_code);
448 return -1;
450 /* required VPD size with unmap support */
451 outbuf[3] = buflen = 0x3c;
453 memset(outbuf + 4, 0, buflen - 4);
455 /* optimal transfer length granularity */
456 outbuf[6] = (min_io_size >> 8) & 0xff;
457 outbuf[7] = min_io_size & 0xff;
459 /* optimal transfer length */
460 outbuf[12] = (opt_io_size >> 24) & 0xff;
461 outbuf[13] = (opt_io_size >> 16) & 0xff;
462 outbuf[14] = (opt_io_size >> 8) & 0xff;
463 outbuf[15] = opt_io_size & 0xff;
465 /* optimal unmap granularity */
466 outbuf[28] = (unmap_sectors >> 24) & 0xff;
467 outbuf[29] = (unmap_sectors >> 16) & 0xff;
468 outbuf[30] = (unmap_sectors >> 8) & 0xff;
469 outbuf[31] = unmap_sectors & 0xff;
470 break;
472 case 0xb2: /* thin provisioning */
474 outbuf[3] = buflen = 8;
475 outbuf[4] = 0;
476 outbuf[5] = 0x40; /* write same with unmap supported */
477 outbuf[6] = 0;
478 outbuf[7] = 0;
479 break;
481 default:
482 BADF("Error: unsupported Inquiry (EVPD[%02X]) "
483 "buffer size %zd\n", page_code, req->cmd.xfer);
484 return -1;
486 /* done with EVPD */
487 return buflen;
490 /* Standard INQUIRY data */
491 if (req->cmd.buf[2] != 0) {
492 BADF("Error: Inquiry (STANDARD) page or code "
493 "is non-zero [%02X]\n", req->cmd.buf[2]);
494 return -1;
497 /* PAGE CODE == 0 */
498 if (req->cmd.xfer < 5) {
499 BADF("Error: Inquiry (STANDARD) buffer size %zd "
500 "is less than 5\n", req->cmd.xfer);
501 return -1;
504 buflen = req->cmd.xfer;
505 if (buflen > SCSI_MAX_INQUIRY_LEN) {
506 buflen = SCSI_MAX_INQUIRY_LEN;
508 memset(outbuf, 0, buflen);
510 outbuf[0] = s->qdev.type & 0x1f;
511 outbuf[1] = s->removable ? 0x80 : 0;
512 if (s->qdev.type == TYPE_ROM) {
513 memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
514 } else {
515 memcpy(&outbuf[16], "QEMU HARDDISK ", 16);
517 memcpy(&outbuf[8], "QEMU ", 8);
518 memset(&outbuf[32], 0, 4);
519 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
521 * We claim conformance to SPC-3, which is required for guests
522 * to ask for modern features like READ CAPACITY(16) or the
523 * block characteristics VPD page by default. Not all of SPC-3
524 * is actually implemented, but we're good enough.
526 outbuf[2] = 5;
527 outbuf[3] = 2; /* Format 2 */
529 if (buflen > 36) {
530 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
531 } else {
532 /* If the allocation length of CDB is too small,
533 the additional length is not adjusted */
534 outbuf[4] = 36 - 5;
537 /* Sync data transfer and TCQ. */
538 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
539 return buflen;
542 static inline bool media_is_dvd(SCSIDiskState *s)
544 uint64_t nb_sectors;
545 if (s->qdev.type != TYPE_ROM) {
546 return false;
548 if (!bdrv_is_inserted(s->qdev.conf.bs)) {
549 return false;
551 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
552 return nb_sectors > CD_MAX_SECTORS;
555 static inline bool media_is_cd(SCSIDiskState *s)
557 uint64_t nb_sectors;
558 if (s->qdev.type != TYPE_ROM) {
559 return false;
561 if (!bdrv_is_inserted(s->qdev.conf.bs)) {
562 return false;
564 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
565 return nb_sectors <= CD_MAX_SECTORS;
568 static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
569 uint8_t *outbuf)
571 static const int rds_caps_size[5] = {
572 [0] = 2048 + 4,
573 [1] = 4 + 4,
574 [3] = 188 + 4,
575 [4] = 2048 + 4,
578 uint8_t media = r->req.cmd.buf[1];
579 uint8_t layer = r->req.cmd.buf[6];
580 uint8_t format = r->req.cmd.buf[7];
581 int size = -1;
583 if (s->qdev.type != TYPE_ROM) {
584 return -1;
586 if (media != 0) {
587 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
588 return -1;
591 if (format != 0xff) {
592 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
593 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
594 return -1;
596 if (media_is_cd(s)) {
597 scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
598 return -1;
600 if (format >= ARRAY_SIZE(rds_caps_size)) {
601 return -1;
603 size = rds_caps_size[format];
604 memset(outbuf, 0, size);
607 switch (format) {
608 case 0x00: {
609 /* Physical format information */
610 uint64_t nb_sectors;
611 if (layer != 0) {
612 goto fail;
614 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
616 outbuf[4] = 1; /* DVD-ROM, part version 1 */
617 outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
618 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
619 outbuf[7] = 0; /* default densities */
621 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
622 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
623 break;
626 case 0x01: /* DVD copyright information, all zeros */
627 break;
629 case 0x03: /* BCA information - invalid field for no BCA info */
630 return -1;
632 case 0x04: /* DVD disc manufacturing information, all zeros */
633 break;
635 case 0xff: { /* List capabilities */
636 int i;
637 size = 4;
638 for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
639 if (!rds_caps_size[i]) {
640 continue;
642 outbuf[size] = i;
643 outbuf[size + 1] = 0x40; /* Not writable, readable */
644 stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
645 size += 4;
647 break;
650 default:
651 return -1;
654 /* Size of buffer, not including 2 byte size field */
655 stw_be_p(outbuf, size - 2);
656 return size;
658 fail:
659 return -1;
662 static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
664 uint8_t event_code, media_status;
666 media_status = 0;
667 if (s->tray_open) {
668 media_status = MS_TRAY_OPEN;
669 } else if (bdrv_is_inserted(s->qdev.conf.bs)) {
670 media_status = MS_MEDIA_PRESENT;
673 /* Event notification descriptor */
674 event_code = MEC_NO_CHANGE;
675 if (media_status != MS_TRAY_OPEN) {
676 if (s->media_event) {
677 event_code = MEC_NEW_MEDIA;
678 s->media_event = false;
679 } else if (s->eject_request) {
680 event_code = MEC_EJECT_REQUESTED;
681 s->eject_request = false;
685 outbuf[0] = event_code;
686 outbuf[1] = media_status;
688 /* These fields are reserved, just clear them. */
689 outbuf[2] = 0;
690 outbuf[3] = 0;
691 return 4;
694 static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
695 uint8_t *outbuf)
697 int size;
698 uint8_t *buf = r->req.cmd.buf;
699 uint8_t notification_class_request = buf[4];
700 if (s->qdev.type != TYPE_ROM) {
701 return -1;
703 if ((buf[1] & 1) == 0) {
704 /* asynchronous */
705 return -1;
708 size = 4;
709 outbuf[0] = outbuf[1] = 0;
710 outbuf[3] = 1 << GESN_MEDIA; /* supported events */
711 if (notification_class_request & (1 << GESN_MEDIA)) {
712 outbuf[2] = GESN_MEDIA;
713 size += scsi_event_status_media(s, &outbuf[size]);
714 } else {
715 outbuf[2] = 0x80;
717 stw_be_p(outbuf, size - 4);
718 return size;
721 static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
723 int current;
725 if (s->qdev.type != TYPE_ROM) {
726 return -1;
728 current = media_is_dvd(s) ? MMC_PROFILE_DVD_ROM : MMC_PROFILE_CD_ROM;
729 memset(outbuf, 0, 40);
730 stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
731 stw_be_p(&outbuf[6], current);
732 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
733 outbuf[10] = 0x03; /* persistent, current */
734 outbuf[11] = 8; /* two profiles */
735 stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
736 outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
737 stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
738 outbuf[18] = (current == MMC_PROFILE_CD_ROM);
739 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
740 stw_be_p(&outbuf[20], 1);
741 outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
742 outbuf[23] = 8;
743 stl_be_p(&outbuf[24], 1); /* SCSI */
744 outbuf[28] = 1; /* DBE = 1, mandatory */
745 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
746 stw_be_p(&outbuf[32], 3);
747 outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
748 outbuf[35] = 4;
749 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
750 /* TODO: Random readable, CD read, DVD read, drive serial number,
751 power management */
752 return 40;
755 static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
757 if (s->qdev.type != TYPE_ROM) {
758 return -1;
760 memset(outbuf, 0, 8);
761 outbuf[5] = 1; /* CD-ROM */
762 return 8;
765 static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
766 int page_control)
768 static const int mode_sense_valid[0x3f] = {
769 [MODE_PAGE_HD_GEOMETRY] = (1 << TYPE_DISK),
770 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
771 [MODE_PAGE_CACHING] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
772 [MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
773 [MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
774 [MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
777 BlockDriverState *bdrv = s->qdev.conf.bs;
778 int cylinders, heads, secs;
779 uint8_t *p = *p_outbuf;
781 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
782 return -1;
785 p[0] = page;
788 * If Changeable Values are requested, a mask denoting those mode parameters
789 * that are changeable shall be returned. As we currently don't support
790 * parameter changes via MODE_SELECT all bits are returned set to zero.
791 * The buffer was already menset to zero by the caller of this function.
793 switch (page) {
794 case MODE_PAGE_HD_GEOMETRY:
795 p[1] = 0x16;
796 if (page_control == 1) { /* Changeable Values */
797 break;
799 /* if a geometry hint is available, use it */
800 bdrv_guess_geometry(bdrv, &cylinders, &heads, &secs);
801 p[2] = (cylinders >> 16) & 0xff;
802 p[3] = (cylinders >> 8) & 0xff;
803 p[4] = cylinders & 0xff;
804 p[5] = heads & 0xff;
805 /* Write precomp start cylinder, disabled */
806 p[6] = (cylinders >> 16) & 0xff;
807 p[7] = (cylinders >> 8) & 0xff;
808 p[8] = cylinders & 0xff;
809 /* Reduced current start cylinder, disabled */
810 p[9] = (cylinders >> 16) & 0xff;
811 p[10] = (cylinders >> 8) & 0xff;
812 p[11] = cylinders & 0xff;
813 /* Device step rate [ns], 200ns */
814 p[12] = 0;
815 p[13] = 200;
816 /* Landing zone cylinder */
817 p[14] = 0xff;
818 p[15] = 0xff;
819 p[16] = 0xff;
820 /* Medium rotation rate [rpm], 5400 rpm */
821 p[20] = (5400 >> 8) & 0xff;
822 p[21] = 5400 & 0xff;
823 break;
825 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
826 p[1] = 0x1e;
827 if (page_control == 1) { /* Changeable Values */
828 break;
830 /* Transfer rate [kbit/s], 5Mbit/s */
831 p[2] = 5000 >> 8;
832 p[3] = 5000 & 0xff;
833 /* if a geometry hint is available, use it */
834 bdrv_guess_geometry(bdrv, &cylinders, &heads, &secs);
835 p[4] = heads & 0xff;
836 p[5] = secs & 0xff;
837 p[6] = s->qdev.blocksize >> 8;
838 p[8] = (cylinders >> 8) & 0xff;
839 p[9] = cylinders & 0xff;
840 /* Write precomp start cylinder, disabled */
841 p[10] = (cylinders >> 8) & 0xff;
842 p[11] = cylinders & 0xff;
843 /* Reduced current start cylinder, disabled */
844 p[12] = (cylinders >> 8) & 0xff;
845 p[13] = cylinders & 0xff;
846 /* Device step rate [100us], 100us */
847 p[14] = 0;
848 p[15] = 1;
849 /* Device step pulse width [us], 1us */
850 p[16] = 1;
851 /* Device head settle delay [100us], 100us */
852 p[17] = 0;
853 p[18] = 1;
854 /* Motor on delay [0.1s], 0.1s */
855 p[19] = 1;
856 /* Motor off delay [0.1s], 0.1s */
857 p[20] = 1;
858 /* Medium rotation rate [rpm], 5400 rpm */
859 p[28] = (5400 >> 8) & 0xff;
860 p[29] = 5400 & 0xff;
861 break;
863 case MODE_PAGE_CACHING:
864 p[0] = 8;
865 p[1] = 0x12;
866 if (page_control == 1) { /* Changeable Values */
867 break;
869 if (bdrv_enable_write_cache(s->qdev.conf.bs)) {
870 p[2] = 4; /* WCE */
872 break;
874 case MODE_PAGE_R_W_ERROR:
875 p[1] = 10;
876 p[2] = 0x80; /* Automatic Write Reallocation Enabled */
877 if (s->qdev.type == TYPE_ROM) {
878 p[3] = 0x20; /* Read Retry Count */
880 break;
882 case MODE_PAGE_AUDIO_CTL:
883 p[1] = 14;
884 break;
886 case MODE_PAGE_CAPABILITIES:
887 p[1] = 0x14;
888 if (page_control == 1) { /* Changeable Values */
889 break;
892 p[2] = 0x3b; /* CD-R & CD-RW read */
893 p[3] = 0; /* Writing not supported */
894 p[4] = 0x7f; /* Audio, composite, digital out,
895 mode 2 form 1&2, multi session */
896 p[5] = 0xff; /* CD DA, DA accurate, RW supported,
897 RW corrected, C2 errors, ISRC,
898 UPC, Bar code */
899 p[6] = 0x2d | (s->tray_locked ? 2 : 0);
900 /* Locking supported, jumper present, eject, tray */
901 p[7] = 0; /* no volume & mute control, no
902 changer */
903 p[8] = (50 * 176) >> 8; /* 50x read speed */
904 p[9] = (50 * 176) & 0xff;
905 p[10] = 2 >> 8; /* Two volume levels */
906 p[11] = 2 & 0xff;
907 p[12] = 2048 >> 8; /* 2M buffer */
908 p[13] = 2048 & 0xff;
909 p[14] = (16 * 176) >> 8; /* 16x read speed current */
910 p[15] = (16 * 176) & 0xff;
911 p[18] = (16 * 176) >> 8; /* 16x write speed */
912 p[19] = (16 * 176) & 0xff;
913 p[20] = (16 * 176) >> 8; /* 16x write speed current */
914 p[21] = (16 * 176) & 0xff;
915 break;
917 default:
918 return -1;
921 *p_outbuf += p[1] + 2;
922 return p[1] + 2;
925 static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
927 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
928 uint64_t nb_sectors;
929 int page, dbd, buflen, ret, page_control;
930 uint8_t *p;
931 uint8_t dev_specific_param;
933 dbd = r->req.cmd.buf[1] & 0x8;
934 page = r->req.cmd.buf[2] & 0x3f;
935 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
936 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
937 (r->req.cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, r->req.cmd.xfer, page_control);
938 memset(outbuf, 0, r->req.cmd.xfer);
939 p = outbuf;
941 if (bdrv_is_read_only(s->qdev.conf.bs)) {
942 dev_specific_param = 0x80; /* Readonly. */
943 } else {
944 dev_specific_param = 0x00;
947 if (r->req.cmd.buf[0] == MODE_SENSE) {
948 p[1] = 0; /* Default media type. */
949 p[2] = dev_specific_param;
950 p[3] = 0; /* Block descriptor length. */
951 p += 4;
952 } else { /* MODE_SENSE_10 */
953 p[2] = 0; /* Default media type. */
954 p[3] = dev_specific_param;
955 p[6] = p[7] = 0; /* Block descriptor length. */
956 p += 8;
959 /* MMC prescribes that CD/DVD drives have no block descriptors. */
960 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
961 if (!dbd && s->qdev.type == TYPE_DISK && nb_sectors) {
962 if (r->req.cmd.buf[0] == MODE_SENSE) {
963 outbuf[3] = 8; /* Block descriptor length */
964 } else { /* MODE_SENSE_10 */
965 outbuf[7] = 8; /* Block descriptor length */
967 nb_sectors /= (s->qdev.blocksize / 512);
968 if (nb_sectors > 0xffffff) {
969 nb_sectors = 0;
971 p[0] = 0; /* media density code */
972 p[1] = (nb_sectors >> 16) & 0xff;
973 p[2] = (nb_sectors >> 8) & 0xff;
974 p[3] = nb_sectors & 0xff;
975 p[4] = 0; /* reserved */
976 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
977 p[6] = s->qdev.blocksize >> 8;
978 p[7] = 0;
979 p += 8;
982 if (page_control == 3) {
983 /* Saved Values */
984 scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
985 return -1;
988 if (page == 0x3f) {
989 for (page = 0; page <= 0x3e; page++) {
990 mode_sense_page(s, page, &p, page_control);
992 } else {
993 ret = mode_sense_page(s, page, &p, page_control);
994 if (ret == -1) {
995 return -1;
999 buflen = p - outbuf;
1001 * The mode data length field specifies the length in bytes of the
1002 * following data that is available to be transferred. The mode data
1003 * length does not include itself.
1005 if (r->req.cmd.buf[0] == MODE_SENSE) {
1006 outbuf[0] = buflen - 1;
1007 } else { /* MODE_SENSE_10 */
1008 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1009 outbuf[1] = (buflen - 2) & 0xff;
1011 if (buflen > r->req.cmd.xfer) {
1012 buflen = r->req.cmd.xfer;
1014 return buflen;
1017 static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1019 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1020 int start_track, format, msf, toclen;
1021 uint64_t nb_sectors;
1023 msf = req->cmd.buf[1] & 2;
1024 format = req->cmd.buf[2] & 0xf;
1025 start_track = req->cmd.buf[6];
1026 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1027 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
1028 nb_sectors /= s->qdev.blocksize / 512;
1029 switch (format) {
1030 case 0:
1031 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1032 break;
1033 case 1:
1034 /* multi session : only a single session defined */
1035 toclen = 12;
1036 memset(outbuf, 0, 12);
1037 outbuf[1] = 0x0a;
1038 outbuf[2] = 0x01;
1039 outbuf[3] = 0x01;
1040 break;
1041 case 2:
1042 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1043 break;
1044 default:
1045 return -1;
1047 if (toclen > req->cmd.xfer) {
1048 toclen = req->cmd.xfer;
1050 return toclen;
1053 static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
1055 SCSIRequest *req = &r->req;
1056 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1057 bool start = req->cmd.buf[4] & 1;
1058 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
1060 if (s->qdev.type == TYPE_ROM && loej) {
1061 if (!start && !s->tray_open && s->tray_locked) {
1062 scsi_check_condition(r,
1063 bdrv_is_inserted(s->qdev.conf.bs)
1064 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1065 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1066 return -1;
1068 bdrv_eject(s->qdev.conf.bs, !start);
1069 s->tray_open = !start;
1071 return 0;
1074 static int scsi_disk_emulate_command(SCSIDiskReq *r)
1076 SCSIRequest *req = &r->req;
1077 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1078 uint64_t nb_sectors;
1079 uint8_t *outbuf;
1080 int buflen = 0;
1082 if (!r->iov.iov_base) {
1084 * FIXME: we shouldn't return anything bigger than 4k, but the code
1085 * requires the buffer to be as big as req->cmd.xfer in several
1086 * places. So, do not allow CDBs with a very large ALLOCATION
1087 * LENGTH. The real fix would be to modify scsi_read_data and
1088 * dma_buf_read, so that they return data beyond the buflen
1089 * as all zeros.
1091 if (req->cmd.xfer > 65536) {
1092 goto illegal_request;
1094 r->buflen = MAX(4096, req->cmd.xfer);
1095 r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
1098 outbuf = r->iov.iov_base;
1099 switch (req->cmd.buf[0]) {
1100 case TEST_UNIT_READY:
1101 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1102 goto not_ready;
1104 break;
1105 case INQUIRY:
1106 buflen = scsi_disk_emulate_inquiry(req, outbuf);
1107 if (buflen < 0) {
1108 goto illegal_request;
1110 break;
1111 case MODE_SENSE:
1112 case MODE_SENSE_10:
1113 buflen = scsi_disk_emulate_mode_sense(r, outbuf);
1114 if (buflen < 0) {
1115 goto illegal_request;
1117 break;
1118 case READ_TOC:
1119 buflen = scsi_disk_emulate_read_toc(req, outbuf);
1120 if (buflen < 0) {
1121 goto illegal_request;
1123 break;
1124 case RESERVE:
1125 if (req->cmd.buf[1] & 1) {
1126 goto illegal_request;
1128 break;
1129 case RESERVE_10:
1130 if (req->cmd.buf[1] & 3) {
1131 goto illegal_request;
1133 break;
1134 case RELEASE:
1135 if (req->cmd.buf[1] & 1) {
1136 goto illegal_request;
1138 break;
1139 case RELEASE_10:
1140 if (req->cmd.buf[1] & 3) {
1141 goto illegal_request;
1143 break;
1144 case START_STOP:
1145 if (scsi_disk_emulate_start_stop(r) < 0) {
1146 return -1;
1148 break;
1149 case ALLOW_MEDIUM_REMOVAL:
1150 s->tray_locked = req->cmd.buf[4] & 1;
1151 bdrv_lock_medium(s->qdev.conf.bs, req->cmd.buf[4] & 1);
1152 break;
1153 case READ_CAPACITY_10:
1154 /* The normal LEN field for this command is zero. */
1155 memset(outbuf, 0, 8);
1156 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1157 if (!nb_sectors) {
1158 goto not_ready;
1160 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1161 goto illegal_request;
1163 nb_sectors /= s->qdev.blocksize / 512;
1164 /* Returned value is the address of the last sector. */
1165 nb_sectors--;
1166 /* Remember the new size for read/write sanity checking. */
1167 s->qdev.max_lba = nb_sectors;
1168 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1169 if (nb_sectors > UINT32_MAX) {
1170 nb_sectors = UINT32_MAX;
1172 outbuf[0] = (nb_sectors >> 24) & 0xff;
1173 outbuf[1] = (nb_sectors >> 16) & 0xff;
1174 outbuf[2] = (nb_sectors >> 8) & 0xff;
1175 outbuf[3] = nb_sectors & 0xff;
1176 outbuf[4] = 0;
1177 outbuf[5] = 0;
1178 outbuf[6] = s->qdev.blocksize >> 8;
1179 outbuf[7] = 0;
1180 buflen = 8;
1181 break;
1182 case REQUEST_SENSE:
1183 /* Just return "NO SENSE". */
1184 buflen = scsi_build_sense(NULL, 0, outbuf, r->buflen,
1185 (req->cmd.buf[1] & 1) == 0);
1186 break;
1187 case MECHANISM_STATUS:
1188 buflen = scsi_emulate_mechanism_status(s, outbuf);
1189 if (buflen < 0) {
1190 goto illegal_request;
1192 break;
1193 case GET_CONFIGURATION:
1194 buflen = scsi_get_configuration(s, outbuf);
1195 if (buflen < 0) {
1196 goto illegal_request;
1198 break;
1199 case GET_EVENT_STATUS_NOTIFICATION:
1200 buflen = scsi_get_event_status_notification(s, r, outbuf);
1201 if (buflen < 0) {
1202 goto illegal_request;
1204 break;
1205 case READ_DVD_STRUCTURE:
1206 buflen = scsi_read_dvd_structure(s, r, outbuf);
1207 if (buflen < 0) {
1208 goto illegal_request;
1210 break;
1211 case SERVICE_ACTION_IN_16:
1212 /* Service Action In subcommands. */
1213 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
1214 DPRINTF("SAI READ CAPACITY(16)\n");
1215 memset(outbuf, 0, req->cmd.xfer);
1216 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1217 if (!nb_sectors) {
1218 goto not_ready;
1220 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
1221 goto illegal_request;
1223 nb_sectors /= s->qdev.blocksize / 512;
1224 /* Returned value is the address of the last sector. */
1225 nb_sectors--;
1226 /* Remember the new size for read/write sanity checking. */
1227 s->qdev.max_lba = nb_sectors;
1228 outbuf[0] = (nb_sectors >> 56) & 0xff;
1229 outbuf[1] = (nb_sectors >> 48) & 0xff;
1230 outbuf[2] = (nb_sectors >> 40) & 0xff;
1231 outbuf[3] = (nb_sectors >> 32) & 0xff;
1232 outbuf[4] = (nb_sectors >> 24) & 0xff;
1233 outbuf[5] = (nb_sectors >> 16) & 0xff;
1234 outbuf[6] = (nb_sectors >> 8) & 0xff;
1235 outbuf[7] = nb_sectors & 0xff;
1236 outbuf[8] = 0;
1237 outbuf[9] = 0;
1238 outbuf[10] = s->qdev.blocksize >> 8;
1239 outbuf[11] = 0;
1240 outbuf[12] = 0;
1241 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
1243 /* set TPE bit if the format supports discard */
1244 if (s->qdev.conf.discard_granularity) {
1245 outbuf[14] = 0x80;
1248 /* Protection, exponent and lowest lba field left blank. */
1249 buflen = req->cmd.xfer;
1250 break;
1252 DPRINTF("Unsupported Service Action In\n");
1253 goto illegal_request;
1254 case VERIFY_10:
1255 break;
1256 default:
1257 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1258 return -1;
1260 return buflen;
1262 not_ready:
1263 if (s->tray_open || !bdrv_is_inserted(s->qdev.conf.bs)) {
1264 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1265 } else {
1266 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
1268 return -1;
1270 illegal_request:
1271 if (r->req.status == -1) {
1272 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1274 return -1;
1277 /* Execute a scsi command. Returns the length of the data expected by the
1278 command. This will be Positive for data transfers from the device
1279 (eg. disk reads), negative for transfers to the device (eg. disk writes),
1280 and zero if the command does not transfer any data. */
1282 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
1284 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1285 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1286 int32_t len;
1287 uint8_t command;
1288 int rc;
1290 command = buf[0];
1291 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", req->lun, req->tag, buf[0]);
1293 #ifdef DEBUG_SCSI
1295 int i;
1296 for (i = 1; i < r->req.cmd.len; i++) {
1297 printf(" 0x%02x", buf[i]);
1299 printf("\n");
1301 #endif
1303 switch (command) {
1304 case TEST_UNIT_READY:
1305 case INQUIRY:
1306 case MODE_SENSE:
1307 case MODE_SENSE_10:
1308 case RESERVE:
1309 case RESERVE_10:
1310 case RELEASE:
1311 case RELEASE_10:
1312 case START_STOP:
1313 case ALLOW_MEDIUM_REMOVAL:
1314 case READ_CAPACITY_10:
1315 case READ_TOC:
1316 case READ_DVD_STRUCTURE:
1317 case GET_CONFIGURATION:
1318 case GET_EVENT_STATUS_NOTIFICATION:
1319 case MECHANISM_STATUS:
1320 case SERVICE_ACTION_IN_16:
1321 case REQUEST_SENSE:
1322 case VERIFY_10:
1323 rc = scsi_disk_emulate_command(r);
1324 if (rc < 0) {
1325 return 0;
1328 r->iov.iov_len = rc;
1329 break;
1330 case SYNCHRONIZE_CACHE:
1331 /* The request is used as the AIO opaque value, so add a ref. */
1332 scsi_req_ref(&r->req);
1333 bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
1334 r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r);
1335 if (r->req.aiocb == NULL) {
1336 scsi_flush_complete(r, -EIO);
1338 return 0;
1339 case READ_6:
1340 case READ_10:
1341 case READ_12:
1342 case READ_16:
1343 len = r->req.cmd.xfer / s->qdev.blocksize;
1344 DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
1345 if (r->req.cmd.lba > s->qdev.max_lba) {
1346 goto illegal_lba;
1348 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1349 r->sector_count = len * (s->qdev.blocksize / 512);
1350 break;
1351 case WRITE_6:
1352 case WRITE_10:
1353 case WRITE_12:
1354 case WRITE_16:
1355 case WRITE_VERIFY_10:
1356 case WRITE_VERIFY_12:
1357 case WRITE_VERIFY_16:
1358 len = r->req.cmd.xfer / s->qdev.blocksize;
1359 DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
1360 (command & 0xe) == 0xe ? "And Verify " : "",
1361 r->req.cmd.lba, len);
1362 if (r->req.cmd.lba > s->qdev.max_lba) {
1363 goto illegal_lba;
1365 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1366 r->sector_count = len * (s->qdev.blocksize / 512);
1367 break;
1368 case MODE_SELECT:
1369 DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
1370 /* We don't support mode parameter changes.
1371 Allow the mode parameter header + block descriptors only. */
1372 if (r->req.cmd.xfer > 12) {
1373 goto fail;
1375 break;
1376 case MODE_SELECT_10:
1377 DPRINTF("Mode Select(10) (len %lu)\n", (long)r->req.cmd.xfer);
1378 /* We don't support mode parameter changes.
1379 Allow the mode parameter header + block descriptors only. */
1380 if (r->req.cmd.xfer > 16) {
1381 goto fail;
1383 break;
1384 case SEEK_10:
1385 DPRINTF("Seek(10) (sector %" PRId64 ")\n", r->req.cmd.lba);
1386 if (r->req.cmd.lba > s->qdev.max_lba) {
1387 goto illegal_lba;
1389 break;
1390 case WRITE_SAME_16:
1391 len = r->req.cmd.xfer / s->qdev.blocksize;
1393 DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
1394 r->req.cmd.lba, len);
1396 if (r->req.cmd.lba > s->qdev.max_lba) {
1397 goto illegal_lba;
1401 * We only support WRITE SAME with the unmap bit set for now.
1403 if (!(buf[1] & 0x8)) {
1404 goto fail;
1407 rc = bdrv_discard(s->qdev.conf.bs,
1408 r->req.cmd.lba * (s->qdev.blocksize / 512),
1409 len * (s->qdev.blocksize / 512));
1410 if (rc < 0) {
1411 /* XXX: better error code ?*/
1412 goto fail;
1415 break;
1416 default:
1417 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1418 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1419 return 0;
1420 fail:
1421 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1422 return 0;
1423 illegal_lba:
1424 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1425 return 0;
1427 if (r->sector_count == 0 && r->iov.iov_len == 0) {
1428 scsi_req_complete(&r->req, GOOD);
1430 len = r->sector_count * 512 + r->iov.iov_len;
1431 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
1432 return -len;
1433 } else {
1434 if (!r->sector_count) {
1435 r->sector_count = -1;
1437 return len;
1441 static void scsi_disk_reset(DeviceState *dev)
1443 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1444 uint64_t nb_sectors;
1446 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
1448 bdrv_get_geometry(s->qdev.conf.bs, &nb_sectors);
1449 nb_sectors /= s->qdev.blocksize / 512;
1450 if (nb_sectors) {
1451 nb_sectors--;
1453 s->qdev.max_lba = nb_sectors;
1456 static void scsi_destroy(SCSIDevice *dev)
1458 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1460 scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
1461 blockdev_mark_auto_del(s->qdev.conf.bs);
1464 static void scsi_cd_change_media_cb(void *opaque, bool load)
1466 SCSIDiskState *s = opaque;
1469 * When a CD gets changed, we have to report an ejected state and
1470 * then a loaded state to guests so that they detect tray
1471 * open/close and media change events. Guests that do not use
1472 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
1473 * states rely on this behavior.
1475 * media_changed governs the state machine used for unit attention
1476 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
1478 s->media_changed = load;
1479 s->tray_open = !load;
1480 s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM);
1481 s->media_event = true;
1482 s->eject_request = false;
1485 static void scsi_cd_eject_request_cb(void *opaque, bool force)
1487 SCSIDiskState *s = opaque;
1489 s->eject_request = true;
1490 if (force) {
1491 s->tray_locked = false;
1495 static bool scsi_cd_is_tray_open(void *opaque)
1497 return ((SCSIDiskState *)opaque)->tray_open;
1500 static bool scsi_cd_is_medium_locked(void *opaque)
1502 return ((SCSIDiskState *)opaque)->tray_locked;
1505 static const BlockDevOps scsi_cd_block_ops = {
1506 .change_media_cb = scsi_cd_change_media_cb,
1507 .eject_request_cb = scsi_cd_eject_request_cb,
1508 .is_tray_open = scsi_cd_is_tray_open,
1509 .is_medium_locked = scsi_cd_is_medium_locked,
1512 static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
1514 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1515 if (s->media_changed) {
1516 s->media_changed = false;
1517 s->qdev.unit_attention = SENSE_CODE(MEDIUM_CHANGED);
1521 static int scsi_initfn(SCSIDevice *dev)
1523 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1524 DriveInfo *dinfo;
1526 if (!s->qdev.conf.bs) {
1527 error_report("scsi-disk: drive property not set");
1528 return -1;
1531 if (!s->removable && !bdrv_is_inserted(s->qdev.conf.bs)) {
1532 error_report("Device needs media, but drive is empty");
1533 return -1;
1536 if (!s->serial) {
1537 /* try to fall back to value set with legacy -drive serial=... */
1538 dinfo = drive_get_by_blockdev(s->qdev.conf.bs);
1539 if (*dinfo->serial) {
1540 s->serial = g_strdup(dinfo->serial);
1544 if (!s->version) {
1545 s->version = g_strdup(QEMU_VERSION);
1548 if (bdrv_is_sg(s->qdev.conf.bs)) {
1549 error_report("scsi-disk: unwanted /dev/sg*");
1550 return -1;
1553 if (s->removable) {
1554 bdrv_set_dev_ops(s->qdev.conf.bs, &scsi_cd_block_ops, s);
1556 bdrv_set_buffer_alignment(s->qdev.conf.bs, s->qdev.blocksize);
1558 bdrv_iostatus_enable(s->qdev.conf.bs);
1559 add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, NULL);
1560 return 0;
1563 static int scsi_hd_initfn(SCSIDevice *dev)
1565 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1566 s->qdev.blocksize = s->qdev.conf.logical_block_size;
1567 s->qdev.type = TYPE_DISK;
1568 return scsi_initfn(&s->qdev);
1571 static int scsi_cd_initfn(SCSIDevice *dev)
1573 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1574 s->qdev.blocksize = 2048;
1575 s->qdev.type = TYPE_ROM;
1576 s->removable = true;
1577 return scsi_initfn(&s->qdev);
1580 static int scsi_disk_initfn(SCSIDevice *dev)
1582 DriveInfo *dinfo;
1584 if (!dev->conf.bs) {
1585 return scsi_initfn(dev); /* ... and die there */
1588 dinfo = drive_get_by_blockdev(dev->conf.bs);
1589 if (dinfo->media_cd) {
1590 return scsi_cd_initfn(dev);
1591 } else {
1592 return scsi_hd_initfn(dev);
1596 static const SCSIReqOps scsi_disk_reqops = {
1597 .size = sizeof(SCSIDiskReq),
1598 .free_req = scsi_free_request,
1599 .send_command = scsi_send_command,
1600 .read_data = scsi_read_data,
1601 .write_data = scsi_write_data,
1602 .cancel_io = scsi_cancel_io,
1603 .get_buf = scsi_get_buf,
1606 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
1607 uint8_t *buf, void *hba_private)
1609 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1610 SCSIRequest *req;
1612 req = scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, hba_private);
1613 return req;
1616 #ifdef __linux__
1617 static int get_device_type(SCSIDiskState *s)
1619 BlockDriverState *bdrv = s->qdev.conf.bs;
1620 uint8_t cmd[16];
1621 uint8_t buf[36];
1622 uint8_t sensebuf[8];
1623 sg_io_hdr_t io_header;
1624 int ret;
1626 memset(cmd, 0, sizeof(cmd));
1627 memset(buf, 0, sizeof(buf));
1628 cmd[0] = INQUIRY;
1629 cmd[4] = sizeof(buf);
1631 memset(&io_header, 0, sizeof(io_header));
1632 io_header.interface_id = 'S';
1633 io_header.dxfer_direction = SG_DXFER_FROM_DEV;
1634 io_header.dxfer_len = sizeof(buf);
1635 io_header.dxferp = buf;
1636 io_header.cmdp = cmd;
1637 io_header.cmd_len = sizeof(cmd);
1638 io_header.mx_sb_len = sizeof(sensebuf);
1639 io_header.sbp = sensebuf;
1640 io_header.timeout = 6000; /* XXX */
1642 ret = bdrv_ioctl(bdrv, SG_IO, &io_header);
1643 if (ret < 0 || io_header.driver_status || io_header.host_status) {
1644 return -1;
1646 s->qdev.type = buf[0];
1647 s->removable = (buf[1] & 0x80) != 0;
1648 return 0;
1651 static int scsi_block_initfn(SCSIDevice *dev)
1653 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1654 int sg_version;
1655 int rc;
1657 if (!s->qdev.conf.bs) {
1658 error_report("scsi-block: drive property not set");
1659 return -1;
1662 /* check we are using a driver managing SG_IO (version 3 and after) */
1663 if (bdrv_ioctl(s->qdev.conf.bs, SG_GET_VERSION_NUM, &sg_version) < 0 ||
1664 sg_version < 30000) {
1665 error_report("scsi-block: scsi generic interface too old");
1666 return -1;
1669 /* get device type from INQUIRY data */
1670 rc = get_device_type(s);
1671 if (rc < 0) {
1672 error_report("scsi-block: INQUIRY failed");
1673 return -1;
1676 /* Make a guess for the block size, we'll fix it when the guest sends.
1677 * READ CAPACITY. If they don't, they likely would assume these sizes
1678 * anyway. (TODO: check in /sys).
1680 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
1681 s->qdev.blocksize = 2048;
1682 } else {
1683 s->qdev.blocksize = 512;
1685 return scsi_initfn(&s->qdev);
1688 static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
1689 uint32_t lun, uint8_t *buf,
1690 void *hba_private)
1692 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1694 switch (buf[0]) {
1695 case READ_6:
1696 case READ_10:
1697 case READ_12:
1698 case READ_16:
1699 case WRITE_6:
1700 case WRITE_10:
1701 case WRITE_12:
1702 case WRITE_16:
1703 case WRITE_VERIFY_10:
1704 case WRITE_VERIFY_12:
1705 case WRITE_VERIFY_16:
1706 /* MMC writing cannot be done via pread/pwrite, because it sometimes
1707 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
1708 * And once you do these writes, reading from the block device is
1709 * unreliable, too. It is even possible that reads deliver random data
1710 * from the host page cache (this is probably a Linux bug).
1712 * We might use scsi_disk_reqops as long as no writing commands are
1713 * seen, but performance usually isn't paramount on optical media. So,
1714 * just make scsi-block operate the same as scsi-generic for them.
1716 if (s->qdev.type != TYPE_ROM) {
1717 return scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun,
1718 hba_private);
1722 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
1723 hba_private);
1725 #endif
1727 #define DEFINE_SCSI_DISK_PROPERTIES() \
1728 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
1729 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1730 DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1732 static SCSIDeviceInfo scsi_disk_info[] = {
1734 .qdev.name = "scsi-hd",
1735 .qdev.fw_name = "disk",
1736 .qdev.desc = "virtual SCSI disk",
1737 .qdev.size = sizeof(SCSIDiskState),
1738 .qdev.reset = scsi_disk_reset,
1739 .init = scsi_hd_initfn,
1740 .destroy = scsi_destroy,
1741 .alloc_req = scsi_new_request,
1742 .unit_attention_reported = scsi_disk_unit_attention_reported,
1743 .qdev.props = (Property[]) {
1744 DEFINE_SCSI_DISK_PROPERTIES(),
1745 DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1746 DEFINE_PROP_END_OF_LIST(),
1749 .qdev.name = "scsi-cd",
1750 .qdev.fw_name = "disk",
1751 .qdev.desc = "virtual SCSI CD-ROM",
1752 .qdev.size = sizeof(SCSIDiskState),
1753 .qdev.reset = scsi_disk_reset,
1754 .init = scsi_cd_initfn,
1755 .destroy = scsi_destroy,
1756 .alloc_req = scsi_new_request,
1757 .unit_attention_reported = scsi_disk_unit_attention_reported,
1758 .qdev.props = (Property[]) {
1759 DEFINE_SCSI_DISK_PROPERTIES(),
1760 DEFINE_PROP_END_OF_LIST(),
1762 #ifdef __linux__
1764 .qdev.name = "scsi-block",
1765 .qdev.fw_name = "disk",
1766 .qdev.desc = "SCSI block device passthrough",
1767 .qdev.size = sizeof(SCSIDiskState),
1768 .qdev.reset = scsi_disk_reset,
1769 .init = scsi_block_initfn,
1770 .destroy = scsi_destroy,
1771 .alloc_req = scsi_block_new_request,
1772 .qdev.props = (Property[]) {
1773 DEFINE_SCSI_DISK_PROPERTIES(),
1774 DEFINE_PROP_END_OF_LIST(),
1776 #endif
1778 .qdev.name = "scsi-disk", /* legacy -device scsi-disk */
1779 .qdev.fw_name = "disk",
1780 .qdev.desc = "virtual SCSI disk or CD-ROM (legacy)",
1781 .qdev.size = sizeof(SCSIDiskState),
1782 .qdev.reset = scsi_disk_reset,
1783 .init = scsi_disk_initfn,
1784 .destroy = scsi_destroy,
1785 .alloc_req = scsi_new_request,
1786 .unit_attention_reported = scsi_disk_unit_attention_reported,
1787 .qdev.props = (Property[]) {
1788 DEFINE_SCSI_DISK_PROPERTIES(),
1789 DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1790 DEFINE_PROP_END_OF_LIST(),
1795 static void scsi_disk_register_devices(void)
1797 int i;
1799 for (i = 0; i < ARRAY_SIZE(scsi_disk_info); i++) {
1800 scsi_qdev_register(&scsi_disk_info[i]);
1803 device_init(scsi_disk_register_devices)