2 * SCSI Device emulation
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
7 * Written by Paul Brook
9 * 2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10 * when the allocation length of CDB is smaller
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.
25 #define DPRINTF(fmt, ...) \
26 do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
28 #define DPRINTF(fmt, ...) do {} while(0)
31 #include "qemu/osdep.h"
32 #include "qemu-common.h"
33 #include "qemu/error-report.h"
34 #include "hw/scsi/scsi.h"
35 #include "block/scsi.h"
36 #include "sysemu/sysemu.h"
37 #include "sysemu/block-backend.h"
38 #include "sysemu/blockdev.h"
39 #include "hw/block/block.h"
40 #include "sysemu/dma.h"
46 #define SCSI_WRITE_SAME_MAX 524288
47 #define SCSI_DMA_BUF_SIZE 131072
48 #define SCSI_MAX_INQUIRY_LEN 256
49 #define SCSI_MAX_MODE_LEN 256
51 #define DEFAULT_DISCARD_GRANULARITY 4096
52 #define DEFAULT_MAX_UNMAP_SIZE (1 << 30) /* 1 GB */
53 #define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
55 typedef struct SCSIDiskState SCSIDiskState
;
57 typedef struct SCSIDiskReq
{
59 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
61 uint32_t sector_count
;
69 #define SCSI_DISK_F_REMOVABLE 0
70 #define SCSI_DISK_F_DPOFUA 1
71 #define SCSI_DISK_F_NO_REMOVABLE_DEVOPS 2
81 uint64_t max_unmap_size
;
92 static int scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, bool acct_failed
);
94 static void scsi_free_request(SCSIRequest
*req
)
96 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
98 qemu_vfree(r
->iov
.iov_base
);
101 /* Helper function for command completion with sense. */
102 static void scsi_check_condition(SCSIDiskReq
*r
, SCSISense sense
)
104 DPRINTF("Command complete tag=0x%x sense=%d/%d/%d\n",
105 r
->req
.tag
, sense
.key
, sense
.asc
, sense
.ascq
);
106 scsi_req_build_sense(&r
->req
, sense
);
107 scsi_req_complete(&r
->req
, CHECK_CONDITION
);
110 static uint32_t scsi_init_iovec(SCSIDiskReq
*r
, size_t size
)
112 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
114 if (!r
->iov
.iov_base
) {
116 r
->iov
.iov_base
= blk_blockalign(s
->qdev
.conf
.blk
, r
->buflen
);
118 r
->iov
.iov_len
= MIN(r
->sector_count
* 512, r
->buflen
);
119 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
120 return r
->qiov
.size
/ 512;
123 static void scsi_disk_save_request(QEMUFile
*f
, SCSIRequest
*req
)
125 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
127 qemu_put_be64s(f
, &r
->sector
);
128 qemu_put_be32s(f
, &r
->sector_count
);
129 qemu_put_be32s(f
, &r
->buflen
);
131 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
132 qemu_put_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
133 } else if (!req
->retry
) {
134 uint32_t len
= r
->iov
.iov_len
;
135 qemu_put_be32s(f
, &len
);
136 qemu_put_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
141 static void scsi_disk_load_request(QEMUFile
*f
, SCSIRequest
*req
)
143 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
145 qemu_get_be64s(f
, &r
->sector
);
146 qemu_get_be32s(f
, &r
->sector_count
);
147 qemu_get_be32s(f
, &r
->buflen
);
149 scsi_init_iovec(r
, r
->buflen
);
150 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
151 qemu_get_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
152 } else if (!r
->req
.retry
) {
154 qemu_get_be32s(f
, &len
);
155 r
->iov
.iov_len
= len
;
156 assert(r
->iov
.iov_len
<= r
->buflen
);
157 qemu_get_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
161 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
164 static void scsi_aio_complete(void *opaque
, int ret
)
166 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
167 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
169 assert(r
->req
.aiocb
!= NULL
);
171 if (r
->req
.io_canceled
) {
172 scsi_req_cancel_complete(&r
->req
);
177 if (scsi_handle_rw_error(r
, -ret
, true)) {
182 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
183 scsi_req_complete(&r
->req
, GOOD
);
186 scsi_req_unref(&r
->req
);
189 static bool scsi_is_cmd_fua(SCSICommand
*cmd
)
191 switch (cmd
->buf
[0]) {
198 return (cmd
->buf
[1] & 8) != 0;
203 case WRITE_VERIFY_10
:
204 case WRITE_VERIFY_12
:
205 case WRITE_VERIFY_16
:
215 static void scsi_write_do_fua(SCSIDiskReq
*r
)
217 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
219 assert(r
->req
.aiocb
== NULL
);
221 if (r
->req
.io_canceled
) {
222 scsi_req_cancel_complete(&r
->req
);
226 if (scsi_is_cmd_fua(&r
->req
.cmd
)) {
227 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
229 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
233 scsi_req_complete(&r
->req
, GOOD
);
236 scsi_req_unref(&r
->req
);
239 static void scsi_dma_complete_noio(SCSIDiskReq
*r
, int ret
)
241 assert(r
->req
.aiocb
== NULL
);
243 if (r
->req
.io_canceled
) {
244 scsi_req_cancel_complete(&r
->req
);
249 if (scsi_handle_rw_error(r
, -ret
, false)) {
254 r
->sector
+= r
->sector_count
;
256 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
257 scsi_write_do_fua(r
);
260 scsi_req_complete(&r
->req
, GOOD
);
264 scsi_req_unref(&r
->req
);
267 static void scsi_dma_complete(void *opaque
, int ret
)
269 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
270 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
272 assert(r
->req
.aiocb
!= NULL
);
276 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
278 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
280 scsi_dma_complete_noio(r
, ret
);
283 static void scsi_read_complete(void * opaque
, int ret
)
285 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
286 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
289 assert(r
->req
.aiocb
!= NULL
);
291 if (r
->req
.io_canceled
) {
292 scsi_req_cancel_complete(&r
->req
);
297 if (scsi_handle_rw_error(r
, -ret
, true)) {
302 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
303 DPRINTF("Data ready tag=0x%x len=%zd\n", r
->req
.tag
, r
->qiov
.size
);
305 n
= r
->qiov
.size
/ 512;
307 r
->sector_count
-= n
;
308 scsi_req_data(&r
->req
, r
->qiov
.size
);
311 scsi_req_unref(&r
->req
);
314 /* Actually issue a read to the block device. */
315 static void scsi_do_read(SCSIDiskReq
*r
, int ret
)
317 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
320 assert (r
->req
.aiocb
== NULL
);
322 if (r
->req
.io_canceled
) {
323 scsi_req_cancel_complete(&r
->req
);
328 if (scsi_handle_rw_error(r
, -ret
, false)) {
333 /* The request is used as the AIO opaque value, so add a ref. */
334 scsi_req_ref(&r
->req
);
337 dma_acct_start(s
->qdev
.conf
.blk
, &r
->acct
, r
->req
.sg
, BLOCK_ACCT_READ
);
338 r
->req
.resid
-= r
->req
.sg
->size
;
339 r
->req
.aiocb
= dma_blk_read(s
->qdev
.conf
.blk
, r
->req
.sg
, r
->sector
,
340 scsi_dma_complete
, r
);
342 n
= scsi_init_iovec(r
, SCSI_DMA_BUF_SIZE
);
343 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
344 n
* BDRV_SECTOR_SIZE
, BLOCK_ACCT_READ
);
345 r
->req
.aiocb
= blk_aio_readv(s
->qdev
.conf
.blk
, r
->sector
, &r
->qiov
, n
,
346 scsi_read_complete
, r
);
350 scsi_req_unref(&r
->req
);
353 static void scsi_do_read_cb(void *opaque
, int ret
)
355 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
356 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
358 assert (r
->req
.aiocb
!= NULL
);
362 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
364 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
366 scsi_do_read(opaque
, ret
);
369 /* Read more data from scsi device into buffer. */
370 static void scsi_read_data(SCSIRequest
*req
)
372 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
373 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
376 DPRINTF("Read sector_count=%d\n", r
->sector_count
);
377 if (r
->sector_count
== 0) {
378 /* This also clears the sense buffer for REQUEST SENSE. */
379 scsi_req_complete(&r
->req
, GOOD
);
383 /* No data transfer may already be in progress */
384 assert(r
->req
.aiocb
== NULL
);
386 /* The request is used as the AIO opaque value, so add a ref. */
387 scsi_req_ref(&r
->req
);
388 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
389 DPRINTF("Data transfer direction invalid\n");
390 scsi_read_complete(r
, -EINVAL
);
395 scsi_read_complete(r
, -ENOMEDIUM
);
401 if (first
&& scsi_is_cmd_fua(&r
->req
.cmd
)) {
402 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
404 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_do_read_cb
, r
);
411 * scsi_handle_rw_error has two return values. 0 means that the error
412 * must be ignored, 1 means that the error has been processed and the
413 * caller should not do anything else for this request. Note that
414 * scsi_handle_rw_error always manages its reference counts, independent
415 * of the return value.
417 static int scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, bool acct_failed
)
419 bool is_read
= (r
->req
.cmd
.mode
== SCSI_XFER_FROM_DEV
);
420 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
421 BlockErrorAction action
= blk_get_error_action(s
->qdev
.conf
.blk
,
424 if (action
== BLOCK_ERROR_ACTION_REPORT
) {
426 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
430 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
433 scsi_check_condition(r
, SENSE_CODE(TARGET_FAILURE
));
436 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
439 scsi_check_condition(r
, SENSE_CODE(SPACE_ALLOC_FAILED
));
442 scsi_check_condition(r
, SENSE_CODE(IO_ERROR
));
446 blk_error_action(s
->qdev
.conf
.blk
, action
, is_read
, error
);
447 if (action
== BLOCK_ERROR_ACTION_STOP
) {
448 scsi_req_retry(&r
->req
);
450 return action
!= BLOCK_ERROR_ACTION_IGNORE
;
453 static void scsi_write_complete_noio(SCSIDiskReq
*r
, int ret
)
457 assert (r
->req
.aiocb
== NULL
);
459 if (r
->req
.io_canceled
) {
460 scsi_req_cancel_complete(&r
->req
);
465 if (scsi_handle_rw_error(r
, -ret
, false)) {
470 n
= r
->qiov
.size
/ 512;
472 r
->sector_count
-= n
;
473 if (r
->sector_count
== 0) {
474 scsi_write_do_fua(r
);
477 scsi_init_iovec(r
, SCSI_DMA_BUF_SIZE
);
478 DPRINTF("Write complete tag=0x%x more=%zd\n", r
->req
.tag
, r
->qiov
.size
);
479 scsi_req_data(&r
->req
, r
->qiov
.size
);
483 scsi_req_unref(&r
->req
);
486 static void scsi_write_complete(void * opaque
, int ret
)
488 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
489 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
491 assert (r
->req
.aiocb
!= NULL
);
495 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
497 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
499 scsi_write_complete_noio(r
, ret
);
502 static void scsi_write_data(SCSIRequest
*req
)
504 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
505 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
508 /* No data transfer may already be in progress */
509 assert(r
->req
.aiocb
== NULL
);
511 /* The request is used as the AIO opaque value, so add a ref. */
512 scsi_req_ref(&r
->req
);
513 if (r
->req
.cmd
.mode
!= SCSI_XFER_TO_DEV
) {
514 DPRINTF("Data transfer direction invalid\n");
515 scsi_write_complete_noio(r
, -EINVAL
);
519 if (!r
->req
.sg
&& !r
->qiov
.size
) {
520 /* Called for the first time. Ask the driver to send us more data. */
522 scsi_write_complete_noio(r
, 0);
526 scsi_write_complete_noio(r
, -ENOMEDIUM
);
530 if (r
->req
.cmd
.buf
[0] == VERIFY_10
|| r
->req
.cmd
.buf
[0] == VERIFY_12
||
531 r
->req
.cmd
.buf
[0] == VERIFY_16
) {
533 scsi_dma_complete_noio(r
, 0);
535 scsi_write_complete_noio(r
, 0);
541 dma_acct_start(s
->qdev
.conf
.blk
, &r
->acct
, r
->req
.sg
, BLOCK_ACCT_WRITE
);
542 r
->req
.resid
-= r
->req
.sg
->size
;
543 r
->req
.aiocb
= dma_blk_write(s
->qdev
.conf
.blk
, r
->req
.sg
, r
->sector
,
544 scsi_dma_complete
, r
);
546 n
= r
->qiov
.size
/ 512;
547 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
548 n
* BDRV_SECTOR_SIZE
, BLOCK_ACCT_WRITE
);
549 r
->req
.aiocb
= blk_aio_writev(s
->qdev
.conf
.blk
, r
->sector
, &r
->qiov
, n
,
550 scsi_write_complete
, r
);
554 /* Return a pointer to the data buffer. */
555 static uint8_t *scsi_get_buf(SCSIRequest
*req
)
557 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
559 return (uint8_t *)r
->iov
.iov_base
;
562 static int scsi_disk_emulate_inquiry(SCSIRequest
*req
, uint8_t *outbuf
)
564 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
568 if (req
->cmd
.buf
[1] & 0x1) {
569 /* Vital product data */
570 uint8_t page_code
= req
->cmd
.buf
[2];
572 outbuf
[buflen
++] = s
->qdev
.type
& 0x1f;
573 outbuf
[buflen
++] = page_code
; // this page
574 outbuf
[buflen
++] = 0x00;
575 outbuf
[buflen
++] = 0x00;
579 case 0x00: /* Supported page codes, mandatory */
581 DPRINTF("Inquiry EVPD[Supported pages] "
582 "buffer size %zd\n", req
->cmd
.xfer
);
583 outbuf
[buflen
++] = 0x00; // list of supported pages (this page)
585 outbuf
[buflen
++] = 0x80; // unit serial number
587 outbuf
[buflen
++] = 0x83; // device identification
588 if (s
->qdev
.type
== TYPE_DISK
) {
589 outbuf
[buflen
++] = 0xb0; // block limits
590 outbuf
[buflen
++] = 0xb2; // thin provisioning
594 case 0x80: /* Device serial number, optional */
599 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
603 l
= strlen(s
->serial
);
608 DPRINTF("Inquiry EVPD[Serial number] "
609 "buffer size %zd\n", req
->cmd
.xfer
);
610 memcpy(outbuf
+buflen
, s
->serial
, l
);
615 case 0x83: /* Device identification page, mandatory */
617 const char *str
= s
->serial
?: blk_name(s
->qdev
.conf
.blk
);
618 int max_len
= s
->serial
? 20 : 255 - 8;
619 int id_len
= strlen(str
);
621 if (id_len
> max_len
) {
624 DPRINTF("Inquiry EVPD[Device identification] "
625 "buffer size %zd\n", req
->cmd
.xfer
);
627 outbuf
[buflen
++] = 0x2; // ASCII
628 outbuf
[buflen
++] = 0; // not officially assigned
629 outbuf
[buflen
++] = 0; // reserved
630 outbuf
[buflen
++] = id_len
; // length of data following
631 memcpy(outbuf
+buflen
, str
, id_len
);
635 outbuf
[buflen
++] = 0x1; // Binary
636 outbuf
[buflen
++] = 0x3; // NAA
637 outbuf
[buflen
++] = 0; // reserved
638 outbuf
[buflen
++] = 8;
639 stq_be_p(&outbuf
[buflen
], s
->qdev
.wwn
);
643 if (s
->qdev
.port_wwn
) {
644 outbuf
[buflen
++] = 0x61; // SAS / Binary
645 outbuf
[buflen
++] = 0x93; // PIV / Target port / NAA
646 outbuf
[buflen
++] = 0; // reserved
647 outbuf
[buflen
++] = 8;
648 stq_be_p(&outbuf
[buflen
], s
->qdev
.port_wwn
);
653 outbuf
[buflen
++] = 0x61; // SAS / Binary
654 outbuf
[buflen
++] = 0x94; // PIV / Target port / relative target port
655 outbuf
[buflen
++] = 0; // reserved
656 outbuf
[buflen
++] = 4;
657 stw_be_p(&outbuf
[buflen
+ 2], s
->port_index
);
662 case 0xb0: /* block limits */
664 unsigned int unmap_sectors
=
665 s
->qdev
.conf
.discard_granularity
/ s
->qdev
.blocksize
;
666 unsigned int min_io_size
=
667 s
->qdev
.conf
.min_io_size
/ s
->qdev
.blocksize
;
668 unsigned int opt_io_size
=
669 s
->qdev
.conf
.opt_io_size
/ s
->qdev
.blocksize
;
670 unsigned int max_unmap_sectors
=
671 s
->max_unmap_size
/ s
->qdev
.blocksize
;
672 unsigned int max_io_sectors
=
673 s
->max_io_size
/ s
->qdev
.blocksize
;
675 if (s
->qdev
.type
== TYPE_ROM
) {
676 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
680 /* required VPD size with unmap support */
682 memset(outbuf
+ 4, 0, buflen
- 4);
684 outbuf
[4] = 0x1; /* wsnz */
686 /* optimal transfer length granularity */
687 outbuf
[6] = (min_io_size
>> 8) & 0xff;
688 outbuf
[7] = min_io_size
& 0xff;
690 /* maximum transfer length */
691 outbuf
[8] = (max_io_sectors
>> 24) & 0xff;
692 outbuf
[9] = (max_io_sectors
>> 16) & 0xff;
693 outbuf
[10] = (max_io_sectors
>> 8) & 0xff;
694 outbuf
[11] = max_io_sectors
& 0xff;
696 /* optimal transfer length */
697 outbuf
[12] = (opt_io_size
>> 24) & 0xff;
698 outbuf
[13] = (opt_io_size
>> 16) & 0xff;
699 outbuf
[14] = (opt_io_size
>> 8) & 0xff;
700 outbuf
[15] = opt_io_size
& 0xff;
702 /* max unmap LBA count, default is 1GB */
703 outbuf
[20] = (max_unmap_sectors
>> 24) & 0xff;
704 outbuf
[21] = (max_unmap_sectors
>> 16) & 0xff;
705 outbuf
[22] = (max_unmap_sectors
>> 8) & 0xff;
706 outbuf
[23] = max_unmap_sectors
& 0xff;
708 /* max unmap descriptors, 255 fit in 4 kb with an 8-byte header. */
714 /* optimal unmap granularity */
715 outbuf
[28] = (unmap_sectors
>> 24) & 0xff;
716 outbuf
[29] = (unmap_sectors
>> 16) & 0xff;
717 outbuf
[30] = (unmap_sectors
>> 8) & 0xff;
718 outbuf
[31] = unmap_sectors
& 0xff;
720 /* max write same size */
726 outbuf
[40] = (max_io_sectors
>> 24) & 0xff;
727 outbuf
[41] = (max_io_sectors
>> 16) & 0xff;
728 outbuf
[42] = (max_io_sectors
>> 8) & 0xff;
729 outbuf
[43] = max_io_sectors
& 0xff;
732 case 0xb2: /* thin provisioning */
736 outbuf
[5] = 0xe0; /* unmap & write_same 10/16 all supported */
737 outbuf
[6] = s
->qdev
.conf
.discard_granularity
? 2 : 1;
745 assert(buflen
- start
<= 255);
746 outbuf
[start
- 1] = buflen
- start
;
750 /* Standard INQUIRY data */
751 if (req
->cmd
.buf
[2] != 0) {
756 buflen
= req
->cmd
.xfer
;
757 if (buflen
> SCSI_MAX_INQUIRY_LEN
) {
758 buflen
= SCSI_MAX_INQUIRY_LEN
;
761 outbuf
[0] = s
->qdev
.type
& 0x1f;
762 outbuf
[1] = (s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) ? 0x80 : 0;
764 strpadcpy((char *) &outbuf
[16], 16, s
->product
, ' ');
765 strpadcpy((char *) &outbuf
[8], 8, s
->vendor
, ' ');
767 memset(&outbuf
[32], 0, 4);
768 memcpy(&outbuf
[32], s
->version
, MIN(4, strlen(s
->version
)));
770 * We claim conformance to SPC-3, which is required for guests
771 * to ask for modern features like READ CAPACITY(16) or the
772 * block characteristics VPD page by default. Not all of SPC-3
773 * is actually implemented, but we're good enough.
776 outbuf
[3] = 2 | 0x10; /* Format 2, HiSup */
779 outbuf
[4] = buflen
- 5; /* Additional Length = (Len - 1) - 4 */
781 /* If the allocation length of CDB is too small,
782 the additional length is not adjusted */
786 /* Sync data transfer and TCQ. */
787 outbuf
[7] = 0x10 | (req
->bus
->info
->tcq
? 0x02 : 0);
791 static inline bool media_is_dvd(SCSIDiskState
*s
)
794 if (s
->qdev
.type
!= TYPE_ROM
) {
797 if (!blk_is_inserted(s
->qdev
.conf
.blk
)) {
803 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
804 return nb_sectors
> CD_MAX_SECTORS
;
807 static inline bool media_is_cd(SCSIDiskState
*s
)
810 if (s
->qdev
.type
!= TYPE_ROM
) {
813 if (!blk_is_inserted(s
->qdev
.conf
.blk
)) {
819 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
820 return nb_sectors
<= CD_MAX_SECTORS
;
823 static int scsi_read_disc_information(SCSIDiskState
*s
, SCSIDiskReq
*r
,
826 uint8_t type
= r
->req
.cmd
.buf
[1] & 7;
828 if (s
->qdev
.type
!= TYPE_ROM
) {
832 /* Types 1/2 are only defined for Blu-Ray. */
834 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
838 memset(outbuf
, 0, 34);
840 outbuf
[2] = 0xe; /* last session complete, disc finalized */
841 outbuf
[3] = 1; /* first track on disc */
842 outbuf
[4] = 1; /* # of sessions */
843 outbuf
[5] = 1; /* first track of last session */
844 outbuf
[6] = 1; /* last track of last session */
845 outbuf
[7] = 0x20; /* unrestricted use */
846 outbuf
[8] = 0x00; /* CD-ROM or DVD-ROM */
847 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
848 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
849 /* 24-31: disc bar code */
850 /* 32: disc application code */
851 /* 33: number of OPC tables */
856 static int scsi_read_dvd_structure(SCSIDiskState
*s
, SCSIDiskReq
*r
,
859 static const int rds_caps_size
[5] = {
866 uint8_t media
= r
->req
.cmd
.buf
[1];
867 uint8_t layer
= r
->req
.cmd
.buf
[6];
868 uint8_t format
= r
->req
.cmd
.buf
[7];
871 if (s
->qdev
.type
!= TYPE_ROM
) {
875 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
879 if (format
!= 0xff) {
880 if (s
->tray_open
|| !blk_is_inserted(s
->qdev
.conf
.blk
)) {
881 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
884 if (media_is_cd(s
)) {
885 scsi_check_condition(r
, SENSE_CODE(INCOMPATIBLE_FORMAT
));
888 if (format
>= ARRAY_SIZE(rds_caps_size
)) {
891 size
= rds_caps_size
[format
];
892 memset(outbuf
, 0, size
);
897 /* Physical format information */
902 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
904 outbuf
[4] = 1; /* DVD-ROM, part version 1 */
905 outbuf
[5] = 0xf; /* 120mm disc, minimum rate unspecified */
906 outbuf
[6] = 1; /* one layer, read-only (per MMC-2 spec) */
907 outbuf
[7] = 0; /* default densities */
909 stl_be_p(&outbuf
[12], (nb_sectors
>> 2) - 1); /* end sector */
910 stl_be_p(&outbuf
[16], (nb_sectors
>> 2) - 1); /* l0 end sector */
914 case 0x01: /* DVD copyright information, all zeros */
917 case 0x03: /* BCA information - invalid field for no BCA info */
920 case 0x04: /* DVD disc manufacturing information, all zeros */
923 case 0xff: { /* List capabilities */
926 for (i
= 0; i
< ARRAY_SIZE(rds_caps_size
); i
++) {
927 if (!rds_caps_size
[i
]) {
931 outbuf
[size
+ 1] = 0x40; /* Not writable, readable */
932 stw_be_p(&outbuf
[size
+ 2], rds_caps_size
[i
]);
942 /* Size of buffer, not including 2 byte size field */
943 stw_be_p(outbuf
, size
- 2);
950 static int scsi_event_status_media(SCSIDiskState
*s
, uint8_t *outbuf
)
952 uint8_t event_code
, media_status
;
956 media_status
= MS_TRAY_OPEN
;
957 } else if (blk_is_inserted(s
->qdev
.conf
.blk
)) {
958 media_status
= MS_MEDIA_PRESENT
;
961 /* Event notification descriptor */
962 event_code
= MEC_NO_CHANGE
;
963 if (media_status
!= MS_TRAY_OPEN
) {
964 if (s
->media_event
) {
965 event_code
= MEC_NEW_MEDIA
;
966 s
->media_event
= false;
967 } else if (s
->eject_request
) {
968 event_code
= MEC_EJECT_REQUESTED
;
969 s
->eject_request
= false;
973 outbuf
[0] = event_code
;
974 outbuf
[1] = media_status
;
976 /* These fields are reserved, just clear them. */
982 static int scsi_get_event_status_notification(SCSIDiskState
*s
, SCSIDiskReq
*r
,
986 uint8_t *buf
= r
->req
.cmd
.buf
;
987 uint8_t notification_class_request
= buf
[4];
988 if (s
->qdev
.type
!= TYPE_ROM
) {
991 if ((buf
[1] & 1) == 0) {
997 outbuf
[0] = outbuf
[1] = 0;
998 outbuf
[3] = 1 << GESN_MEDIA
; /* supported events */
999 if (notification_class_request
& (1 << GESN_MEDIA
)) {
1000 outbuf
[2] = GESN_MEDIA
;
1001 size
+= scsi_event_status_media(s
, &outbuf
[size
]);
1005 stw_be_p(outbuf
, size
- 4);
1009 static int scsi_get_configuration(SCSIDiskState
*s
, uint8_t *outbuf
)
1013 if (s
->qdev
.type
!= TYPE_ROM
) {
1017 if (media_is_dvd(s
)) {
1018 current
= MMC_PROFILE_DVD_ROM
;
1019 } else if (media_is_cd(s
)) {
1020 current
= MMC_PROFILE_CD_ROM
;
1022 current
= MMC_PROFILE_NONE
;
1025 memset(outbuf
, 0, 40);
1026 stl_be_p(&outbuf
[0], 36); /* Bytes after the data length field */
1027 stw_be_p(&outbuf
[6], current
);
1028 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
1029 outbuf
[10] = 0x03; /* persistent, current */
1030 outbuf
[11] = 8; /* two profiles */
1031 stw_be_p(&outbuf
[12], MMC_PROFILE_DVD_ROM
);
1032 outbuf
[14] = (current
== MMC_PROFILE_DVD_ROM
);
1033 stw_be_p(&outbuf
[16], MMC_PROFILE_CD_ROM
);
1034 outbuf
[18] = (current
== MMC_PROFILE_CD_ROM
);
1035 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
1036 stw_be_p(&outbuf
[20], 1);
1037 outbuf
[22] = 0x08 | 0x03; /* version 2, persistent, current */
1039 stl_be_p(&outbuf
[24], 1); /* SCSI */
1040 outbuf
[28] = 1; /* DBE = 1, mandatory */
1041 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
1042 stw_be_p(&outbuf
[32], 3);
1043 outbuf
[34] = 0x08 | 0x03; /* version 2, persistent, current */
1045 outbuf
[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
1046 /* TODO: Random readable, CD read, DVD read, drive serial number,
1051 static int scsi_emulate_mechanism_status(SCSIDiskState
*s
, uint8_t *outbuf
)
1053 if (s
->qdev
.type
!= TYPE_ROM
) {
1056 memset(outbuf
, 0, 8);
1057 outbuf
[5] = 1; /* CD-ROM */
1061 static int mode_sense_page(SCSIDiskState
*s
, int page
, uint8_t **p_outbuf
,
1064 static const int mode_sense_valid
[0x3f] = {
1065 [MODE_PAGE_HD_GEOMETRY
] = (1 << TYPE_DISK
),
1066 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
] = (1 << TYPE_DISK
),
1067 [MODE_PAGE_CACHING
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
1068 [MODE_PAGE_R_W_ERROR
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
1069 [MODE_PAGE_AUDIO_CTL
] = (1 << TYPE_ROM
),
1070 [MODE_PAGE_CAPABILITIES
] = (1 << TYPE_ROM
),
1073 uint8_t *p
= *p_outbuf
+ 2;
1076 if ((mode_sense_valid
[page
] & (1 << s
->qdev
.type
)) == 0) {
1081 * If Changeable Values are requested, a mask denoting those mode parameters
1082 * that are changeable shall be returned. As we currently don't support
1083 * parameter changes via MODE_SELECT all bits are returned set to zero.
1084 * The buffer was already menset to zero by the caller of this function.
1086 * The offsets here are off by two compared to the descriptions in the
1087 * SCSI specs, because those include a 2-byte header. This is unfortunate,
1088 * but it is done so that offsets are consistent within our implementation
1089 * of MODE SENSE and MODE SELECT. MODE SELECT has to deal with both
1090 * 2-byte and 4-byte headers.
1093 case MODE_PAGE_HD_GEOMETRY
:
1095 if (page_control
== 1) { /* Changeable Values */
1098 /* if a geometry hint is available, use it */
1099 p
[0] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1100 p
[1] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1101 p
[2] = s
->qdev
.conf
.cyls
& 0xff;
1102 p
[3] = s
->qdev
.conf
.heads
& 0xff;
1103 /* Write precomp start cylinder, disabled */
1104 p
[4] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1105 p
[5] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1106 p
[6] = s
->qdev
.conf
.cyls
& 0xff;
1107 /* Reduced current start cylinder, disabled */
1108 p
[7] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1109 p
[8] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1110 p
[9] = s
->qdev
.conf
.cyls
& 0xff;
1111 /* Device step rate [ns], 200ns */
1114 /* Landing zone cylinder */
1118 /* Medium rotation rate [rpm], 5400 rpm */
1119 p
[18] = (5400 >> 8) & 0xff;
1120 p
[19] = 5400 & 0xff;
1123 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
:
1125 if (page_control
== 1) { /* Changeable Values */
1128 /* Transfer rate [kbit/s], 5Mbit/s */
1131 /* if a geometry hint is available, use it */
1132 p
[2] = s
->qdev
.conf
.heads
& 0xff;
1133 p
[3] = s
->qdev
.conf
.secs
& 0xff;
1134 p
[4] = s
->qdev
.blocksize
>> 8;
1135 p
[6] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1136 p
[7] = s
->qdev
.conf
.cyls
& 0xff;
1137 /* Write precomp start cylinder, disabled */
1138 p
[8] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1139 p
[9] = s
->qdev
.conf
.cyls
& 0xff;
1140 /* Reduced current start cylinder, disabled */
1141 p
[10] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1142 p
[11] = s
->qdev
.conf
.cyls
& 0xff;
1143 /* Device step rate [100us], 100us */
1146 /* Device step pulse width [us], 1us */
1148 /* Device head settle delay [100us], 100us */
1151 /* Motor on delay [0.1s], 0.1s */
1153 /* Motor off delay [0.1s], 0.1s */
1155 /* Medium rotation rate [rpm], 5400 rpm */
1156 p
[26] = (5400 >> 8) & 0xff;
1157 p
[27] = 5400 & 0xff;
1160 case MODE_PAGE_CACHING
:
1162 if (page_control
== 1 || /* Changeable Values */
1163 blk_enable_write_cache(s
->qdev
.conf
.blk
)) {
1168 case MODE_PAGE_R_W_ERROR
:
1170 if (page_control
== 1) { /* Changeable Values */
1173 p
[0] = 0x80; /* Automatic Write Reallocation Enabled */
1174 if (s
->qdev
.type
== TYPE_ROM
) {
1175 p
[1] = 0x20; /* Read Retry Count */
1179 case MODE_PAGE_AUDIO_CTL
:
1183 case MODE_PAGE_CAPABILITIES
:
1185 if (page_control
== 1) { /* Changeable Values */
1189 p
[0] = 0x3b; /* CD-R & CD-RW read */
1190 p
[1] = 0; /* Writing not supported */
1191 p
[2] = 0x7f; /* Audio, composite, digital out,
1192 mode 2 form 1&2, multi session */
1193 p
[3] = 0xff; /* CD DA, DA accurate, RW supported,
1194 RW corrected, C2 errors, ISRC,
1196 p
[4] = 0x2d | (s
->tray_locked
? 2 : 0);
1197 /* Locking supported, jumper present, eject, tray */
1198 p
[5] = 0; /* no volume & mute control, no
1200 p
[6] = (50 * 176) >> 8; /* 50x read speed */
1201 p
[7] = (50 * 176) & 0xff;
1202 p
[8] = 2 >> 8; /* Two volume levels */
1204 p
[10] = 2048 >> 8; /* 2M buffer */
1205 p
[11] = 2048 & 0xff;
1206 p
[12] = (16 * 176) >> 8; /* 16x read speed current */
1207 p
[13] = (16 * 176) & 0xff;
1208 p
[16] = (16 * 176) >> 8; /* 16x write speed */
1209 p
[17] = (16 * 176) & 0xff;
1210 p
[18] = (16 * 176) >> 8; /* 16x write speed current */
1211 p
[19] = (16 * 176) & 0xff;
1218 assert(length
< 256);
1219 (*p_outbuf
)[0] = page
;
1220 (*p_outbuf
)[1] = length
;
1221 *p_outbuf
+= length
+ 2;
1225 static int scsi_disk_emulate_mode_sense(SCSIDiskReq
*r
, uint8_t *outbuf
)
1227 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1228 uint64_t nb_sectors
;
1230 int page
, buflen
, ret
, page_control
;
1232 uint8_t dev_specific_param
;
1234 dbd
= (r
->req
.cmd
.buf
[1] & 0x8) != 0;
1235 page
= r
->req
.cmd
.buf
[2] & 0x3f;
1236 page_control
= (r
->req
.cmd
.buf
[2] & 0xc0) >> 6;
1237 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
1238 (r
->req
.cmd
.buf
[0] == MODE_SENSE
) ? 6 : 10, page
, r
->req
.cmd
.xfer
, page_control
);
1239 memset(outbuf
, 0, r
->req
.cmd
.xfer
);
1242 if (s
->qdev
.type
== TYPE_DISK
) {
1243 dev_specific_param
= s
->features
& (1 << SCSI_DISK_F_DPOFUA
) ? 0x10 : 0;
1244 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
1245 dev_specific_param
|= 0x80; /* Readonly. */
1248 /* MMC prescribes that CD/DVD drives have no block descriptors,
1249 * and defines no device-specific parameter. */
1250 dev_specific_param
= 0x00;
1254 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1255 p
[1] = 0; /* Default media type. */
1256 p
[2] = dev_specific_param
;
1257 p
[3] = 0; /* Block descriptor length. */
1259 } else { /* MODE_SENSE_10 */
1260 p
[2] = 0; /* Default media type. */
1261 p
[3] = dev_specific_param
;
1262 p
[6] = p
[7] = 0; /* Block descriptor length. */
1266 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1267 if (!dbd
&& nb_sectors
) {
1268 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1269 outbuf
[3] = 8; /* Block descriptor length */
1270 } else { /* MODE_SENSE_10 */
1271 outbuf
[7] = 8; /* Block descriptor length */
1273 nb_sectors
/= (s
->qdev
.blocksize
/ 512);
1274 if (nb_sectors
> 0xffffff) {
1277 p
[0] = 0; /* media density code */
1278 p
[1] = (nb_sectors
>> 16) & 0xff;
1279 p
[2] = (nb_sectors
>> 8) & 0xff;
1280 p
[3] = nb_sectors
& 0xff;
1281 p
[4] = 0; /* reserved */
1282 p
[5] = 0; /* bytes 5-7 are the sector size in bytes */
1283 p
[6] = s
->qdev
.blocksize
>> 8;
1288 if (page_control
== 3) {
1290 scsi_check_condition(r
, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED
));
1295 for (page
= 0; page
<= 0x3e; page
++) {
1296 mode_sense_page(s
, page
, &p
, page_control
);
1299 ret
= mode_sense_page(s
, page
, &p
, page_control
);
1305 buflen
= p
- outbuf
;
1307 * The mode data length field specifies the length in bytes of the
1308 * following data that is available to be transferred. The mode data
1309 * length does not include itself.
1311 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1312 outbuf
[0] = buflen
- 1;
1313 } else { /* MODE_SENSE_10 */
1314 outbuf
[0] = ((buflen
- 2) >> 8) & 0xff;
1315 outbuf
[1] = (buflen
- 2) & 0xff;
1320 static int scsi_disk_emulate_read_toc(SCSIRequest
*req
, uint8_t *outbuf
)
1322 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1323 int start_track
, format
, msf
, toclen
;
1324 uint64_t nb_sectors
;
1326 msf
= req
->cmd
.buf
[1] & 2;
1327 format
= req
->cmd
.buf
[2] & 0xf;
1328 start_track
= req
->cmd
.buf
[6];
1329 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1330 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track
, format
, msf
>> 1);
1331 nb_sectors
/= s
->qdev
.blocksize
/ 512;
1334 toclen
= cdrom_read_toc(nb_sectors
, outbuf
, msf
, start_track
);
1337 /* multi session : only a single session defined */
1339 memset(outbuf
, 0, 12);
1345 toclen
= cdrom_read_toc_raw(nb_sectors
, outbuf
, msf
, start_track
);
1353 static int scsi_disk_emulate_start_stop(SCSIDiskReq
*r
)
1355 SCSIRequest
*req
= &r
->req
;
1356 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1357 bool start
= req
->cmd
.buf
[4] & 1;
1358 bool loej
= req
->cmd
.buf
[4] & 2; /* load on start, eject on !start */
1359 int pwrcnd
= req
->cmd
.buf
[4] & 0xf0;
1362 /* eject/load only happens for power condition == 0 */
1366 if ((s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) && loej
) {
1367 if (!start
&& !s
->tray_open
&& s
->tray_locked
) {
1368 scsi_check_condition(r
,
1369 blk_is_inserted(s
->qdev
.conf
.blk
)
1370 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED
)
1371 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED
));
1375 if (s
->tray_open
!= !start
) {
1376 blk_eject(s
->qdev
.conf
.blk
, !start
);
1377 s
->tray_open
= !start
;
1383 static void scsi_disk_emulate_read_data(SCSIRequest
*req
)
1385 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1386 int buflen
= r
->iov
.iov_len
;
1389 DPRINTF("Read buf_len=%d\n", buflen
);
1392 scsi_req_data(&r
->req
, buflen
);
1396 /* This also clears the sense buffer for REQUEST SENSE. */
1397 scsi_req_complete(&r
->req
, GOOD
);
1400 static int scsi_disk_check_mode_select(SCSIDiskState
*s
, int page
,
1401 uint8_t *inbuf
, int inlen
)
1403 uint8_t mode_current
[SCSI_MAX_MODE_LEN
];
1404 uint8_t mode_changeable
[SCSI_MAX_MODE_LEN
];
1406 int len
, expected_len
, changeable_len
, i
;
1408 /* The input buffer does not include the page header, so it is
1411 expected_len
= inlen
+ 2;
1412 if (expected_len
> SCSI_MAX_MODE_LEN
) {
1417 memset(mode_current
, 0, inlen
+ 2);
1418 len
= mode_sense_page(s
, page
, &p
, 0);
1419 if (len
< 0 || len
!= expected_len
) {
1423 p
= mode_changeable
;
1424 memset(mode_changeable
, 0, inlen
+ 2);
1425 changeable_len
= mode_sense_page(s
, page
, &p
, 1);
1426 assert(changeable_len
== len
);
1428 /* Check that unchangeable bits are the same as what MODE SENSE
1431 for (i
= 2; i
< len
; i
++) {
1432 if (((mode_current
[i
] ^ inbuf
[i
- 2]) & ~mode_changeable
[i
]) != 0) {
1439 static void scsi_disk_apply_mode_select(SCSIDiskState
*s
, int page
, uint8_t *p
)
1442 case MODE_PAGE_CACHING
:
1443 blk_set_enable_write_cache(s
->qdev
.conf
.blk
, (p
[0] & 4) != 0);
1451 static int mode_select_pages(SCSIDiskReq
*r
, uint8_t *p
, int len
, bool change
)
1453 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1456 int page
, subpage
, page_len
;
1458 /* Parse both possible formats for the mode page headers. */
1462 goto invalid_param_len
;
1465 page_len
= lduw_be_p(&p
[2]);
1470 goto invalid_param_len
;
1481 if (page_len
> len
) {
1482 goto invalid_param_len
;
1486 if (scsi_disk_check_mode_select(s
, page
, p
, page_len
) < 0) {
1490 scsi_disk_apply_mode_select(s
, page
, p
);
1499 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM
));
1503 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1507 static void scsi_disk_emulate_mode_select(SCSIDiskReq
*r
, uint8_t *inbuf
)
1509 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1511 int cmd
= r
->req
.cmd
.buf
[0];
1512 int len
= r
->req
.cmd
.xfer
;
1513 int hdr_len
= (cmd
== MODE_SELECT
? 4 : 8);
1517 /* We only support PF=1, SP=0. */
1518 if ((r
->req
.cmd
.buf
[1] & 0x11) != 0x10) {
1522 if (len
< hdr_len
) {
1523 goto invalid_param_len
;
1526 bd_len
= (cmd
== MODE_SELECT
? p
[3] : lduw_be_p(&p
[6]));
1530 goto invalid_param_len
;
1532 if (bd_len
!= 0 && bd_len
!= 8) {
1539 /* Ensure no change is made if there is an error! */
1540 for (pass
= 0; pass
< 2; pass
++) {
1541 if (mode_select_pages(r
, p
, len
, pass
== 1) < 0) {
1546 if (!blk_enable_write_cache(s
->qdev
.conf
.blk
)) {
1547 /* The request is used as the AIO opaque value, so add a ref. */
1548 scsi_req_ref(&r
->req
);
1549 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
1551 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
1555 scsi_req_complete(&r
->req
, GOOD
);
1559 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM
));
1563 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1567 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1570 static inline bool check_lba_range(SCSIDiskState
*s
,
1571 uint64_t sector_num
, uint32_t nb_sectors
)
1574 * The first line tests that no overflow happens when computing the last
1575 * sector. The second line tests that the last accessed sector is in
1578 * Careful, the computations should not underflow for nb_sectors == 0,
1579 * and a 0-block read to the first LBA beyond the end of device is
1582 return (sector_num
<= sector_num
+ nb_sectors
&&
1583 sector_num
+ nb_sectors
<= s
->qdev
.max_lba
+ 1);
1586 typedef struct UnmapCBData
{
1592 static void scsi_unmap_complete(void *opaque
, int ret
);
1594 static void scsi_unmap_complete_noio(UnmapCBData
*data
, int ret
)
1596 SCSIDiskReq
*r
= data
->r
;
1597 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1598 uint64_t sector_num
;
1599 uint32_t nb_sectors
;
1601 assert(r
->req
.aiocb
== NULL
);
1603 if (r
->req
.io_canceled
) {
1604 scsi_req_cancel_complete(&r
->req
);
1609 if (scsi_handle_rw_error(r
, -ret
, false)) {
1614 if (data
->count
> 0) {
1615 sector_num
= ldq_be_p(&data
->inbuf
[0]);
1616 nb_sectors
= ldl_be_p(&data
->inbuf
[8]) & 0xffffffffULL
;
1617 if (!check_lba_range(s
, sector_num
, nb_sectors
)) {
1618 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1622 r
->req
.aiocb
= blk_aio_discard(s
->qdev
.conf
.blk
,
1623 sector_num
* (s
->qdev
.blocksize
/ 512),
1624 nb_sectors
* (s
->qdev
.blocksize
/ 512),
1625 scsi_unmap_complete
, data
);
1631 scsi_req_complete(&r
->req
, GOOD
);
1634 scsi_req_unref(&r
->req
);
1638 static void scsi_unmap_complete(void *opaque
, int ret
)
1640 UnmapCBData
*data
= opaque
;
1641 SCSIDiskReq
*r
= data
->r
;
1643 assert(r
->req
.aiocb
!= NULL
);
1644 r
->req
.aiocb
= NULL
;
1646 scsi_unmap_complete_noio(data
, ret
);
1649 static void scsi_disk_emulate_unmap(SCSIDiskReq
*r
, uint8_t *inbuf
)
1651 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1653 int len
= r
->req
.cmd
.xfer
;
1656 /* Reject ANCHOR=1. */
1657 if (r
->req
.cmd
.buf
[1] & 0x1) {
1662 goto invalid_param_len
;
1664 if (len
< lduw_be_p(&p
[0]) + 2) {
1665 goto invalid_param_len
;
1667 if (len
< lduw_be_p(&p
[2]) + 8) {
1668 goto invalid_param_len
;
1670 if (lduw_be_p(&p
[2]) & 15) {
1671 goto invalid_param_len
;
1674 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
1675 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
1679 data
= g_new0(UnmapCBData
, 1);
1681 data
->inbuf
= &p
[8];
1682 data
->count
= lduw_be_p(&p
[2]) >> 4;
1684 /* The matching unref is in scsi_unmap_complete, before data is freed. */
1685 scsi_req_ref(&r
->req
);
1686 scsi_unmap_complete_noio(data
, 0);
1690 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1694 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1697 typedef struct WriteSameCBData
{
1705 static void scsi_write_same_complete(void *opaque
, int ret
)
1707 WriteSameCBData
*data
= opaque
;
1708 SCSIDiskReq
*r
= data
->r
;
1709 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1711 assert(r
->req
.aiocb
!= NULL
);
1712 r
->req
.aiocb
= NULL
;
1713 if (r
->req
.io_canceled
) {
1714 scsi_req_cancel_complete(&r
->req
);
1719 if (scsi_handle_rw_error(r
, -ret
, true)) {
1724 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
1726 data
->nb_sectors
-= data
->iov
.iov_len
/ 512;
1727 data
->sector
+= data
->iov
.iov_len
/ 512;
1728 data
->iov
.iov_len
= MIN(data
->nb_sectors
* 512, data
->iov
.iov_len
);
1729 if (data
->iov
.iov_len
) {
1730 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1731 data
->iov
.iov_len
, BLOCK_ACCT_WRITE
);
1732 /* blk_aio_write doesn't like the qiov size being different from
1733 * nb_sectors, make sure they match.
1735 qemu_iovec_init_external(&data
->qiov
, &data
->iov
, 1);
1736 r
->req
.aiocb
= blk_aio_writev(s
->qdev
.conf
.blk
, data
->sector
,
1737 &data
->qiov
, data
->iov
.iov_len
/ 512,
1738 scsi_write_same_complete
, data
);
1742 scsi_req_complete(&r
->req
, GOOD
);
1745 scsi_req_unref(&r
->req
);
1746 qemu_vfree(data
->iov
.iov_base
);
1750 static void scsi_disk_emulate_write_same(SCSIDiskReq
*r
, uint8_t *inbuf
)
1752 SCSIRequest
*req
= &r
->req
;
1753 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1754 uint32_t nb_sectors
= scsi_data_cdb_xfer(r
->req
.cmd
.buf
);
1755 WriteSameCBData
*data
;
1759 /* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
1760 if (nb_sectors
== 0 || (req
->cmd
.buf
[1] & 0x16)) {
1761 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1765 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
1766 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
1769 if (!check_lba_range(s
, r
->req
.cmd
.lba
, nb_sectors
)) {
1770 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1774 if (buffer_is_zero(inbuf
, s
->qdev
.blocksize
)) {
1775 int flags
= (req
->cmd
.buf
[1] & 0x8) ? BDRV_REQ_MAY_UNMAP
: 0;
1777 /* The request is used as the AIO opaque value, so add a ref. */
1778 scsi_req_ref(&r
->req
);
1779 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1780 nb_sectors
* s
->qdev
.blocksize
,
1782 r
->req
.aiocb
= blk_aio_write_zeroes(s
->qdev
.conf
.blk
,
1783 r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512),
1784 nb_sectors
* (s
->qdev
.blocksize
/ 512),
1785 flags
, scsi_aio_complete
, r
);
1789 data
= g_new0(WriteSameCBData
, 1);
1791 data
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512);
1792 data
->nb_sectors
= nb_sectors
* (s
->qdev
.blocksize
/ 512);
1793 data
->iov
.iov_len
= MIN(data
->nb_sectors
* 512, SCSI_WRITE_SAME_MAX
);
1794 data
->iov
.iov_base
= buf
= blk_blockalign(s
->qdev
.conf
.blk
,
1796 qemu_iovec_init_external(&data
->qiov
, &data
->iov
, 1);
1798 for (i
= 0; i
< data
->iov
.iov_len
; i
+= s
->qdev
.blocksize
) {
1799 memcpy(&buf
[i
], inbuf
, s
->qdev
.blocksize
);
1802 scsi_req_ref(&r
->req
);
1803 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1804 data
->iov
.iov_len
, BLOCK_ACCT_WRITE
);
1805 r
->req
.aiocb
= blk_aio_writev(s
->qdev
.conf
.blk
, data
->sector
,
1806 &data
->qiov
, data
->iov
.iov_len
/ 512,
1807 scsi_write_same_complete
, data
);
1810 static void scsi_disk_emulate_write_data(SCSIRequest
*req
)
1812 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1814 if (r
->iov
.iov_len
) {
1815 int buflen
= r
->iov
.iov_len
;
1816 DPRINTF("Write buf_len=%d\n", buflen
);
1818 scsi_req_data(&r
->req
, buflen
);
1822 switch (req
->cmd
.buf
[0]) {
1824 case MODE_SELECT_10
:
1825 /* This also clears the sense buffer for REQUEST SENSE. */
1826 scsi_disk_emulate_mode_select(r
, r
->iov
.iov_base
);
1830 scsi_disk_emulate_unmap(r
, r
->iov
.iov_base
);
1836 if (r
->req
.status
== -1) {
1837 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1843 scsi_disk_emulate_write_same(r
, r
->iov
.iov_base
);
1851 static int32_t scsi_disk_emulate_command(SCSIRequest
*req
, uint8_t *buf
)
1853 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1854 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1855 uint64_t nb_sectors
;
1859 switch (req
->cmd
.buf
[0]) {
1868 case ALLOW_MEDIUM_REMOVAL
:
1869 case GET_CONFIGURATION
:
1870 case GET_EVENT_STATUS_NOTIFICATION
:
1871 case MECHANISM_STATUS
:
1876 if (s
->tray_open
|| !blk_is_inserted(s
->qdev
.conf
.blk
)) {
1877 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
1884 * FIXME: we shouldn't return anything bigger than 4k, but the code
1885 * requires the buffer to be as big as req->cmd.xfer in several
1886 * places. So, do not allow CDBs with a very large ALLOCATION
1887 * LENGTH. The real fix would be to modify scsi_read_data and
1888 * dma_buf_read, so that they return data beyond the buflen
1891 if (req
->cmd
.xfer
> 65536) {
1892 goto illegal_request
;
1894 r
->buflen
= MAX(4096, req
->cmd
.xfer
);
1896 if (!r
->iov
.iov_base
) {
1897 r
->iov
.iov_base
= blk_blockalign(s
->qdev
.conf
.blk
, r
->buflen
);
1900 buflen
= req
->cmd
.xfer
;
1901 outbuf
= r
->iov
.iov_base
;
1902 memset(outbuf
, 0, r
->buflen
);
1903 switch (req
->cmd
.buf
[0]) {
1904 case TEST_UNIT_READY
:
1905 assert(!s
->tray_open
&& blk_is_inserted(s
->qdev
.conf
.blk
));
1908 buflen
= scsi_disk_emulate_inquiry(req
, outbuf
);
1910 goto illegal_request
;
1915 buflen
= scsi_disk_emulate_mode_sense(r
, outbuf
);
1917 goto illegal_request
;
1921 buflen
= scsi_disk_emulate_read_toc(req
, outbuf
);
1923 goto illegal_request
;
1927 if (req
->cmd
.buf
[1] & 1) {
1928 goto illegal_request
;
1932 if (req
->cmd
.buf
[1] & 3) {
1933 goto illegal_request
;
1937 if (req
->cmd
.buf
[1] & 1) {
1938 goto illegal_request
;
1942 if (req
->cmd
.buf
[1] & 3) {
1943 goto illegal_request
;
1947 if (scsi_disk_emulate_start_stop(r
) < 0) {
1951 case ALLOW_MEDIUM_REMOVAL
:
1952 s
->tray_locked
= req
->cmd
.buf
[4] & 1;
1953 blk_lock_medium(s
->qdev
.conf
.blk
, req
->cmd
.buf
[4] & 1);
1955 case READ_CAPACITY_10
:
1956 /* The normal LEN field for this command is zero. */
1957 memset(outbuf
, 0, 8);
1958 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1960 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
1963 if ((req
->cmd
.buf
[8] & 1) == 0 && req
->cmd
.lba
) {
1964 goto illegal_request
;
1966 nb_sectors
/= s
->qdev
.blocksize
/ 512;
1967 /* Returned value is the address of the last sector. */
1969 /* Remember the new size for read/write sanity checking. */
1970 s
->qdev
.max_lba
= nb_sectors
;
1971 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1972 if (nb_sectors
> UINT32_MAX
) {
1973 nb_sectors
= UINT32_MAX
;
1975 outbuf
[0] = (nb_sectors
>> 24) & 0xff;
1976 outbuf
[1] = (nb_sectors
>> 16) & 0xff;
1977 outbuf
[2] = (nb_sectors
>> 8) & 0xff;
1978 outbuf
[3] = nb_sectors
& 0xff;
1981 outbuf
[6] = s
->qdev
.blocksize
>> 8;
1985 /* Just return "NO SENSE". */
1986 buflen
= scsi_build_sense(NULL
, 0, outbuf
, r
->buflen
,
1987 (req
->cmd
.buf
[1] & 1) == 0);
1989 goto illegal_request
;
1992 case MECHANISM_STATUS
:
1993 buflen
= scsi_emulate_mechanism_status(s
, outbuf
);
1995 goto illegal_request
;
1998 case GET_CONFIGURATION
:
1999 buflen
= scsi_get_configuration(s
, outbuf
);
2001 goto illegal_request
;
2004 case GET_EVENT_STATUS_NOTIFICATION
:
2005 buflen
= scsi_get_event_status_notification(s
, r
, outbuf
);
2007 goto illegal_request
;
2010 case READ_DISC_INFORMATION
:
2011 buflen
= scsi_read_disc_information(s
, r
, outbuf
);
2013 goto illegal_request
;
2016 case READ_DVD_STRUCTURE
:
2017 buflen
= scsi_read_dvd_structure(s
, r
, outbuf
);
2019 goto illegal_request
;
2022 case SERVICE_ACTION_IN_16
:
2023 /* Service Action In subcommands. */
2024 if ((req
->cmd
.buf
[1] & 31) == SAI_READ_CAPACITY_16
) {
2025 DPRINTF("SAI READ CAPACITY(16)\n");
2026 memset(outbuf
, 0, req
->cmd
.xfer
);
2027 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
2029 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
2032 if ((req
->cmd
.buf
[14] & 1) == 0 && req
->cmd
.lba
) {
2033 goto illegal_request
;
2035 nb_sectors
/= s
->qdev
.blocksize
/ 512;
2036 /* Returned value is the address of the last sector. */
2038 /* Remember the new size for read/write sanity checking. */
2039 s
->qdev
.max_lba
= nb_sectors
;
2040 outbuf
[0] = (nb_sectors
>> 56) & 0xff;
2041 outbuf
[1] = (nb_sectors
>> 48) & 0xff;
2042 outbuf
[2] = (nb_sectors
>> 40) & 0xff;
2043 outbuf
[3] = (nb_sectors
>> 32) & 0xff;
2044 outbuf
[4] = (nb_sectors
>> 24) & 0xff;
2045 outbuf
[5] = (nb_sectors
>> 16) & 0xff;
2046 outbuf
[6] = (nb_sectors
>> 8) & 0xff;
2047 outbuf
[7] = nb_sectors
& 0xff;
2050 outbuf
[10] = s
->qdev
.blocksize
>> 8;
2053 outbuf
[13] = get_physical_block_exp(&s
->qdev
.conf
);
2055 /* set TPE bit if the format supports discard */
2056 if (s
->qdev
.conf
.discard_granularity
) {
2060 /* Protection, exponent and lowest lba field left blank. */
2063 DPRINTF("Unsupported Service Action In\n");
2064 goto illegal_request
;
2065 case SYNCHRONIZE_CACHE
:
2066 /* The request is used as the AIO opaque value, so add a ref. */
2067 scsi_req_ref(&r
->req
);
2068 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
2070 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
2073 DPRINTF("Seek(10) (sector %" PRId64
")\n", r
->req
.cmd
.lba
);
2074 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
2079 DPRINTF("Mode Select(6) (len %lu)\n", (long)r
->req
.cmd
.xfer
);
2081 case MODE_SELECT_10
:
2082 DPRINTF("Mode Select(10) (len %lu)\n", (long)r
->req
.cmd
.xfer
);
2085 DPRINTF("Unmap (len %lu)\n", (long)r
->req
.cmd
.xfer
);
2090 DPRINTF("Verify (bytchk %d)\n", (req
->cmd
.buf
[1] >> 1) & 3);
2091 if (req
->cmd
.buf
[1] & 6) {
2092 goto illegal_request
;
2097 DPRINTF("WRITE SAME %d (len %lu)\n",
2098 req
->cmd
.buf
[0] == WRITE_SAME_10
? 10 : 16,
2099 (long)r
->req
.cmd
.xfer
);
2102 DPRINTF("Unknown SCSI command (%2.2x=%s)\n", buf
[0],
2103 scsi_command_name(buf
[0]));
2104 scsi_check_condition(r
, SENSE_CODE(INVALID_OPCODE
));
2107 assert(!r
->req
.aiocb
);
2108 r
->iov
.iov_len
= MIN(r
->buflen
, req
->cmd
.xfer
);
2109 if (r
->iov
.iov_len
== 0) {
2110 scsi_req_complete(&r
->req
, GOOD
);
2112 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
2113 assert(r
->iov
.iov_len
== req
->cmd
.xfer
);
2114 return -r
->iov
.iov_len
;
2116 return r
->iov
.iov_len
;
2120 if (r
->req
.status
== -1) {
2121 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
2126 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
2130 /* Execute a scsi command. Returns the length of the data expected by the
2131 command. This will be Positive for data transfers from the device
2132 (eg. disk reads), negative for transfers to the device (eg. disk writes),
2133 and zero if the command does not transfer any data. */
2135 static int32_t scsi_disk_dma_command(SCSIRequest
*req
, uint8_t *buf
)
2137 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
2138 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
2144 if (s
->tray_open
|| !blk_is_inserted(s
->qdev
.conf
.blk
)) {
2145 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
2149 len
= scsi_data_cdb_xfer(r
->req
.cmd
.buf
);
2155 DPRINTF("Read (sector %" PRId64
", count %u)\n", r
->req
.cmd
.lba
, len
);
2156 if (r
->req
.cmd
.buf
[1] & 0xe0) {
2157 goto illegal_request
;
2159 if (!check_lba_range(s
, r
->req
.cmd
.lba
, len
)) {
2162 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512);
2163 r
->sector_count
= len
* (s
->qdev
.blocksize
/ 512);
2169 case WRITE_VERIFY_10
:
2170 case WRITE_VERIFY_12
:
2171 case WRITE_VERIFY_16
:
2172 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
2173 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
2176 DPRINTF("Write %s(sector %" PRId64
", count %u)\n",
2177 (command
& 0xe) == 0xe ? "And Verify " : "",
2178 r
->req
.cmd
.lba
, len
);
2179 if (r
->req
.cmd
.buf
[1] & 0xe0) {
2180 goto illegal_request
;
2182 if (!check_lba_range(s
, r
->req
.cmd
.lba
, len
)) {
2185 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512);
2186 r
->sector_count
= len
* (s
->qdev
.blocksize
/ 512);
2191 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
2194 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
2197 if (r
->sector_count
== 0) {
2198 scsi_req_complete(&r
->req
, GOOD
);
2200 assert(r
->iov
.iov_len
== 0);
2201 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
2202 return -r
->sector_count
* 512;
2204 return r
->sector_count
* 512;
2208 static void scsi_disk_reset(DeviceState
*dev
)
2210 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
.qdev
, dev
);
2211 uint64_t nb_sectors
;
2213 scsi_device_purge_requests(&s
->qdev
, SENSE_CODE(RESET
));
2215 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
2216 nb_sectors
/= s
->qdev
.blocksize
/ 512;
2220 s
->qdev
.max_lba
= nb_sectors
;
2221 /* reset tray statuses */
2226 static void scsi_disk_resize_cb(void *opaque
)
2228 SCSIDiskState
*s
= opaque
;
2230 /* SPC lists this sense code as available only for
2231 * direct-access devices.
2233 if (s
->qdev
.type
== TYPE_DISK
) {
2234 scsi_device_report_change(&s
->qdev
, SENSE_CODE(CAPACITY_CHANGED
));
2238 static void scsi_cd_change_media_cb(void *opaque
, bool load
)
2240 SCSIDiskState
*s
= opaque
;
2243 * When a CD gets changed, we have to report an ejected state and
2244 * then a loaded state to guests so that they detect tray
2245 * open/close and media change events. Guests that do not use
2246 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
2247 * states rely on this behavior.
2249 * media_changed governs the state machine used for unit attention
2250 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
2252 s
->media_changed
= load
;
2253 s
->tray_open
= !load
;
2254 scsi_device_set_ua(&s
->qdev
, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM
));
2255 s
->media_event
= true;
2256 s
->eject_request
= false;
2259 static void scsi_cd_eject_request_cb(void *opaque
, bool force
)
2261 SCSIDiskState
*s
= opaque
;
2263 s
->eject_request
= true;
2265 s
->tray_locked
= false;
2269 static bool scsi_cd_is_tray_open(void *opaque
)
2271 return ((SCSIDiskState
*)opaque
)->tray_open
;
2274 static bool scsi_cd_is_medium_locked(void *opaque
)
2276 return ((SCSIDiskState
*)opaque
)->tray_locked
;
2279 static const BlockDevOps scsi_disk_removable_block_ops
= {
2280 .change_media_cb
= scsi_cd_change_media_cb
,
2281 .eject_request_cb
= scsi_cd_eject_request_cb
,
2282 .is_tray_open
= scsi_cd_is_tray_open
,
2283 .is_medium_locked
= scsi_cd_is_medium_locked
,
2285 .resize_cb
= scsi_disk_resize_cb
,
2288 static const BlockDevOps scsi_disk_block_ops
= {
2289 .resize_cb
= scsi_disk_resize_cb
,
2292 static void scsi_disk_unit_attention_reported(SCSIDevice
*dev
)
2294 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2295 if (s
->media_changed
) {
2296 s
->media_changed
= false;
2297 scsi_device_set_ua(&s
->qdev
, SENSE_CODE(MEDIUM_CHANGED
));
2301 static void scsi_realize(SCSIDevice
*dev
, Error
**errp
)
2303 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2306 if (!s
->qdev
.conf
.blk
) {
2307 error_setg(errp
, "drive property not set");
2311 if (!(s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) &&
2312 !blk_is_inserted(s
->qdev
.conf
.blk
)) {
2313 error_setg(errp
, "Device needs media, but drive is empty");
2317 blkconf_serial(&s
->qdev
.conf
, &s
->serial
);
2318 blkconf_blocksizes(&s
->qdev
.conf
);
2319 if (dev
->type
== TYPE_DISK
) {
2320 blkconf_geometry(&dev
->conf
, NULL
, 65535, 255, 255, &err
);
2322 error_propagate(errp
, err
);
2327 if (s
->qdev
.conf
.discard_granularity
== -1) {
2328 s
->qdev
.conf
.discard_granularity
=
2329 MAX(s
->qdev
.conf
.logical_block_size
, DEFAULT_DISCARD_GRANULARITY
);
2333 s
->version
= g_strdup(qemu_hw_version());
2336 s
->vendor
= g_strdup("QEMU");
2339 if (blk_is_sg(s
->qdev
.conf
.blk
)) {
2340 error_setg(errp
, "unwanted /dev/sg*");
2344 if ((s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) &&
2345 !(s
->features
& (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS
))) {
2346 blk_set_dev_ops(s
->qdev
.conf
.blk
, &scsi_disk_removable_block_ops
, s
);
2348 blk_set_dev_ops(s
->qdev
.conf
.blk
, &scsi_disk_block_ops
, s
);
2350 blk_set_guest_block_size(s
->qdev
.conf
.blk
, s
->qdev
.blocksize
);
2352 blk_iostatus_enable(s
->qdev
.conf
.blk
);
2355 static void scsi_hd_realize(SCSIDevice
*dev
, Error
**errp
)
2357 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2358 /* can happen for devices without drive. The error message for missing
2359 * backend will be issued in scsi_realize
2361 if (s
->qdev
.conf
.blk
) {
2362 blkconf_blocksizes(&s
->qdev
.conf
);
2364 s
->qdev
.blocksize
= s
->qdev
.conf
.logical_block_size
;
2365 s
->qdev
.type
= TYPE_DISK
;
2367 s
->product
= g_strdup("QEMU HARDDISK");
2369 scsi_realize(&s
->qdev
, errp
);
2372 static void scsi_cd_realize(SCSIDevice
*dev
, Error
**errp
)
2374 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2375 s
->qdev
.blocksize
= 2048;
2376 s
->qdev
.type
= TYPE_ROM
;
2377 s
->features
|= 1 << SCSI_DISK_F_REMOVABLE
;
2379 s
->product
= g_strdup("QEMU CD-ROM");
2381 scsi_realize(&s
->qdev
, errp
);
2384 static void scsi_disk_realize(SCSIDevice
*dev
, Error
**errp
)
2387 Error
*local_err
= NULL
;
2389 if (!dev
->conf
.blk
) {
2390 scsi_realize(dev
, &local_err
);
2392 error_propagate(errp
, local_err
);
2396 dinfo
= blk_legacy_dinfo(dev
->conf
.blk
);
2397 if (dinfo
&& dinfo
->media_cd
) {
2398 scsi_cd_realize(dev
, errp
);
2400 scsi_hd_realize(dev
, errp
);
2404 static const SCSIReqOps scsi_disk_emulate_reqops
= {
2405 .size
= sizeof(SCSIDiskReq
),
2406 .free_req
= scsi_free_request
,
2407 .send_command
= scsi_disk_emulate_command
,
2408 .read_data
= scsi_disk_emulate_read_data
,
2409 .write_data
= scsi_disk_emulate_write_data
,
2410 .get_buf
= scsi_get_buf
,
2413 static const SCSIReqOps scsi_disk_dma_reqops
= {
2414 .size
= sizeof(SCSIDiskReq
),
2415 .free_req
= scsi_free_request
,
2416 .send_command
= scsi_disk_dma_command
,
2417 .read_data
= scsi_read_data
,
2418 .write_data
= scsi_write_data
,
2419 .get_buf
= scsi_get_buf
,
2420 .load_request
= scsi_disk_load_request
,
2421 .save_request
= scsi_disk_save_request
,
2424 static const SCSIReqOps
*const scsi_disk_reqops_dispatch
[256] = {
2425 [TEST_UNIT_READY
] = &scsi_disk_emulate_reqops
,
2426 [INQUIRY
] = &scsi_disk_emulate_reqops
,
2427 [MODE_SENSE
] = &scsi_disk_emulate_reqops
,
2428 [MODE_SENSE_10
] = &scsi_disk_emulate_reqops
,
2429 [START_STOP
] = &scsi_disk_emulate_reqops
,
2430 [ALLOW_MEDIUM_REMOVAL
] = &scsi_disk_emulate_reqops
,
2431 [READ_CAPACITY_10
] = &scsi_disk_emulate_reqops
,
2432 [READ_TOC
] = &scsi_disk_emulate_reqops
,
2433 [READ_DVD_STRUCTURE
] = &scsi_disk_emulate_reqops
,
2434 [READ_DISC_INFORMATION
] = &scsi_disk_emulate_reqops
,
2435 [GET_CONFIGURATION
] = &scsi_disk_emulate_reqops
,
2436 [GET_EVENT_STATUS_NOTIFICATION
] = &scsi_disk_emulate_reqops
,
2437 [MECHANISM_STATUS
] = &scsi_disk_emulate_reqops
,
2438 [SERVICE_ACTION_IN_16
] = &scsi_disk_emulate_reqops
,
2439 [REQUEST_SENSE
] = &scsi_disk_emulate_reqops
,
2440 [SYNCHRONIZE_CACHE
] = &scsi_disk_emulate_reqops
,
2441 [SEEK_10
] = &scsi_disk_emulate_reqops
,
2442 [MODE_SELECT
] = &scsi_disk_emulate_reqops
,
2443 [MODE_SELECT_10
] = &scsi_disk_emulate_reqops
,
2444 [UNMAP
] = &scsi_disk_emulate_reqops
,
2445 [WRITE_SAME_10
] = &scsi_disk_emulate_reqops
,
2446 [WRITE_SAME_16
] = &scsi_disk_emulate_reqops
,
2447 [VERIFY_10
] = &scsi_disk_emulate_reqops
,
2448 [VERIFY_12
] = &scsi_disk_emulate_reqops
,
2449 [VERIFY_16
] = &scsi_disk_emulate_reqops
,
2451 [READ_6
] = &scsi_disk_dma_reqops
,
2452 [READ_10
] = &scsi_disk_dma_reqops
,
2453 [READ_12
] = &scsi_disk_dma_reqops
,
2454 [READ_16
] = &scsi_disk_dma_reqops
,
2455 [WRITE_6
] = &scsi_disk_dma_reqops
,
2456 [WRITE_10
] = &scsi_disk_dma_reqops
,
2457 [WRITE_12
] = &scsi_disk_dma_reqops
,
2458 [WRITE_16
] = &scsi_disk_dma_reqops
,
2459 [WRITE_VERIFY_10
] = &scsi_disk_dma_reqops
,
2460 [WRITE_VERIFY_12
] = &scsi_disk_dma_reqops
,
2461 [WRITE_VERIFY_16
] = &scsi_disk_dma_reqops
,
2464 static SCSIRequest
*scsi_new_request(SCSIDevice
*d
, uint32_t tag
, uint32_t lun
,
2465 uint8_t *buf
, void *hba_private
)
2467 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2469 const SCSIReqOps
*ops
;
2473 ops
= scsi_disk_reqops_dispatch
[command
];
2475 ops
= &scsi_disk_emulate_reqops
;
2477 req
= scsi_req_alloc(ops
, &s
->qdev
, tag
, lun
, hba_private
);
2480 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun
, tag
, buf
[0]);
2483 for (i
= 1; i
< scsi_cdb_length(buf
); i
++) {
2484 printf(" 0x%02x", buf
[i
]);
2494 static int get_device_type(SCSIDiskState
*s
)
2498 uint8_t sensebuf
[8];
2499 sg_io_hdr_t io_header
;
2502 memset(cmd
, 0, sizeof(cmd
));
2503 memset(buf
, 0, sizeof(buf
));
2505 cmd
[4] = sizeof(buf
);
2507 memset(&io_header
, 0, sizeof(io_header
));
2508 io_header
.interface_id
= 'S';
2509 io_header
.dxfer_direction
= SG_DXFER_FROM_DEV
;
2510 io_header
.dxfer_len
= sizeof(buf
);
2511 io_header
.dxferp
= buf
;
2512 io_header
.cmdp
= cmd
;
2513 io_header
.cmd_len
= sizeof(cmd
);
2514 io_header
.mx_sb_len
= sizeof(sensebuf
);
2515 io_header
.sbp
= sensebuf
;
2516 io_header
.timeout
= 6000; /* XXX */
2518 ret
= blk_ioctl(s
->qdev
.conf
.blk
, SG_IO
, &io_header
);
2519 if (ret
< 0 || io_header
.driver_status
|| io_header
.host_status
) {
2522 s
->qdev
.type
= buf
[0];
2523 if (buf
[1] & 0x80) {
2524 s
->features
|= 1 << SCSI_DISK_F_REMOVABLE
;
2529 static void scsi_block_realize(SCSIDevice
*dev
, Error
**errp
)
2531 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2535 if (!s
->qdev
.conf
.blk
) {
2536 error_setg(errp
, "drive property not set");
2540 /* check we are using a driver managing SG_IO (version 3 and after) */
2541 rc
= blk_ioctl(s
->qdev
.conf
.blk
, SG_GET_VERSION_NUM
, &sg_version
);
2543 error_setg(errp
, "cannot get SG_IO version number: %s. "
2544 "Is this a SCSI device?",
2548 if (sg_version
< 30000) {
2549 error_setg(errp
, "scsi generic interface too old");
2553 /* get device type from INQUIRY data */
2554 rc
= get_device_type(s
);
2556 error_setg(errp
, "INQUIRY failed");
2560 /* Make a guess for the block size, we'll fix it when the guest sends.
2561 * READ CAPACITY. If they don't, they likely would assume these sizes
2562 * anyway. (TODO: check in /sys).
2564 if (s
->qdev
.type
== TYPE_ROM
|| s
->qdev
.type
== TYPE_WORM
) {
2565 s
->qdev
.blocksize
= 2048;
2567 s
->qdev
.blocksize
= 512;
2570 /* Makes the scsi-block device not removable by using HMP and QMP eject
2573 s
->features
|= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS
);
2575 scsi_realize(&s
->qdev
, errp
);
2576 scsi_generic_read_device_identification(&s
->qdev
);
2579 static bool scsi_block_is_passthrough(SCSIDiskState
*s
, uint8_t *buf
)
2593 case WRITE_VERIFY_10
:
2594 case WRITE_VERIFY_12
:
2595 case WRITE_VERIFY_16
:
2596 /* If we are not using O_DIRECT, we might read stale data from the
2597 * host cache if writes were made using other commands than these
2598 * ones (such as WRITE SAME or EXTENDED COPY, etc.). So, without
2599 * O_DIRECT everything must go through SG_IO.
2601 if (!(blk_get_flags(s
->qdev
.conf
.blk
) & BDRV_O_NOCACHE
)) {
2605 /* MMC writing cannot be done via pread/pwrite, because it sometimes
2606 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
2607 * And once you do these writes, reading from the block device is
2608 * unreliable, too. It is even possible that reads deliver random data
2609 * from the host page cache (this is probably a Linux bug).
2611 * We might use scsi_disk_dma_reqops as long as no writing commands are
2612 * seen, but performance usually isn't paramount on optical media. So,
2613 * just make scsi-block operate the same as scsi-generic for them.
2615 if (s
->qdev
.type
!= TYPE_ROM
) {
2628 static SCSIRequest
*scsi_block_new_request(SCSIDevice
*d
, uint32_t tag
,
2629 uint32_t lun
, uint8_t *buf
,
2632 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2634 if (scsi_block_is_passthrough(s
, buf
)) {
2635 return scsi_req_alloc(&scsi_generic_req_ops
, &s
->qdev
, tag
, lun
,
2638 return scsi_req_alloc(&scsi_disk_dma_reqops
, &s
->qdev
, tag
, lun
,
2643 static int scsi_block_parse_cdb(SCSIDevice
*d
, SCSICommand
*cmd
,
2644 uint8_t *buf
, void *hba_private
)
2646 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2648 if (scsi_block_is_passthrough(s
, buf
)) {
2649 return scsi_bus_parse_cdb(&s
->qdev
, cmd
, buf
, hba_private
);
2651 return scsi_req_parse_cdb(&s
->qdev
, cmd
, buf
);
2657 #define DEFINE_SCSI_DISK_PROPERTIES() \
2658 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
2659 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
2660 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
2661 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
2662 DEFINE_PROP_STRING("product", SCSIDiskState, product)
2664 static Property scsi_hd_properties
[] = {
2665 DEFINE_SCSI_DISK_PROPERTIES(),
2666 DEFINE_PROP_BIT("removable", SCSIDiskState
, features
,
2667 SCSI_DISK_F_REMOVABLE
, false),
2668 DEFINE_PROP_BIT("dpofua", SCSIDiskState
, features
,
2669 SCSI_DISK_F_DPOFUA
, false),
2670 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
2671 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
2672 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
2673 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
2674 DEFAULT_MAX_UNMAP_SIZE
),
2675 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
2676 DEFAULT_MAX_IO_SIZE
),
2677 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState
, qdev
.conf
),
2678 DEFINE_PROP_END_OF_LIST(),
2681 static const VMStateDescription vmstate_scsi_disk_state
= {
2682 .name
= "scsi-disk",
2684 .minimum_version_id
= 1,
2685 .fields
= (VMStateField
[]) {
2686 VMSTATE_SCSI_DEVICE(qdev
, SCSIDiskState
),
2687 VMSTATE_BOOL(media_changed
, SCSIDiskState
),
2688 VMSTATE_BOOL(media_event
, SCSIDiskState
),
2689 VMSTATE_BOOL(eject_request
, SCSIDiskState
),
2690 VMSTATE_BOOL(tray_open
, SCSIDiskState
),
2691 VMSTATE_BOOL(tray_locked
, SCSIDiskState
),
2692 VMSTATE_END_OF_LIST()
2696 static void scsi_hd_class_initfn(ObjectClass
*klass
, void *data
)
2698 DeviceClass
*dc
= DEVICE_CLASS(klass
);
2699 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
2701 sc
->realize
= scsi_hd_realize
;
2702 sc
->alloc_req
= scsi_new_request
;
2703 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
2704 dc
->fw_name
= "disk";
2705 dc
->desc
= "virtual SCSI disk";
2706 dc
->reset
= scsi_disk_reset
;
2707 dc
->props
= scsi_hd_properties
;
2708 dc
->vmsd
= &vmstate_scsi_disk_state
;
2711 static const TypeInfo scsi_hd_info
= {
2713 .parent
= TYPE_SCSI_DEVICE
,
2714 .instance_size
= sizeof(SCSIDiskState
),
2715 .class_init
= scsi_hd_class_initfn
,
2718 static Property scsi_cd_properties
[] = {
2719 DEFINE_SCSI_DISK_PROPERTIES(),
2720 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
2721 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
2722 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
2723 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
2724 DEFAULT_MAX_IO_SIZE
),
2725 DEFINE_PROP_END_OF_LIST(),
2728 static void scsi_cd_class_initfn(ObjectClass
*klass
, void *data
)
2730 DeviceClass
*dc
= DEVICE_CLASS(klass
);
2731 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
2733 sc
->realize
= scsi_cd_realize
;
2734 sc
->alloc_req
= scsi_new_request
;
2735 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
2736 dc
->fw_name
= "disk";
2737 dc
->desc
= "virtual SCSI CD-ROM";
2738 dc
->reset
= scsi_disk_reset
;
2739 dc
->props
= scsi_cd_properties
;
2740 dc
->vmsd
= &vmstate_scsi_disk_state
;
2743 static const TypeInfo scsi_cd_info
= {
2745 .parent
= TYPE_SCSI_DEVICE
,
2746 .instance_size
= sizeof(SCSIDiskState
),
2747 .class_init
= scsi_cd_class_initfn
,
2751 static Property scsi_block_properties
[] = {
2752 DEFINE_PROP_DRIVE("drive", SCSIDiskState
, qdev
.conf
.blk
),
2753 DEFINE_PROP_END_OF_LIST(),
2756 static void scsi_block_class_initfn(ObjectClass
*klass
, void *data
)
2758 DeviceClass
*dc
= DEVICE_CLASS(klass
);
2759 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
2761 sc
->realize
= scsi_block_realize
;
2762 sc
->alloc_req
= scsi_block_new_request
;
2763 sc
->parse_cdb
= scsi_block_parse_cdb
;
2764 dc
->fw_name
= "disk";
2765 dc
->desc
= "SCSI block device passthrough";
2766 dc
->reset
= scsi_disk_reset
;
2767 dc
->props
= scsi_block_properties
;
2768 dc
->vmsd
= &vmstate_scsi_disk_state
;
2771 static const TypeInfo scsi_block_info
= {
2772 .name
= "scsi-block",
2773 .parent
= TYPE_SCSI_DEVICE
,
2774 .instance_size
= sizeof(SCSIDiskState
),
2775 .class_init
= scsi_block_class_initfn
,
2779 static Property scsi_disk_properties
[] = {
2780 DEFINE_SCSI_DISK_PROPERTIES(),
2781 DEFINE_PROP_BIT("removable", SCSIDiskState
, features
,
2782 SCSI_DISK_F_REMOVABLE
, false),
2783 DEFINE_PROP_BIT("dpofua", SCSIDiskState
, features
,
2784 SCSI_DISK_F_DPOFUA
, false),
2785 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
2786 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
2787 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
2788 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
2789 DEFAULT_MAX_UNMAP_SIZE
),
2790 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
2791 DEFAULT_MAX_IO_SIZE
),
2792 DEFINE_PROP_END_OF_LIST(),
2795 static void scsi_disk_class_initfn(ObjectClass
*klass
, void *data
)
2797 DeviceClass
*dc
= DEVICE_CLASS(klass
);
2798 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
2800 sc
->realize
= scsi_disk_realize
;
2801 sc
->alloc_req
= scsi_new_request
;
2802 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
2803 dc
->fw_name
= "disk";
2804 dc
->desc
= "virtual SCSI disk or CD-ROM (legacy)";
2805 dc
->reset
= scsi_disk_reset
;
2806 dc
->props
= scsi_disk_properties
;
2807 dc
->vmsd
= &vmstate_scsi_disk_state
;
2810 static const TypeInfo scsi_disk_info
= {
2811 .name
= "scsi-disk",
2812 .parent
= TYPE_SCSI_DEVICE
,
2813 .instance_size
= sizeof(SCSIDiskState
),
2814 .class_init
= scsi_disk_class_initfn
,
2817 static void scsi_disk_register_types(void)
2819 type_register_static(&scsi_hd_info
);
2820 type_register_static(&scsi_cd_info
);
2822 type_register_static(&scsi_block_info
);
2824 type_register_static(&scsi_disk_info
);
2827 type_init(scsi_disk_register_types
)