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 "hw/qdev-properties-system.h"
38 #include "sysemu/dma.h"
39 #include "sysemu/sysemu.h"
40 #include "qemu/cutils.h"
42 #include "qom/object.h"
48 #define SCSI_WRITE_SAME_MAX (512 * KiB)
49 #define SCSI_DMA_BUF_SIZE (128 * KiB)
50 #define SCSI_MAX_INQUIRY_LEN 256
51 #define SCSI_MAX_MODE_LEN 256
53 #define DEFAULT_DISCARD_GRANULARITY (4 * KiB)
54 #define DEFAULT_MAX_UNMAP_SIZE (1 * GiB)
55 #define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
57 #define TYPE_SCSI_DISK_BASE "scsi-disk-base"
59 OBJECT_DECLARE_TYPE(SCSIDiskState
, SCSIDiskClass
, SCSI_DISK_BASE
)
61 struct SCSIDiskClass
{
62 SCSIDeviceClass parent_class
;
64 DMAIOFunc
*dma_writev
;
65 bool (*need_fua_emulation
)(SCSICommand
*cmd
);
66 void (*update_sense
)(SCSIRequest
*r
);
69 typedef struct SCSIDiskReq
{
71 /* Both sector and sector_count are in terms of BDRV_SECTOR_SIZE bytes. */
73 uint32_t sector_count
;
76 bool need_fua_emulation
;
80 unsigned char *status
;
83 #define SCSI_DISK_F_REMOVABLE 0
84 #define SCSI_DISK_F_DPOFUA 1
85 #define SCSI_DISK_F_NO_REMOVABLE_DEVOPS 2
87 struct SCSIDiskState
{
94 uint64_t max_unmap_size
;
105 * 0x0000 - rotation rate not reported
106 * 0x0001 - non-rotating medium (SSD)
107 * 0x0002-0x0400 - reserved
108 * 0x0401-0xffe - rotations per minute
111 uint16_t rotation_rate
;
114 static void scsi_free_request(SCSIRequest
*req
)
116 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
118 qemu_vfree(r
->iov
.iov_base
);
121 /* Helper function for command completion with sense. */
122 static void scsi_check_condition(SCSIDiskReq
*r
, SCSISense sense
)
124 trace_scsi_disk_check_condition(r
->req
.tag
, sense
.key
, sense
.asc
,
126 scsi_req_build_sense(&r
->req
, sense
);
127 scsi_req_complete(&r
->req
, CHECK_CONDITION
);
130 static void scsi_init_iovec(SCSIDiskReq
*r
, size_t size
)
132 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
134 if (!r
->iov
.iov_base
) {
136 r
->iov
.iov_base
= blk_blockalign(s
->qdev
.conf
.blk
, r
->buflen
);
138 r
->iov
.iov_len
= MIN(r
->sector_count
* BDRV_SECTOR_SIZE
, r
->buflen
);
139 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
142 static void scsi_disk_save_request(QEMUFile
*f
, SCSIRequest
*req
)
144 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
146 qemu_put_be64s(f
, &r
->sector
);
147 qemu_put_be32s(f
, &r
->sector_count
);
148 qemu_put_be32s(f
, &r
->buflen
);
150 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
151 qemu_put_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
152 } else if (!req
->retry
) {
153 uint32_t len
= r
->iov
.iov_len
;
154 qemu_put_be32s(f
, &len
);
155 qemu_put_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
160 static void scsi_disk_load_request(QEMUFile
*f
, SCSIRequest
*req
)
162 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
164 qemu_get_be64s(f
, &r
->sector
);
165 qemu_get_be32s(f
, &r
->sector_count
);
166 qemu_get_be32s(f
, &r
->buflen
);
168 scsi_init_iovec(r
, r
->buflen
);
169 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
170 qemu_get_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
171 } else if (!r
->req
.retry
) {
173 qemu_get_be32s(f
, &len
);
174 r
->iov
.iov_len
= len
;
175 assert(r
->iov
.iov_len
<= r
->buflen
);
176 qemu_get_buffer(f
, r
->iov
.iov_base
, r
->iov
.iov_len
);
180 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
184 * scsi_handle_rw_error has two return values. False means that the error
185 * must be ignored, true means that the error has been processed and the
186 * caller should not do anything else for this request. Note that
187 * scsi_handle_rw_error always manages its reference counts, independent
188 * of the return value.
190 static bool scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, bool acct_failed
)
192 bool is_read
= (r
->req
.cmd
.mode
== SCSI_XFER_FROM_DEV
);
193 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
194 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
195 BlockErrorAction action
= blk_get_error_action(s
->qdev
.conf
.blk
,
199 if (action
== BLOCK_ERROR_ACTION_REPORT
) {
201 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
204 /* A passthrough command has run and has produced sense data; check
205 * whether the error has to be handled by the guest or should rather
208 assert(r
->status
&& *r
->status
);
209 if (scsi_sense_buf_is_guest_recoverable(r
->req
.sense
, sizeof(r
->req
.sense
))) {
210 /* These errors are handled by guest. */
211 sdc
->update_sense(&r
->req
);
212 scsi_req_complete(&r
->req
, *r
->status
);
215 error
= scsi_sense_buf_to_errno(r
->req
.sense
, sizeof(r
->req
.sense
));
217 int status
= scsi_sense_from_errno(error
, &sense
);
218 if (status
== CHECK_CONDITION
) {
219 scsi_req_build_sense(&r
->req
, sense
);
221 scsi_req_complete(&r
->req
, status
);
225 blk_error_action(s
->qdev
.conf
.blk
, action
, is_read
, error
);
226 if (action
== BLOCK_ERROR_ACTION_IGNORE
) {
230 if (action
== BLOCK_ERROR_ACTION_STOP
) {
231 scsi_req_retry(&r
->req
);
236 static bool scsi_disk_req_check_error(SCSIDiskReq
*r
, int ret
, bool acct_failed
)
238 if (r
->req
.io_canceled
) {
239 scsi_req_cancel_complete(&r
->req
);
243 if (ret
< 0 || (r
->status
&& *r
->status
)) {
244 return scsi_handle_rw_error(r
, -ret
, acct_failed
);
250 static void scsi_aio_complete(void *opaque
, int ret
)
252 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
253 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
255 assert(r
->req
.aiocb
!= NULL
);
257 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
258 if (scsi_disk_req_check_error(r
, ret
, true)) {
262 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
263 scsi_req_complete(&r
->req
, GOOD
);
266 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
267 scsi_req_unref(&r
->req
);
270 static bool scsi_is_cmd_fua(SCSICommand
*cmd
)
272 switch (cmd
->buf
[0]) {
279 return (cmd
->buf
[1] & 8) != 0;
284 case WRITE_VERIFY_10
:
285 case WRITE_VERIFY_12
:
286 case WRITE_VERIFY_16
:
296 static void scsi_write_do_fua(SCSIDiskReq
*r
)
298 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
300 assert(r
->req
.aiocb
== NULL
);
301 assert(!r
->req
.io_canceled
);
303 if (r
->need_fua_emulation
) {
304 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
306 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
310 scsi_req_complete(&r
->req
, GOOD
);
311 scsi_req_unref(&r
->req
);
314 static void scsi_dma_complete_noio(SCSIDiskReq
*r
, int ret
)
316 assert(r
->req
.aiocb
== NULL
);
317 if (scsi_disk_req_check_error(r
, ret
, false)) {
321 r
->sector
+= r
->sector_count
;
323 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
324 scsi_write_do_fua(r
);
327 scsi_req_complete(&r
->req
, GOOD
);
331 scsi_req_unref(&r
->req
);
334 static void scsi_dma_complete(void *opaque
, int ret
)
336 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
337 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
339 assert(r
->req
.aiocb
!= NULL
);
342 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
344 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
346 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
348 scsi_dma_complete_noio(r
, ret
);
349 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
352 static void scsi_read_complete_noio(SCSIDiskReq
*r
, int ret
)
356 assert(r
->req
.aiocb
== NULL
);
357 if (scsi_disk_req_check_error(r
, ret
, false)) {
361 n
= r
->qiov
.size
/ BDRV_SECTOR_SIZE
;
363 r
->sector_count
-= n
;
364 scsi_req_data(&r
->req
, r
->qiov
.size
);
367 scsi_req_unref(&r
->req
);
370 static void scsi_read_complete(void *opaque
, int ret
)
372 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
373 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
375 assert(r
->req
.aiocb
!= NULL
);
378 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
380 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
382 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
383 trace_scsi_disk_read_complete(r
->req
.tag
, r
->qiov
.size
);
385 scsi_read_complete_noio(r
, ret
);
386 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
389 /* Actually issue a read to the block device. */
390 static void scsi_do_read(SCSIDiskReq
*r
, int ret
)
392 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
393 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
395 assert (r
->req
.aiocb
== NULL
);
396 if (scsi_disk_req_check_error(r
, ret
, false)) {
400 /* The request is used as the AIO opaque value, so add a ref. */
401 scsi_req_ref(&r
->req
);
404 dma_acct_start(s
->qdev
.conf
.blk
, &r
->acct
, r
->req
.sg
, BLOCK_ACCT_READ
);
405 r
->req
.resid
-= r
->req
.sg
->size
;
406 r
->req
.aiocb
= dma_blk_io(blk_get_aio_context(s
->qdev
.conf
.blk
),
407 r
->req
.sg
, r
->sector
<< BDRV_SECTOR_BITS
,
409 sdc
->dma_readv
, r
, scsi_dma_complete
, r
,
410 DMA_DIRECTION_FROM_DEVICE
);
412 scsi_init_iovec(r
, SCSI_DMA_BUF_SIZE
);
413 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
414 r
->qiov
.size
, BLOCK_ACCT_READ
);
415 r
->req
.aiocb
= sdc
->dma_readv(r
->sector
<< BDRV_SECTOR_BITS
, &r
->qiov
,
416 scsi_read_complete
, r
, r
);
420 scsi_req_unref(&r
->req
);
423 static void scsi_do_read_cb(void *opaque
, int ret
)
425 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
426 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
428 assert (r
->req
.aiocb
!= NULL
);
431 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
433 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
435 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
437 scsi_do_read(opaque
, ret
);
438 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
441 /* Read more data from scsi device into buffer. */
442 static void scsi_read_data(SCSIRequest
*req
)
444 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
445 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
448 trace_scsi_disk_read_data_count(r
->sector_count
);
449 if (r
->sector_count
== 0) {
450 /* This also clears the sense buffer for REQUEST SENSE. */
451 scsi_req_complete(&r
->req
, GOOD
);
455 /* No data transfer may already be in progress */
456 assert(r
->req
.aiocb
== NULL
);
458 /* The request is used as the AIO opaque value, so add a ref. */
459 scsi_req_ref(&r
->req
);
460 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
461 trace_scsi_disk_read_data_invalid();
462 scsi_read_complete_noio(r
, -EINVAL
);
466 if (!blk_is_available(req
->dev
->conf
.blk
)) {
467 scsi_read_complete_noio(r
, -ENOMEDIUM
);
473 if (first
&& r
->need_fua_emulation
) {
474 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
476 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_do_read_cb
, r
);
482 static void scsi_write_complete_noio(SCSIDiskReq
*r
, int ret
)
486 assert (r
->req
.aiocb
== NULL
);
487 if (scsi_disk_req_check_error(r
, ret
, false)) {
491 n
= r
->qiov
.size
/ BDRV_SECTOR_SIZE
;
493 r
->sector_count
-= n
;
494 if (r
->sector_count
== 0) {
495 scsi_write_do_fua(r
);
498 scsi_init_iovec(r
, SCSI_DMA_BUF_SIZE
);
499 trace_scsi_disk_write_complete_noio(r
->req
.tag
, r
->qiov
.size
);
500 scsi_req_data(&r
->req
, r
->qiov
.size
);
504 scsi_req_unref(&r
->req
);
507 static void scsi_write_complete(void * opaque
, int ret
)
509 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
510 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
512 assert (r
->req
.aiocb
!= NULL
);
515 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
517 block_acct_failed(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
519 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
521 scsi_write_complete_noio(r
, ret
);
522 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
525 static void scsi_write_data(SCSIRequest
*req
)
527 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
528 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
529 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
531 /* No data transfer may already be in progress */
532 assert(r
->req
.aiocb
== NULL
);
534 /* The request is used as the AIO opaque value, so add a ref. */
535 scsi_req_ref(&r
->req
);
536 if (r
->req
.cmd
.mode
!= SCSI_XFER_TO_DEV
) {
537 trace_scsi_disk_write_data_invalid();
538 scsi_write_complete_noio(r
, -EINVAL
);
542 if (!r
->req
.sg
&& !r
->qiov
.size
) {
543 /* Called for the first time. Ask the driver to send us more data. */
545 scsi_write_complete_noio(r
, 0);
548 if (!blk_is_available(req
->dev
->conf
.blk
)) {
549 scsi_write_complete_noio(r
, -ENOMEDIUM
);
553 if (r
->req
.cmd
.buf
[0] == VERIFY_10
|| r
->req
.cmd
.buf
[0] == VERIFY_12
||
554 r
->req
.cmd
.buf
[0] == VERIFY_16
) {
556 scsi_dma_complete_noio(r
, 0);
558 scsi_write_complete_noio(r
, 0);
564 dma_acct_start(s
->qdev
.conf
.blk
, &r
->acct
, r
->req
.sg
, BLOCK_ACCT_WRITE
);
565 r
->req
.resid
-= r
->req
.sg
->size
;
566 r
->req
.aiocb
= dma_blk_io(blk_get_aio_context(s
->qdev
.conf
.blk
),
567 r
->req
.sg
, r
->sector
<< BDRV_SECTOR_BITS
,
569 sdc
->dma_writev
, r
, scsi_dma_complete
, r
,
570 DMA_DIRECTION_TO_DEVICE
);
572 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
573 r
->qiov
.size
, BLOCK_ACCT_WRITE
);
574 r
->req
.aiocb
= sdc
->dma_writev(r
->sector
<< BDRV_SECTOR_BITS
, &r
->qiov
,
575 scsi_write_complete
, r
, r
);
579 /* Return a pointer to the data buffer. */
580 static uint8_t *scsi_get_buf(SCSIRequest
*req
)
582 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
584 return (uint8_t *)r
->iov
.iov_base
;
587 static int scsi_disk_emulate_vpd_page(SCSIRequest
*req
, uint8_t *outbuf
)
589 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
590 uint8_t page_code
= req
->cmd
.buf
[2];
591 int start
, buflen
= 0;
593 outbuf
[buflen
++] = s
->qdev
.type
& 0x1f;
594 outbuf
[buflen
++] = page_code
;
595 outbuf
[buflen
++] = 0x00;
596 outbuf
[buflen
++] = 0x00;
600 case 0x00: /* Supported page codes, mandatory */
602 trace_scsi_disk_emulate_vpd_page_00(req
->cmd
.xfer
);
603 outbuf
[buflen
++] = 0x00; /* list of supported pages (this page) */
605 outbuf
[buflen
++] = 0x80; /* unit serial number */
607 outbuf
[buflen
++] = 0x83; /* device identification */
608 if (s
->qdev
.type
== TYPE_DISK
) {
609 outbuf
[buflen
++] = 0xb0; /* block limits */
610 outbuf
[buflen
++] = 0xb1; /* block device characteristics */
611 outbuf
[buflen
++] = 0xb2; /* thin provisioning */
615 case 0x80: /* Device serial number, optional */
620 trace_scsi_disk_emulate_vpd_page_80_not_supported();
624 l
= strlen(s
->serial
);
629 trace_scsi_disk_emulate_vpd_page_80(req
->cmd
.xfer
);
630 memcpy(outbuf
+ buflen
, s
->serial
, l
);
635 case 0x83: /* Device identification page, mandatory */
637 int id_len
= s
->device_id
? MIN(strlen(s
->device_id
), 255 - 8) : 0;
639 trace_scsi_disk_emulate_vpd_page_83(req
->cmd
.xfer
);
642 outbuf
[buflen
++] = 0x2; /* ASCII */
643 outbuf
[buflen
++] = 0; /* not officially assigned */
644 outbuf
[buflen
++] = 0; /* reserved */
645 outbuf
[buflen
++] = id_len
; /* length of data following */
646 memcpy(outbuf
+ buflen
, s
->device_id
, id_len
);
651 outbuf
[buflen
++] = 0x1; /* Binary */
652 outbuf
[buflen
++] = 0x3; /* NAA */
653 outbuf
[buflen
++] = 0; /* reserved */
654 outbuf
[buflen
++] = 8;
655 stq_be_p(&outbuf
[buflen
], s
->qdev
.wwn
);
659 if (s
->qdev
.port_wwn
) {
660 outbuf
[buflen
++] = 0x61; /* SAS / Binary */
661 outbuf
[buflen
++] = 0x93; /* PIV / Target port / NAA */
662 outbuf
[buflen
++] = 0; /* reserved */
663 outbuf
[buflen
++] = 8;
664 stq_be_p(&outbuf
[buflen
], s
->qdev
.port_wwn
);
669 outbuf
[buflen
++] = 0x61; /* SAS / Binary */
671 /* PIV/Target port/relative target port */
672 outbuf
[buflen
++] = 0x94;
674 outbuf
[buflen
++] = 0; /* reserved */
675 outbuf
[buflen
++] = 4;
676 stw_be_p(&outbuf
[buflen
+ 2], s
->port_index
);
681 case 0xb0: /* block limits */
683 SCSIBlockLimits bl
= {};
685 if (s
->qdev
.type
== TYPE_ROM
) {
686 trace_scsi_disk_emulate_vpd_page_b0_not_supported();
691 s
->qdev
.conf
.discard_granularity
/ s
->qdev
.blocksize
;
693 s
->qdev
.conf
.min_io_size
/ s
->qdev
.blocksize
;
695 s
->qdev
.conf
.opt_io_size
/ s
->qdev
.blocksize
;
696 bl
.max_unmap_sectors
=
697 s
->max_unmap_size
/ s
->qdev
.blocksize
;
699 s
->max_io_size
/ s
->qdev
.blocksize
;
700 /* 255 descriptors fit in 4 KiB with an 8-byte header */
701 bl
.max_unmap_descr
= 255;
703 if (s
->qdev
.type
== TYPE_DISK
) {
704 int max_transfer_blk
= blk_get_max_transfer(s
->qdev
.conf
.blk
);
705 int max_io_sectors_blk
=
706 max_transfer_blk
/ s
->qdev
.blocksize
;
709 MIN_NON_ZERO(max_io_sectors_blk
, bl
.max_io_sectors
);
711 buflen
+= scsi_emulate_block_limits(outbuf
+ buflen
, &bl
);
714 case 0xb1: /* block device characteristics */
717 outbuf
[4] = (s
->rotation_rate
>> 8) & 0xff;
718 outbuf
[5] = s
->rotation_rate
& 0xff;
719 outbuf
[6] = 0; /* PRODUCT TYPE */
720 outbuf
[7] = 0; /* WABEREQ | WACEREQ | NOMINAL FORM FACTOR */
721 outbuf
[8] = 0; /* VBULS */
724 case 0xb2: /* thin provisioning */
728 outbuf
[5] = 0xe0; /* unmap & write_same 10/16 all supported */
729 outbuf
[6] = s
->qdev
.conf
.discard_granularity
? 2 : 1;
737 assert(buflen
- start
<= 255);
738 outbuf
[start
- 1] = buflen
- start
;
742 static int scsi_disk_emulate_inquiry(SCSIRequest
*req
, uint8_t *outbuf
)
744 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
747 if (req
->cmd
.buf
[1] & 0x1) {
748 /* Vital product data */
749 return scsi_disk_emulate_vpd_page(req
, outbuf
);
752 /* Standard INQUIRY data */
753 if (req
->cmd
.buf
[2] != 0) {
758 buflen
= req
->cmd
.xfer
;
759 if (buflen
> SCSI_MAX_INQUIRY_LEN
) {
760 buflen
= SCSI_MAX_INQUIRY_LEN
;
763 outbuf
[0] = s
->qdev
.type
& 0x1f;
764 outbuf
[1] = (s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) ? 0x80 : 0;
766 strpadcpy((char *) &outbuf
[16], 16, s
->product
, ' ');
767 strpadcpy((char *) &outbuf
[8], 8, s
->vendor
, ' ');
769 memset(&outbuf
[32], 0, 4);
770 memcpy(&outbuf
[32], s
->version
, MIN(4, strlen(s
->version
)));
772 * We claim conformance to SPC-3, which is required for guests
773 * to ask for modern features like READ CAPACITY(16) or the
774 * block characteristics VPD page by default. Not all of SPC-3
775 * is actually implemented, but we're good enough.
777 outbuf
[2] = s
->qdev
.default_scsi_version
;
778 outbuf
[3] = 2 | 0x10; /* Format 2, HiSup */
781 outbuf
[4] = buflen
- 5; /* Additional Length = (Len - 1) - 4 */
783 /* If the allocation length of CDB is too small,
784 the additional length is not adjusted */
788 /* Sync data transfer and TCQ. */
789 outbuf
[7] = 0x10 | (req
->bus
->info
->tcq
? 0x02 : 0);
793 static inline bool media_is_dvd(SCSIDiskState
*s
)
796 if (s
->qdev
.type
!= TYPE_ROM
) {
799 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
802 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
803 return nb_sectors
> CD_MAX_SECTORS
;
806 static inline bool media_is_cd(SCSIDiskState
*s
)
809 if (s
->qdev
.type
!= TYPE_ROM
) {
812 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
815 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
816 return nb_sectors
<= CD_MAX_SECTORS
;
819 static int scsi_read_disc_information(SCSIDiskState
*s
, SCSIDiskReq
*r
,
822 uint8_t type
= r
->req
.cmd
.buf
[1] & 7;
824 if (s
->qdev
.type
!= TYPE_ROM
) {
828 /* Types 1/2 are only defined for Blu-Ray. */
830 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
834 memset(outbuf
, 0, 34);
836 outbuf
[2] = 0xe; /* last session complete, disc finalized */
837 outbuf
[3] = 1; /* first track on disc */
838 outbuf
[4] = 1; /* # of sessions */
839 outbuf
[5] = 1; /* first track of last session */
840 outbuf
[6] = 1; /* last track of last session */
841 outbuf
[7] = 0x20; /* unrestricted use */
842 outbuf
[8] = 0x00; /* CD-ROM or DVD-ROM */
843 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
844 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
845 /* 24-31: disc bar code */
846 /* 32: disc application code */
847 /* 33: number of OPC tables */
852 static int scsi_read_dvd_structure(SCSIDiskState
*s
, SCSIDiskReq
*r
,
855 static const int rds_caps_size
[5] = {
862 uint8_t media
= r
->req
.cmd
.buf
[1];
863 uint8_t layer
= r
->req
.cmd
.buf
[6];
864 uint8_t format
= r
->req
.cmd
.buf
[7];
867 if (s
->qdev
.type
!= TYPE_ROM
) {
871 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
875 if (format
!= 0xff) {
876 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
877 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
880 if (media_is_cd(s
)) {
881 scsi_check_condition(r
, SENSE_CODE(INCOMPATIBLE_FORMAT
));
884 if (format
>= ARRAY_SIZE(rds_caps_size
)) {
887 size
= rds_caps_size
[format
];
888 memset(outbuf
, 0, size
);
893 /* Physical format information */
898 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
900 outbuf
[4] = 1; /* DVD-ROM, part version 1 */
901 outbuf
[5] = 0xf; /* 120mm disc, minimum rate unspecified */
902 outbuf
[6] = 1; /* one layer, read-only (per MMC-2 spec) */
903 outbuf
[7] = 0; /* default densities */
905 stl_be_p(&outbuf
[12], (nb_sectors
>> 2) - 1); /* end sector */
906 stl_be_p(&outbuf
[16], (nb_sectors
>> 2) - 1); /* l0 end sector */
910 case 0x01: /* DVD copyright information, all zeros */
913 case 0x03: /* BCA information - invalid field for no BCA info */
916 case 0x04: /* DVD disc manufacturing information, all zeros */
919 case 0xff: { /* List capabilities */
922 for (i
= 0; i
< ARRAY_SIZE(rds_caps_size
); i
++) {
923 if (!rds_caps_size
[i
]) {
927 outbuf
[size
+ 1] = 0x40; /* Not writable, readable */
928 stw_be_p(&outbuf
[size
+ 2], rds_caps_size
[i
]);
938 /* Size of buffer, not including 2 byte size field */
939 stw_be_p(outbuf
, size
- 2);
946 static int scsi_event_status_media(SCSIDiskState
*s
, uint8_t *outbuf
)
948 uint8_t event_code
, media_status
;
952 media_status
= MS_TRAY_OPEN
;
953 } else if (blk_is_inserted(s
->qdev
.conf
.blk
)) {
954 media_status
= MS_MEDIA_PRESENT
;
957 /* Event notification descriptor */
958 event_code
= MEC_NO_CHANGE
;
959 if (media_status
!= MS_TRAY_OPEN
) {
960 if (s
->media_event
) {
961 event_code
= MEC_NEW_MEDIA
;
962 s
->media_event
= false;
963 } else if (s
->eject_request
) {
964 event_code
= MEC_EJECT_REQUESTED
;
965 s
->eject_request
= false;
969 outbuf
[0] = event_code
;
970 outbuf
[1] = media_status
;
972 /* These fields are reserved, just clear them. */
978 static int scsi_get_event_status_notification(SCSIDiskState
*s
, SCSIDiskReq
*r
,
982 uint8_t *buf
= r
->req
.cmd
.buf
;
983 uint8_t notification_class_request
= buf
[4];
984 if (s
->qdev
.type
!= TYPE_ROM
) {
987 if ((buf
[1] & 1) == 0) {
993 outbuf
[0] = outbuf
[1] = 0;
994 outbuf
[3] = 1 << GESN_MEDIA
; /* supported events */
995 if (notification_class_request
& (1 << GESN_MEDIA
)) {
996 outbuf
[2] = GESN_MEDIA
;
997 size
+= scsi_event_status_media(s
, &outbuf
[size
]);
1001 stw_be_p(outbuf
, size
- 4);
1005 static int scsi_get_configuration(SCSIDiskState
*s
, uint8_t *outbuf
)
1009 if (s
->qdev
.type
!= TYPE_ROM
) {
1013 if (media_is_dvd(s
)) {
1014 current
= MMC_PROFILE_DVD_ROM
;
1015 } else if (media_is_cd(s
)) {
1016 current
= MMC_PROFILE_CD_ROM
;
1018 current
= MMC_PROFILE_NONE
;
1021 memset(outbuf
, 0, 40);
1022 stl_be_p(&outbuf
[0], 36); /* Bytes after the data length field */
1023 stw_be_p(&outbuf
[6], current
);
1024 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
1025 outbuf
[10] = 0x03; /* persistent, current */
1026 outbuf
[11] = 8; /* two profiles */
1027 stw_be_p(&outbuf
[12], MMC_PROFILE_DVD_ROM
);
1028 outbuf
[14] = (current
== MMC_PROFILE_DVD_ROM
);
1029 stw_be_p(&outbuf
[16], MMC_PROFILE_CD_ROM
);
1030 outbuf
[18] = (current
== MMC_PROFILE_CD_ROM
);
1031 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
1032 stw_be_p(&outbuf
[20], 1);
1033 outbuf
[22] = 0x08 | 0x03; /* version 2, persistent, current */
1035 stl_be_p(&outbuf
[24], 1); /* SCSI */
1036 outbuf
[28] = 1; /* DBE = 1, mandatory */
1037 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
1038 stw_be_p(&outbuf
[32], 3);
1039 outbuf
[34] = 0x08 | 0x03; /* version 2, persistent, current */
1041 outbuf
[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
1042 /* TODO: Random readable, CD read, DVD read, drive serial number,
1047 static int scsi_emulate_mechanism_status(SCSIDiskState
*s
, uint8_t *outbuf
)
1049 if (s
->qdev
.type
!= TYPE_ROM
) {
1052 memset(outbuf
, 0, 8);
1053 outbuf
[5] = 1; /* CD-ROM */
1057 static int mode_sense_page(SCSIDiskState
*s
, int page
, uint8_t **p_outbuf
,
1060 static const int mode_sense_valid
[0x3f] = {
1061 [MODE_PAGE_HD_GEOMETRY
] = (1 << TYPE_DISK
),
1062 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
] = (1 << TYPE_DISK
),
1063 [MODE_PAGE_CACHING
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
1064 [MODE_PAGE_R_W_ERROR
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
1065 [MODE_PAGE_AUDIO_CTL
] = (1 << TYPE_ROM
),
1066 [MODE_PAGE_CAPABILITIES
] = (1 << TYPE_ROM
),
1069 uint8_t *p
= *p_outbuf
+ 2;
1072 if ((mode_sense_valid
[page
] & (1 << s
->qdev
.type
)) == 0) {
1077 * If Changeable Values are requested, a mask denoting those mode parameters
1078 * that are changeable shall be returned. As we currently don't support
1079 * parameter changes via MODE_SELECT all bits are returned set to zero.
1080 * The buffer was already menset to zero by the caller of this function.
1082 * The offsets here are off by two compared to the descriptions in the
1083 * SCSI specs, because those include a 2-byte header. This is unfortunate,
1084 * but it is done so that offsets are consistent within our implementation
1085 * of MODE SENSE and MODE SELECT. MODE SELECT has to deal with both
1086 * 2-byte and 4-byte headers.
1089 case MODE_PAGE_HD_GEOMETRY
:
1091 if (page_control
== 1) { /* Changeable Values */
1094 /* if a geometry hint is available, use it */
1095 p
[0] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1096 p
[1] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1097 p
[2] = s
->qdev
.conf
.cyls
& 0xff;
1098 p
[3] = s
->qdev
.conf
.heads
& 0xff;
1099 /* Write precomp start cylinder, disabled */
1100 p
[4] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1101 p
[5] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1102 p
[6] = s
->qdev
.conf
.cyls
& 0xff;
1103 /* Reduced current start cylinder, disabled */
1104 p
[7] = (s
->qdev
.conf
.cyls
>> 16) & 0xff;
1105 p
[8] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1106 p
[9] = s
->qdev
.conf
.cyls
& 0xff;
1107 /* Device step rate [ns], 200ns */
1110 /* Landing zone cylinder */
1114 /* Medium rotation rate [rpm], 5400 rpm */
1115 p
[18] = (5400 >> 8) & 0xff;
1116 p
[19] = 5400 & 0xff;
1119 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
:
1121 if (page_control
== 1) { /* Changeable Values */
1124 /* Transfer rate [kbit/s], 5Mbit/s */
1127 /* if a geometry hint is available, use it */
1128 p
[2] = s
->qdev
.conf
.heads
& 0xff;
1129 p
[3] = s
->qdev
.conf
.secs
& 0xff;
1130 p
[4] = s
->qdev
.blocksize
>> 8;
1131 p
[6] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1132 p
[7] = s
->qdev
.conf
.cyls
& 0xff;
1133 /* Write precomp start cylinder, disabled */
1134 p
[8] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1135 p
[9] = s
->qdev
.conf
.cyls
& 0xff;
1136 /* Reduced current start cylinder, disabled */
1137 p
[10] = (s
->qdev
.conf
.cyls
>> 8) & 0xff;
1138 p
[11] = s
->qdev
.conf
.cyls
& 0xff;
1139 /* Device step rate [100us], 100us */
1142 /* Device step pulse width [us], 1us */
1144 /* Device head settle delay [100us], 100us */
1147 /* Motor on delay [0.1s], 0.1s */
1149 /* Motor off delay [0.1s], 0.1s */
1151 /* Medium rotation rate [rpm], 5400 rpm */
1152 p
[26] = (5400 >> 8) & 0xff;
1153 p
[27] = 5400 & 0xff;
1156 case MODE_PAGE_CACHING
:
1158 if (page_control
== 1 || /* Changeable Values */
1159 blk_enable_write_cache(s
->qdev
.conf
.blk
)) {
1164 case MODE_PAGE_R_W_ERROR
:
1166 if (page_control
== 1) { /* Changeable Values */
1169 p
[0] = 0x80; /* Automatic Write Reallocation Enabled */
1170 if (s
->qdev
.type
== TYPE_ROM
) {
1171 p
[1] = 0x20; /* Read Retry Count */
1175 case MODE_PAGE_AUDIO_CTL
:
1179 case MODE_PAGE_CAPABILITIES
:
1181 if (page_control
== 1) { /* Changeable Values */
1185 p
[0] = 0x3b; /* CD-R & CD-RW read */
1186 p
[1] = 0; /* Writing not supported */
1187 p
[2] = 0x7f; /* Audio, composite, digital out,
1188 mode 2 form 1&2, multi session */
1189 p
[3] = 0xff; /* CD DA, DA accurate, RW supported,
1190 RW corrected, C2 errors, ISRC,
1192 p
[4] = 0x2d | (s
->tray_locked
? 2 : 0);
1193 /* Locking supported, jumper present, eject, tray */
1194 p
[5] = 0; /* no volume & mute control, no
1196 p
[6] = (50 * 176) >> 8; /* 50x read speed */
1197 p
[7] = (50 * 176) & 0xff;
1198 p
[8] = 2 >> 8; /* Two volume levels */
1200 p
[10] = 2048 >> 8; /* 2M buffer */
1201 p
[11] = 2048 & 0xff;
1202 p
[12] = (16 * 176) >> 8; /* 16x read speed current */
1203 p
[13] = (16 * 176) & 0xff;
1204 p
[16] = (16 * 176) >> 8; /* 16x write speed */
1205 p
[17] = (16 * 176) & 0xff;
1206 p
[18] = (16 * 176) >> 8; /* 16x write speed current */
1207 p
[19] = (16 * 176) & 0xff;
1214 assert(length
< 256);
1215 (*p_outbuf
)[0] = page
;
1216 (*p_outbuf
)[1] = length
;
1217 *p_outbuf
+= length
+ 2;
1221 static int scsi_disk_emulate_mode_sense(SCSIDiskReq
*r
, uint8_t *outbuf
)
1223 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1224 uint64_t nb_sectors
;
1226 int page
, buflen
, ret
, page_control
;
1228 uint8_t dev_specific_param
;
1230 dbd
= (r
->req
.cmd
.buf
[1] & 0x8) != 0;
1231 page
= r
->req
.cmd
.buf
[2] & 0x3f;
1232 page_control
= (r
->req
.cmd
.buf
[2] & 0xc0) >> 6;
1234 trace_scsi_disk_emulate_mode_sense((r
->req
.cmd
.buf
[0] == MODE_SENSE
) ? 6 :
1235 10, page
, r
->req
.cmd
.xfer
, page_control
);
1236 memset(outbuf
, 0, r
->req
.cmd
.xfer
);
1239 if (s
->qdev
.type
== TYPE_DISK
) {
1240 dev_specific_param
= s
->features
& (1 << SCSI_DISK_F_DPOFUA
) ? 0x10 : 0;
1241 if (!blk_is_writable(s
->qdev
.conf
.blk
)) {
1242 dev_specific_param
|= 0x80; /* Readonly. */
1245 /* MMC prescribes that CD/DVD drives have no block descriptors,
1246 * and defines no device-specific parameter. */
1247 dev_specific_param
= 0x00;
1251 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1252 p
[1] = 0; /* Default media type. */
1253 p
[2] = dev_specific_param
;
1254 p
[3] = 0; /* Block descriptor length. */
1256 } else { /* MODE_SENSE_10 */
1257 p
[2] = 0; /* Default media type. */
1258 p
[3] = dev_specific_param
;
1259 p
[6] = p
[7] = 0; /* Block descriptor length. */
1263 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1264 if (!dbd
&& nb_sectors
) {
1265 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1266 outbuf
[3] = 8; /* Block descriptor length */
1267 } else { /* MODE_SENSE_10 */
1268 outbuf
[7] = 8; /* Block descriptor length */
1270 nb_sectors
/= (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1271 if (nb_sectors
> 0xffffff) {
1274 p
[0] = 0; /* media density code */
1275 p
[1] = (nb_sectors
>> 16) & 0xff;
1276 p
[2] = (nb_sectors
>> 8) & 0xff;
1277 p
[3] = nb_sectors
& 0xff;
1278 p
[4] = 0; /* reserved */
1279 p
[5] = 0; /* bytes 5-7 are the sector size in bytes */
1280 p
[6] = s
->qdev
.blocksize
>> 8;
1285 if (page_control
== 3) {
1287 scsi_check_condition(r
, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED
));
1292 for (page
= 0; page
<= 0x3e; page
++) {
1293 mode_sense_page(s
, page
, &p
, page_control
);
1296 ret
= mode_sense_page(s
, page
, &p
, page_control
);
1302 buflen
= p
- outbuf
;
1304 * The mode data length field specifies the length in bytes of the
1305 * following data that is available to be transferred. The mode data
1306 * length does not include itself.
1308 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1309 outbuf
[0] = buflen
- 1;
1310 } else { /* MODE_SENSE_10 */
1311 outbuf
[0] = ((buflen
- 2) >> 8) & 0xff;
1312 outbuf
[1] = (buflen
- 2) & 0xff;
1317 static int scsi_disk_emulate_read_toc(SCSIRequest
*req
, uint8_t *outbuf
)
1319 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1320 int start_track
, format
, msf
, toclen
;
1321 uint64_t nb_sectors
;
1323 msf
= req
->cmd
.buf
[1] & 2;
1324 format
= req
->cmd
.buf
[2] & 0xf;
1325 start_track
= req
->cmd
.buf
[6];
1326 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1327 trace_scsi_disk_emulate_read_toc(start_track
, format
, msf
>> 1);
1328 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
1331 toclen
= cdrom_read_toc(nb_sectors
, outbuf
, msf
, start_track
);
1334 /* multi session : only a single session defined */
1336 memset(outbuf
, 0, 12);
1342 toclen
= cdrom_read_toc_raw(nb_sectors
, outbuf
, msf
, start_track
);
1350 static int scsi_disk_emulate_start_stop(SCSIDiskReq
*r
)
1352 SCSIRequest
*req
= &r
->req
;
1353 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1354 bool start
= req
->cmd
.buf
[4] & 1;
1355 bool loej
= req
->cmd
.buf
[4] & 2; /* load on start, eject on !start */
1356 int pwrcnd
= req
->cmd
.buf
[4] & 0xf0;
1359 /* eject/load only happens for power condition == 0 */
1363 if ((s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) && loej
) {
1364 if (!start
&& !s
->tray_open
&& s
->tray_locked
) {
1365 scsi_check_condition(r
,
1366 blk_is_inserted(s
->qdev
.conf
.blk
)
1367 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED
)
1368 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED
));
1372 if (s
->tray_open
!= !start
) {
1373 blk_eject(s
->qdev
.conf
.blk
, !start
);
1374 s
->tray_open
= !start
;
1380 static void scsi_disk_emulate_read_data(SCSIRequest
*req
)
1382 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1383 int buflen
= r
->iov
.iov_len
;
1386 trace_scsi_disk_emulate_read_data(buflen
);
1389 scsi_req_data(&r
->req
, buflen
);
1393 /* This also clears the sense buffer for REQUEST SENSE. */
1394 scsi_req_complete(&r
->req
, GOOD
);
1397 static int scsi_disk_check_mode_select(SCSIDiskState
*s
, int page
,
1398 uint8_t *inbuf
, int inlen
)
1400 uint8_t mode_current
[SCSI_MAX_MODE_LEN
];
1401 uint8_t mode_changeable
[SCSI_MAX_MODE_LEN
];
1403 int len
, expected_len
, changeable_len
, i
;
1405 /* The input buffer does not include the page header, so it is
1408 expected_len
= inlen
+ 2;
1409 if (expected_len
> SCSI_MAX_MODE_LEN
) {
1414 memset(mode_current
, 0, inlen
+ 2);
1415 len
= mode_sense_page(s
, page
, &p
, 0);
1416 if (len
< 0 || len
!= expected_len
) {
1420 p
= mode_changeable
;
1421 memset(mode_changeable
, 0, inlen
+ 2);
1422 changeable_len
= mode_sense_page(s
, page
, &p
, 1);
1423 assert(changeable_len
== len
);
1425 /* Check that unchangeable bits are the same as what MODE SENSE
1428 for (i
= 2; i
< len
; i
++) {
1429 if (((mode_current
[i
] ^ inbuf
[i
- 2]) & ~mode_changeable
[i
]) != 0) {
1436 static void scsi_disk_apply_mode_select(SCSIDiskState
*s
, int page
, uint8_t *p
)
1439 case MODE_PAGE_CACHING
:
1440 blk_set_enable_write_cache(s
->qdev
.conf
.blk
, (p
[0] & 4) != 0);
1448 static int mode_select_pages(SCSIDiskReq
*r
, uint8_t *p
, int len
, bool change
)
1450 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1453 int page
, subpage
, page_len
;
1455 /* Parse both possible formats for the mode page headers. */
1459 goto invalid_param_len
;
1462 page_len
= lduw_be_p(&p
[2]);
1467 goto invalid_param_len
;
1478 if (page_len
> len
) {
1479 goto invalid_param_len
;
1483 if (scsi_disk_check_mode_select(s
, page
, p
, page_len
) < 0) {
1487 scsi_disk_apply_mode_select(s
, page
, p
);
1496 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM
));
1500 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1504 static void scsi_disk_emulate_mode_select(SCSIDiskReq
*r
, uint8_t *inbuf
)
1506 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1508 int cmd
= r
->req
.cmd
.buf
[0];
1509 int len
= r
->req
.cmd
.xfer
;
1510 int hdr_len
= (cmd
== MODE_SELECT
? 4 : 8);
1514 /* We only support PF=1, SP=0. */
1515 if ((r
->req
.cmd
.buf
[1] & 0x11) != 0x10) {
1519 if (len
< hdr_len
) {
1520 goto invalid_param_len
;
1523 bd_len
= (cmd
== MODE_SELECT
? p
[3] : lduw_be_p(&p
[6]));
1527 goto invalid_param_len
;
1529 if (bd_len
!= 0 && bd_len
!= 8) {
1536 /* Ensure no change is made if there is an error! */
1537 for (pass
= 0; pass
< 2; pass
++) {
1538 if (mode_select_pages(r
, p
, len
, pass
== 1) < 0) {
1543 if (!blk_enable_write_cache(s
->qdev
.conf
.blk
)) {
1544 /* The request is used as the AIO opaque value, so add a ref. */
1545 scsi_req_ref(&r
->req
);
1546 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
1548 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
1552 scsi_req_complete(&r
->req
, GOOD
);
1556 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM
));
1560 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1564 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1567 static inline bool check_lba_range(SCSIDiskState
*s
,
1568 uint64_t sector_num
, uint32_t nb_sectors
)
1571 * The first line tests that no overflow happens when computing the last
1572 * sector. The second line tests that the last accessed sector is in
1575 * Careful, the computations should not underflow for nb_sectors == 0,
1576 * and a 0-block read to the first LBA beyond the end of device is
1579 return (sector_num
<= sector_num
+ nb_sectors
&&
1580 sector_num
+ nb_sectors
<= s
->qdev
.max_lba
+ 1);
1583 typedef struct UnmapCBData
{
1589 static void scsi_unmap_complete(void *opaque
, int ret
);
1591 static void scsi_unmap_complete_noio(UnmapCBData
*data
, int ret
)
1593 SCSIDiskReq
*r
= data
->r
;
1594 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1596 assert(r
->req
.aiocb
== NULL
);
1598 if (data
->count
> 0) {
1599 r
->sector
= ldq_be_p(&data
->inbuf
[0])
1600 * (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1601 r
->sector_count
= (ldl_be_p(&data
->inbuf
[8]) & 0xffffffffULL
)
1602 * (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1603 if (!check_lba_range(s
, r
->sector
, r
->sector_count
)) {
1604 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
),
1606 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1610 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1611 r
->sector_count
* BDRV_SECTOR_SIZE
,
1614 r
->req
.aiocb
= blk_aio_pdiscard(s
->qdev
.conf
.blk
,
1615 r
->sector
* BDRV_SECTOR_SIZE
,
1616 r
->sector_count
* BDRV_SECTOR_SIZE
,
1617 scsi_unmap_complete
, data
);
1623 scsi_req_complete(&r
->req
, GOOD
);
1626 scsi_req_unref(&r
->req
);
1630 static void scsi_unmap_complete(void *opaque
, int ret
)
1632 UnmapCBData
*data
= opaque
;
1633 SCSIDiskReq
*r
= data
->r
;
1634 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1636 assert(r
->req
.aiocb
!= NULL
);
1637 r
->req
.aiocb
= NULL
;
1639 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
1640 if (scsi_disk_req_check_error(r
, ret
, true)) {
1641 scsi_req_unref(&r
->req
);
1644 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
1645 scsi_unmap_complete_noio(data
, ret
);
1647 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
1650 static void scsi_disk_emulate_unmap(SCSIDiskReq
*r
, uint8_t *inbuf
)
1652 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1654 int len
= r
->req
.cmd
.xfer
;
1657 /* Reject ANCHOR=1. */
1658 if (r
->req
.cmd
.buf
[1] & 0x1) {
1663 goto invalid_param_len
;
1665 if (len
< lduw_be_p(&p
[0]) + 2) {
1666 goto invalid_param_len
;
1668 if (len
< lduw_be_p(&p
[2]) + 8) {
1669 goto invalid_param_len
;
1671 if (lduw_be_p(&p
[2]) & 15) {
1672 goto invalid_param_len
;
1675 if (!blk_is_writable(s
->qdev
.conf
.blk
)) {
1676 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
), BLOCK_ACCT_UNMAP
);
1677 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
1681 data
= g_new0(UnmapCBData
, 1);
1683 data
->inbuf
= &p
[8];
1684 data
->count
= lduw_be_p(&p
[2]) >> 4;
1686 /* The matching unref is in scsi_unmap_complete, before data is freed. */
1687 scsi_req_ref(&r
->req
);
1688 scsi_unmap_complete_noio(data
, 0);
1692 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
), BLOCK_ACCT_UNMAP
);
1693 scsi_check_condition(r
, SENSE_CODE(INVALID_PARAM_LEN
));
1697 block_acct_invalid(blk_get_stats(s
->qdev
.conf
.blk
), BLOCK_ACCT_UNMAP
);
1698 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1701 typedef struct WriteSameCBData
{
1709 static void scsi_write_same_complete(void *opaque
, int ret
)
1711 WriteSameCBData
*data
= opaque
;
1712 SCSIDiskReq
*r
= data
->r
;
1713 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
1715 assert(r
->req
.aiocb
!= NULL
);
1716 r
->req
.aiocb
= NULL
;
1717 aio_context_acquire(blk_get_aio_context(s
->qdev
.conf
.blk
));
1718 if (scsi_disk_req_check_error(r
, ret
, true)) {
1722 block_acct_done(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
);
1724 data
->nb_sectors
-= data
->iov
.iov_len
/ BDRV_SECTOR_SIZE
;
1725 data
->sector
+= data
->iov
.iov_len
/ BDRV_SECTOR_SIZE
;
1726 data
->iov
.iov_len
= MIN(data
->nb_sectors
* BDRV_SECTOR_SIZE
,
1728 if (data
->iov
.iov_len
) {
1729 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1730 data
->iov
.iov_len
, BLOCK_ACCT_WRITE
);
1731 /* Reinitialize qiov, to handle unaligned WRITE SAME request
1732 * where final qiov may need smaller size */
1733 qemu_iovec_init_external(&data
->qiov
, &data
->iov
, 1);
1734 r
->req
.aiocb
= blk_aio_pwritev(s
->qdev
.conf
.blk
,
1735 data
->sector
<< BDRV_SECTOR_BITS
,
1737 scsi_write_same_complete
, data
);
1738 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
1742 scsi_req_complete(&r
->req
, GOOD
);
1745 scsi_req_unref(&r
->req
);
1746 qemu_vfree(data
->iov
.iov_base
);
1748 aio_context_release(blk_get_aio_context(s
->qdev
.conf
.blk
));
1751 static void scsi_disk_emulate_write_same(SCSIDiskReq
*r
, uint8_t *inbuf
)
1753 SCSIRequest
*req
= &r
->req
;
1754 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1755 uint32_t nb_sectors
= scsi_data_cdb_xfer(r
->req
.cmd
.buf
);
1756 WriteSameCBData
*data
;
1760 /* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
1761 if (nb_sectors
== 0 || (req
->cmd
.buf
[1] & 0x16)) {
1762 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1766 if (!blk_is_writable(s
->qdev
.conf
.blk
)) {
1767 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
1770 if (!check_lba_range(s
, r
->req
.cmd
.lba
, nb_sectors
)) {
1771 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1775 if ((req
->cmd
.buf
[1] & 0x1) || buffer_is_zero(inbuf
, s
->qdev
.blocksize
)) {
1776 int flags
= (req
->cmd
.buf
[1] & 0x8) ? BDRV_REQ_MAY_UNMAP
: 0;
1778 /* The request is used as the AIO opaque value, so add a ref. */
1779 scsi_req_ref(&r
->req
);
1780 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1781 nb_sectors
* s
->qdev
.blocksize
,
1783 r
->req
.aiocb
= blk_aio_pwrite_zeroes(s
->qdev
.conf
.blk
,
1784 r
->req
.cmd
.lba
* s
->qdev
.blocksize
,
1785 nb_sectors
* s
->qdev
.blocksize
,
1786 flags
, scsi_aio_complete
, r
);
1790 data
= g_new0(WriteSameCBData
, 1);
1792 data
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1793 data
->nb_sectors
= nb_sectors
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
1794 data
->iov
.iov_len
= MIN(data
->nb_sectors
* BDRV_SECTOR_SIZE
,
1795 SCSI_WRITE_SAME_MAX
);
1796 data
->iov
.iov_base
= buf
= blk_blockalign(s
->qdev
.conf
.blk
,
1798 qemu_iovec_init_external(&data
->qiov
, &data
->iov
, 1);
1800 for (i
= 0; i
< data
->iov
.iov_len
; i
+= s
->qdev
.blocksize
) {
1801 memcpy(&buf
[i
], inbuf
, s
->qdev
.blocksize
);
1804 scsi_req_ref(&r
->req
);
1805 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
,
1806 data
->iov
.iov_len
, BLOCK_ACCT_WRITE
);
1807 r
->req
.aiocb
= blk_aio_pwritev(s
->qdev
.conf
.blk
,
1808 data
->sector
<< BDRV_SECTOR_BITS
,
1810 scsi_write_same_complete
, data
);
1813 static void scsi_disk_emulate_write_data(SCSIRequest
*req
)
1815 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1817 if (r
->iov
.iov_len
) {
1818 int buflen
= r
->iov
.iov_len
;
1819 trace_scsi_disk_emulate_write_data(buflen
);
1821 scsi_req_data(&r
->req
, buflen
);
1825 switch (req
->cmd
.buf
[0]) {
1827 case MODE_SELECT_10
:
1828 /* This also clears the sense buffer for REQUEST SENSE. */
1829 scsi_disk_emulate_mode_select(r
, r
->iov
.iov_base
);
1833 scsi_disk_emulate_unmap(r
, r
->iov
.iov_base
);
1839 if (r
->req
.status
== -1) {
1840 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1846 scsi_disk_emulate_write_same(r
, r
->iov
.iov_base
);
1854 static int32_t scsi_disk_emulate_command(SCSIRequest
*req
, uint8_t *buf
)
1856 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1857 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1858 uint64_t nb_sectors
;
1862 switch (req
->cmd
.buf
[0]) {
1871 case ALLOW_MEDIUM_REMOVAL
:
1872 case GET_CONFIGURATION
:
1873 case GET_EVENT_STATUS_NOTIFICATION
:
1874 case MECHANISM_STATUS
:
1879 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
1880 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
1887 * FIXME: we shouldn't return anything bigger than 4k, but the code
1888 * requires the buffer to be as big as req->cmd.xfer in several
1889 * places. So, do not allow CDBs with a very large ALLOCATION
1890 * LENGTH. The real fix would be to modify scsi_read_data and
1891 * dma_buf_read, so that they return data beyond the buflen
1894 if (req
->cmd
.xfer
> 65536) {
1895 goto illegal_request
;
1897 r
->buflen
= MAX(4096, req
->cmd
.xfer
);
1899 if (!r
->iov
.iov_base
) {
1900 r
->iov
.iov_base
= blk_blockalign(s
->qdev
.conf
.blk
, r
->buflen
);
1903 outbuf
= r
->iov
.iov_base
;
1904 memset(outbuf
, 0, r
->buflen
);
1905 switch (req
->cmd
.buf
[0]) {
1906 case TEST_UNIT_READY
:
1907 assert(blk_is_available(s
->qdev
.conf
.blk
));
1910 buflen
= scsi_disk_emulate_inquiry(req
, outbuf
);
1912 goto illegal_request
;
1917 buflen
= scsi_disk_emulate_mode_sense(r
, outbuf
);
1919 goto illegal_request
;
1923 buflen
= scsi_disk_emulate_read_toc(req
, outbuf
);
1925 goto illegal_request
;
1929 if (req
->cmd
.buf
[1] & 1) {
1930 goto illegal_request
;
1934 if (req
->cmd
.buf
[1] & 3) {
1935 goto illegal_request
;
1939 if (req
->cmd
.buf
[1] & 1) {
1940 goto illegal_request
;
1944 if (req
->cmd
.buf
[1] & 3) {
1945 goto illegal_request
;
1949 if (scsi_disk_emulate_start_stop(r
) < 0) {
1953 case ALLOW_MEDIUM_REMOVAL
:
1954 s
->tray_locked
= req
->cmd
.buf
[4] & 1;
1955 blk_lock_medium(s
->qdev
.conf
.blk
, req
->cmd
.buf
[4] & 1);
1957 case READ_CAPACITY_10
:
1958 /* The normal LEN field for this command is zero. */
1959 memset(outbuf
, 0, 8);
1960 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
1962 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
1965 if ((req
->cmd
.buf
[8] & 1) == 0 && req
->cmd
.lba
) {
1966 goto illegal_request
;
1968 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
1969 /* Returned value is the address of the last sector. */
1971 /* Remember the new size for read/write sanity checking. */
1972 s
->qdev
.max_lba
= nb_sectors
;
1973 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1974 if (nb_sectors
> UINT32_MAX
) {
1975 nb_sectors
= UINT32_MAX
;
1977 outbuf
[0] = (nb_sectors
>> 24) & 0xff;
1978 outbuf
[1] = (nb_sectors
>> 16) & 0xff;
1979 outbuf
[2] = (nb_sectors
>> 8) & 0xff;
1980 outbuf
[3] = nb_sectors
& 0xff;
1983 outbuf
[6] = s
->qdev
.blocksize
>> 8;
1987 /* Just return "NO SENSE". */
1988 buflen
= scsi_convert_sense(NULL
, 0, outbuf
, r
->buflen
,
1989 (req
->cmd
.buf
[1] & 1) == 0);
1991 goto illegal_request
;
1994 case MECHANISM_STATUS
:
1995 buflen
= scsi_emulate_mechanism_status(s
, outbuf
);
1997 goto illegal_request
;
2000 case GET_CONFIGURATION
:
2001 buflen
= scsi_get_configuration(s
, outbuf
);
2003 goto illegal_request
;
2006 case GET_EVENT_STATUS_NOTIFICATION
:
2007 buflen
= scsi_get_event_status_notification(s
, r
, outbuf
);
2009 goto illegal_request
;
2012 case READ_DISC_INFORMATION
:
2013 buflen
= scsi_read_disc_information(s
, r
, outbuf
);
2015 goto illegal_request
;
2018 case READ_DVD_STRUCTURE
:
2019 buflen
= scsi_read_dvd_structure(s
, r
, outbuf
);
2021 goto illegal_request
;
2024 case SERVICE_ACTION_IN_16
:
2025 /* Service Action In subcommands. */
2026 if ((req
->cmd
.buf
[1] & 31) == SAI_READ_CAPACITY_16
) {
2027 trace_scsi_disk_emulate_command_SAI_16();
2028 memset(outbuf
, 0, req
->cmd
.xfer
);
2029 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
2031 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
2034 if ((req
->cmd
.buf
[14] & 1) == 0 && req
->cmd
.lba
) {
2035 goto illegal_request
;
2037 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
2038 /* Returned value is the address of the last sector. */
2040 /* Remember the new size for read/write sanity checking. */
2041 s
->qdev
.max_lba
= nb_sectors
;
2042 outbuf
[0] = (nb_sectors
>> 56) & 0xff;
2043 outbuf
[1] = (nb_sectors
>> 48) & 0xff;
2044 outbuf
[2] = (nb_sectors
>> 40) & 0xff;
2045 outbuf
[3] = (nb_sectors
>> 32) & 0xff;
2046 outbuf
[4] = (nb_sectors
>> 24) & 0xff;
2047 outbuf
[5] = (nb_sectors
>> 16) & 0xff;
2048 outbuf
[6] = (nb_sectors
>> 8) & 0xff;
2049 outbuf
[7] = nb_sectors
& 0xff;
2052 outbuf
[10] = s
->qdev
.blocksize
>> 8;
2055 outbuf
[13] = get_physical_block_exp(&s
->qdev
.conf
);
2057 /* set TPE bit if the format supports discard */
2058 if (s
->qdev
.conf
.discard_granularity
) {
2062 /* Protection, exponent and lowest lba field left blank. */
2065 trace_scsi_disk_emulate_command_SAI_unsupported();
2066 goto illegal_request
;
2067 case SYNCHRONIZE_CACHE
:
2068 /* The request is used as the AIO opaque value, so add a ref. */
2069 scsi_req_ref(&r
->req
);
2070 block_acct_start(blk_get_stats(s
->qdev
.conf
.blk
), &r
->acct
, 0,
2072 r
->req
.aiocb
= blk_aio_flush(s
->qdev
.conf
.blk
, scsi_aio_complete
, r
);
2075 trace_scsi_disk_emulate_command_SEEK_10(r
->req
.cmd
.lba
);
2076 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
2081 trace_scsi_disk_emulate_command_MODE_SELECT(r
->req
.cmd
.xfer
);
2083 case MODE_SELECT_10
:
2084 trace_scsi_disk_emulate_command_MODE_SELECT_10(r
->req
.cmd
.xfer
);
2087 trace_scsi_disk_emulate_command_UNMAP(r
->req
.cmd
.xfer
);
2092 trace_scsi_disk_emulate_command_VERIFY((req
->cmd
.buf
[1] >> 1) & 3);
2093 if (req
->cmd
.buf
[1] & 6) {
2094 goto illegal_request
;
2099 trace_scsi_disk_emulate_command_WRITE_SAME(
2100 req
->cmd
.buf
[0] == WRITE_SAME_10
? 10 : 16, r
->req
.cmd
.xfer
);
2103 trace_scsi_disk_emulate_command_UNKNOWN(buf
[0],
2104 scsi_command_name(buf
[0]));
2105 scsi_check_condition(r
, SENSE_CODE(INVALID_OPCODE
));
2108 assert(!r
->req
.aiocb
);
2109 r
->iov
.iov_len
= MIN(r
->buflen
, req
->cmd
.xfer
);
2110 if (r
->iov
.iov_len
== 0) {
2111 scsi_req_complete(&r
->req
, GOOD
);
2113 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
2114 assert(r
->iov
.iov_len
== req
->cmd
.xfer
);
2115 return -r
->iov
.iov_len
;
2117 return r
->iov
.iov_len
;
2121 if (r
->req
.status
== -1) {
2122 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
2127 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
2131 /* Execute a scsi command. Returns the length of the data expected by the
2132 command. This will be Positive for data transfers from the device
2133 (eg. disk reads), negative for transfers to the device (eg. disk writes),
2134 and zero if the command does not transfer any data. */
2136 static int32_t scsi_disk_dma_command(SCSIRequest
*req
, uint8_t *buf
)
2138 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
2139 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
2140 SCSIDiskClass
*sdc
= (SCSIDiskClass
*) object_get_class(OBJECT(s
));
2146 if (!blk_is_available(s
->qdev
.conf
.blk
)) {
2147 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
2151 len
= scsi_data_cdb_xfer(r
->req
.cmd
.buf
);
2157 trace_scsi_disk_dma_command_READ(r
->req
.cmd
.lba
, len
);
2158 /* Protection information is not supported. For SCSI versions 2 and
2159 * older (as determined by snooping the guest's INQUIRY commands),
2160 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2162 if (s
->qdev
.scsi_version
> 2 && (r
->req
.cmd
.buf
[1] & 0xe0)) {
2163 goto illegal_request
;
2165 if (!check_lba_range(s
, r
->req
.cmd
.lba
, len
)) {
2168 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2169 r
->sector_count
= len
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2175 case WRITE_VERIFY_10
:
2176 case WRITE_VERIFY_12
:
2177 case WRITE_VERIFY_16
:
2178 if (!blk_is_writable(s
->qdev
.conf
.blk
)) {
2179 scsi_check_condition(r
, SENSE_CODE(WRITE_PROTECTED
));
2182 trace_scsi_disk_dma_command_WRITE(
2183 (command
& 0xe) == 0xe ? "And Verify " : "",
2184 r
->req
.cmd
.lba
, len
);
2189 /* We get here only for BYTCHK == 0x01 and only for scsi-block.
2190 * As far as DMA is concerned, we can treat it the same as a write;
2191 * scsi_block_do_sgio will send VERIFY commands.
2193 if (s
->qdev
.scsi_version
> 2 && (r
->req
.cmd
.buf
[1] & 0xe0)) {
2194 goto illegal_request
;
2196 if (!check_lba_range(s
, r
->req
.cmd
.lba
, len
)) {
2199 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2200 r
->sector_count
= len
* (s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
);
2205 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
2208 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
2211 r
->need_fua_emulation
= sdc
->need_fua_emulation(&r
->req
.cmd
);
2212 if (r
->sector_count
== 0) {
2213 scsi_req_complete(&r
->req
, GOOD
);
2215 assert(r
->iov
.iov_len
== 0);
2216 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
2217 return -r
->sector_count
* BDRV_SECTOR_SIZE
;
2219 return r
->sector_count
* BDRV_SECTOR_SIZE
;
2223 static void scsi_disk_reset(DeviceState
*dev
)
2225 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
.qdev
, dev
);
2226 uint64_t nb_sectors
;
2228 scsi_device_purge_requests(&s
->qdev
, SENSE_CODE(RESET
));
2230 blk_get_geometry(s
->qdev
.conf
.blk
, &nb_sectors
);
2231 nb_sectors
/= s
->qdev
.blocksize
/ BDRV_SECTOR_SIZE
;
2235 s
->qdev
.max_lba
= nb_sectors
;
2236 /* reset tray statuses */
2240 s
->qdev
.scsi_version
= s
->qdev
.default_scsi_version
;
2243 static void scsi_disk_resize_cb(void *opaque
)
2245 SCSIDiskState
*s
= opaque
;
2247 /* SPC lists this sense code as available only for
2248 * direct-access devices.
2250 if (s
->qdev
.type
== TYPE_DISK
) {
2251 scsi_device_report_change(&s
->qdev
, SENSE_CODE(CAPACITY_CHANGED
));
2255 static void scsi_cd_change_media_cb(void *opaque
, bool load
, Error
**errp
)
2257 SCSIDiskState
*s
= opaque
;
2260 * When a CD gets changed, we have to report an ejected state and
2261 * then a loaded state to guests so that they detect tray
2262 * open/close and media change events. Guests that do not use
2263 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
2264 * states rely on this behavior.
2266 * media_changed governs the state machine used for unit attention
2267 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
2269 s
->media_changed
= load
;
2270 s
->tray_open
= !load
;
2271 scsi_device_set_ua(&s
->qdev
, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM
));
2272 s
->media_event
= true;
2273 s
->eject_request
= false;
2276 static void scsi_cd_eject_request_cb(void *opaque
, bool force
)
2278 SCSIDiskState
*s
= opaque
;
2280 s
->eject_request
= true;
2282 s
->tray_locked
= false;
2286 static bool scsi_cd_is_tray_open(void *opaque
)
2288 return ((SCSIDiskState
*)opaque
)->tray_open
;
2291 static bool scsi_cd_is_medium_locked(void *opaque
)
2293 return ((SCSIDiskState
*)opaque
)->tray_locked
;
2296 static const BlockDevOps scsi_disk_removable_block_ops
= {
2297 .change_media_cb
= scsi_cd_change_media_cb
,
2298 .eject_request_cb
= scsi_cd_eject_request_cb
,
2299 .is_tray_open
= scsi_cd_is_tray_open
,
2300 .is_medium_locked
= scsi_cd_is_medium_locked
,
2302 .resize_cb
= scsi_disk_resize_cb
,
2305 static const BlockDevOps scsi_disk_block_ops
= {
2306 .resize_cb
= scsi_disk_resize_cb
,
2309 static void scsi_disk_unit_attention_reported(SCSIDevice
*dev
)
2311 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2312 if (s
->media_changed
) {
2313 s
->media_changed
= false;
2314 scsi_device_set_ua(&s
->qdev
, SENSE_CODE(MEDIUM_CHANGED
));
2318 static void scsi_realize(SCSIDevice
*dev
, Error
**errp
)
2320 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2323 if (!s
->qdev
.conf
.blk
) {
2324 error_setg(errp
, "drive property not set");
2328 if (!(s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) &&
2329 !blk_is_inserted(s
->qdev
.conf
.blk
)) {
2330 error_setg(errp
, "Device needs media, but drive is empty");
2334 if (!blkconf_blocksizes(&s
->qdev
.conf
, errp
)) {
2338 if (blk_get_aio_context(s
->qdev
.conf
.blk
) != qemu_get_aio_context() &&
2339 !s
->qdev
.hba_supports_iothread
)
2341 error_setg(errp
, "HBA does not support iothreads");
2345 if (dev
->type
== TYPE_DISK
) {
2346 if (!blkconf_geometry(&dev
->conf
, NULL
, 65535, 255, 255, errp
)) {
2351 read_only
= !blk_supports_write_perm(s
->qdev
.conf
.blk
);
2352 if (dev
->type
== TYPE_ROM
) {
2356 if (!blkconf_apply_backend_options(&dev
->conf
, read_only
,
2357 dev
->type
== TYPE_DISK
, errp
)) {
2361 if (s
->qdev
.conf
.discard_granularity
== -1) {
2362 s
->qdev
.conf
.discard_granularity
=
2363 MAX(s
->qdev
.conf
.logical_block_size
, DEFAULT_DISCARD_GRANULARITY
);
2367 s
->version
= g_strdup(qemu_hw_version());
2370 s
->vendor
= g_strdup("QEMU");
2372 if (!s
->device_id
) {
2374 s
->device_id
= g_strdup_printf("%.20s", s
->serial
);
2376 const char *str
= blk_name(s
->qdev
.conf
.blk
);
2378 s
->device_id
= g_strdup(str
);
2383 if (blk_is_sg(s
->qdev
.conf
.blk
)) {
2384 error_setg(errp
, "unwanted /dev/sg*");
2388 if ((s
->features
& (1 << SCSI_DISK_F_REMOVABLE
)) &&
2389 !(s
->features
& (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS
))) {
2390 blk_set_dev_ops(s
->qdev
.conf
.blk
, &scsi_disk_removable_block_ops
, s
);
2392 blk_set_dev_ops(s
->qdev
.conf
.blk
, &scsi_disk_block_ops
, s
);
2394 blk_set_guest_block_size(s
->qdev
.conf
.blk
, s
->qdev
.blocksize
);
2396 blk_iostatus_enable(s
->qdev
.conf
.blk
);
2398 add_boot_device_lchs(&dev
->qdev
, NULL
,
2404 static void scsi_unrealize(SCSIDevice
*dev
)
2406 del_boot_device_lchs(&dev
->qdev
, NULL
);
2409 static void scsi_hd_realize(SCSIDevice
*dev
, Error
**errp
)
2411 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2412 AioContext
*ctx
= NULL
;
2413 /* can happen for devices without drive. The error message for missing
2414 * backend will be issued in scsi_realize
2416 if (s
->qdev
.conf
.blk
) {
2417 ctx
= blk_get_aio_context(s
->qdev
.conf
.blk
);
2418 aio_context_acquire(ctx
);
2419 if (!blkconf_blocksizes(&s
->qdev
.conf
, errp
)) {
2423 s
->qdev
.blocksize
= s
->qdev
.conf
.logical_block_size
;
2424 s
->qdev
.type
= TYPE_DISK
;
2426 s
->product
= g_strdup("QEMU HARDDISK");
2428 scsi_realize(&s
->qdev
, errp
);
2431 aio_context_release(ctx
);
2435 static void scsi_cd_realize(SCSIDevice
*dev
, Error
**errp
)
2437 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2441 if (!dev
->conf
.blk
) {
2442 /* Anonymous BlockBackend for an empty drive. As we put it into
2443 * dev->conf, qdev takes care of detaching on unplug. */
2444 dev
->conf
.blk
= blk_new(qemu_get_aio_context(), 0, BLK_PERM_ALL
);
2445 ret
= blk_attach_dev(dev
->conf
.blk
, &dev
->qdev
);
2449 ctx
= blk_get_aio_context(dev
->conf
.blk
);
2450 aio_context_acquire(ctx
);
2451 s
->qdev
.blocksize
= 2048;
2452 s
->qdev
.type
= TYPE_ROM
;
2453 s
->features
|= 1 << SCSI_DISK_F_REMOVABLE
;
2455 s
->product
= g_strdup("QEMU CD-ROM");
2457 scsi_realize(&s
->qdev
, errp
);
2458 aio_context_release(ctx
);
2461 static void scsi_disk_realize(SCSIDevice
*dev
, Error
**errp
)
2464 Error
*local_err
= NULL
;
2466 warn_report("'scsi-disk' is deprecated, "
2467 "please use 'scsi-hd' or 'scsi-cd' instead");
2469 if (!dev
->conf
.blk
) {
2470 scsi_realize(dev
, &local_err
);
2472 error_propagate(errp
, local_err
);
2476 dinfo
= blk_legacy_dinfo(dev
->conf
.blk
);
2477 if (dinfo
&& dinfo
->media_cd
) {
2478 scsi_cd_realize(dev
, errp
);
2480 scsi_hd_realize(dev
, errp
);
2484 static const SCSIReqOps scsi_disk_emulate_reqops
= {
2485 .size
= sizeof(SCSIDiskReq
),
2486 .free_req
= scsi_free_request
,
2487 .send_command
= scsi_disk_emulate_command
,
2488 .read_data
= scsi_disk_emulate_read_data
,
2489 .write_data
= scsi_disk_emulate_write_data
,
2490 .get_buf
= scsi_get_buf
,
2493 static const SCSIReqOps scsi_disk_dma_reqops
= {
2494 .size
= sizeof(SCSIDiskReq
),
2495 .free_req
= scsi_free_request
,
2496 .send_command
= scsi_disk_dma_command
,
2497 .read_data
= scsi_read_data
,
2498 .write_data
= scsi_write_data
,
2499 .get_buf
= scsi_get_buf
,
2500 .load_request
= scsi_disk_load_request
,
2501 .save_request
= scsi_disk_save_request
,
2504 static const SCSIReqOps
*const scsi_disk_reqops_dispatch
[256] = {
2505 [TEST_UNIT_READY
] = &scsi_disk_emulate_reqops
,
2506 [INQUIRY
] = &scsi_disk_emulate_reqops
,
2507 [MODE_SENSE
] = &scsi_disk_emulate_reqops
,
2508 [MODE_SENSE_10
] = &scsi_disk_emulate_reqops
,
2509 [START_STOP
] = &scsi_disk_emulate_reqops
,
2510 [ALLOW_MEDIUM_REMOVAL
] = &scsi_disk_emulate_reqops
,
2511 [READ_CAPACITY_10
] = &scsi_disk_emulate_reqops
,
2512 [READ_TOC
] = &scsi_disk_emulate_reqops
,
2513 [READ_DVD_STRUCTURE
] = &scsi_disk_emulate_reqops
,
2514 [READ_DISC_INFORMATION
] = &scsi_disk_emulate_reqops
,
2515 [GET_CONFIGURATION
] = &scsi_disk_emulate_reqops
,
2516 [GET_EVENT_STATUS_NOTIFICATION
] = &scsi_disk_emulate_reqops
,
2517 [MECHANISM_STATUS
] = &scsi_disk_emulate_reqops
,
2518 [SERVICE_ACTION_IN_16
] = &scsi_disk_emulate_reqops
,
2519 [REQUEST_SENSE
] = &scsi_disk_emulate_reqops
,
2520 [SYNCHRONIZE_CACHE
] = &scsi_disk_emulate_reqops
,
2521 [SEEK_10
] = &scsi_disk_emulate_reqops
,
2522 [MODE_SELECT
] = &scsi_disk_emulate_reqops
,
2523 [MODE_SELECT_10
] = &scsi_disk_emulate_reqops
,
2524 [UNMAP
] = &scsi_disk_emulate_reqops
,
2525 [WRITE_SAME_10
] = &scsi_disk_emulate_reqops
,
2526 [WRITE_SAME_16
] = &scsi_disk_emulate_reqops
,
2527 [VERIFY_10
] = &scsi_disk_emulate_reqops
,
2528 [VERIFY_12
] = &scsi_disk_emulate_reqops
,
2529 [VERIFY_16
] = &scsi_disk_emulate_reqops
,
2531 [READ_6
] = &scsi_disk_dma_reqops
,
2532 [READ_10
] = &scsi_disk_dma_reqops
,
2533 [READ_12
] = &scsi_disk_dma_reqops
,
2534 [READ_16
] = &scsi_disk_dma_reqops
,
2535 [WRITE_6
] = &scsi_disk_dma_reqops
,
2536 [WRITE_10
] = &scsi_disk_dma_reqops
,
2537 [WRITE_12
] = &scsi_disk_dma_reqops
,
2538 [WRITE_16
] = &scsi_disk_dma_reqops
,
2539 [WRITE_VERIFY_10
] = &scsi_disk_dma_reqops
,
2540 [WRITE_VERIFY_12
] = &scsi_disk_dma_reqops
,
2541 [WRITE_VERIFY_16
] = &scsi_disk_dma_reqops
,
2544 static void scsi_disk_new_request_dump(uint32_t lun
, uint32_t tag
, uint8_t *buf
)
2547 int len
= scsi_cdb_length(buf
);
2548 char *line_buffer
, *p
;
2550 line_buffer
= g_malloc(len
* 5 + 1);
2552 for (i
= 0, p
= line_buffer
; i
< len
; i
++) {
2553 p
+= sprintf(p
, " 0x%02x", buf
[i
]);
2555 trace_scsi_disk_new_request(lun
, tag
, line_buffer
);
2557 g_free(line_buffer
);
2560 static SCSIRequest
*scsi_new_request(SCSIDevice
*d
, uint32_t tag
, uint32_t lun
,
2561 uint8_t *buf
, void *hba_private
)
2563 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2565 const SCSIReqOps
*ops
;
2569 ops
= scsi_disk_reqops_dispatch
[command
];
2571 ops
= &scsi_disk_emulate_reqops
;
2573 req
= scsi_req_alloc(ops
, &s
->qdev
, tag
, lun
, hba_private
);
2575 if (trace_event_get_state_backends(TRACE_SCSI_DISK_NEW_REQUEST
)) {
2576 scsi_disk_new_request_dump(lun
, tag
, buf
);
2583 static int get_device_type(SCSIDiskState
*s
)
2589 memset(cmd
, 0, sizeof(cmd
));
2590 memset(buf
, 0, sizeof(buf
));
2592 cmd
[4] = sizeof(buf
);
2594 ret
= scsi_SG_IO_FROM_DEV(s
->qdev
.conf
.blk
, cmd
, sizeof(cmd
),
2595 buf
, sizeof(buf
), s
->qdev
.io_timeout
);
2599 s
->qdev
.type
= buf
[0];
2600 if (buf
[1] & 0x80) {
2601 s
->features
|= 1 << SCSI_DISK_F_REMOVABLE
;
2606 static void scsi_block_realize(SCSIDevice
*dev
, Error
**errp
)
2608 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
2613 if (!s
->qdev
.conf
.blk
) {
2614 error_setg(errp
, "drive property not set");
2618 if (s
->rotation_rate
) {
2619 error_report_once("rotation_rate is specified for scsi-block but is "
2620 "not implemented. This option is deprecated and will "
2621 "be removed in a future version");
2624 ctx
= blk_get_aio_context(s
->qdev
.conf
.blk
);
2625 aio_context_acquire(ctx
);
2627 /* check we are using a driver managing SG_IO (version 3 and after) */
2628 rc
= blk_ioctl(s
->qdev
.conf
.blk
, SG_GET_VERSION_NUM
, &sg_version
);
2630 error_setg_errno(errp
, -rc
, "cannot get SG_IO version number");
2632 error_append_hint(errp
, "Is this a SCSI device?\n");
2636 if (sg_version
< 30000) {
2637 error_setg(errp
, "scsi generic interface too old");
2641 /* get device type from INQUIRY data */
2642 rc
= get_device_type(s
);
2644 error_setg(errp
, "INQUIRY failed");
2648 /* Make a guess for the block size, we'll fix it when the guest sends.
2649 * READ CAPACITY. If they don't, they likely would assume these sizes
2650 * anyway. (TODO: check in /sys).
2652 if (s
->qdev
.type
== TYPE_ROM
|| s
->qdev
.type
== TYPE_WORM
) {
2653 s
->qdev
.blocksize
= 2048;
2655 s
->qdev
.blocksize
= 512;
2658 /* Makes the scsi-block device not removable by using HMP and QMP eject
2661 s
->features
|= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS
);
2663 scsi_realize(&s
->qdev
, errp
);
2664 scsi_generic_read_device_inquiry(&s
->qdev
);
2667 aio_context_release(ctx
);
2670 typedef struct SCSIBlockReq
{
2672 sg_io_hdr_t io_header
;
2674 /* Selected bytes of the original CDB, copied into our own CDB. */
2675 uint8_t cmd
, cdb1
, group_number
;
2677 /* CDB passed to SG_IO. */
2681 static BlockAIOCB
*scsi_block_do_sgio(SCSIBlockReq
*req
,
2682 int64_t offset
, QEMUIOVector
*iov
,
2684 BlockCompletionFunc
*cb
, void *opaque
)
2686 sg_io_hdr_t
*io_header
= &req
->io_header
;
2687 SCSIDiskReq
*r
= &req
->req
;
2688 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
2689 int nb_logical_blocks
;
2693 /* This is not supported yet. It can only happen if the guest does
2694 * reads and writes that are not aligned to one logical sectors
2695 * _and_ cover multiple MemoryRegions.
2697 assert(offset
% s
->qdev
.blocksize
== 0);
2698 assert(iov
->size
% s
->qdev
.blocksize
== 0);
2700 io_header
->interface_id
= 'S';
2702 /* The data transfer comes from the QEMUIOVector. */
2703 io_header
->dxfer_direction
= direction
;
2704 io_header
->dxfer_len
= iov
->size
;
2705 io_header
->dxferp
= (void *)iov
->iov
;
2706 io_header
->iovec_count
= iov
->niov
;
2707 assert(io_header
->iovec_count
== iov
->niov
); /* no overflow! */
2709 /* Build a new CDB with the LBA and length patched in, in case
2710 * DMA helpers split the transfer in multiple segments. Do not
2711 * build a CDB smaller than what the guest wanted, and only build
2712 * a larger one if strictly necessary.
2714 io_header
->cmdp
= req
->cdb
;
2715 lba
= offset
/ s
->qdev
.blocksize
;
2716 nb_logical_blocks
= io_header
->dxfer_len
/ s
->qdev
.blocksize
;
2718 if ((req
->cmd
>> 5) == 0 && lba
<= 0x1ffff) {
2720 stl_be_p(&req
->cdb
[0], lba
| (req
->cmd
<< 24));
2721 req
->cdb
[4] = nb_logical_blocks
;
2723 io_header
->cmd_len
= 6;
2724 } else if ((req
->cmd
>> 5) <= 1 && lba
<= 0xffffffffULL
) {
2726 req
->cdb
[0] = (req
->cmd
& 0x1f) | 0x20;
2727 req
->cdb
[1] = req
->cdb1
;
2728 stl_be_p(&req
->cdb
[2], lba
);
2729 req
->cdb
[6] = req
->group_number
;
2730 stw_be_p(&req
->cdb
[7], nb_logical_blocks
);
2732 io_header
->cmd_len
= 10;
2733 } else if ((req
->cmd
>> 5) != 4 && lba
<= 0xffffffffULL
) {
2735 req
->cdb
[0] = (req
->cmd
& 0x1f) | 0xA0;
2736 req
->cdb
[1] = req
->cdb1
;
2737 stl_be_p(&req
->cdb
[2], lba
);
2738 stl_be_p(&req
->cdb
[6], nb_logical_blocks
);
2739 req
->cdb
[10] = req
->group_number
;
2741 io_header
->cmd_len
= 12;
2744 req
->cdb
[0] = (req
->cmd
& 0x1f) | 0x80;
2745 req
->cdb
[1] = req
->cdb1
;
2746 stq_be_p(&req
->cdb
[2], lba
);
2747 stl_be_p(&req
->cdb
[10], nb_logical_blocks
);
2748 req
->cdb
[14] = req
->group_number
;
2750 io_header
->cmd_len
= 16;
2753 /* The rest is as in scsi-generic.c. */
2754 io_header
->mx_sb_len
= sizeof(r
->req
.sense
);
2755 io_header
->sbp
= r
->req
.sense
;
2756 io_header
->timeout
= s
->qdev
.io_timeout
* 1000;
2757 io_header
->usr_ptr
= r
;
2758 io_header
->flags
|= SG_FLAG_DIRECT_IO
;
2759 trace_scsi_disk_aio_sgio_command(r
->req
.tag
, req
->cdb
[0], lba
,
2760 nb_logical_blocks
, io_header
->timeout
);
2761 aiocb
= blk_aio_ioctl(s
->qdev
.conf
.blk
, SG_IO
, io_header
, cb
, opaque
);
2762 assert(aiocb
!= NULL
);
2766 static bool scsi_block_no_fua(SCSICommand
*cmd
)
2771 static BlockAIOCB
*scsi_block_dma_readv(int64_t offset
,
2773 BlockCompletionFunc
*cb
, void *cb_opaque
,
2776 SCSIBlockReq
*r
= opaque
;
2777 return scsi_block_do_sgio(r
, offset
, iov
,
2778 SG_DXFER_FROM_DEV
, cb
, cb_opaque
);
2781 static BlockAIOCB
*scsi_block_dma_writev(int64_t offset
,
2783 BlockCompletionFunc
*cb
, void *cb_opaque
,
2786 SCSIBlockReq
*r
= opaque
;
2787 return scsi_block_do_sgio(r
, offset
, iov
,
2788 SG_DXFER_TO_DEV
, cb
, cb_opaque
);
2791 static bool scsi_block_is_passthrough(SCSIDiskState
*s
, uint8_t *buf
)
2797 /* Check if BYTCHK == 0x01 (data-out buffer contains data
2798 * for the number of logical blocks specified in the length
2799 * field). For other modes, do not use scatter/gather operation.
2801 if ((buf
[1] & 6) == 2) {
2814 case WRITE_VERIFY_10
:
2815 case WRITE_VERIFY_12
:
2816 case WRITE_VERIFY_16
:
2817 /* MMC writing cannot be done via DMA helpers, because it sometimes
2818 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
2819 * We might use scsi_block_dma_reqops as long as no writing commands are
2820 * seen, but performance usually isn't paramount on optical media. So,
2821 * just make scsi-block operate the same as scsi-generic for them.
2823 if (s
->qdev
.type
!= TYPE_ROM
) {
2836 static int32_t scsi_block_dma_command(SCSIRequest
*req
, uint8_t *buf
)
2838 SCSIBlockReq
*r
= (SCSIBlockReq
*)req
;
2839 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
2841 r
->cmd
= req
->cmd
.buf
[0];
2842 switch (r
->cmd
>> 5) {
2845 r
->cdb1
= r
->group_number
= 0;
2849 r
->cdb1
= req
->cmd
.buf
[1];
2850 r
->group_number
= req
->cmd
.buf
[6];
2854 r
->cdb1
= req
->cmd
.buf
[1];
2855 r
->group_number
= req
->cmd
.buf
[10];
2859 r
->cdb1
= req
->cmd
.buf
[1];
2860 r
->group_number
= req
->cmd
.buf
[14];
2866 /* Protection information is not supported. For SCSI versions 2 and
2867 * older (as determined by snooping the guest's INQUIRY commands),
2868 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2870 if (s
->qdev
.scsi_version
> 2 && (req
->cmd
.buf
[1] & 0xe0)) {
2871 scsi_check_condition(&r
->req
, SENSE_CODE(INVALID_FIELD
));
2875 r
->req
.status
= &r
->io_header
.status
;
2876 return scsi_disk_dma_command(req
, buf
);
2879 static const SCSIReqOps scsi_block_dma_reqops
= {
2880 .size
= sizeof(SCSIBlockReq
),
2881 .free_req
= scsi_free_request
,
2882 .send_command
= scsi_block_dma_command
,
2883 .read_data
= scsi_read_data
,
2884 .write_data
= scsi_write_data
,
2885 .get_buf
= scsi_get_buf
,
2886 .load_request
= scsi_disk_load_request
,
2887 .save_request
= scsi_disk_save_request
,
2890 static SCSIRequest
*scsi_block_new_request(SCSIDevice
*d
, uint32_t tag
,
2891 uint32_t lun
, uint8_t *buf
,
2894 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2896 if (scsi_block_is_passthrough(s
, buf
)) {
2897 return scsi_req_alloc(&scsi_generic_req_ops
, &s
->qdev
, tag
, lun
,
2900 return scsi_req_alloc(&scsi_block_dma_reqops
, &s
->qdev
, tag
, lun
,
2905 static int scsi_block_parse_cdb(SCSIDevice
*d
, SCSICommand
*cmd
,
2906 uint8_t *buf
, void *hba_private
)
2908 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
2910 if (scsi_block_is_passthrough(s
, buf
)) {
2911 return scsi_bus_parse_cdb(&s
->qdev
, cmd
, buf
, hba_private
);
2913 return scsi_req_parse_cdb(&s
->qdev
, cmd
, buf
);
2917 static void scsi_block_update_sense(SCSIRequest
*req
)
2919 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
2920 SCSIBlockReq
*br
= DO_UPCAST(SCSIBlockReq
, req
, r
);
2921 r
->req
.sense_len
= MIN(br
->io_header
.sb_len_wr
, sizeof(r
->req
.sense
));
2926 BlockAIOCB
*scsi_dma_readv(int64_t offset
, QEMUIOVector
*iov
,
2927 BlockCompletionFunc
*cb
, void *cb_opaque
,
2930 SCSIDiskReq
*r
= opaque
;
2931 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
2932 return blk_aio_preadv(s
->qdev
.conf
.blk
, offset
, iov
, 0, cb
, cb_opaque
);
2936 BlockAIOCB
*scsi_dma_writev(int64_t offset
, QEMUIOVector
*iov
,
2937 BlockCompletionFunc
*cb
, void *cb_opaque
,
2940 SCSIDiskReq
*r
= opaque
;
2941 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
2942 return blk_aio_pwritev(s
->qdev
.conf
.blk
, offset
, iov
, 0, cb
, cb_opaque
);
2945 static void scsi_disk_base_class_initfn(ObjectClass
*klass
, void *data
)
2947 DeviceClass
*dc
= DEVICE_CLASS(klass
);
2948 SCSIDiskClass
*sdc
= SCSI_DISK_BASE_CLASS(klass
);
2950 dc
->fw_name
= "disk";
2951 dc
->reset
= scsi_disk_reset
;
2952 sdc
->dma_readv
= scsi_dma_readv
;
2953 sdc
->dma_writev
= scsi_dma_writev
;
2954 sdc
->need_fua_emulation
= scsi_is_cmd_fua
;
2957 static const TypeInfo scsi_disk_base_info
= {
2958 .name
= TYPE_SCSI_DISK_BASE
,
2959 .parent
= TYPE_SCSI_DEVICE
,
2960 .class_init
= scsi_disk_base_class_initfn
,
2961 .instance_size
= sizeof(SCSIDiskState
),
2962 .class_size
= sizeof(SCSIDiskClass
),
2966 #define DEFINE_SCSI_DISK_PROPERTIES() \
2967 DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSIDiskState, qdev.conf.blk), \
2968 DEFINE_BLOCK_PROPERTIES_BASE(SCSIDiskState, qdev.conf), \
2969 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
2970 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
2971 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
2972 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
2973 DEFINE_PROP_STRING("product", SCSIDiskState, product), \
2974 DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)
2977 static Property scsi_hd_properties
[] = {
2978 DEFINE_SCSI_DISK_PROPERTIES(),
2979 DEFINE_PROP_BIT("removable", SCSIDiskState
, features
,
2980 SCSI_DISK_F_REMOVABLE
, false),
2981 DEFINE_PROP_BIT("dpofua", SCSIDiskState
, features
,
2982 SCSI_DISK_F_DPOFUA
, false),
2983 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
2984 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
2985 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
2986 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
2987 DEFAULT_MAX_UNMAP_SIZE
),
2988 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
2989 DEFAULT_MAX_IO_SIZE
),
2990 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState
, rotation_rate
, 0),
2991 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
2993 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState
, qdev
.conf
),
2994 DEFINE_PROP_END_OF_LIST(),
2997 static const VMStateDescription vmstate_scsi_disk_state
= {
2998 .name
= "scsi-disk",
3000 .minimum_version_id
= 1,
3001 .fields
= (VMStateField
[]) {
3002 VMSTATE_SCSI_DEVICE(qdev
, SCSIDiskState
),
3003 VMSTATE_BOOL(media_changed
, SCSIDiskState
),
3004 VMSTATE_BOOL(media_event
, SCSIDiskState
),
3005 VMSTATE_BOOL(eject_request
, SCSIDiskState
),
3006 VMSTATE_BOOL(tray_open
, SCSIDiskState
),
3007 VMSTATE_BOOL(tray_locked
, SCSIDiskState
),
3008 VMSTATE_END_OF_LIST()
3012 static void scsi_hd_class_initfn(ObjectClass
*klass
, void *data
)
3014 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3015 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3017 sc
->realize
= scsi_hd_realize
;
3018 sc
->unrealize
= scsi_unrealize
;
3019 sc
->alloc_req
= scsi_new_request
;
3020 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
3021 dc
->desc
= "virtual SCSI disk";
3022 device_class_set_props(dc
, scsi_hd_properties
);
3023 dc
->vmsd
= &vmstate_scsi_disk_state
;
3026 static const TypeInfo scsi_hd_info
= {
3028 .parent
= TYPE_SCSI_DISK_BASE
,
3029 .class_init
= scsi_hd_class_initfn
,
3032 static Property scsi_cd_properties
[] = {
3033 DEFINE_SCSI_DISK_PROPERTIES(),
3034 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
3035 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
3036 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
3037 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3038 DEFAULT_MAX_IO_SIZE
),
3039 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3041 DEFINE_PROP_END_OF_LIST(),
3044 static void scsi_cd_class_initfn(ObjectClass
*klass
, void *data
)
3046 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3047 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3049 sc
->realize
= scsi_cd_realize
;
3050 sc
->alloc_req
= scsi_new_request
;
3051 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
3052 dc
->desc
= "virtual SCSI CD-ROM";
3053 device_class_set_props(dc
, scsi_cd_properties
);
3054 dc
->vmsd
= &vmstate_scsi_disk_state
;
3057 static const TypeInfo scsi_cd_info
= {
3059 .parent
= TYPE_SCSI_DISK_BASE
,
3060 .class_init
= scsi_cd_class_initfn
,
3064 static Property scsi_block_properties
[] = {
3065 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState
, qdev
.conf
),
3066 DEFINE_PROP_DRIVE("drive", SCSIDiskState
, qdev
.conf
.blk
),
3067 DEFINE_PROP_BOOL("share-rw", SCSIDiskState
, qdev
.conf
.share_rw
, false),
3068 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState
, rotation_rate
, 0),
3069 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
3070 DEFAULT_MAX_UNMAP_SIZE
),
3071 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3072 DEFAULT_MAX_IO_SIZE
),
3073 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3075 DEFINE_PROP_UINT32("io_timeout", SCSIDiskState
, qdev
.io_timeout
,
3076 DEFAULT_IO_TIMEOUT
),
3077 DEFINE_PROP_END_OF_LIST(),
3080 static void scsi_block_class_initfn(ObjectClass
*klass
, void *data
)
3082 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3083 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3084 SCSIDiskClass
*sdc
= SCSI_DISK_BASE_CLASS(klass
);
3086 sc
->realize
= scsi_block_realize
;
3087 sc
->alloc_req
= scsi_block_new_request
;
3088 sc
->parse_cdb
= scsi_block_parse_cdb
;
3089 sdc
->dma_readv
= scsi_block_dma_readv
;
3090 sdc
->dma_writev
= scsi_block_dma_writev
;
3091 sdc
->update_sense
= scsi_block_update_sense
;
3092 sdc
->need_fua_emulation
= scsi_block_no_fua
;
3093 dc
->desc
= "SCSI block device passthrough";
3094 device_class_set_props(dc
, scsi_block_properties
);
3095 dc
->vmsd
= &vmstate_scsi_disk_state
;
3098 static const TypeInfo scsi_block_info
= {
3099 .name
= "scsi-block",
3100 .parent
= TYPE_SCSI_DISK_BASE
,
3101 .class_init
= scsi_block_class_initfn
,
3105 static Property scsi_disk_properties
[] = {
3106 DEFINE_SCSI_DISK_PROPERTIES(),
3107 DEFINE_PROP_BIT("removable", SCSIDiskState
, features
,
3108 SCSI_DISK_F_REMOVABLE
, false),
3109 DEFINE_PROP_BIT("dpofua", SCSIDiskState
, features
,
3110 SCSI_DISK_F_DPOFUA
, false),
3111 DEFINE_PROP_UINT64("wwn", SCSIDiskState
, qdev
.wwn
, 0),
3112 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState
, qdev
.port_wwn
, 0),
3113 DEFINE_PROP_UINT16("port_index", SCSIDiskState
, port_index
, 0),
3114 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState
, max_unmap_size
,
3115 DEFAULT_MAX_UNMAP_SIZE
),
3116 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState
, max_io_size
,
3117 DEFAULT_MAX_IO_SIZE
),
3118 DEFINE_PROP_INT32("scsi_version", SCSIDiskState
, qdev
.default_scsi_version
,
3120 DEFINE_PROP_END_OF_LIST(),
3123 static void scsi_disk_class_initfn(ObjectClass
*klass
, void *data
)
3125 DeviceClass
*dc
= DEVICE_CLASS(klass
);
3126 SCSIDeviceClass
*sc
= SCSI_DEVICE_CLASS(klass
);
3128 sc
->realize
= scsi_disk_realize
;
3129 sc
->alloc_req
= scsi_new_request
;
3130 sc
->unit_attention_reported
= scsi_disk_unit_attention_reported
;
3131 dc
->fw_name
= "disk";
3132 dc
->desc
= "virtual SCSI disk or CD-ROM (legacy)";
3133 dc
->reset
= scsi_disk_reset
;
3134 device_class_set_props(dc
, scsi_disk_properties
);
3135 dc
->vmsd
= &vmstate_scsi_disk_state
;
3138 static const TypeInfo scsi_disk_info
= {
3139 .name
= "scsi-disk",
3140 .parent
= TYPE_SCSI_DISK_BASE
,
3141 .class_init
= scsi_disk_class_initfn
,
3144 static void scsi_disk_register_types(void)
3146 type_register_static(&scsi_disk_base_info
);
3147 type_register_static(&scsi_hd_info
);
3148 type_register_static(&scsi_cd_info
);
3150 type_register_static(&scsi_block_info
);
3152 type_register_static(&scsi_disk_info
);
3155 type_init(scsi_disk_register_types
)