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.
22 #include "qemu/osdep.h"
23 #include "qemu/units.h"
24 #include "qapi/error.h"
25 #include "qemu/error-report.h"
26 #include "qemu/main-loop.h"
27 #include "qemu/module.h"
28 #include "hw/scsi/scsi.h"
29 #include "migration/qemu-file-types.h"
30 #include "migration/vmstate.h"
31 #include "hw/scsi/emulation.h"
32 #include "scsi/constants.h"
33 #include "sysemu/block-backend.h"
34 #include "sysemu/blockdev.h"
35 #include "hw/block/block.h"
36 #include "hw/qdev-properties.h"
37 #include "sysemu/dma.h"
38 #include "sysemu/sysemu.h"
39 #include "qemu/cutils.h"
41 #include "qom/object.h"
47 #define SCSI_WRITE_SAME_MAX (512 * KiB)
48 #define SCSI_DMA_BUF_SIZE (128 * KiB)
49 #define SCSI_MAX_INQUIRY_LEN 256
50 #define SCSI_MAX_MODE_LEN 256
52 #define DEFAULT_DISCARD_GRANULARITY (4 * KiB)
53 #define DEFAULT_MAX_UNMAP_SIZE (1 * GiB)
54 #define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
56 #define TYPE_SCSI_DISK_BASE "scsi-disk-base"
58 typedef struct SCSIDiskClass SCSIDiskClass
;
59 typedef struct SCSIDiskState SCSIDiskState
;
60 #define SCSI_DISK_BASE(obj) \
61 OBJECT_CHECK(SCSIDiskState, (obj), TYPE_SCSI_DISK_BASE)
62 #define SCSI_DISK_BASE_CLASS(klass) \
63 OBJECT_CLASS_CHECK(SCSIDiskClass, (klass), TYPE_SCSI_DISK_BASE)
64 #define SCSI_DISK_BASE_GET_CLASS(obj) \
65 OBJECT_GET_CLASS(SCSIDiskClass, (obj), TYPE_SCSI_DISK_BASE)
67 struct SCSIDiskClass
{
68 SCSIDeviceClass parent_class
;
70 DMAIOFunc
*dma_writev
;
71 bool (*need_fua_emulation
)(SCSICommand
*cmd
);
72 void (*update_sense
)(SCSIRequest
*r
);
75 typedef struct SCSIDiskReq
{
77 /* Both sector and sector_count are in terms of BDRV_SECTOR_SIZE bytes. */
79 uint32_t sector_count
;
82 bool need_fua_emulation
;
86 unsigned char *status
;
89 #define SCSI_DISK_F_REMOVABLE 0
90 #define SCSI_DISK_F_DPOFUA 1
91 #define SCSI_DISK_F_NO_REMOVABLE_DEVOPS 2
93 struct SCSIDiskState
{
100 uint64_t max_unmap_size
;
101 uint64_t max_io_size
;
111 * 0x0000 - rotation rate not reported
112 * 0x0001 - non-rotating medium (SSD)
113 * 0x0002-0x0400 - reserved
114 * 0x0401-0xffe - rotations per minute
117 uint16_t rotation_rate
;
120 static bool scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, bool acct_failed
);
122 static void scsi_free_request(SCSIRequest
*req
)
124 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
126 qemu_vfree(r
->iov
.iov_base
);
129 /* Helper function for command completion with sense. */
130 static void scsi_check_condition(SCSIDiskReq
*r
, SCSISense sense
)
132 trace_scsi_disk_check_condition(r
->req
.tag
, sense
.key
, sense
.asc
,
134 scsi_req_build_sense(&r
->req
, sense
);
135 scsi_req_complete(&r
->req
, CHECK_CONDITION
);
138 static void scsi_init_iovec(SCSIDiskReq
*r
, size_t size
)
140 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
142 if (!r
->iov
.iov_base
) {
144 r
->iov
.iov_base
= blk_blockalign(s
->qdev
.conf
.blk
, r
->buflen
);
146 r
->iov
.iov_len
= MIN(r
->sector_count
* BDRV_SECTOR_SIZE
, r
->buflen
);
147 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
150 static void scsi_disk_save_request(QEMUFile
*f
, SCSIRequest
*req
)
152 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
154 qemu_put_be64s(f
, &r
->sector
);
155 qemu_put_be32s(f
, &r
->sector_count
);
156 qemu_put_be32s(f
, &r
->buflen
);
158 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
159 qemu_put_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
160 } else if (!req
->retry
) {
161 uint32_t len
= r
->iov
.iov_len
;
162 qemu_put_be32s(f
, &len
);
163 qemu_put_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
168 static void scsi_disk_load_request(QEMUFile
*f
, SCSIRequest
*req
)
170 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
172 qemu_get_be64s(f
, &r
->sector
);
173 qemu_get_be32s(f
, &r
->sector_count
);
174 qemu_get_be32s(f
, &r
->buflen
);
176 scsi_init_iovec(r
, r
->buflen
);
177 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
178 qemu_get_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
179 } else if (!r
->req
.retry
) {
181 qemu_get_be32s(f
, &len
);
182 r
->iov
.iov_len
= len
;
183 assert(r
->iov
.iov_len
<= r
->buflen
);
184 qemu_get_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
188 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
191 static bool scsi_disk_req_check_error(SCSIDiskReq
*r
, int ret
, bool acct_failed
)
193 if (r
->req
.io_canceled
) {
194 scsi_req_cancel_complete(&r
->req
);
198 if (ret
< 0 || (r
->status
&& *r
->status
)) {
199 return scsi_handle_rw_error(r
, -ret
, acct_failed
);
205 static void scsi_aio_complete(void *opaque
, int ret
)
207 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
208 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
210 assert(r
->req
.aiocb
!= NULL
);
212 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
213 if (scsi_disk_req_check_error(r
, ret
, true)) {
217 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
218 scsi_req_complete(&r
->req
, GOOD
);
221 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
222 scsi_req_unref(&r
->req
);
225 static bool scsi_is_cmd_fua(SCSICommand
*cmd
)
227 switch (cmd
->buf
[0]) {
234 return (cmd
->buf
[1] & 8) != 0;
239 case WRITE_VERIFY_10
:
240 case WRITE_VERIFY_12
:
241 case WRITE_VERIFY_16
:
251 static void scsi_write_do_fua(SCSIDiskReq
*r
)
253 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
255 assert(r
->req
.aiocb
== NULL
);
256 assert(!r
->req
.io_canceled
);
258 if (r
->need_fua_emulation
) {
259 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
261 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
265 scsi_req_complete(&r
->req
, GOOD
);
266 scsi_req_unref(&r
->req
);
269 static void scsi_dma_complete_noio(SCSIDiskReq
*r
, int ret
)
271 assert(r
->req
.aiocb
== NULL
);
272 if (scsi_disk_req_check_error(r
, ret
, false)) {
276 r
->sector
+= r
->sector_count
;
278 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
279 scsi_write_do_fua(r
);
282 scsi_req_complete(&r
->req
, GOOD
);
286 scsi_req_unref(&r
->req
);
289 static void scsi_dma_complete(void *opaque
, int ret
)
291 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
292 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
294 assert(r
->req
.aiocb
!= NULL
);
297 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
299 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
301 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
303 scsi_dma_complete_noio(r
, ret
);
304 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
307 static void scsi_read_complete_noio(SCSIDiskReq
*r
, int ret
)
311 assert(r
->req
.aiocb
== NULL
);
312 if (scsi_disk_req_check_error(r
, ret
, false)) {
316 n
= r
->qiov
.size
/ BDRV_SECTOR_SIZE
;
318 r
->sector_count
-= n
;
319 scsi_req_data(&r
->req
, r
->qiov
.size
);
322 scsi_req_unref(&r
->req
);
325 static void scsi_read_complete(void *opaque
, int ret
)
327 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
328 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
330 assert(r
->req
.aiocb
!= NULL
);
333 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
335 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
337 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
338 trace_scsi_disk_read_complete(r
->req
.tag
, r
->qiov
.size
);
340 scsi_read_complete_noio(r
, ret
);
341 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
344 /* Actually issue a read to the block device. */
345 static void scsi_do_read(SCSIDiskReq
*r
, int ret
)
347 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
348 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
350 assert (r
->req
.aiocb
== NULL
);
351 if (scsi_disk_req_check_error(r
, ret
, false)) {
355 /* The request is used as the AIO opaque value, so add a ref. */
356 scsi_req_ref(&r
->req
);
359 dma_acct_start(s
->qdev
.conf
.blk
, &r
->acct
, r
->req
.sg
, BLOCK_ACCT_READ
);
360 r
->req
.resid
-= r
->req
.sg
->size
;
361 r
->req
.aiocb
= dma_blk_io(blk_get_aio_context(s
->qdev
.conf
.blk
),
362 r
->req
.sg
, r
->sector
<< BDRV_SECTOR_BITS
,
364 sdc
->dma_readv
, r
, scsi_dma_complete
, r
,
365 DMA_DIRECTION_FROM_DEVICE
);
367 scsi_init_iovec(r
, SCSI_DMA_BUF_SIZE
);
368 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
369 r
->qiov
.size
, BLOCK_ACCT_READ
);
370 r
->req
.aiocb
= sdc
->dma_readv(r
->sector
<< BDRV_SECTOR_BITS
, &r
->qiov
,
371 scsi_read_complete
, r
, r
);
375 scsi_req_unref(&r
->req
);
378 static void scsi_do_read_cb(void *opaque
, int ret
)
380 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
381 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
383 assert (r
->req
.aiocb
!= NULL
);
386 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
388 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
390 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
392 scsi_do_read(opaque
, ret
);
393 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
396 /* Read more data from scsi device into buffer. */
397 static void scsi_read_data(SCSIRequest
*req
)
399 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
400 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
403 trace_scsi_disk_read_data_count(r
->sector_count
);
404 if (r
->sector_count
== 0) {
405 /* This also clears the sense buffer for REQUEST SENSE. */
406 scsi_req_complete(&r
->req
, GOOD
);
410 /* No data transfer may already be in progress */
411 assert(r
->req
.aiocb
== NULL
);
413 /* The request is used as the AIO opaque value, so add a ref. */
414 scsi_req_ref(&r
->req
);
415 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
416 trace_scsi_disk_read_data_invalid();
417 scsi_read_complete_noio(r
, -EINVAL
);
421 if (!blk_is_available(req
->dev
->conf
.blk
)) {
422 scsi_read_complete_noio(r
, -ENOMEDIUM
);
428 if (first
&& r
->need_fua_emulation
) {
429 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
431 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_do_read_cb
, r
);
438 * scsi_handle_rw_error has two return values. False means that the error
439 * must be ignored, true means that the error has been processed and the
440 * caller should not do anything else for this request. Note that
441 * scsi_handle_rw_error always manages its reference counts, independent
442 * of the return value.
444 static bool scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, bool acct_failed
)
446 bool is_read
= (r
->req
.cmd
.mode
== SCSI_XFER_FROM_DEV
);
447 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
448 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
449 BlockErrorAction action
= blk_get_error_action(s
->qdev
.conf
.blk
,
452 if (action
== BLOCK_ERROR_ACTION_REPORT
) {
454 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
458 /* A passthrough command has run and has produced sense data; check
459 * whether the error has to be handled by the guest or should rather
462 assert(r
->status
&& *r
->status
);
463 if (scsi_sense_buf_is_guest_recoverable(r
->req
.sense
, sizeof(r
->req
.sense
))) {
464 /* These errors are handled by guest. */
465 sdc
->update_sense(&r
->req
);
466 scsi_req_complete(&r
->req
, *r
->status
);
469 error
= scsi_sense_buf_to_errno(r
->req
.sense
, sizeof(r
->req
.sense
));
472 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
475 scsi_check_condition(r
, SENSE_CODE(TARGET_FAILURE
));
478 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
481 scsi_check_condition(r
, SENSE_CODE(SPACE_ALLOC_FAILED
));
484 scsi_check_condition(r
, SENSE_CODE(IO_ERROR
));
489 blk_error_action(s
->qdev
.conf
.blk
, action
, is_read
, error
);
490 if (action
== BLOCK_ERROR_ACTION_IGNORE
) {
491 scsi_req_complete(&r
->req
, 0);
495 if (action
== BLOCK_ERROR_ACTION_STOP
) {
496 scsi_req_retry(&r
->req
);
501 static void scsi_write_complete_noio(SCSIDiskReq
*r
, int ret
)
505 assert (r
->req
.aiocb
== NULL
);
506 if (scsi_disk_req_check_error(r
, ret
, false)) {
510 n
= r
->qiov
.size
/ BDRV_SECTOR_SIZE
;
512 r
->sector_count
-= n
;
513 if (r
->sector_count
== 0) {
514 scsi_write_do_fua(r
);
517 scsi_init_iovec(r
, SCSI_DMA_BUF_SIZE
);
518 trace_scsi_disk_write_complete_noio(r
->req
.tag
, r
->qiov
.size
);
519 scsi_req_data(&r
->req
, r
->qiov
.size
);
523 scsi_req_unref(&r
->req
);
526 static void scsi_write_complete(void * opaque
, int ret
)
528 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
529 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
531 assert (r
->req
.aiocb
!= NULL
);
534 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
536 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
538 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
540 scsi_write_complete_noio(r
, ret
);
541 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
544 static void scsi_write_data(SCSIRequest
*req
)
546 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
547 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
548 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
550 /* No data transfer may already be in progress */
551 assert(r
->req
.aiocb
== NULL
);
553 /* The request is used as the AIO opaque value, so add a ref. */
554 scsi_req_ref(&r
->req
);
555 if (r
->req
.cmd
.mode
!= SCSI_XFER_TO_DEV
) {
556 trace_scsi_disk_write_data_invalid();
557 scsi_write_complete_noio(r
, -EINVAL
);
561 if (!r
->req
.sg
&& !r
->qiov
.size
) {
562 /* Called for the first time. Ask the driver to send us more data. */
564 scsi_write_complete_noio(r
, 0);
567 if (!blk_is_available(req
->dev
->conf
.blk
)) {
568 scsi_write_complete_noio(r
, -ENOMEDIUM
);
572 if (r
->req
.cmd
.buf
[0] == VERIFY_10
|| r
->req
.cmd
.buf
[0] == VERIFY_12
||
573 r
->req
.cmd
.buf
[0] == VERIFY_16
) {
575 scsi_dma_complete_noio(r
, 0);
577 scsi_write_complete_noio(r
, 0);
583 dma_acct_start(s
->qdev
.conf
.blk
, &r
->acct
, r
->req
.sg
, BLOCK_ACCT_WRITE
);
584 r
->req
.resid
-= r
->req
.sg
->size
;
585 r
->req
.aiocb
= dma_blk_io(blk_get_aio_context(s
->qdev
.conf
.blk
),
586 r
->req
.sg
, r
->sector
<< BDRV_SECTOR_BITS
,
588 sdc
->dma_writev
, r
, scsi_dma_complete
, r
,
589 DMA_DIRECTION_TO_DEVICE
);
591 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
592 r
->qiov
.size
, BLOCK_ACCT_WRITE
);
593 r
->req
.aiocb
= sdc
->dma_writev(r
->sector
<< BDRV_SECTOR_BITS
, &r
->qiov
,
594 scsi_write_complete
, r
, r
);
598 /* Return a pointer to the data buffer. */
599 static uint8_t *scsi_get_buf(SCSIRequest
*req
)
601 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
603 return (uint8_t *)r
->iov
.iov_base
;
606 static int scsi_disk_emulate_vpd_page(SCSIRequest
*req
, uint8_t *outbuf
)
608 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
609 uint8_t page_code
= req
->cmd
.buf
[2];
610 int start
, buflen
= 0;
612 outbuf
[buflen
++] = s
->qdev
.type
& 0x1f;
613 outbuf
[buflen
++] = page_code
;
614 outbuf
[buflen
++] = 0x00;
615 outbuf
[buflen
++] = 0x00;
619 case 0x00: /* Supported page codes, mandatory */
621 trace_scsi_disk_emulate_vpd_page_00(req
->cmd
.xfer
);
622 outbuf
[buflen
++] = 0x00; /* list of supported pages (this page) */
624 outbuf
[buflen
++] = 0x80; /* unit serial number */
626 outbuf
[buflen
++] = 0x83; /* device identification */
627 if (s
->qdev
.type
== TYPE_DISK
) {
628 outbuf
[buflen
++] = 0xb0; /* block limits */
629 outbuf
[buflen
++] = 0xb1; /* block device characteristics */
630 outbuf
[buflen
++] = 0xb2; /* thin provisioning */
634 case 0x80: /* Device serial number, optional */
639 trace_scsi_disk_emulate_vpd_page_80_not_supported();
643 l
= strlen(s
->serial
);
648 trace_scsi_disk_emulate_vpd_page_80(req
->cmd
.xfer
);
649 memcpy(outbuf
+ buflen
, s
->serial
, l
);
654 case 0x83: /* Device identification page, mandatory */
656 int id_len
= s
->device_id
? MIN(strlen(s
->device_id
), 255 - 8) : 0;
658 trace_scsi_disk_emulate_vpd_page_83(req
->cmd
.xfer
);
661 outbuf
[buflen
++] = 0x2; /* ASCII */
662 outbuf
[buflen
++] = 0; /* not officially assigned */
663 outbuf
[buflen
++] = 0; /* reserved */
664 outbuf
[buflen
++] = id_len
; /* length of data following */
665 memcpy(outbuf
+ buflen
, s
->device_id
, id_len
);
670 outbuf
[buflen
++] = 0x1; /* Binary */
671 outbuf
[buflen
++] = 0x3; /* NAA */
672 outbuf
[buflen
++] = 0; /* reserved */
673 outbuf
[buflen
++] = 8;
674 stq_be_p(&outbuf
[buflen
], s
->qdev
.wwn
);
678 if (s
->qdev
.port_wwn
) {
679 outbuf
[buflen
++] = 0x61; /* SAS / Binary */
680 outbuf
[buflen
++] = 0x93; /* PIV / Target port / NAA */
681 outbuf
[buflen
++] = 0; /* reserved */
682 outbuf
[buflen
++] = 8;
683 stq_be_p(&outbuf
[buflen
], s
->qdev
.port_wwn
);
688 outbuf
[buflen
++] = 0x61; /* SAS / Binary */
690 /* PIV/Target port/relative target port */
691 outbuf
[buflen
++] = 0x94;
693 outbuf
[buflen
++] = 0; /* reserved */
694 outbuf
[buflen
++] = 4;
695 stw_be_p(&outbuf
[buflen
+ 2], s
->port_index
);
700 case 0xb0: /* block limits */
702 SCSIBlockLimits bl
= {};
704 if (s
->qdev
.type
== TYPE_ROM
) {
705 trace_scsi_disk_emulate_vpd_page_b0_not_supported();
710 s
->qdev
.conf
.discard_granularity
/ s
->qdev
.blocksize
;
712 s
->qdev
.conf
.min_io_size
/ s
->qdev
.blocksize
;
714 s
->qdev
.conf
.opt_io_size
/ s
->qdev
.blocksize
;
715 bl
.max_unmap_sectors
=
716 s
->max_unmap_size
/ s
->qdev
.blocksize
;
718 s
->max_io_size
/ s
->qdev
.blocksize
;
719 /* 255 descriptors fit in 4 KiB with an 8-byte header */
720 bl
.max_unmap_descr
= 255;
722 if (s
->qdev
.type
== TYPE_DISK
) {
723 int max_transfer_blk
= blk_get_max_transfer(s
->qdev
.conf
.blk
);
724 int max_io_sectors_blk
=
725 max_transfer_blk
/ s
->qdev
.blocksize
;
728 MIN_NON_ZERO(max_io_sectors_blk
, bl
.max_io_sectors
);
730 buflen
+= scsi_emulate_block_limits(outbuf
+ buflen
, &bl
);
733 case 0xb1: /* block device characteristics */
736 outbuf
[4] = (s
->rotation_rate
>> 8) & 0xff;
737 outbuf
[5] = s
->rotation_rate
& 0xff;
738 outbuf
[6] = 0; /* PRODUCT TYPE */
739 outbuf
[7] = 0; /* WABEREQ | WACEREQ | NOMINAL FORM FACTOR */
740 outbuf
[8] = 0; /* VBULS */
743 case 0xb2: /* thin provisioning */
747 outbuf
[5] = 0xe0; /* unmap & write_same 10/16 all supported */
748 outbuf
[6] = s
->qdev
.conf
.discard_granularity
? 2 : 1;
756 assert(buflen
- start
<= 255);
757 outbuf
[start
- 1] = buflen
- start
;
761 static int scsi_disk_emulate_inquiry(SCSIRequest
*req
, uint8_t *outbuf
)
763 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
766 if (req
->cmd
.buf
[1] & 0x1) {
767 /* Vital product data */
768 return scsi_disk_emulate_vpd_page(req
, outbuf
);
771 /* Standard INQUIRY data */
772 if (req
->cmd
.buf
[2] != 0) {
777 buflen
= req
->cmd
.xfer
;
778 if (buflen
> SCSI_MAX_INQUIRY_LEN
) {
779 buflen
= SCSI_MAX_INQUIRY_LEN
;
782 outbuf
[0] = s
->qdev
.type
& 0x1f;
783 outbuf
[1] = (s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) ? 0x80 : 0;
785 strpadcpy((char *) &outbuf
[16], 16, s
->product
, ' ');
786 strpadcpy((char *) &outbuf
[8], 8, s
->vendor
, ' ');
788 memset(&outbuf
[32], 0, 4);
789 memcpy(&outbuf
[32], s
->version
, MIN(4, strlen(s
->version
)));
791 * We claim conformance to SPC-3, which is required for guests
792 * to ask for modern features like READ CAPACITY(16) or the
793 * block characteristics VPD page by default. Not all of SPC-3
794 * is actually implemented, but we're good enough.
796 outbuf
[2] = s
->qdev
.default_scsi_version
;
797 outbuf
[3] = 2 | 0x10; /* Format 2, HiSup */
800 outbuf
[4] = buflen
- 5; /* Additional Length = (Len - 1) - 4 */
802 /* If the allocation length of CDB is too small,
803 the additional length is not adjusted */
807 /* Sync data transfer and TCQ. */
808 outbuf
[7] = 0x10 | (req
->bus
->info
->tcq
? 0x02 : 0);
812 static inline bool media_is_dvd(SCSIDiskState
*s
)
815 if (s
->qdev
.type
!= TYPE_ROM
) {
818 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
821 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
822 return nb_sectors
> CD_MAX_SECTORS
;
825 static inline bool media_is_cd(SCSIDiskState
*s
)
828 if (s
->qdev
.type
!= TYPE_ROM
) {
831 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
834 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
835 return nb_sectors
<= CD_MAX_SECTORS
;
838 static int scsi_read_disc_information(SCSIDiskState
*s
, SCSIDiskReq
*r
,
841 uint8_t type
= r
->req
.cmd
.buf
[1] & 7;
843 if (s
->qdev
.type
!= TYPE_ROM
) {
847 /* Types 1/2 are only defined for Blu-Ray. */
849 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
853 memset(outbuf
, 0, 34);
855 outbuf
[2] = 0xe; /* last session complete, disc finalized */
856 outbuf
[3] = 1; /* first track on disc */
857 outbuf
[4] = 1; /* # of sessions */
858 outbuf
[5] = 1; /* first track of last session */
859 outbuf
[6] = 1; /* last track of last session */
860 outbuf
[7] = 0x20; /* unrestricted use */
861 outbuf
[8] = 0x00; /* CD-ROM or DVD-ROM */
862 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
863 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
864 /* 24-31: disc bar code */
865 /* 32: disc application code */
866 /* 33: number of OPC tables */
871 static int scsi_read_dvd_structure(SCSIDiskState
*s
, SCSIDiskReq
*r
,
874 static const int rds_caps_size
[5] = {
881 uint8_t media
= r
->req
.cmd
.buf
[1];
882 uint8_t layer
= r
->req
.cmd
.buf
[6];
883 uint8_t format
= r
->req
.cmd
.buf
[7];
886 if (s
->qdev
.type
!= TYPE_ROM
) {
890 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
894 if (format
!= 0xff) {
895 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
896 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
899 if (media_is_cd(s
)) {
900 scsi_check_condition(r
, SENSE_CODE(INCOMPATIBLE_FORMAT
));
903 if (format
>= ARRAY_SIZE(rds_caps_size
)) {
906 size
= rds_caps_size
[format
];
907 memset(outbuf
, 0, size
);
912 /* Physical format information */
917 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
919 outbuf
[4] = 1; /* DVD-ROM, part version 1 */
920 outbuf
[5] = 0xf; /* 120mm disc, minimum rate unspecified */
921 outbuf
[6] = 1; /* one layer, read-only (per MMC-2 spec) */
922 outbuf
[7] = 0; /* default densities */
924 stl_be_p(&outbuf
[12], (nb_sectors
>> 2) - 1); /* end sector */
925 stl_be_p(&outbuf
[16], (nb_sectors
>> 2) - 1); /* l0 end sector */
929 case 0x01: /* DVD copyright information, all zeros */
932 case 0x03: /* BCA information - invalid field for no BCA info */
935 case 0x04: /* DVD disc manufacturing information, all zeros */
938 case 0xff: { /* List capabilities */
941 for (i
= 0; i
< ARRAY_SIZE(rds_caps_size
); i
++) {
942 if (!rds_caps_size
[i
]) {
946 outbuf
[size
+ 1] = 0x40; /* Not writable, readable */
947 stw_be_p(&outbuf
[size
+ 2], rds_caps_size
[i
]);
957 /* Size of buffer, not including 2 byte size field */
958 stw_be_p(outbuf
, size
- 2);
965 static int scsi_event_status_media(SCSIDiskState
*s
, uint8_t *outbuf
)
967 uint8_t event_code
, media_status
;
971 media_status
= MS_TRAY_OPEN
;
972 } else if (blk_is_inserted(s
->qdev
.conf
.blk
)) {
973 media_status
= MS_MEDIA_PRESENT
;
976 /* Event notification descriptor */
977 event_code
= MEC_NO_CHANGE
;
978 if (media_status
!= MS_TRAY_OPEN
) {
979 if (s
->media_event
) {
980 event_code
= MEC_NEW_MEDIA
;
981 s
->media_event
= false;
982 } else if (s
->eject_request
) {
983 event_code
= MEC_EJECT_REQUESTED
;
984 s
->eject_request
= false;
988 outbuf
[0] = event_code
;
989 outbuf
[1] = media_status
;
991 /* These fields are reserved, just clear them. */
997 static int scsi_get_event_status_notification(SCSIDiskState
*s
, SCSIDiskReq
*r
,
1001 uint8_t *buf
= r
->req
.cmd
.buf
;
1002 uint8_t notification_class_request
= buf
[4];
1003 if (s
->qdev
.type
!= TYPE_ROM
) {
1006 if ((buf
[1] & 1) == 0) {
1012 outbuf
[0] = outbuf
[1] = 0;
1013 outbuf
[3] = 1 << GESN_MEDIA
; /* supported events */
1014 if (notification_class_request
& (1 << GESN_MEDIA
)) {
1015 outbuf
[2] = GESN_MEDIA
;
1016 size
+= scsi_event_status_media(s
, &outbuf
[size
]);
1020 stw_be_p(outbuf
, size
- 4);
1024 static int scsi_get_configuration(SCSIDiskState
*s
, uint8_t *outbuf
)
1028 if (s
->qdev
.type
!= TYPE_ROM
) {
1032 if (media_is_dvd(s
)) {
1033 current
= MMC_PROFILE_DVD_ROM
;
1034 } else if (media_is_cd(s
)) {
1035 current
= MMC_PROFILE_CD_ROM
;
1037 current
= MMC_PROFILE_NONE
;
1040 memset(outbuf
, 0, 40);
1041 stl_be_p(&outbuf
[0], 36); /* Bytes after the data length field */
1042 stw_be_p(&outbuf
[6], current
);
1043 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
1044 outbuf
[10] = 0x03; /* persistent, current */
1045 outbuf
[11] = 8; /* two profiles */
1046 stw_be_p(&outbuf
[12], MMC_PROFILE_DVD_ROM
);
1047 outbuf
[14] = (current
== MMC_PROFILE_DVD_ROM
);
1048 stw_be_p(&outbuf
[16], MMC_PROFILE_CD_ROM
);
1049 outbuf
[18] = (current
== MMC_PROFILE_CD_ROM
);
1050 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
1051 stw_be_p(&outbuf
[20], 1);
1052 outbuf
[22] = 0x08 | 0x03; /* version 2, persistent, current */
1054 stl_be_p(&outbuf
[24], 1); /* SCSI */
1055 outbuf
[28] = 1; /* DBE = 1, mandatory */
1056 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
1057 stw_be_p(&outbuf
[32], 3);
1058 outbuf
[34] = 0x08 | 0x03; /* version 2, persistent, current */
1060 outbuf
[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
1061 /* TODO: Random readable, CD read, DVD read, drive serial number,
1066 static int scsi_emulate_mechanism_status(SCSIDiskState
*s
, uint8_t *outbuf
)
1068 if (s
->qdev
.type
!= TYPE_ROM
) {
1071 memset(outbuf
, 0, 8);
1072 outbuf
[5] = 1; /* CD-ROM */
1076 static int mode_sense_page(SCSIDiskState
*s
, int page
, uint8_t **p_outbuf
,
1079 static const int mode_sense_valid
[0x3f] = {
1080 [MODE_PAGE_HD_GEOMETRY
] = (1 << TYPE_DISK
),
1081 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
] = (1 << TYPE_DISK
),
1082 [MODE_PAGE_CACHING
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
1083 [MODE_PAGE_R_W_ERROR
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
1084 [MODE_PAGE_AUDIO_CTL
] = (1 << TYPE_ROM
),
1085 [MODE_PAGE_CAPABILITIES
] = (1 << TYPE_ROM
),
1088 uint8_t *p
= *p_outbuf
+ 2;
1091 if ((mode_sense_valid
[page
] & (1 << s
->qdev
.type
)) == 0) {
1096 * If Changeable Values are requested, a mask denoting those mode parameters
1097 * that are changeable shall be returned. As we currently don't support
1098 * parameter changes via MODE_SELECT all bits are returned set to zero.
1099 * The buffer was already menset to zero by the caller of this function.
1101 * The offsets here are off by two compared to the descriptions in the
1102 * SCSI specs, because those include a 2-byte header. This is unfortunate,
1103 * but it is done so that offsets are consistent within our implementation
1104 * of MODE SENSE and MODE SELECT. MODE SELECT has to deal with both
1105 * 2-byte and 4-byte headers.
1108 case MODE_PAGE_HD_GEOMETRY
:
1110 if (page_control
== 1) { /* Changeable Values */
1113 /* if a geometry hint is available, use it */
1114 p
[0] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1115 p
[1] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1116 p
[2] = s
->qdev
.conf
.cyls
& 0xff;
1117 p
[3] = s
->qdev
.conf
.heads
& 0xff;
1118 /* Write precomp start cylinder, disabled */
1119 p
[4] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1120 p
[5] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1121 p
[6] = s
->qdev
.conf
.cyls
& 0xff;
1122 /* Reduced current start cylinder, disabled */
1123 p
[7] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1124 p
[8] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1125 p
[9] = s
->qdev
.conf
.cyls
& 0xff;
1126 /* Device step rate [ns], 200ns */
1129 /* Landing zone cylinder */
1133 /* Medium rotation rate [rpm], 5400 rpm */
1134 p
[18] = (5400 >> 8) & 0xff;
1135 p
[19] = 5400 & 0xff;
1138 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
:
1140 if (page_control
== 1) { /* Changeable Values */
1143 /* Transfer rate [kbit/s], 5Mbit/s */
1146 /* if a geometry hint is available, use it */
1147 p
[2] = s
->qdev
.conf
.heads
& 0xff;
1148 p
[3] = s
->qdev
.conf
.secs
& 0xff;
1149 p
[4] = s
->qdev
.blocksize
>> 8;
1150 p
[6] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1151 p
[7] = s
->qdev
.conf
.cyls
& 0xff;
1152 /* Write precomp start cylinder, disabled */
1153 p
[8] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1154 p
[9] = s
->qdev
.conf
.cyls
& 0xff;
1155 /* Reduced current start cylinder, disabled */
1156 p
[10] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1157 p
[11] = s
->qdev
.conf
.cyls
& 0xff;
1158 /* Device step rate [100us], 100us */
1161 /* Device step pulse width [us], 1us */
1163 /* Device head settle delay [100us], 100us */
1166 /* Motor on delay [0.1s], 0.1s */
1168 /* Motor off delay [0.1s], 0.1s */
1170 /* Medium rotation rate [rpm], 5400 rpm */
1171 p
[26] = (5400 >> 8) & 0xff;
1172 p
[27] = 5400 & 0xff;
1175 case MODE_PAGE_CACHING
:
1177 if (page_control
== 1 || /* Changeable Values */
1178 blk_enable_write_cache(s
->qdev
.conf
.blk
)) {
1183 case MODE_PAGE_R_W_ERROR
:
1185 if (page_control
== 1) { /* Changeable Values */
1188 p
[0] = 0x80; /* Automatic Write Reallocation Enabled */
1189 if (s
->qdev
.type
== TYPE_ROM
) {
1190 p
[1] = 0x20; /* Read Retry Count */
1194 case MODE_PAGE_AUDIO_CTL
:
1198 case MODE_PAGE_CAPABILITIES
:
1200 if (page_control
== 1) { /* Changeable Values */
1204 p
[0] = 0x3b; /* CD-R & CD-RW read */
1205 p
[1] = 0; /* Writing not supported */
1206 p
[2] = 0x7f; /* Audio, composite, digital out,
1207 mode 2 form 1&2, multi session */
1208 p
[3] = 0xff; /* CD DA, DA accurate, RW supported,
1209 RW corrected, C2 errors, ISRC,
1211 p
[4] = 0x2d | (s
->tray_locked
? 2 : 0);
1212 /* Locking supported, jumper present, eject, tray */
1213 p
[5] = 0; /* no volume & mute control, no
1215 p
[6] = (50 * 176) >> 8; /* 50x read speed */
1216 p
[7] = (50 * 176) & 0xff;
1217 p
[8] = 2 >> 8; /* Two volume levels */
1219 p
[10] = 2048 >> 8; /* 2M buffer */
1220 p
[11] = 2048 & 0xff;
1221 p
[12] = (16 * 176) >> 8; /* 16x read speed current */
1222 p
[13] = (16 * 176) & 0xff;
1223 p
[16] = (16 * 176) >> 8; /* 16x write speed */
1224 p
[17] = (16 * 176) & 0xff;
1225 p
[18] = (16 * 176) >> 8; /* 16x write speed current */
1226 p
[19] = (16 * 176) & 0xff;
1233 assert(length
< 256);
1234 (*p_outbuf
)[0] = page
;
1235 (*p_outbuf
)[1] = length
;
1236 *p_outbuf
+= length
+ 2;
1240 static int scsi_disk_emulate_mode_sense(SCSIDiskReq
*r
, uint8_t *outbuf
)
1242 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1243 uint64_t nb_sectors
;
1245 int page
, buflen
, ret
, page_control
;
1247 uint8_t dev_specific_param
;
1249 dbd
= (r
->req
.cmd
.buf
[1] & 0x8) != 0;
1250 page
= r
->req
.cmd
.buf
[2] & 0x3f;
1251 page_control
= (r
->req
.cmd
.buf
[2] & 0xc0) >> 6;
1253 trace_scsi_disk_emulate_mode_sense((r
->req
.cmd
.buf
[0] == MODE_SENSE
) ? 6 :
1254 10, page
, r
->req
.cmd
.xfer
, page_control
);
1255 memset(outbuf
, 0, r
->req
.cmd
.xfer
);
1258 if (s
->qdev
.type
== TYPE_DISK
) {
1259 dev_specific_param
= s
->features
& (1 << SCSI_DISK_F_DPOFUA
) ? 0x10 : 0;
1260 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
1261 dev_specific_param
|= 0x80; /* Readonly. */
1264 /* MMC prescribes that CD/DVD drives have no block descriptors,
1265 * and defines no device-specific parameter. */
1266 dev_specific_param
= 0x00;
1270 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1271 p
[1] = 0; /* Default media type. */
1272 p
[2] = dev_specific_param
;
1273 p
[3] = 0; /* Block descriptor length. */
1275 } else { /* MODE_SENSE_10 */
1276 p
[2] = 0; /* Default media type. */
1277 p
[3] = dev_specific_param
;
1278 p
[6] = p
[7] = 0; /* Block descriptor length. */
1282 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1283 if (!dbd
&& nb_sectors
) {
1284 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1285 outbuf
[3] = 8; /* Block descriptor length */
1286 } else { /* MODE_SENSE_10 */
1287 outbuf
[7] = 8; /* Block descriptor length */
1289 nb_sectors
/= (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1290 if (nb_sectors
> 0xffffff) {
1293 p
[0] = 0; /* media density code */
1294 p
[1] = (nb_sectors
>> 16) & 0xff;
1295 p
[2] = (nb_sectors
>> 8) & 0xff;
1296 p
[3] = nb_sectors
& 0xff;
1297 p
[4] = 0; /* reserved */
1298 p
[5] = 0; /* bytes 5-7 are the sector size in bytes */
1299 p
[6] = s
->qdev
.blocksize
>> 8;
1304 if (page_control
== 3) {
1306 scsi_check_condition(r
, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED
));
1311 for (page
= 0; page
<= 0x3e; page
++) {
1312 mode_sense_page(s
, page
, &p
, page_control
);
1315 ret
= mode_sense_page(s
, page
, &p
, page_control
);
1321 buflen
= p
- outbuf
;
1323 * The mode data length field specifies the length in bytes of the
1324 * following data that is available to be transferred. The mode data
1325 * length does not include itself.
1327 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1328 outbuf
[0] = buflen
- 1;
1329 } else { /* MODE_SENSE_10 */
1330 outbuf
[0] = ((buflen
- 2) >> 8) & 0xff;
1331 outbuf
[1] = (buflen
- 2) & 0xff;
1336 static int scsi_disk_emulate_read_toc(SCSIRequest
*req
, uint8_t *outbuf
)
1338 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1339 int start_track
, format
, msf
, toclen
;
1340 uint64_t nb_sectors
;
1342 msf
= req
->cmd
.buf
[1] & 2;
1343 format
= req
->cmd
.buf
[2] & 0xf;
1344 start_track
= req
->cmd
.buf
[6];
1345 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1346 trace_scsi_disk_emulate_read_toc(start_track
, format
, msf
>> 1);
1347 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
1350 toclen
= cdrom_read_toc(nb_sectors
, outbuf
, msf
, start_track
);
1353 /* multi session : only a single session defined */
1355 memset(outbuf
, 0, 12);
1361 toclen
= cdrom_read_toc_raw(nb_sectors
, outbuf
, msf
, start_track
);
1369 static int scsi_disk_emulate_start_stop(SCSIDiskReq
*r
)
1371 SCSIRequest
*req
= &r
->req
;
1372 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1373 bool start
= req
->cmd
.buf
[4] & 1;
1374 bool loej
= req
->cmd
.buf
[4] & 2; /* load on start, eject on !start */
1375 int pwrcnd
= req
->cmd
.buf
[4] & 0xf0;
1378 /* eject/load only happens for power condition == 0 */
1382 if ((s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) && loej
) {
1383 if (!start
&& !s
->tray_open
&& s
->tray_locked
) {
1384 scsi_check_condition(r
,
1385 blk_is_inserted(s
->qdev
.conf
.blk
)
1386 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED
)
1387 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED
));
1391 if (s
->tray_open
!= !start
) {
1392 blk_eject(s
->qdev
.conf
.blk
, !start
);
1393 s
->tray_open
= !start
;
1399 static void scsi_disk_emulate_read_data(SCSIRequest
*req
)
1401 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1402 int buflen
= r
->iov
.iov_len
;
1405 trace_scsi_disk_emulate_read_data(buflen
);
1408 scsi_req_data(&r
->req
, buflen
);
1412 /* This also clears the sense buffer for REQUEST SENSE. */
1413 scsi_req_complete(&r
->req
, GOOD
);
1416 static int scsi_disk_check_mode_select(SCSIDiskState
*s
, int page
,
1417 uint8_t *inbuf
, int inlen
)
1419 uint8_t mode_current
[SCSI_MAX_MODE_LEN
];
1420 uint8_t mode_changeable
[SCSI_MAX_MODE_LEN
];
1422 int len
, expected_len
, changeable_len
, i
;
1424 /* The input buffer does not include the page header, so it is
1427 expected_len
= inlen
+ 2;
1428 if (expected_len
> SCSI_MAX_MODE_LEN
) {
1433 memset(mode_current
, 0, inlen
+ 2);
1434 len
= mode_sense_page(s
, page
, &p
, 0);
1435 if (len
< 0 || len
!= expected_len
) {
1439 p
= mode_changeable
;
1440 memset(mode_changeable
, 0, inlen
+ 2);
1441 changeable_len
= mode_sense_page(s
, page
, &p
, 1);
1442 assert(changeable_len
== len
);
1444 /* Check that unchangeable bits are the same as what MODE SENSE
1447 for (i
= 2; i
< len
; i
++) {
1448 if (((mode_current
[i
] ^ inbuf
[i
- 2]) & ~mode_changeable
[i
]) != 0) {
1455 static void scsi_disk_apply_mode_select(SCSIDiskState
*s
, int page
, uint8_t *p
)
1458 case MODE_PAGE_CACHING
:
1459 blk_set_enable_write_cache(s
->qdev
.conf
.blk
, (p
[0] & 4) != 0);
1467 static int mode_select_pages(SCSIDiskReq
*r
, uint8_t *p
, int len
, bool change
)
1469 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1472 int page
, subpage
, page_len
;
1474 /* Parse both possible formats for the mode page headers. */
1478 goto invalid_param_len
;
1481 page_len
= lduw_be_p(&p
[2]);
1486 goto invalid_param_len
;
1497 if (page_len
> len
) {
1498 goto invalid_param_len
;
1502 if (scsi_disk_check_mode_select(s
, page
, p
, page_len
) < 0) {
1506 scsi_disk_apply_mode_select(s
, page
, p
);
1515 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM
));
1519 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1523 static void scsi_disk_emulate_mode_select(SCSIDiskReq
*r
, uint8_t *inbuf
)
1525 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1527 int cmd
= r
->req
.cmd
.buf
[0];
1528 int len
= r
->req
.cmd
.xfer
;
1529 int hdr_len
= (cmd
== MODE_SELECT
? 4 : 8);
1533 /* We only support PF=1, SP=0. */
1534 if ((r
->req
.cmd
.buf
[1] & 0x11) != 0x10) {
1538 if (len
< hdr_len
) {
1539 goto invalid_param_len
;
1542 bd_len
= (cmd
== MODE_SELECT
? p
[3] : lduw_be_p(&p
[6]));
1546 goto invalid_param_len
;
1548 if (bd_len
!= 0 && bd_len
!= 8) {
1555 /* Ensure no change is made if there is an error! */
1556 for (pass
= 0; pass
< 2; pass
++) {
1557 if (mode_select_pages(r
, p
, len
, pass
== 1) < 0) {
1562 if (!blk_enable_write_cache(s
->qdev
.conf
.blk
)) {
1563 /* The request is used as the AIO opaque value, so add a ref. */
1564 scsi_req_ref(&r
->req
);
1565 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
1567 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
1571 scsi_req_complete(&r
->req
, GOOD
);
1575 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM
));
1579 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1583 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1586 static inline bool check_lba_range(SCSIDiskState
*s
,
1587 uint64_t sector_num
, uint32_t nb_sectors
)
1590 * The first line tests that no overflow happens when computing the last
1591 * sector. The second line tests that the last accessed sector is in
1594 * Careful, the computations should not underflow for nb_sectors == 0,
1595 * and a 0-block read to the first LBA beyond the end of device is
1598 return (sector_num
<= sector_num
+ nb_sectors
&&
1599 sector_num
+ nb_sectors
<= s
->qdev
.max_lba
+ 1);
1602 typedef struct UnmapCBData
{
1608 static void scsi_unmap_complete(void *opaque
, int ret
);
1610 static void scsi_unmap_complete_noio(UnmapCBData
*data
, int ret
)
1612 SCSIDiskReq
*r
= data
->r
;
1613 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1615 assert(r
->req
.aiocb
== NULL
);
1617 if (data
->count
> 0) {
1618 r
->sector
= ldq_be_p(&data
->inbuf
[0])
1619 * (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1620 r
->sector_count
= (ldl_be_p(&data
->inbuf
[8]) & 0xffffffffULL
)
1621 * (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1622 if (!check_lba_range(s
, r
->sector
, r
->sector_count
)) {
1623 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
),
1625 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1629 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1630 r
->sector_count
* BDRV_SECTOR_SIZE
,
1633 r
->req
.aiocb
= blk_aio_pdiscard(s
->qdev
.conf
.blk
,
1634 r
->sector
* BDRV_SECTOR_SIZE
,
1635 r
->sector_count
* BDRV_SECTOR_SIZE
,
1636 scsi_unmap_complete
, data
);
1642 scsi_req_complete(&r
->req
, GOOD
);
1645 scsi_req_unref(&r
->req
);
1649 static void scsi_unmap_complete(void *opaque
, int ret
)
1651 UnmapCBData
*data
= opaque
;
1652 SCSIDiskReq
*r
= data
->r
;
1653 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1655 assert(r
->req
.aiocb
!= NULL
);
1656 r
->req
.aiocb
= NULL
;
1658 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
1659 if (scsi_disk_req_check_error(r
, ret
, true)) {
1660 scsi_req_unref(&r
->req
);
1663 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
1664 scsi_unmap_complete_noio(data
, ret
);
1666 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
1669 static void scsi_disk_emulate_unmap(SCSIDiskReq
*r
, uint8_t *inbuf
)
1671 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1673 int len
= r
->req
.cmd
.xfer
;
1676 /* Reject ANCHOR=1. */
1677 if (r
->req
.cmd
.buf
[1] & 0x1) {
1682 goto invalid_param_len
;
1684 if (len
< lduw_be_p(&p
[0]) + 2) {
1685 goto invalid_param_len
;
1687 if (len
< lduw_be_p(&p
[2]) + 8) {
1688 goto invalid_param_len
;
1690 if (lduw_be_p(&p
[2]) & 15) {
1691 goto invalid_param_len
;
1694 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
1695 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
), BLOCK_ACCT_UNMAP
);
1696 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
1700 data
= g_new0(UnmapCBData
, 1);
1702 data
->inbuf
= &p
[8];
1703 data
->count
= lduw_be_p(&p
[2]) >> 4;
1705 /* The matching unref is in scsi_unmap_complete, before data is freed. */
1706 scsi_req_ref(&r
->req
);
1707 scsi_unmap_complete_noio(data
, 0);
1711 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
), BLOCK_ACCT_UNMAP
);
1712 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1716 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
), BLOCK_ACCT_UNMAP
);
1717 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1720 typedef struct WriteSameCBData
{
1728 static void scsi_write_same_complete(void *opaque
, int ret
)
1730 WriteSameCBData
*data
= opaque
;
1731 SCSIDiskReq
*r
= data
->r
;
1732 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1734 assert(r
->req
.aiocb
!= NULL
);
1735 r
->req
.aiocb
= NULL
;
1736 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
1737 if (scsi_disk_req_check_error(r
, ret
, true)) {
1741 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
1743 data
->nb_sectors
-= data
->iov
.iov_len
/ BDRV_SECTOR_SIZE
;
1744 data
->sector
+= data
->iov
.iov_len
/ BDRV_SECTOR_SIZE
;
1745 data
->iov
.iov_len
= MIN(data
->nb_sectors
* BDRV_SECTOR_SIZE
,
1747 if (data
->iov
.iov_len
) {
1748 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1749 data
->iov
.iov_len
, BLOCK_ACCT_WRITE
);
1750 /* Reinitialize qiov, to handle unaligned WRITE SAME request
1751 * where final qiov may need smaller size */
1752 qemu_iovec_init_external(&data
->qiov
, &data
->iov
, 1);
1753 r
->req
.aiocb
= blk_aio_pwritev(s
->qdev
.conf
.blk
,
1754 data
->sector
<< BDRV_SECTOR_BITS
,
1756 scsi_write_same_complete
, data
);
1757 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
1761 scsi_req_complete(&r
->req
, GOOD
);
1764 scsi_req_unref(&r
->req
);
1765 qemu_vfree(data
->iov
.iov_base
);
1767 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
1770 static void scsi_disk_emulate_write_same(SCSIDiskReq
*r
, uint8_t *inbuf
)
1772 SCSIRequest
*req
= &r
->req
;
1773 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1774 uint32_t nb_sectors
= scsi_data_cdb_xfer(r
->req
.cmd
.buf
);
1775 WriteSameCBData
*data
;
1779 /* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
1780 if (nb_sectors
== 0 || (req
->cmd
.buf
[1] & 0x16)) {
1781 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1785 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
1786 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
1789 if (!check_lba_range(s
, r
->req
.cmd
.lba
, nb_sectors
)) {
1790 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1794 if ((req
->cmd
.buf
[1] & 0x1) || buffer_is_zero(inbuf
, s
->qdev
.blocksize
)) {
1795 int flags
= (req
->cmd
.buf
[1] & 0x8) ? BDRV_REQ_MAY_UNMAP
: 0;
1797 /* The request is used as the AIO opaque value, so add a ref. */
1798 scsi_req_ref(&r
->req
);
1799 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1800 nb_sectors
* s
->qdev
.blocksize
,
1802 r
->req
.aiocb
= blk_aio_pwrite_zeroes(s
->qdev
.conf
.blk
,
1803 r
->req
.cmd
.lba
* s
->qdev
.blocksize
,
1804 nb_sectors
* s
->qdev
.blocksize
,
1805 flags
, scsi_aio_complete
, r
);
1809 data
= g_new0(WriteSameCBData
, 1);
1811 data
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1812 data
->nb_sectors
= nb_sectors
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1813 data
->iov
.iov_len
= MIN(data
->nb_sectors
* BDRV_SECTOR_SIZE
,
1814 SCSI_WRITE_SAME_MAX
);
1815 data
->iov
.iov_base
= buf
= blk_blockalign(s
->qdev
.conf
.blk
,
1817 qemu_iovec_init_external(&data
->qiov
, &data
->iov
, 1);
1819 for (i
= 0; i
< data
->iov
.iov_len
; i
+= s
->qdev
.blocksize
) {
1820 memcpy(&buf
[i
], inbuf
, s
->qdev
.blocksize
);
1823 scsi_req_ref(&r
->req
);
1824 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1825 data
->iov
.iov_len
, BLOCK_ACCT_WRITE
);
1826 r
->req
.aiocb
= blk_aio_pwritev(s
->qdev
.conf
.blk
,
1827 data
->sector
<< BDRV_SECTOR_BITS
,
1829 scsi_write_same_complete
, data
);
1832 static void scsi_disk_emulate_write_data(SCSIRequest
*req
)
1834 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1836 if (r
->iov
.iov_len
) {
1837 int buflen
= r
->iov
.iov_len
;
1838 trace_scsi_disk_emulate_write_data(buflen
);
1840 scsi_req_data(&r
->req
, buflen
);
1844 switch (req
->cmd
.buf
[0]) {
1846 case MODE_SELECT_10
:
1847 /* This also clears the sense buffer for REQUEST SENSE. */
1848 scsi_disk_emulate_mode_select(r
, r
->iov
.iov_base
);
1852 scsi_disk_emulate_unmap(r
, r
->iov
.iov_base
);
1858 if (r
->req
.status
== -1) {
1859 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1865 scsi_disk_emulate_write_same(r
, r
->iov
.iov_base
);
1873 static int32_t scsi_disk_emulate_command(SCSIRequest
*req
, uint8_t *buf
)
1875 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1876 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1877 uint64_t nb_sectors
;
1881 switch (req
->cmd
.buf
[0]) {
1890 case ALLOW_MEDIUM_REMOVAL
:
1891 case GET_CONFIGURATION
:
1892 case GET_EVENT_STATUS_NOTIFICATION
:
1893 case MECHANISM_STATUS
:
1898 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
1899 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
1906 * FIXME: we shouldn't return anything bigger than 4k, but the code
1907 * requires the buffer to be as big as req->cmd.xfer in several
1908 * places. So, do not allow CDBs with a very large ALLOCATION
1909 * LENGTH. The real fix would be to modify scsi_read_data and
1910 * dma_buf_read, so that they return data beyond the buflen
1913 if (req
->cmd
.xfer
> 65536) {
1914 goto illegal_request
;
1916 r
->buflen
= MAX(4096, req
->cmd
.xfer
);
1918 if (!r
->iov
.iov_base
) {
1919 r
->iov
.iov_base
= blk_blockalign(s
->qdev
.conf
.blk
, r
->buflen
);
1922 outbuf
= r
->iov
.iov_base
;
1923 memset(outbuf
, 0, r
->buflen
);
1924 switch (req
->cmd
.buf
[0]) {
1925 case TEST_UNIT_READY
:
1926 assert(blk_is_available(s
->qdev
.conf
.blk
));
1929 buflen
= scsi_disk_emulate_inquiry(req
, outbuf
);
1931 goto illegal_request
;
1936 buflen
= scsi_disk_emulate_mode_sense(r
, outbuf
);
1938 goto illegal_request
;
1942 buflen
= scsi_disk_emulate_read_toc(req
, outbuf
);
1944 goto illegal_request
;
1948 if (req
->cmd
.buf
[1] & 1) {
1949 goto illegal_request
;
1953 if (req
->cmd
.buf
[1] & 3) {
1954 goto illegal_request
;
1958 if (req
->cmd
.buf
[1] & 1) {
1959 goto illegal_request
;
1963 if (req
->cmd
.buf
[1] & 3) {
1964 goto illegal_request
;
1968 if (scsi_disk_emulate_start_stop(r
) < 0) {
1972 case ALLOW_MEDIUM_REMOVAL
:
1973 s
->tray_locked
= req
->cmd
.buf
[4] & 1;
1974 blk_lock_medium(s
->qdev
.conf
.blk
, req
->cmd
.buf
[4] & 1);
1976 case READ_CAPACITY_10
:
1977 /* The normal LEN field for this command is zero. */
1978 memset(outbuf
, 0, 8);
1979 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1981 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
1984 if ((req
->cmd
.buf
[8] & 1) == 0 && req
->cmd
.lba
) {
1985 goto illegal_request
;
1987 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
1988 /* Returned value is the address of the last sector. */
1990 /* Remember the new size for read/write sanity checking. */
1991 s
->qdev
.max_lba
= nb_sectors
;
1992 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1993 if (nb_sectors
> UINT32_MAX
) {
1994 nb_sectors
= UINT32_MAX
;
1996 outbuf
[0] = (nb_sectors
>> 24) & 0xff;
1997 outbuf
[1] = (nb_sectors
>> 16) & 0xff;
1998 outbuf
[2] = (nb_sectors
>> 8) & 0xff;
1999 outbuf
[3] = nb_sectors
& 0xff;
2002 outbuf
[6] = s
->qdev
.blocksize
>> 8;
2006 /* Just return "NO SENSE". */
2007 buflen
= scsi_convert_sense(NULL
, 0, outbuf
, r
->buflen
,
2008 (req
->cmd
.buf
[1] & 1) == 0);
2010 goto illegal_request
;
2013 case MECHANISM_STATUS
:
2014 buflen
= scsi_emulate_mechanism_status(s
, outbuf
);
2016 goto illegal_request
;
2019 case GET_CONFIGURATION
:
2020 buflen
= scsi_get_configuration(s
, outbuf
);
2022 goto illegal_request
;
2025 case GET_EVENT_STATUS_NOTIFICATION
:
2026 buflen
= scsi_get_event_status_notification(s
, r
, outbuf
);
2028 goto illegal_request
;
2031 case READ_DISC_INFORMATION
:
2032 buflen
= scsi_read_disc_information(s
, r
, outbuf
);
2034 goto illegal_request
;
2037 case READ_DVD_STRUCTURE
:
2038 buflen
= scsi_read_dvd_structure(s
, r
, outbuf
);
2040 goto illegal_request
;
2043 case SERVICE_ACTION_IN_16
:
2044 /* Service Action In subcommands. */
2045 if ((req
->cmd
.buf
[1] & 31) == SAI_READ_CAPACITY_16
) {
2046 trace_scsi_disk_emulate_command_SAI_16();
2047 memset(outbuf
, 0, req
->cmd
.xfer
);
2048 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
2050 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
2053 if ((req
->cmd
.buf
[14] & 1) == 0 && req
->cmd
.lba
) {
2054 goto illegal_request
;
2056 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
2057 /* Returned value is the address of the last sector. */
2059 /* Remember the new size for read/write sanity checking. */
2060 s
->qdev
.max_lba
= nb_sectors
;
2061 outbuf
[0] = (nb_sectors
>> 56) & 0xff;
2062 outbuf
[1] = (nb_sectors
>> 48) & 0xff;
2063 outbuf
[2] = (nb_sectors
>> 40) & 0xff;
2064 outbuf
[3] = (nb_sectors
>> 32) & 0xff;
2065 outbuf
[4] = (nb_sectors
>> 24) & 0xff;
2066 outbuf
[5] = (nb_sectors
>> 16) & 0xff;
2067 outbuf
[6] = (nb_sectors
>> 8) & 0xff;
2068 outbuf
[7] = nb_sectors
& 0xff;
2071 outbuf
[10] = s
->qdev
.blocksize
>> 8;
2074 outbuf
[13] = get_physical_block_exp(&s
->qdev
.conf
);
2076 /* set TPE bit if the format supports discard */
2077 if (s
->qdev
.conf
.discard_granularity
) {
2081 /* Protection, exponent and lowest lba field left blank. */
2084 trace_scsi_disk_emulate_command_SAI_unsupported();
2085 goto illegal_request
;
2086 case SYNCHRONIZE_CACHE
:
2087 /* The request is used as the AIO opaque value, so add a ref. */
2088 scsi_req_ref(&r
->req
);
2089 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
2091 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
2094 trace_scsi_disk_emulate_command_SEEK_10(r
->req
.cmd
.lba
);
2095 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
2100 trace_scsi_disk_emulate_command_MODE_SELECT(r
->req
.cmd
.xfer
);
2102 case MODE_SELECT_10
:
2103 trace_scsi_disk_emulate_command_MODE_SELECT_10(r
->req
.cmd
.xfer
);
2106 trace_scsi_disk_emulate_command_UNMAP(r
->req
.cmd
.xfer
);
2111 trace_scsi_disk_emulate_command_VERIFY((req
->cmd
.buf
[1] >> 1) & 3);
2112 if (req
->cmd
.buf
[1] & 6) {
2113 goto illegal_request
;
2118 trace_scsi_disk_emulate_command_WRITE_SAME(
2119 req
->cmd
.buf
[0] == WRITE_SAME_10
? 10 : 16, r
->req
.cmd
.xfer
);
2122 trace_scsi_disk_emulate_command_UNKNOWN(buf
[0],
2123 scsi_command_name(buf
[0]));
2124 scsi_check_condition(r
, SENSE_CODE(INVALID_OPCODE
));
2127 assert(!r
->req
.aiocb
);
2128 r
->iov
.iov_len
= MIN(r
->buflen
, req
->cmd
.xfer
);
2129 if (r
->iov
.iov_len
== 0) {
2130 scsi_req_complete(&r
->req
, GOOD
);
2132 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
2133 assert(r
->iov
.iov_len
== req
->cmd
.xfer
);
2134 return -r
->iov
.iov_len
;
2136 return r
->iov
.iov_len
;
2140 if (r
->req
.status
== -1) {
2141 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
2146 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
2150 /* Execute a scsi command. Returns the length of the data expected by the
2151 command. This will be Positive for data transfers from the device
2152 (eg. disk reads), negative for transfers to the device (eg. disk writes),
2153 and zero if the command does not transfer any data. */
2155 static int32_t scsi_disk_dma_command(SCSIRequest
*req
, uint8_t *buf
)
2157 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
2158 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
2159 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
2165 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
2166 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
2170 len
= scsi_data_cdb_xfer(r
->req
.cmd
.buf
);
2176 trace_scsi_disk_dma_command_READ(r
->req
.cmd
.lba
, len
);
2177 /* Protection information is not supported. For SCSI versions 2 and
2178 * older (as determined by snooping the guest's INQUIRY commands),
2179 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2181 if (s
->qdev
.scsi_version
> 2 && (r
->req
.cmd
.buf
[1] & 0xe0)) {
2182 goto illegal_request
;
2184 if (!check_lba_range(s
, r
->req
.cmd
.lba
, len
)) {
2187 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2188 r
->sector_count
= len
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2194 case WRITE_VERIFY_10
:
2195 case WRITE_VERIFY_12
:
2196 case WRITE_VERIFY_16
:
2197 if (blk_is_read_only(s
->qdev
.conf
.blk
)) {
2198 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
2201 trace_scsi_disk_dma_command_WRITE(
2202 (command
& 0xe) == 0xe ? "And Verify " : "",
2203 r
->req
.cmd
.lba
, len
);
2208 /* We get here only for BYTCHK == 0x01 and only for scsi-block.
2209 * As far as DMA is concerned, we can treat it the same as a write;
2210 * scsi_block_do_sgio will send VERIFY commands.
2212 if (s
->qdev
.scsi_version
> 2 && (r
->req
.cmd
.buf
[1] & 0xe0)) {
2213 goto illegal_request
;
2215 if (!check_lba_range(s
, r
->req
.cmd
.lba
, len
)) {
2218 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2219 r
->sector_count
= len
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2224 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
2227 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
2230 r
->need_fua_emulation
= sdc
->need_fua_emulation(&r
->req
.cmd
);
2231 if (r
->sector_count
== 0) {
2232 scsi_req_complete(&r
->req
, GOOD
);
2234 assert(r
->iov
.iov_len
== 0);
2235 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
2236 return -r
->sector_count
* BDRV_SECTOR_SIZE
;
2238 return r
->sector_count
* BDRV_SECTOR_SIZE
;
2242 static void scsi_disk_reset(DeviceState
*dev
)
2244 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
.qdev
, dev
);
2245 uint64_t nb_sectors
;
2247 scsi_device_purge_requests(&s
->qdev
, SENSE_CODE(RESET
));
2249 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
2250 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
2254 s
->qdev
.max_lba
= nb_sectors
;
2255 /* reset tray statuses */
2259 s
->qdev
.scsi_version
= s
->qdev
.default_scsi_version
;
2262 static void scsi_disk_resize_cb(void *opaque
)
2264 SCSIDiskState
*s
= opaque
;
2266 /* SPC lists this sense code as available only for
2267 * direct-access devices.
2269 if (s
->qdev
.type
== TYPE_DISK
) {
2270 scsi_device_report_change(&s
->qdev
, SENSE_CODE(CAPACITY_CHANGED
));
2274 static void scsi_cd_change_media_cb(void *opaque
, bool load
, Error
**errp
)
2276 SCSIDiskState
*s
= opaque
;
2279 * When a CD gets changed, we have to report an ejected state and
2280 * then a loaded state to guests so that they detect tray
2281 * open/close and media change events. Guests that do not use
2282 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
2283 * states rely on this behavior.
2285 * media_changed governs the state machine used for unit attention
2286 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
2288 s
->media_changed
= load
;
2289 s
->tray_open
= !load
;
2290 scsi_device_set_ua(&s
->qdev
, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM
));
2291 s
->media_event
= true;
2292 s
->eject_request
= false;
2295 static void scsi_cd_eject_request_cb(void *opaque
, bool force
)
2297 SCSIDiskState
*s
= opaque
;
2299 s
->eject_request
= true;
2301 s
->tray_locked
= false;
2305 static bool scsi_cd_is_tray_open(void *opaque
)
2307 return ((SCSIDiskState
*)opaque
)->tray_open
;
2310 static bool scsi_cd_is_medium_locked(void *opaque
)
2312 return ((SCSIDiskState
*)opaque
)->tray_locked
;
2315 static const BlockDevOps scsi_disk_removable_block_ops
= {
2316 .change_media_cb
= scsi_cd_change_media_cb
,
2317 .eject_request_cb
= scsi_cd_eject_request_cb
,
2318 .is_tray_open
= scsi_cd_is_tray_open
,
2319 .is_medium_locked
= scsi_cd_is_medium_locked
,
2321 .resize_cb
= scsi_disk_resize_cb
,
2324 static const BlockDevOps scsi_disk_block_ops
= {
2325 .resize_cb
= scsi_disk_resize_cb
,
2328 static void scsi_disk_unit_attention_reported(SCSIDevice
*dev
)
2330 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2331 if (s
->media_changed
) {
2332 s
->media_changed
= false;
2333 scsi_device_set_ua(&s
->qdev
, SENSE_CODE(MEDIUM_CHANGED
));
2337 static void scsi_realize(SCSIDevice
*dev
, Error
**errp
)
2339 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2342 if (!s
->qdev
.conf
.blk
) {
2343 error_setg(errp
, "drive property not set");
2347 if (!(s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) &&
2348 !blk_is_inserted(s
->qdev
.conf
.blk
)) {
2349 error_setg(errp
, "Device needs media, but drive is empty");
2353 if (!blkconf_blocksizes(&s
->qdev
.conf
, errp
)) {
2357 if (blk_get_aio_context(s
->qdev
.conf
.blk
) != qemu_get_aio_context() &&
2358 !s
->qdev
.hba_supports_iothread
)
2360 error_setg(errp
, "HBA does not support iothreads");
2364 if (dev
->type
== TYPE_DISK
) {
2365 if (!blkconf_geometry(&dev
->conf
, NULL
, 65535, 255, 255, errp
)) {
2370 read_only
= blk_is_read_only(s
->qdev
.conf
.blk
);
2371 if (dev
->type
== TYPE_ROM
) {
2375 if (!blkconf_apply_backend_options(&dev
->conf
, read_only
,
2376 dev
->type
== TYPE_DISK
, errp
)) {
2380 if (s
->qdev
.conf
.discard_granularity
== -1) {
2381 s
->qdev
.conf
.discard_granularity
=
2382 MAX(s
->qdev
.conf
.logical_block_size
, DEFAULT_DISCARD_GRANULARITY
);
2386 s
->version
= g_strdup(qemu_hw_version());
2389 s
->vendor
= g_strdup("QEMU");
2391 if (!s
->device_id
) {
2393 s
->device_id
= g_strdup_printf("%.20s", s
->serial
);
2395 const char *str
= blk_name(s
->qdev
.conf
.blk
);
2397 s
->device_id
= g_strdup(str
);
2402 if (blk_is_sg(s
->qdev
.conf
.blk
)) {
2403 error_setg(errp
, "unwanted /dev/sg*");
2407 if ((s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) &&
2408 !(s
->features
& (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS
))) {
2409 blk_set_dev_ops(s
->qdev
.conf
.blk
, &scsi_disk_removable_block_ops
, s
);
2411 blk_set_dev_ops(s
->qdev
.conf
.blk
, &scsi_disk_block_ops
, s
);
2413 blk_set_guest_block_size(s
->qdev
.conf
.blk
, s
->qdev
.blocksize
);
2415 blk_iostatus_enable(s
->qdev
.conf
.blk
);
2417 add_boot_device_lchs(&dev
->qdev
, NULL
,
2423 static void scsi_unrealize(SCSIDevice
*dev
)
2425 del_boot_device_lchs(&dev
->qdev
, NULL
);
2428 static void scsi_hd_realize(SCSIDevice
*dev
, Error
**errp
)
2430 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2431 AioContext
*ctx
= NULL
;
2432 /* can happen for devices without drive. The error message for missing
2433 * backend will be issued in scsi_realize
2435 if (s
->qdev
.conf
.blk
) {
2436 ctx
= blk_get_aio_context(s
->qdev
.conf
.blk
);
2437 aio_context_acquire(ctx
);
2438 if (!blkconf_blocksizes(&s
->qdev
.conf
, errp
)) {
2442 s
->qdev
.blocksize
= s
->qdev
.conf
.logical_block_size
;
2443 s
->qdev
.type
= TYPE_DISK
;
2445 s
->product
= g_strdup("QEMU HARDDISK");
2447 scsi_realize(&s
->qdev
, errp
);
2450 aio_context_release(ctx
);
2454 static void scsi_cd_realize(SCSIDevice
*dev
, Error
**errp
)
2456 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2460 if (!dev
->conf
.blk
) {
2461 /* Anonymous BlockBackend for an empty drive. As we put it into
2462 * dev->conf, qdev takes care of detaching on unplug. */
2463 dev
->conf
.blk
= blk_new(qemu_get_aio_context(), 0, BLK_PERM_ALL
);
2464 ret
= blk_attach_dev(dev
->conf
.blk
, &dev
->qdev
);
2468 ctx
= blk_get_aio_context(dev
->conf
.blk
);
2469 aio_context_acquire(ctx
);
2470 s
->qdev
.blocksize
= 2048;
2471 s
->qdev
.type
= TYPE_ROM
;
2472 s
->features
|= 1 << SCSI_DISK_F_REMOVABLE
;
2474 s
->product
= g_strdup("QEMU CD-ROM");
2476 scsi_realize(&s
->qdev
, errp
);
2477 aio_context_release(ctx
);
2480 static void scsi_disk_realize(SCSIDevice
*dev
, Error
**errp
)
2483 Error
*local_err
= NULL
;
2485 warn_report("'scsi-disk' is deprecated, "
2486 "please use 'scsi-hd' or 'scsi-cd' instead");
2488 if (!dev
->conf
.blk
) {
2489 scsi_realize(dev
, &local_err
);
2491 error_propagate(errp
, local_err
);
2495 dinfo
= blk_legacy_dinfo(dev
->conf
.blk
);
2496 if (dinfo
&& dinfo
->media_cd
) {
2497 scsi_cd_realize(dev
, errp
);
2499 scsi_hd_realize(dev
, errp
);
2503 static const SCSIReqOps scsi_disk_emulate_reqops
= {
2504 .size
= sizeof(SCSIDiskReq
),
2505 .free_req
= scsi_free_request
,
2506 .send_command
= scsi_disk_emulate_command
,
2507 .read_data
= scsi_disk_emulate_read_data
,
2508 .write_data
= scsi_disk_emulate_write_data
,
2509 .get_buf
= scsi_get_buf
,
2512 static const SCSIReqOps scsi_disk_dma_reqops
= {
2513 .size
= sizeof(SCSIDiskReq
),
2514 .free_req
= scsi_free_request
,
2515 .send_command
= scsi_disk_dma_command
,
2516 .read_data
= scsi_read_data
,
2517 .write_data
= scsi_write_data
,
2518 .get_buf
= scsi_get_buf
,
2519 .load_request
= scsi_disk_load_request
,
2520 .save_request
= scsi_disk_save_request
,
2523 static const SCSIReqOps
*const scsi_disk_reqops_dispatch
[256] = {
2524 [TEST_UNIT_READY
] = &scsi_disk_emulate_reqops
,
2525 [INQUIRY
] = &scsi_disk_emulate_reqops
,
2526 [MODE_SENSE
] = &scsi_disk_emulate_reqops
,
2527 [MODE_SENSE_10
] = &scsi_disk_emulate_reqops
,
2528 [START_STOP
] = &scsi_disk_emulate_reqops
,
2529 [ALLOW_MEDIUM_REMOVAL
] = &scsi_disk_emulate_reqops
,
2530 [READ_CAPACITY_10
] = &scsi_disk_emulate_reqops
,
2531 [READ_TOC
] = &scsi_disk_emulate_reqops
,
2532 [READ_DVD_STRUCTURE
] = &scsi_disk_emulate_reqops
,
2533 [READ_DISC_INFORMATION
] = &scsi_disk_emulate_reqops
,
2534 [GET_CONFIGURATION
] = &scsi_disk_emulate_reqops
,
2535 [GET_EVENT_STATUS_NOTIFICATION
] = &scsi_disk_emulate_reqops
,
2536 [MECHANISM_STATUS
] = &scsi_disk_emulate_reqops
,
2537 [SERVICE_ACTION_IN_16
] = &scsi_disk_emulate_reqops
,
2538 [REQUEST_SENSE
] = &scsi_disk_emulate_reqops
,
2539 [SYNCHRONIZE_CACHE
] = &scsi_disk_emulate_reqops
,
2540 [SEEK_10
] = &scsi_disk_emulate_reqops
,
2541 [MODE_SELECT
] = &scsi_disk_emulate_reqops
,
2542 [MODE_SELECT_10
] = &scsi_disk_emulate_reqops
,
2543 [UNMAP
] = &scsi_disk_emulate_reqops
,
2544 [WRITE_SAME_10
] = &scsi_disk_emulate_reqops
,
2545 [WRITE_SAME_16
] = &scsi_disk_emulate_reqops
,
2546 [VERIFY_10
] = &scsi_disk_emulate_reqops
,
2547 [VERIFY_12
] = &scsi_disk_emulate_reqops
,
2548 [VERIFY_16
] = &scsi_disk_emulate_reqops
,
2550 [READ_6
] = &scsi_disk_dma_reqops
,
2551 [READ_10
] = &scsi_disk_dma_reqops
,
2552 [READ_12
] = &scsi_disk_dma_reqops
,
2553 [READ_16
] = &scsi_disk_dma_reqops
,
2554 [WRITE_6
] = &scsi_disk_dma_reqops
,
2555 [WRITE_10
] = &scsi_disk_dma_reqops
,
2556 [WRITE_12
] = &scsi_disk_dma_reqops
,
2557 [WRITE_16
] = &scsi_disk_dma_reqops
,
2558 [WRITE_VERIFY_10
] = &scsi_disk_dma_reqops
,
2559 [WRITE_VERIFY_12
] = &scsi_disk_dma_reqops
,
2560 [WRITE_VERIFY_16
] = &scsi_disk_dma_reqops
,
2563 static void scsi_disk_new_request_dump(uint32_t lun
, uint32_t tag
, uint8_t *buf
)
2566 int len
= scsi_cdb_length(buf
);
2567 char *line_buffer
, *p
;
2569 line_buffer
= g_malloc(len
* 5 + 1);
2571 for (i
= 0, p
= line_buffer
; i
< len
; i
++) {
2572 p
+= sprintf(p
, " 0x%02x", buf
[i
]);
2574 trace_scsi_disk_new_request(lun
, tag
, line_buffer
);
2576 g_free(line_buffer
);
2579 static SCSIRequest
*scsi_new_request(SCSIDevice
*d
, uint32_t tag
, uint32_t lun
,
2580 uint8_t *buf
, void *hba_private
)
2582 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2584 const SCSIReqOps
*ops
;
2588 ops
= scsi_disk_reqops_dispatch
[command
];
2590 ops
= &scsi_disk_emulate_reqops
;
2592 req
= scsi_req_alloc(ops
, &s
->qdev
, tag
, lun
, hba_private
);
2594 if (trace_event_get_state_backends(TRACE_SCSI_DISK_NEW_REQUEST
)) {
2595 scsi_disk_new_request_dump(lun
, tag
, buf
);
2602 static int get_device_type(SCSIDiskState
*s
)
2608 memset(cmd
, 0, sizeof(cmd
));
2609 memset(buf
, 0, sizeof(buf
));
2611 cmd
[4] = sizeof(buf
);
2613 ret
= scsi_SG_IO_FROM_DEV(s
->qdev
.conf
.blk
, cmd
, sizeof(cmd
),
2618 s
->qdev
.type
= buf
[0];
2619 if (buf
[1] & 0x80) {
2620 s
->features
|= 1 << SCSI_DISK_F_REMOVABLE
;
2625 static void scsi_block_realize(SCSIDevice
*dev
, Error
**errp
)
2627 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2632 if (!s
->qdev
.conf
.blk
) {
2633 error_setg(errp
, "drive property not set");
2637 if (s
->rotation_rate
) {
2638 error_report_once("rotation_rate is specified for scsi-block but is "
2639 "not implemented. This option is deprecated and will "
2640 "be removed in a future version");
2643 ctx
= blk_get_aio_context(s
->qdev
.conf
.blk
);
2644 aio_context_acquire(ctx
);
2646 /* check we are using a driver managing SG_IO (version 3 and after) */
2647 rc
= blk_ioctl(s
->qdev
.conf
.blk
, SG_GET_VERSION_NUM
, &sg_version
);
2649 error_setg_errno(errp
, -rc
, "cannot get SG_IO version number");
2651 error_append_hint(errp
, "Is this a SCSI device?\n");
2655 if (sg_version
< 30000) {
2656 error_setg(errp
, "scsi generic interface too old");
2660 /* get device type from INQUIRY data */
2661 rc
= get_device_type(s
);
2663 error_setg(errp
, "INQUIRY failed");
2667 /* Make a guess for the block size, we'll fix it when the guest sends.
2668 * READ CAPACITY. If they don't, they likely would assume these sizes
2669 * anyway. (TODO: check in /sys).
2671 if (s
->qdev
.type
== TYPE_ROM
|| s
->qdev
.type
== TYPE_WORM
) {
2672 s
->qdev
.blocksize
= 2048;
2674 s
->qdev
.blocksize
= 512;
2677 /* Makes the scsi-block device not removable by using HMP and QMP eject
2680 s
->features
|= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS
);
2682 scsi_realize(&s
->qdev
, errp
);
2683 scsi_generic_read_device_inquiry(&s
->qdev
);
2686 aio_context_release(ctx
);
2689 typedef struct SCSIBlockReq
{
2691 sg_io_hdr_t io_header
;
2693 /* Selected bytes of the original CDB, copied into our own CDB. */
2694 uint8_t cmd
, cdb1
, group_number
;
2696 /* CDB passed to SG_IO. */
2700 static BlockAIOCB
*scsi_block_do_sgio(SCSIBlockReq
*req
,
2701 int64_t offset
, QEMUIOVector
*iov
,
2703 BlockCompletionFunc
*cb
, void *opaque
)
2705 sg_io_hdr_t
*io_header
= &req
->io_header
;
2706 SCSIDiskReq
*r
= &req
->req
;
2707 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
2708 int nb_logical_blocks
;
2712 /* This is not supported yet. It can only happen if the guest does
2713 * reads and writes that are not aligned to one logical sectors
2714 * _and_ cover multiple MemoryRegions.
2716 assert(offset
% s
->qdev
.blocksize
== 0);
2717 assert(iov
->size
% s
->qdev
.blocksize
== 0);
2719 io_header
->interface_id
= 'S';
2721 /* The data transfer comes from the QEMUIOVector. */
2722 io_header
->dxfer_direction
= direction
;
2723 io_header
->dxfer_len
= iov
->size
;
2724 io_header
->dxferp
= (void *)iov
->iov
;
2725 io_header
->iovec_count
= iov
->niov
;
2726 assert(io_header
->iovec_count
== iov
->niov
); /* no overflow! */
2728 /* Build a new CDB with the LBA and length patched in, in case
2729 * DMA helpers split the transfer in multiple segments. Do not
2730 * build a CDB smaller than what the guest wanted, and only build
2731 * a larger one if strictly necessary.
2733 io_header
->cmdp
= req
->cdb
;
2734 lba
= offset
/ s
->qdev
.blocksize
;
2735 nb_logical_blocks
= io_header
->dxfer_len
/ s
->qdev
.blocksize
;
2737 if ((req
->cmd
>> 5) == 0 && lba
<= 0x1ffff) {
2739 stl_be_p(&req
->cdb
[0], lba
| (req
->cmd
<< 24));
2740 req
->cdb
[4] = nb_logical_blocks
;
2742 io_header
->cmd_len
= 6;
2743 } else if ((req
->cmd
>> 5) <= 1 && lba
<= 0xffffffffULL
) {
2745 req
->cdb
[0] = (req
->cmd
& 0x1f) | 0x20;
2746 req
->cdb
[1] = req
->cdb1
;
2747 stl_be_p(&req
->cdb
[2], lba
);
2748 req
->cdb
[6] = req
->group_number
;
2749 stw_be_p(&req
->cdb
[7], nb_logical_blocks
);
2751 io_header
->cmd_len
= 10;
2752 } else if ((req
->cmd
>> 5) != 4 && lba
<= 0xffffffffULL
) {
2754 req
->cdb
[0] = (req
->cmd
& 0x1f) | 0xA0;
2755 req
->cdb
[1] = req
->cdb1
;
2756 stl_be_p(&req
->cdb
[2], lba
);
2757 stl_be_p(&req
->cdb
[6], nb_logical_blocks
);
2758 req
->cdb
[10] = req
->group_number
;
2760 io_header
->cmd_len
= 12;
2763 req
->cdb
[0] = (req
->cmd
& 0x1f) | 0x80;
2764 req
->cdb
[1] = req
->cdb1
;
2765 stq_be_p(&req
->cdb
[2], lba
);
2766 stl_be_p(&req
->cdb
[10], nb_logical_blocks
);
2767 req
->cdb
[14] = req
->group_number
;
2769 io_header
->cmd_len
= 16;
2772 /* The rest is as in scsi-generic.c. */
2773 io_header
->mx_sb_len
= sizeof(r
->req
.sense
);
2774 io_header
->sbp
= r
->req
.sense
;
2775 io_header
->timeout
= UINT_MAX
;
2776 io_header
->usr_ptr
= r
;
2777 io_header
->flags
|= SG_FLAG_DIRECT_IO
;
2779 aiocb
= blk_aio_ioctl(s
->qdev
.conf
.blk
, SG_IO
, io_header
, cb
, opaque
);
2780 assert(aiocb
!= NULL
);
2784 static bool scsi_block_no_fua(SCSICommand
*cmd
)
2789 static BlockAIOCB
*scsi_block_dma_readv(int64_t offset
,
2791 BlockCompletionFunc
*cb
, void *cb_opaque
,
2794 SCSIBlockReq
*r
= opaque
;
2795 return scsi_block_do_sgio(r
, offset
, iov
,
2796 SG_DXFER_FROM_DEV
, cb
, cb_opaque
);
2799 static BlockAIOCB
*scsi_block_dma_writev(int64_t offset
,
2801 BlockCompletionFunc
*cb
, void *cb_opaque
,
2804 SCSIBlockReq
*r
= opaque
;
2805 return scsi_block_do_sgio(r
, offset
, iov
,
2806 SG_DXFER_TO_DEV
, cb
, cb_opaque
);
2809 static bool scsi_block_is_passthrough(SCSIDiskState
*s
, uint8_t *buf
)
2815 /* Check if BYTCHK == 0x01 (data-out buffer contains data
2816 * for the number of logical blocks specified in the length
2817 * field). For other modes, do not use scatter/gather operation.
2819 if ((buf
[1] & 6) == 2) {
2832 case WRITE_VERIFY_10
:
2833 case WRITE_VERIFY_12
:
2834 case WRITE_VERIFY_16
:
2835 /* MMC writing cannot be done via DMA helpers, because it sometimes
2836 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
2837 * We might use scsi_block_dma_reqops as long as no writing commands are
2838 * seen, but performance usually isn't paramount on optical media. So,
2839 * just make scsi-block operate the same as scsi-generic for them.
2841 if (s
->qdev
.type
!= TYPE_ROM
) {
2854 static int32_t scsi_block_dma_command(SCSIRequest
*req
, uint8_t *buf
)
2856 SCSIBlockReq
*r
= (SCSIBlockReq
*)req
;
2857 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
2859 r
->cmd
= req
->cmd
.buf
[0];
2860 switch (r
->cmd
>> 5) {
2863 r
->cdb1
= r
->group_number
= 0;
2867 r
->cdb1
= req
->cmd
.buf
[1];
2868 r
->group_number
= req
->cmd
.buf
[6];
2872 r
->cdb1
= req
->cmd
.buf
[1];
2873 r
->group_number
= req
->cmd
.buf
[10];
2877 r
->cdb1
= req
->cmd
.buf
[1];
2878 r
->group_number
= req
->cmd
.buf
[14];
2884 /* Protection information is not supported. For SCSI versions 2 and
2885 * older (as determined by snooping the guest's INQUIRY commands),
2886 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2888 if (s
->qdev
.scsi_version
> 2 && (req
->cmd
.buf
[1] & 0xe0)) {
2889 scsi_check_condition(&r
->req
, SENSE_CODE(INVALID_FIELD
));
2893 r
->req
.status
= &r
->io_header
.status
;
2894 return scsi_disk_dma_command(req
, buf
);
2897 static const SCSIReqOps scsi_block_dma_reqops
= {
2898 .size
= sizeof(SCSIBlockReq
),
2899 .free_req
= scsi_free_request
,
2900 .send_command
= scsi_block_dma_command
,
2901 .read_data
= scsi_read_data
,
2902 .write_data
= scsi_write_data
,
2903 .get_buf
= scsi_get_buf
,
2904 .load_request
= scsi_disk_load_request
,
2905 .save_request
= scsi_disk_save_request
,
2908 static SCSIRequest
*scsi_block_new_request(SCSIDevice
*d
, uint32_t tag
,
2909 uint32_t lun
, uint8_t *buf
,
2912 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2914 if (scsi_block_is_passthrough(s
, buf
)) {
2915 return scsi_req_alloc(&scsi_generic_req_ops
, &s
->qdev
, tag
, lun
,
2918 return scsi_req_alloc(&scsi_block_dma_reqops
, &s
->qdev
, tag
, lun
,
2923 static int scsi_block_parse_cdb(SCSIDevice
*d
, SCSICommand
*cmd
,
2924 uint8_t *buf
, void *hba_private
)
2926 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2928 if (scsi_block_is_passthrough(s
, buf
)) {
2929 return scsi_bus_parse_cdb(&s
->qdev
, cmd
, buf
, hba_private
);
2931 return scsi_req_parse_cdb(&s
->qdev
, cmd
, buf
);
2935 static void scsi_block_update_sense(SCSIRequest
*req
)
2937 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
2938 SCSIBlockReq
*br
= DO_UPCAST(SCSIBlockReq
, req
, r
);
2939 r
->req
.sense_len
= MIN(br
->io_header
.sb_len_wr
, sizeof(r
->req
.sense
));
2944 BlockAIOCB
*scsi_dma_readv(int64_t offset
, QEMUIOVector
*iov
,
2945 BlockCompletionFunc
*cb
, void *cb_opaque
,
2948 SCSIDiskReq
*r
= opaque
;
2949 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
2950 return blk_aio_preadv(s
->qdev
.conf
.blk
, offset
, iov
, 0, cb
, cb_opaque
);
2954 BlockAIOCB
*scsi_dma_writev(int64_t offset
, QEMUIOVector
*iov
,
2955 BlockCompletionFunc
*cb
, void *cb_opaque
,
2958 SCSIDiskReq
*r
= opaque
;
2959 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
2960 return blk_aio_pwritev(s
->qdev
.conf
.blk
, offset
, iov
, 0, cb
, cb_opaque
);
2963 static void scsi_disk_base_class_initfn(ObjectClass
*klass
, void *data
)
2965 DeviceClass
*dc
= DEVICE_CLASS(klass
);
2966 SCSIDiskClass
*sdc
= SCSI_DISK_BASE_CLASS(klass
);
2968 dc
->fw_name
= "disk";
2969 dc
->reset
= scsi_disk_reset
;
2970 sdc
->dma_readv
= scsi_dma_readv
;
2971 sdc
->dma_writev
= scsi_dma_writev
;
2972 sdc
->need_fua_emulation
= scsi_is_cmd_fua
;
2975 static const TypeInfo scsi_disk_base_info
= {
2976 .name
= TYPE_SCSI_DISK_BASE
,
2977 .parent
= TYPE_SCSI_DEVICE
,
2978 .class_init
= scsi_disk_base_class_initfn
,
2979 .instance_size
= sizeof(SCSIDiskState
),
2980 .class_size
= sizeof(SCSIDiskClass
),
2984 #define DEFINE_SCSI_DISK_PROPERTIES() \
2985 DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSIDiskState, qdev.conf.blk), \
2986 DEFINE_BLOCK_PROPERTIES_BASE(SCSIDiskState, qdev.conf), \
2987 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
2988 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
2989 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
2990 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
2991 DEFINE_PROP_STRING("product", SCSIDiskState, product), \
2992 DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)
2995 static Property scsi_hd_properties
[] = {
2996 DEFINE_SCSI_DISK_PROPERTIES(),
2997 DEFINE_PROP_BIT("removable", SCSIDiskState
, features
,
2998 SCSI_DISK_F_REMOVABLE
, false),
2999 DEFINE_PROP_BIT("dpofua", SCSIDiskState
, features
,
3000 SCSI_DISK_F_DPOFUA
, false),
3001 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
3002 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
3003 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
3004 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
3005 DEFAULT_MAX_UNMAP_SIZE
),
3006 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3007 DEFAULT_MAX_IO_SIZE
),
3008 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState
, rotation_rate
, 0),
3009 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3011 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState
, qdev
.conf
),
3012 DEFINE_PROP_END_OF_LIST(),
3015 static const VMStateDescription vmstate_scsi_disk_state
= {
3016 .name
= "scsi-disk",
3018 .minimum_version_id
= 1,
3019 .fields
= (VMStateField
[]) {
3020 VMSTATE_SCSI_DEVICE(qdev
, SCSIDiskState
),
3021 VMSTATE_BOOL(media_changed
, SCSIDiskState
),
3022 VMSTATE_BOOL(media_event
, SCSIDiskState
),
3023 VMSTATE_BOOL(eject_request
, SCSIDiskState
),
3024 VMSTATE_BOOL(tray_open
, SCSIDiskState
),
3025 VMSTATE_BOOL(tray_locked
, SCSIDiskState
),
3026 VMSTATE_END_OF_LIST()
3030 static void scsi_hd_class_initfn(ObjectClass
*klass
, void *data
)
3032 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3033 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3035 sc
->realize
= scsi_hd_realize
;
3036 sc
->unrealize
= scsi_unrealize
;
3037 sc
->alloc_req
= scsi_new_request
;
3038 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
3039 dc
->desc
= "virtual SCSI disk";
3040 device_class_set_props(dc
, scsi_hd_properties
);
3041 dc
->vmsd
= &vmstate_scsi_disk_state
;
3044 static const TypeInfo scsi_hd_info
= {
3046 .parent
= TYPE_SCSI_DISK_BASE
,
3047 .class_init
= scsi_hd_class_initfn
,
3050 static Property scsi_cd_properties
[] = {
3051 DEFINE_SCSI_DISK_PROPERTIES(),
3052 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
3053 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
3054 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
3055 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3056 DEFAULT_MAX_IO_SIZE
),
3057 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3059 DEFINE_PROP_END_OF_LIST(),
3062 static void scsi_cd_class_initfn(ObjectClass
*klass
, void *data
)
3064 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3065 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3067 sc
->realize
= scsi_cd_realize
;
3068 sc
->alloc_req
= scsi_new_request
;
3069 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
3070 dc
->desc
= "virtual SCSI CD-ROM";
3071 device_class_set_props(dc
, scsi_cd_properties
);
3072 dc
->vmsd
= &vmstate_scsi_disk_state
;
3075 static const TypeInfo scsi_cd_info
= {
3077 .parent
= TYPE_SCSI_DISK_BASE
,
3078 .class_init
= scsi_cd_class_initfn
,
3082 static Property scsi_block_properties
[] = {
3083 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState
, qdev
.conf
),
3084 DEFINE_PROP_DRIVE("drive", SCSIDiskState
, qdev
.conf
.blk
),
3085 DEFINE_PROP_BOOL("share-rw", SCSIDiskState
, qdev
.conf
.share_rw
, false),
3086 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState
, rotation_rate
, 0),
3087 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
3088 DEFAULT_MAX_UNMAP_SIZE
),
3089 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3090 DEFAULT_MAX_IO_SIZE
),
3091 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3093 DEFINE_PROP_END_OF_LIST(),
3096 static void scsi_block_class_initfn(ObjectClass
*klass
, void *data
)
3098 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3099 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3100 SCSIDiskClass
*sdc
= SCSI_DISK_BASE_CLASS(klass
);
3102 sc
->realize
= scsi_block_realize
;
3103 sc
->alloc_req
= scsi_block_new_request
;
3104 sc
->parse_cdb
= scsi_block_parse_cdb
;
3105 sdc
->dma_readv
= scsi_block_dma_readv
;
3106 sdc
->dma_writev
= scsi_block_dma_writev
;
3107 sdc
->update_sense
= scsi_block_update_sense
;
3108 sdc
->need_fua_emulation
= scsi_block_no_fua
;
3109 dc
->desc
= "SCSI block device passthrough";
3110 device_class_set_props(dc
, scsi_block_properties
);
3111 dc
->vmsd
= &vmstate_scsi_disk_state
;
3114 static const TypeInfo scsi_block_info
= {
3115 .name
= "scsi-block",
3116 .parent
= TYPE_SCSI_DISK_BASE
,
3117 .class_init
= scsi_block_class_initfn
,
3121 static Property scsi_disk_properties
[] = {
3122 DEFINE_SCSI_DISK_PROPERTIES(),
3123 DEFINE_PROP_BIT("removable", SCSIDiskState
, features
,
3124 SCSI_DISK_F_REMOVABLE
, false),
3125 DEFINE_PROP_BIT("dpofua", SCSIDiskState
, features
,
3126 SCSI_DISK_F_DPOFUA
, false),
3127 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
3128 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
3129 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
3130 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
3131 DEFAULT_MAX_UNMAP_SIZE
),
3132 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3133 DEFAULT_MAX_IO_SIZE
),
3134 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3136 DEFINE_PROP_END_OF_LIST(),
3139 static void scsi_disk_class_initfn(ObjectClass
*klass
, void *data
)
3141 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3142 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3144 sc
->realize
= scsi_disk_realize
;
3145 sc
->alloc_req
= scsi_new_request
;
3146 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
3147 dc
->fw_name
= "disk";
3148 dc
->desc
= "virtual SCSI disk or CD-ROM (legacy)";
3149 dc
->reset
= scsi_disk_reset
;
3150 device_class_set_props(dc
, scsi_disk_properties
);
3151 dc
->vmsd
= &vmstate_scsi_disk_state
;
3154 static const TypeInfo scsi_disk_info
= {
3155 .name
= "scsi-disk",
3156 .parent
= TYPE_SCSI_DISK_BASE
,
3157 .class_init
= scsi_disk_class_initfn
,
3160 static void scsi_disk_register_types(void)
3162 type_register_static(&scsi_disk_base_info
);
3163 type_register_static(&scsi_hd_info
);
3164 type_register_static(&scsi_cd_info
);
3166 type_register_static(&scsi_block_info
);
3168 type_register_static(&scsi_disk_info
);
3171 type_init(scsi_disk_register_types
)