main: switch qemu_set_fd_handler to g_io_add_watch
[qemu.git] / hw / scsi-disk.c
blob3cc830ff95a7f204f2af0193eae07e9778a48a34
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"
41 #define SCSI_DMA_BUF_SIZE 131072
42 #define SCSI_MAX_INQUIRY_LEN 256
44 #define SCSI_REQ_STATUS_RETRY 0x01
45 #define SCSI_REQ_STATUS_RETRY_TYPE_MASK 0x06
46 #define SCSI_REQ_STATUS_RETRY_READ 0x00
47 #define SCSI_REQ_STATUS_RETRY_WRITE 0x02
48 #define SCSI_REQ_STATUS_RETRY_FLUSH 0x04
50 typedef struct SCSIDiskState SCSIDiskState;
52 typedef struct SCSIDiskReq {
53 SCSIRequest req;
54 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
55 uint64_t sector;
56 uint32_t sector_count;
57 struct iovec iov;
58 QEMUIOVector qiov;
59 uint32_t status;
60 BlockAcctCookie acct;
61 } SCSIDiskReq;
63 struct SCSIDiskState
65 SCSIDevice qdev;
66 BlockDriverState *bs;
67 /* The qemu block layer uses a fixed 512 byte sector size.
68 This is the number of 512 byte blocks in a single scsi sector. */
69 int cluster_size;
70 uint32_t removable;
71 uint64_t max_lba;
72 QEMUBH *bh;
73 char *version;
74 char *serial;
77 static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type);
78 static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf);
80 static void scsi_free_request(SCSIRequest *req)
82 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
84 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 r->req.aiocb = NULL;
108 static void scsi_read_complete(void * opaque, int ret)
110 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
111 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
112 int n;
114 r->req.aiocb = NULL;
116 bdrv_acct_done(s->bs, &r->acct);
118 if (ret) {
119 if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_READ)) {
120 return;
124 DPRINTF("Data ready tag=0x%x len=%zd\n", r->req.tag, r->iov.iov_len);
126 n = r->iov.iov_len / 512;
127 r->sector += n;
128 r->sector_count -= n;
129 scsi_req_data(&r->req, r->iov.iov_len);
133 /* Read more data from scsi device into buffer. */
134 static void scsi_read_data(SCSIRequest *req)
136 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
137 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
138 uint32_t n;
140 if (r->sector_count == (uint32_t)-1) {
141 DPRINTF("Read buf_len=%zd\n", r->iov.iov_len);
142 r->sector_count = 0;
143 scsi_req_data(&r->req, r->iov.iov_len);
144 return;
146 DPRINTF("Read sector_count=%d\n", r->sector_count);
147 if (r->sector_count == 0) {
148 /* This also clears the sense buffer for REQUEST SENSE. */
149 scsi_req_complete(&r->req, GOOD);
150 return;
153 /* No data transfer may already be in progress */
154 assert(r->req.aiocb == NULL);
156 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
157 DPRINTF("Data transfer direction invalid\n");
158 scsi_read_complete(r, -EINVAL);
159 return;
162 n = r->sector_count;
163 if (n > SCSI_DMA_BUF_SIZE / 512)
164 n = SCSI_DMA_BUF_SIZE / 512;
166 r->iov.iov_len = n * 512;
167 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
169 bdrv_acct_start(s->bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
170 r->req.aiocb = bdrv_aio_readv(s->bs, r->sector, &r->qiov, n,
171 scsi_read_complete, r);
172 if (r->req.aiocb == NULL) {
173 scsi_read_complete(r, -EIO);
177 static int scsi_handle_rw_error(SCSIDiskReq *r, int error, int type)
179 int is_read = (type == SCSI_REQ_STATUS_RETRY_READ);
180 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
181 BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
183 if (action == BLOCK_ERR_IGNORE) {
184 bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
185 return 0;
188 if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
189 || action == BLOCK_ERR_STOP_ANY) {
191 type &= SCSI_REQ_STATUS_RETRY_TYPE_MASK;
192 r->status |= SCSI_REQ_STATUS_RETRY | type;
194 bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
195 vm_stop(VMSTOP_DISKFULL);
196 } else {
197 switch (error) {
198 case ENOMEM:
199 scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
200 break;
201 case EINVAL:
202 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
203 break;
204 default:
205 scsi_check_condition(r, SENSE_CODE(IO_ERROR));
206 break;
208 bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
210 return 1;
213 static void scsi_write_complete(void * opaque, int ret)
215 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
216 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
217 uint32_t len;
218 uint32_t n;
220 r->req.aiocb = NULL;
222 bdrv_acct_done(s->bs, &r->acct);
224 if (ret) {
225 if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_WRITE)) {
226 return;
230 n = r->iov.iov_len / 512;
231 r->sector += n;
232 r->sector_count -= n;
233 if (r->sector_count == 0) {
234 scsi_req_complete(&r->req, GOOD);
235 } else {
236 len = r->sector_count * 512;
237 if (len > SCSI_DMA_BUF_SIZE) {
238 len = SCSI_DMA_BUF_SIZE;
240 r->iov.iov_len = len;
241 DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, len);
242 scsi_req_data(&r->req, len);
246 static void scsi_write_data(SCSIRequest *req)
248 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
249 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
250 uint32_t n;
252 /* No data transfer may already be in progress */
253 assert(r->req.aiocb == NULL);
255 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
256 DPRINTF("Data transfer direction invalid\n");
257 scsi_write_complete(r, -EINVAL);
258 return;
261 n = r->iov.iov_len / 512;
262 if (n) {
263 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
265 bdrv_acct_start(s->bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
266 r->req.aiocb = bdrv_aio_writev(s->bs, r->sector, &r->qiov, n,
267 scsi_write_complete, r);
268 if (r->req.aiocb == NULL) {
269 scsi_write_complete(r, -ENOMEM);
271 } else {
272 /* Invoke completion routine to fetch data from host. */
273 scsi_write_complete(r, 0);
277 static void scsi_dma_restart_bh(void *opaque)
279 SCSIDiskState *s = opaque;
280 SCSIRequest *req;
281 SCSIDiskReq *r;
283 qemu_bh_delete(s->bh);
284 s->bh = NULL;
286 QTAILQ_FOREACH(req, &s->qdev.requests, next) {
287 r = DO_UPCAST(SCSIDiskReq, req, req);
288 if (r->status & SCSI_REQ_STATUS_RETRY) {
289 int status = r->status;
290 int ret;
292 r->status &=
293 ~(SCSI_REQ_STATUS_RETRY | SCSI_REQ_STATUS_RETRY_TYPE_MASK);
295 switch (status & SCSI_REQ_STATUS_RETRY_TYPE_MASK) {
296 case SCSI_REQ_STATUS_RETRY_READ:
297 scsi_read_data(&r->req);
298 break;
299 case SCSI_REQ_STATUS_RETRY_WRITE:
300 scsi_write_data(&r->req);
301 break;
302 case SCSI_REQ_STATUS_RETRY_FLUSH:
303 ret = scsi_disk_emulate_command(r, r->iov.iov_base);
304 if (ret == 0) {
305 scsi_req_complete(&r->req, GOOD);
312 static void scsi_dma_restart_cb(void *opaque, int running, int reason)
314 SCSIDiskState *s = opaque;
316 if (!running)
317 return;
319 if (!s->bh) {
320 s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
321 qemu_bh_schedule(s->bh);
325 /* Return a pointer to the data buffer. */
326 static uint8_t *scsi_get_buf(SCSIRequest *req)
328 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
330 return (uint8_t *)r->iov.iov_base;
333 static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
335 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
336 int buflen = 0;
338 if (req->cmd.buf[1] & 0x2) {
339 /* Command support data - optional, not implemented */
340 BADF("optional INQUIRY command support request not implemented\n");
341 return -1;
344 if (req->cmd.buf[1] & 0x1) {
345 /* Vital product data */
346 uint8_t page_code = req->cmd.buf[2];
347 if (req->cmd.xfer < 4) {
348 BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
349 "less than 4\n", page_code, req->cmd.xfer);
350 return -1;
353 if (s->qdev.type == TYPE_ROM) {
354 outbuf[buflen++] = 5;
355 } else {
356 outbuf[buflen++] = 0;
358 outbuf[buflen++] = page_code ; // this page
359 outbuf[buflen++] = 0x00;
361 switch (page_code) {
362 case 0x00: /* Supported page codes, mandatory */
364 int pages;
365 DPRINTF("Inquiry EVPD[Supported pages] "
366 "buffer size %zd\n", req->cmd.xfer);
367 pages = buflen++;
368 outbuf[buflen++] = 0x00; // list of supported pages (this page)
369 if (s->serial)
370 outbuf[buflen++] = 0x80; // unit serial number
371 outbuf[buflen++] = 0x83; // device identification
372 if (s->qdev.type == TYPE_DISK) {
373 outbuf[buflen++] = 0xb0; // block limits
374 outbuf[buflen++] = 0xb2; // thin provisioning
376 outbuf[pages] = buflen - pages - 1; // number of pages
377 break;
379 case 0x80: /* Device serial number, optional */
381 int l;
383 if (!s->serial) {
384 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
385 return -1;
388 l = strlen(s->serial);
389 if (l > req->cmd.xfer)
390 l = req->cmd.xfer;
391 if (l > 20)
392 l = 20;
394 DPRINTF("Inquiry EVPD[Serial number] "
395 "buffer size %zd\n", req->cmd.xfer);
396 outbuf[buflen++] = l;
397 memcpy(outbuf+buflen, s->serial, l);
398 buflen += l;
399 break;
402 case 0x83: /* Device identification page, mandatory */
404 int max_len = 255 - 8;
405 int id_len = strlen(bdrv_get_device_name(s->bs));
407 if (id_len > max_len)
408 id_len = max_len;
409 DPRINTF("Inquiry EVPD[Device identification] "
410 "buffer size %zd\n", req->cmd.xfer);
412 outbuf[buflen++] = 4 + id_len;
413 outbuf[buflen++] = 0x2; // ASCII
414 outbuf[buflen++] = 0; // not officially assigned
415 outbuf[buflen++] = 0; // reserved
416 outbuf[buflen++] = id_len; // length of data following
418 memcpy(outbuf+buflen, bdrv_get_device_name(s->bs), id_len);
419 buflen += id_len;
420 break;
422 case 0xb0: /* block limits */
424 unsigned int unmap_sectors =
425 s->qdev.conf.discard_granularity / s->qdev.blocksize;
426 unsigned int min_io_size =
427 s->qdev.conf.min_io_size / s->qdev.blocksize;
428 unsigned int opt_io_size =
429 s->qdev.conf.opt_io_size / s->qdev.blocksize;
431 if (s->qdev.type == TYPE_ROM) {
432 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
433 page_code);
434 return -1;
436 /* required VPD size with unmap support */
437 outbuf[3] = buflen = 0x3c;
439 memset(outbuf + 4, 0, buflen - 4);
441 /* optimal transfer length granularity */
442 outbuf[6] = (min_io_size >> 8) & 0xff;
443 outbuf[7] = min_io_size & 0xff;
445 /* optimal transfer length */
446 outbuf[12] = (opt_io_size >> 24) & 0xff;
447 outbuf[13] = (opt_io_size >> 16) & 0xff;
448 outbuf[14] = (opt_io_size >> 8) & 0xff;
449 outbuf[15] = opt_io_size & 0xff;
451 /* optimal unmap granularity */
452 outbuf[28] = (unmap_sectors >> 24) & 0xff;
453 outbuf[29] = (unmap_sectors >> 16) & 0xff;
454 outbuf[30] = (unmap_sectors >> 8) & 0xff;
455 outbuf[31] = unmap_sectors & 0xff;
456 break;
458 case 0xb2: /* thin provisioning */
460 outbuf[3] = buflen = 8;
461 outbuf[4] = 0;
462 outbuf[5] = 0x40; /* write same with unmap supported */
463 outbuf[6] = 0;
464 outbuf[7] = 0;
465 break;
467 default:
468 BADF("Error: unsupported Inquiry (EVPD[%02X]) "
469 "buffer size %zd\n", page_code, req->cmd.xfer);
470 return -1;
472 /* done with EVPD */
473 return buflen;
476 /* Standard INQUIRY data */
477 if (req->cmd.buf[2] != 0) {
478 BADF("Error: Inquiry (STANDARD) page or code "
479 "is non-zero [%02X]\n", req->cmd.buf[2]);
480 return -1;
483 /* PAGE CODE == 0 */
484 if (req->cmd.xfer < 5) {
485 BADF("Error: Inquiry (STANDARD) buffer size %zd "
486 "is less than 5\n", req->cmd.xfer);
487 return -1;
490 buflen = req->cmd.xfer;
491 if (buflen > SCSI_MAX_INQUIRY_LEN)
492 buflen = SCSI_MAX_INQUIRY_LEN;
494 memset(outbuf, 0, buflen);
496 outbuf[0] = s->qdev.type & 0x1f;
497 if (s->qdev.type == TYPE_ROM) {
498 outbuf[1] = 0x80;
499 memcpy(&outbuf[16], "QEMU CD-ROM ", 16);
500 } else {
501 outbuf[1] = s->removable ? 0x80 : 0;
502 memcpy(&outbuf[16], "QEMU HARDDISK ", 16);
504 memcpy(&outbuf[8], "QEMU ", 8);
505 memset(&outbuf[32], 0, 4);
506 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
508 * We claim conformance to SPC-3, which is required for guests
509 * to ask for modern features like READ CAPACITY(16) or the
510 * block characteristics VPD page by default. Not all of SPC-3
511 * is actually implemented, but we're good enough.
513 outbuf[2] = 5;
514 outbuf[3] = 2; /* Format 2 */
516 if (buflen > 36) {
517 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
518 } else {
519 /* If the allocation length of CDB is too small,
520 the additional length is not adjusted */
521 outbuf[4] = 36 - 5;
524 /* Sync data transfer and TCQ. */
525 outbuf[7] = 0x10 | (req->bus->tcq ? 0x02 : 0);
526 return buflen;
529 static int mode_sense_page(SCSIRequest *req, int page, uint8_t *p,
530 int page_control)
532 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
533 BlockDriverState *bdrv = s->bs;
534 int cylinders, heads, secs;
537 * If Changeable Values are requested, a mask denoting those mode parameters
538 * that are changeable shall be returned. As we currently don't support
539 * parameter changes via MODE_SELECT all bits are returned set to zero.
540 * The buffer was already menset to zero by the caller of this function.
542 switch (page) {
543 case 4: /* Rigid disk device geometry page. */
544 p[0] = 4;
545 p[1] = 0x16;
546 if (page_control == 1) { /* Changeable Values */
547 return p[1] + 2;
549 /* if a geometry hint is available, use it */
550 bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
551 p[2] = (cylinders >> 16) & 0xff;
552 p[3] = (cylinders >> 8) & 0xff;
553 p[4] = cylinders & 0xff;
554 p[5] = heads & 0xff;
555 /* Write precomp start cylinder, disabled */
556 p[6] = (cylinders >> 16) & 0xff;
557 p[7] = (cylinders >> 8) & 0xff;
558 p[8] = cylinders & 0xff;
559 /* Reduced current start cylinder, disabled */
560 p[9] = (cylinders >> 16) & 0xff;
561 p[10] = (cylinders >> 8) & 0xff;
562 p[11] = cylinders & 0xff;
563 /* Device step rate [ns], 200ns */
564 p[12] = 0;
565 p[13] = 200;
566 /* Landing zone cylinder */
567 p[14] = 0xff;
568 p[15] = 0xff;
569 p[16] = 0xff;
570 /* Medium rotation rate [rpm], 5400 rpm */
571 p[20] = (5400 >> 8) & 0xff;
572 p[21] = 5400 & 0xff;
573 return p[1] + 2;
575 case 5: /* Flexible disk device geometry page. */
576 p[0] = 5;
577 p[1] = 0x1e;
578 if (page_control == 1) { /* Changeable Values */
579 return p[1] + 2;
581 /* Transfer rate [kbit/s], 5Mbit/s */
582 p[2] = 5000 >> 8;
583 p[3] = 5000 & 0xff;
584 /* if a geometry hint is available, use it */
585 bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
586 p[4] = heads & 0xff;
587 p[5] = secs & 0xff;
588 p[6] = s->cluster_size * 2;
589 p[8] = (cylinders >> 8) & 0xff;
590 p[9] = cylinders & 0xff;
591 /* Write precomp start cylinder, disabled */
592 p[10] = (cylinders >> 8) & 0xff;
593 p[11] = cylinders & 0xff;
594 /* Reduced current start cylinder, disabled */
595 p[12] = (cylinders >> 8) & 0xff;
596 p[13] = cylinders & 0xff;
597 /* Device step rate [100us], 100us */
598 p[14] = 0;
599 p[15] = 1;
600 /* Device step pulse width [us], 1us */
601 p[16] = 1;
602 /* Device head settle delay [100us], 100us */
603 p[17] = 0;
604 p[18] = 1;
605 /* Motor on delay [0.1s], 0.1s */
606 p[19] = 1;
607 /* Motor off delay [0.1s], 0.1s */
608 p[20] = 1;
609 /* Medium rotation rate [rpm], 5400 rpm */
610 p[28] = (5400 >> 8) & 0xff;
611 p[29] = 5400 & 0xff;
612 return p[1] + 2;
614 case 8: /* Caching page. */
615 p[0] = 8;
616 p[1] = 0x12;
617 if (page_control == 1) { /* Changeable Values */
618 return p[1] + 2;
620 if (bdrv_enable_write_cache(s->bs)) {
621 p[2] = 4; /* WCE */
623 return p[1] + 2;
625 case 0x2a: /* CD Capabilities and Mechanical Status page. */
626 if (s->qdev.type != TYPE_ROM)
627 return 0;
628 p[0] = 0x2a;
629 p[1] = 0x14;
630 if (page_control == 1) { /* Changeable Values */
631 return p[1] + 2;
633 p[2] = 3; // CD-R & CD-RW read
634 p[3] = 0; // Writing not supported
635 p[4] = 0x7f; /* Audio, composite, digital out,
636 mode 2 form 1&2, multi session */
637 p[5] = 0xff; /* CD DA, DA accurate, RW supported,
638 RW corrected, C2 errors, ISRC,
639 UPC, Bar code */
640 p[6] = 0x2d | (bdrv_is_locked(s->bs)? 2 : 0);
641 /* Locking supported, jumper present, eject, tray */
642 p[7] = 0; /* no volume & mute control, no
643 changer */
644 p[8] = (50 * 176) >> 8; // 50x read speed
645 p[9] = (50 * 176) & 0xff;
646 p[10] = 0 >> 8; // No volume
647 p[11] = 0 & 0xff;
648 p[12] = 2048 >> 8; // 2M buffer
649 p[13] = 2048 & 0xff;
650 p[14] = (16 * 176) >> 8; // 16x read speed current
651 p[15] = (16 * 176) & 0xff;
652 p[18] = (16 * 176) >> 8; // 16x write speed
653 p[19] = (16 * 176) & 0xff;
654 p[20] = (16 * 176) >> 8; // 16x write speed current
655 p[21] = (16 * 176) & 0xff;
656 return p[1] + 2;
658 default:
659 return 0;
663 static int scsi_disk_emulate_mode_sense(SCSIRequest *req, uint8_t *outbuf)
665 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
666 uint64_t nb_sectors;
667 int page, dbd, buflen, page_control;
668 uint8_t *p;
669 uint8_t dev_specific_param;
671 dbd = req->cmd.buf[1] & 0x8;
672 page = req->cmd.buf[2] & 0x3f;
673 page_control = (req->cmd.buf[2] & 0xc0) >> 6;
674 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
675 (req->cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, req->cmd.xfer, page_control);
676 memset(outbuf, 0, req->cmd.xfer);
677 p = outbuf;
679 if (bdrv_is_read_only(s->bs)) {
680 dev_specific_param = 0x80; /* Readonly. */
681 } else {
682 dev_specific_param = 0x00;
685 if (req->cmd.buf[0] == MODE_SENSE) {
686 p[1] = 0; /* Default media type. */
687 p[2] = dev_specific_param;
688 p[3] = 0; /* Block descriptor length. */
689 p += 4;
690 } else { /* MODE_SENSE_10 */
691 p[2] = 0; /* Default media type. */
692 p[3] = dev_specific_param;
693 p[6] = p[7] = 0; /* Block descriptor length. */
694 p += 8;
697 bdrv_get_geometry(s->bs, &nb_sectors);
698 if (!dbd && nb_sectors) {
699 if (req->cmd.buf[0] == MODE_SENSE) {
700 outbuf[3] = 8; /* Block descriptor length */
701 } else { /* MODE_SENSE_10 */
702 outbuf[7] = 8; /* Block descriptor length */
704 nb_sectors /= s->cluster_size;
705 if (nb_sectors > 0xffffff)
706 nb_sectors = 0;
707 p[0] = 0; /* media density code */
708 p[1] = (nb_sectors >> 16) & 0xff;
709 p[2] = (nb_sectors >> 8) & 0xff;
710 p[3] = nb_sectors & 0xff;
711 p[4] = 0; /* reserved */
712 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
713 p[6] = s->cluster_size * 2;
714 p[7] = 0;
715 p += 8;
718 if (page_control == 3) { /* Saved Values */
719 return -1; /* ILLEGAL_REQUEST */
722 switch (page) {
723 case 0x04:
724 case 0x05:
725 case 0x08:
726 case 0x2a:
727 p += mode_sense_page(req, page, p, page_control);
728 break;
729 case 0x3f:
730 p += mode_sense_page(req, 0x08, p, page_control);
731 p += mode_sense_page(req, 0x2a, p, page_control);
732 break;
733 default:
734 return -1; /* ILLEGAL_REQUEST */
737 buflen = p - outbuf;
739 * The mode data length field specifies the length in bytes of the
740 * following data that is available to be transferred. The mode data
741 * length does not include itself.
743 if (req->cmd.buf[0] == MODE_SENSE) {
744 outbuf[0] = buflen - 1;
745 } else { /* MODE_SENSE_10 */
746 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
747 outbuf[1] = (buflen - 2) & 0xff;
749 if (buflen > req->cmd.xfer)
750 buflen = req->cmd.xfer;
751 return buflen;
754 static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
756 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
757 int start_track, format, msf, toclen;
758 uint64_t nb_sectors;
760 msf = req->cmd.buf[1] & 2;
761 format = req->cmd.buf[2] & 0xf;
762 start_track = req->cmd.buf[6];
763 bdrv_get_geometry(s->bs, &nb_sectors);
764 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
765 nb_sectors /= s->cluster_size;
766 switch (format) {
767 case 0:
768 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
769 break;
770 case 1:
771 /* multi session : only a single session defined */
772 toclen = 12;
773 memset(outbuf, 0, 12);
774 outbuf[1] = 0x0a;
775 outbuf[2] = 0x01;
776 outbuf[3] = 0x01;
777 break;
778 case 2:
779 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
780 break;
781 default:
782 return -1;
784 if (toclen > req->cmd.xfer)
785 toclen = req->cmd.xfer;
786 return toclen;
789 static int scsi_disk_emulate_command(SCSIDiskReq *r, uint8_t *outbuf)
791 SCSIRequest *req = &r->req;
792 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
793 uint64_t nb_sectors;
794 int buflen = 0;
795 int ret;
797 switch (req->cmd.buf[0]) {
798 case TEST_UNIT_READY:
799 if (!bdrv_is_inserted(s->bs))
800 goto not_ready;
801 break;
802 case INQUIRY:
803 buflen = scsi_disk_emulate_inquiry(req, outbuf);
804 if (buflen < 0)
805 goto illegal_request;
806 break;
807 case MODE_SENSE:
808 case MODE_SENSE_10:
809 buflen = scsi_disk_emulate_mode_sense(req, outbuf);
810 if (buflen < 0)
811 goto illegal_request;
812 break;
813 case READ_TOC:
814 buflen = scsi_disk_emulate_read_toc(req, outbuf);
815 if (buflen < 0)
816 goto illegal_request;
817 break;
818 case RESERVE:
819 if (req->cmd.buf[1] & 1)
820 goto illegal_request;
821 break;
822 case RESERVE_10:
823 if (req->cmd.buf[1] & 3)
824 goto illegal_request;
825 break;
826 case RELEASE:
827 if (req->cmd.buf[1] & 1)
828 goto illegal_request;
829 break;
830 case RELEASE_10:
831 if (req->cmd.buf[1] & 3)
832 goto illegal_request;
833 break;
834 case START_STOP:
835 if (s->qdev.type == TYPE_ROM && (req->cmd.buf[4] & 2)) {
836 /* load/eject medium */
837 bdrv_eject(s->bs, !(req->cmd.buf[4] & 1));
839 break;
840 case ALLOW_MEDIUM_REMOVAL:
841 bdrv_set_locked(s->bs, req->cmd.buf[4] & 1);
842 break;
843 case READ_CAPACITY_10:
844 /* The normal LEN field for this command is zero. */
845 memset(outbuf, 0, 8);
846 bdrv_get_geometry(s->bs, &nb_sectors);
847 if (!nb_sectors)
848 goto not_ready;
849 nb_sectors /= s->cluster_size;
850 /* Returned value is the address of the last sector. */
851 nb_sectors--;
852 /* Remember the new size for read/write sanity checking. */
853 s->max_lba = nb_sectors;
854 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
855 if (nb_sectors > UINT32_MAX)
856 nb_sectors = UINT32_MAX;
857 outbuf[0] = (nb_sectors >> 24) & 0xff;
858 outbuf[1] = (nb_sectors >> 16) & 0xff;
859 outbuf[2] = (nb_sectors >> 8) & 0xff;
860 outbuf[3] = nb_sectors & 0xff;
861 outbuf[4] = 0;
862 outbuf[5] = 0;
863 outbuf[6] = s->cluster_size * 2;
864 outbuf[7] = 0;
865 buflen = 8;
866 break;
867 case SYNCHRONIZE_CACHE:
869 BlockAcctCookie acct;
871 bdrv_acct_start(s->bs, &acct, 0, BDRV_ACCT_FLUSH);
872 ret = bdrv_flush(s->bs);
873 bdrv_acct_done(s->bs, &acct);
874 if (ret < 0) {
875 if (scsi_handle_rw_error(r, -ret, SCSI_REQ_STATUS_RETRY_FLUSH)) {
876 return -1;
879 break;
881 case GET_CONFIGURATION:
882 memset(outbuf, 0, 8);
883 /* ??? This should probably return much more information. For now
884 just return the basic header indicating the CD-ROM profile. */
885 outbuf[7] = 8; // CD-ROM
886 buflen = 8;
887 break;
888 case SERVICE_ACTION_IN:
889 /* Service Action In subcommands. */
890 if ((req->cmd.buf[1] & 31) == 0x10) {
891 DPRINTF("SAI READ CAPACITY(16)\n");
892 memset(outbuf, 0, req->cmd.xfer);
893 bdrv_get_geometry(s->bs, &nb_sectors);
894 if (!nb_sectors)
895 goto not_ready;
896 nb_sectors /= s->cluster_size;
897 /* Returned value is the address of the last sector. */
898 nb_sectors--;
899 /* Remember the new size for read/write sanity checking. */
900 s->max_lba = nb_sectors;
901 outbuf[0] = (nb_sectors >> 56) & 0xff;
902 outbuf[1] = (nb_sectors >> 48) & 0xff;
903 outbuf[2] = (nb_sectors >> 40) & 0xff;
904 outbuf[3] = (nb_sectors >> 32) & 0xff;
905 outbuf[4] = (nb_sectors >> 24) & 0xff;
906 outbuf[5] = (nb_sectors >> 16) & 0xff;
907 outbuf[6] = (nb_sectors >> 8) & 0xff;
908 outbuf[7] = nb_sectors & 0xff;
909 outbuf[8] = 0;
910 outbuf[9] = 0;
911 outbuf[10] = s->cluster_size * 2;
912 outbuf[11] = 0;
913 outbuf[12] = 0;
914 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
916 /* set TPE bit if the format supports discard */
917 if (s->qdev.conf.discard_granularity) {
918 outbuf[14] = 0x80;
921 /* Protection, exponent and lowest lba field left blank. */
922 buflen = req->cmd.xfer;
923 break;
925 DPRINTF("Unsupported Service Action In\n");
926 goto illegal_request;
927 case VERIFY_10:
928 break;
929 default:
930 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
931 return -1;
933 return buflen;
935 not_ready:
936 if (!bdrv_is_inserted(s->bs)) {
937 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
938 } else {
939 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
941 return -1;
943 illegal_request:
944 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
945 return -1;
948 /* Execute a scsi command. Returns the length of the data expected by the
949 command. This will be Positive for data transfers from the device
950 (eg. disk reads), negative for transfers to the device (eg. disk writes),
951 and zero if the command does not transfer any data. */
953 static int32_t scsi_send_command(SCSIRequest *req, uint8_t *buf)
955 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
956 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
957 int32_t len;
958 uint8_t command;
959 uint8_t *outbuf;
960 int rc;
962 command = buf[0];
963 outbuf = (uint8_t *)r->iov.iov_base;
964 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", req->lun, req->tag, buf[0]);
966 #ifdef DEBUG_SCSI
968 int i;
969 for (i = 1; i < r->req.cmd.len; i++) {
970 printf(" 0x%02x", buf[i]);
972 printf("\n");
974 #endif
976 switch (command) {
977 case TEST_UNIT_READY:
978 case INQUIRY:
979 case MODE_SENSE:
980 case MODE_SENSE_10:
981 case RESERVE:
982 case RESERVE_10:
983 case RELEASE:
984 case RELEASE_10:
985 case START_STOP:
986 case ALLOW_MEDIUM_REMOVAL:
987 case READ_CAPACITY_10:
988 case SYNCHRONIZE_CACHE:
989 case READ_TOC:
990 case GET_CONFIGURATION:
991 case SERVICE_ACTION_IN:
992 case VERIFY_10:
993 rc = scsi_disk_emulate_command(r, outbuf);
994 if (rc < 0) {
995 return 0;
998 r->iov.iov_len = rc;
999 break;
1000 case READ_6:
1001 case READ_10:
1002 case READ_12:
1003 case READ_16:
1004 len = r->req.cmd.xfer / s->qdev.blocksize;
1005 DPRINTF("Read (sector %" PRId64 ", count %d)\n", r->req.cmd.lba, len);
1006 if (r->req.cmd.lba > s->max_lba)
1007 goto illegal_lba;
1008 r->sector = r->req.cmd.lba * s->cluster_size;
1009 r->sector_count = len * s->cluster_size;
1010 break;
1011 case WRITE_6:
1012 case WRITE_10:
1013 case WRITE_12:
1014 case WRITE_16:
1015 case WRITE_VERIFY_10:
1016 case WRITE_VERIFY_12:
1017 case WRITE_VERIFY_16:
1018 len = r->req.cmd.xfer / s->qdev.blocksize;
1019 DPRINTF("Write %s(sector %" PRId64 ", count %d)\n",
1020 (command & 0xe) == 0xe ? "And Verify " : "",
1021 r->req.cmd.lba, len);
1022 if (r->req.cmd.lba > s->max_lba)
1023 goto illegal_lba;
1024 r->sector = r->req.cmd.lba * s->cluster_size;
1025 r->sector_count = len * s->cluster_size;
1026 break;
1027 case MODE_SELECT:
1028 DPRINTF("Mode Select(6) (len %lu)\n", (long)r->req.cmd.xfer);
1029 /* We don't support mode parameter changes.
1030 Allow the mode parameter header + block descriptors only. */
1031 if (r->req.cmd.xfer > 12) {
1032 goto fail;
1034 break;
1035 case MODE_SELECT_10:
1036 DPRINTF("Mode Select(10) (len %lu)\n", (long)r->req.cmd.xfer);
1037 /* We don't support mode parameter changes.
1038 Allow the mode parameter header + block descriptors only. */
1039 if (r->req.cmd.xfer > 16) {
1040 goto fail;
1042 break;
1043 case SEEK_6:
1044 case SEEK_10:
1045 DPRINTF("Seek(%d) (sector %" PRId64 ")\n", command == SEEK_6 ? 6 : 10,
1046 r->req.cmd.lba);
1047 if (r->req.cmd.lba > s->max_lba) {
1048 goto illegal_lba;
1050 break;
1051 case WRITE_SAME_16:
1052 len = r->req.cmd.xfer / s->qdev.blocksize;
1054 DPRINTF("WRITE SAME(16) (sector %" PRId64 ", count %d)\n",
1055 r->req.cmd.lba, len);
1057 if (r->req.cmd.lba > s->max_lba) {
1058 goto illegal_lba;
1062 * We only support WRITE SAME with the unmap bit set for now.
1064 if (!(buf[1] & 0x8)) {
1065 goto fail;
1068 rc = bdrv_discard(s->bs, r->req.cmd.lba * s->cluster_size,
1069 len * s->cluster_size);
1070 if (rc < 0) {
1071 /* XXX: better error code ?*/
1072 goto fail;
1075 break;
1076 case REQUEST_SENSE:
1077 abort();
1078 default:
1079 DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1080 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
1081 return 0;
1082 fail:
1083 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1084 return 0;
1085 illegal_lba:
1086 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1087 return 0;
1089 if (r->sector_count == 0 && r->iov.iov_len == 0) {
1090 scsi_req_complete(&r->req, GOOD);
1092 len = r->sector_count * 512 + r->iov.iov_len;
1093 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
1094 return -len;
1095 } else {
1096 if (!r->sector_count)
1097 r->sector_count = -1;
1098 return len;
1102 static void scsi_disk_reset(DeviceState *dev)
1104 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1105 uint64_t nb_sectors;
1107 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
1109 bdrv_get_geometry(s->bs, &nb_sectors);
1110 nb_sectors /= s->cluster_size;
1111 if (nb_sectors) {
1112 nb_sectors--;
1114 s->max_lba = nb_sectors;
1117 static void scsi_destroy(SCSIDevice *dev)
1119 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1121 scsi_device_purge_requests(&s->qdev, SENSE_CODE(NO_SENSE));
1122 blockdev_mark_auto_del(s->qdev.conf.bs);
1125 static int scsi_initfn(SCSIDevice *dev, uint8_t scsi_type)
1127 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1128 DriveInfo *dinfo;
1130 if (!s->qdev.conf.bs) {
1131 error_report("scsi-disk: drive property not set");
1132 return -1;
1134 s->bs = s->qdev.conf.bs;
1136 if (scsi_type == TYPE_DISK && !bdrv_is_inserted(s->bs)) {
1137 error_report("Device needs media, but drive is empty");
1138 return -1;
1141 if (!s->serial) {
1142 /* try to fall back to value set with legacy -drive serial=... */
1143 dinfo = drive_get_by_blockdev(s->bs);
1144 if (*dinfo->serial) {
1145 s->serial = g_strdup(dinfo->serial);
1149 if (!s->version) {
1150 s->version = g_strdup(QEMU_VERSION);
1153 if (bdrv_is_sg(s->bs)) {
1154 error_report("scsi-disk: unwanted /dev/sg*");
1155 return -1;
1158 if (scsi_type == TYPE_ROM) {
1159 s->qdev.blocksize = 2048;
1160 } else if (scsi_type == TYPE_DISK) {
1161 s->qdev.blocksize = s->qdev.conf.logical_block_size;
1162 } else {
1163 error_report("scsi-disk: Unhandled SCSI type %02x", scsi_type);
1164 return -1;
1166 s->cluster_size = s->qdev.blocksize / 512;
1167 s->bs->buffer_alignment = s->qdev.blocksize;
1169 s->qdev.type = scsi_type;
1170 qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
1171 bdrv_set_removable(s->bs, scsi_type == TYPE_ROM);
1172 add_boot_device_path(s->qdev.conf.bootindex, &dev->qdev, ",0");
1173 return 0;
1176 static int scsi_hd_initfn(SCSIDevice *dev)
1178 return scsi_initfn(dev, TYPE_DISK);
1181 static int scsi_cd_initfn(SCSIDevice *dev)
1183 return scsi_initfn(dev, TYPE_ROM);
1186 static int scsi_disk_initfn(SCSIDevice *dev)
1188 DriveInfo *dinfo;
1189 uint8_t scsi_type;
1191 if (!dev->conf.bs) {
1192 scsi_type = TYPE_DISK; /* will die in scsi_initfn() */
1193 } else {
1194 dinfo = drive_get_by_blockdev(dev->conf.bs);
1195 scsi_type = dinfo->media_cd ? TYPE_ROM : TYPE_DISK;
1198 return scsi_initfn(dev, scsi_type);
1201 static SCSIReqOps scsi_disk_reqops = {
1202 .size = sizeof(SCSIDiskReq),
1203 .free_req = scsi_free_request,
1204 .send_command = scsi_send_command,
1205 .read_data = scsi_read_data,
1206 .write_data = scsi_write_data,
1207 .cancel_io = scsi_cancel_io,
1208 .get_buf = scsi_get_buf,
1211 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag,
1212 uint32_t lun, void *hba_private)
1214 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
1215 SCSIRequest *req;
1216 SCSIDiskReq *r;
1218 req = scsi_req_alloc(&scsi_disk_reqops, &s->qdev, tag, lun, hba_private);
1219 r = DO_UPCAST(SCSIDiskReq, req, req);
1220 r->iov.iov_base = qemu_blockalign(s->bs, SCSI_DMA_BUF_SIZE);
1221 return req;
1224 #define DEFINE_SCSI_DISK_PROPERTIES() \
1225 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
1226 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1227 DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1229 static SCSIDeviceInfo scsi_disk_info[] = {
1231 .qdev.name = "scsi-hd",
1232 .qdev.fw_name = "disk",
1233 .qdev.desc = "virtual SCSI disk",
1234 .qdev.size = sizeof(SCSIDiskState),
1235 .qdev.reset = scsi_disk_reset,
1236 .init = scsi_hd_initfn,
1237 .destroy = scsi_destroy,
1238 .alloc_req = scsi_new_request,
1239 .qdev.props = (Property[]) {
1240 DEFINE_SCSI_DISK_PROPERTIES(),
1241 DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1242 DEFINE_PROP_END_OF_LIST(),
1245 .qdev.name = "scsi-cd",
1246 .qdev.fw_name = "disk",
1247 .qdev.desc = "virtual SCSI CD-ROM",
1248 .qdev.size = sizeof(SCSIDiskState),
1249 .qdev.reset = scsi_disk_reset,
1250 .init = scsi_cd_initfn,
1251 .destroy = scsi_destroy,
1252 .alloc_req = scsi_new_request,
1253 .qdev.props = (Property[]) {
1254 DEFINE_SCSI_DISK_PROPERTIES(),
1255 DEFINE_PROP_END_OF_LIST(),
1258 .qdev.name = "scsi-disk", /* legacy -device scsi-disk */
1259 .qdev.fw_name = "disk",
1260 .qdev.desc = "virtual SCSI disk or CD-ROM (legacy)",
1261 .qdev.size = sizeof(SCSIDiskState),
1262 .qdev.reset = scsi_disk_reset,
1263 .init = scsi_disk_initfn,
1264 .destroy = scsi_destroy,
1265 .alloc_req = scsi_new_request,
1266 .qdev.props = (Property[]) {
1267 DEFINE_SCSI_DISK_PROPERTIES(),
1268 DEFINE_PROP_BIT("removable", SCSIDiskState, removable, 0, false),
1269 DEFINE_PROP_END_OF_LIST(),
1274 static void scsi_disk_register_devices(void)
1276 int i;
1278 for (i = 0; i < ARRAY_SIZE(scsi_disk_info); i++) {
1279 scsi_qdev_register(&scsi_disk_info[i]);
1282 device_init(scsi_disk_register_devices)