2 * SCSI Device emulation
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
7 * Written by Paul Brook
9 * 2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10 * when the allocation length of CDB is smaller
12 * 2009-Oct-13 Artyom Tarasenko : implemented the block descriptor in the
13 * MODE SENSE response.
15 * This code is licensed under the LGPL.
17 * Note that this file only handles the SCSI architecture model and device
18 * commands. Emulation of interface/link layer protocols is handled by
19 * the host adapter emulator.
25 #define DPRINTF(fmt, ...) \
26 do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
28 #define DPRINTF(fmt, ...) do {} while(0)
31 #define BADF(fmt, ...) \
32 do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
34 #include "qemu-common.h"
35 #include "qemu-error.h"
37 #include "scsi-defs.h"
40 #include "block_int.h"
46 #define SCSI_DMA_BUF_SIZE 131072
47 #define SCSI_MAX_INQUIRY_LEN 256
49 typedef struct SCSIDiskState SCSIDiskState
;
51 typedef struct SCSIDiskReq
{
53 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
55 uint32_t sector_count
;
76 static int scsi_handle_rw_error(SCSIDiskReq
*r
, int error
);
78 static void scsi_free_request(SCSIRequest
*req
)
80 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
82 if (r
->iov
.iov_base
) {
83 qemu_vfree(r
->iov
.iov_base
);
87 /* Helper function for command completion with sense. */
88 static void scsi_check_condition(SCSIDiskReq
*r
, SCSISense sense
)
90 DPRINTF("Command complete tag=0x%x sense=%d/%d/%d\n",
91 r
->req
.tag
, sense
.key
, sense
.asc
, sense
.ascq
);
92 scsi_req_build_sense(&r
->req
, sense
);
93 scsi_req_complete(&r
->req
, CHECK_CONDITION
);
96 /* Cancel a pending data transfer. */
97 static void scsi_cancel_io(SCSIRequest
*req
)
99 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
101 DPRINTF("Cancel tag=0x%x\n", req
->tag
);
103 bdrv_aio_cancel(r
->req
.aiocb
);
105 /* This reference was left in by scsi_*_data. We take ownership of
106 * it the moment scsi_req_cancel is called, independent of whether
107 * bdrv_aio_cancel completes the request or not. */
108 scsi_req_unref(&r
->req
);
113 static uint32_t scsi_init_iovec(SCSIDiskReq
*r
)
115 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
117 if (!r
->iov
.iov_base
) {
118 r
->buflen
= SCSI_DMA_BUF_SIZE
;
119 r
->iov
.iov_base
= qemu_blockalign(s
->qdev
.conf
.bs
, r
->buflen
);
121 r
->iov
.iov_len
= MIN(r
->sector_count
* 512, r
->buflen
);
122 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
123 return r
->qiov
.size
/ 512;
126 static void scsi_read_complete(void * opaque
, int ret
)
128 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
129 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
132 if (r
->req
.aiocb
!= NULL
) {
134 bdrv_acct_done(s
->qdev
.conf
.bs
, &r
->acct
);
138 if (scsi_handle_rw_error(r
, -ret
)) {
143 DPRINTF("Data ready tag=0x%x len=%zd\n", r
->req
.tag
, r
->qiov
.size
);
145 n
= r
->qiov
.size
/ 512;
147 r
->sector_count
-= n
;
148 scsi_req_data(&r
->req
, r
->qiov
.size
);
151 if (!r
->req
.io_canceled
) {
152 scsi_req_unref(&r
->req
);
156 static void scsi_flush_complete(void * opaque
, int ret
)
158 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
159 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
161 if (r
->req
.aiocb
!= NULL
) {
163 bdrv_acct_done(s
->qdev
.conf
.bs
, &r
->acct
);
167 if (scsi_handle_rw_error(r
, -ret
)) {
172 scsi_req_complete(&r
->req
, GOOD
);
175 if (!r
->req
.io_canceled
) {
176 scsi_req_unref(&r
->req
);
180 /* Read more data from scsi device into buffer. */
181 static void scsi_read_data(SCSIRequest
*req
)
183 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
184 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
187 if (r
->sector_count
== (uint32_t)-1) {
188 DPRINTF("Read buf_len=%zd\n", r
->iov
.iov_len
);
190 scsi_req_data(&r
->req
, r
->iov
.iov_len
);
193 DPRINTF("Read sector_count=%d\n", r
->sector_count
);
194 if (r
->sector_count
== 0) {
195 /* This also clears the sense buffer for REQUEST SENSE. */
196 scsi_req_complete(&r
->req
, GOOD
);
200 /* No data transfer may already be in progress */
201 assert(r
->req
.aiocb
== NULL
);
203 /* The request is used as the AIO opaque value, so add a ref. */
204 scsi_req_ref(&r
->req
);
205 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
206 DPRINTF("Data transfer direction invalid\n");
207 scsi_read_complete(r
, -EINVAL
);
212 scsi_read_complete(r
, -ENOMEDIUM
);
216 n
= scsi_init_iovec(r
);
217 bdrv_acct_start(s
->qdev
.conf
.bs
, &r
->acct
, n
* BDRV_SECTOR_SIZE
, BDRV_ACCT_READ
);
218 r
->req
.aiocb
= bdrv_aio_readv(s
->qdev
.conf
.bs
, r
->sector
, &r
->qiov
, n
,
219 scsi_read_complete
, r
);
220 if (r
->req
.aiocb
== NULL
) {
221 scsi_read_complete(r
, -EIO
);
226 * scsi_handle_rw_error has two return values. 0 means that the error
227 * must be ignored, 1 means that the error has been processed and the
228 * caller should not do anything else for this request. Note that
229 * scsi_handle_rw_error always manages its reference counts, independent
230 * of the return value.
232 static int scsi_handle_rw_error(SCSIDiskReq
*r
, int error
)
234 int is_read
= (r
->req
.cmd
.xfer
== SCSI_XFER_FROM_DEV
);
235 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
236 BlockErrorAction action
= bdrv_get_on_error(s
->qdev
.conf
.bs
, is_read
);
238 if (action
== BLOCK_ERR_IGNORE
) {
239 bdrv_mon_event(s
->qdev
.conf
.bs
, BDRV_ACTION_IGNORE
, is_read
);
243 if ((error
== ENOSPC
&& action
== BLOCK_ERR_STOP_ENOSPC
)
244 || action
== BLOCK_ERR_STOP_ANY
) {
246 bdrv_mon_event(s
->qdev
.conf
.bs
, BDRV_ACTION_STOP
, is_read
);
247 vm_stop(RUN_STATE_IO_ERROR
);
248 bdrv_iostatus_set_err(s
->qdev
.conf
.bs
, error
);
249 scsi_req_retry(&r
->req
);
253 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
256 scsi_check_condition(r
, SENSE_CODE(TARGET_FAILURE
));
259 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
262 scsi_check_condition(r
, SENSE_CODE(IO_ERROR
));
265 bdrv_mon_event(s
->qdev
.conf
.bs
, BDRV_ACTION_REPORT
, is_read
);
270 static void scsi_write_complete(void * opaque
, int ret
)
272 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
273 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
276 if (r
->req
.aiocb
!= NULL
) {
278 bdrv_acct_done(s
->qdev
.conf
.bs
, &r
->acct
);
282 if (scsi_handle_rw_error(r
, -ret
)) {
287 n
= r
->qiov
.size
/ 512;
289 r
->sector_count
-= n
;
290 if (r
->sector_count
== 0) {
291 scsi_req_complete(&r
->req
, GOOD
);
294 DPRINTF("Write complete tag=0x%x more=%d\n", r
->req
.tag
, r
->qiov
.size
);
295 scsi_req_data(&r
->req
, r
->qiov
.size
);
299 if (!r
->req
.io_canceled
) {
300 scsi_req_unref(&r
->req
);
304 static void scsi_write_data(SCSIRequest
*req
)
306 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
307 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
310 /* No data transfer may already be in progress */
311 assert(r
->req
.aiocb
== NULL
);
313 /* The request is used as the AIO opaque value, so add a ref. */
314 scsi_req_ref(&r
->req
);
315 if (r
->req
.cmd
.mode
!= SCSI_XFER_TO_DEV
) {
316 DPRINTF("Data transfer direction invalid\n");
317 scsi_write_complete(r
, -EINVAL
);
321 n
= r
->qiov
.size
/ 512;
324 scsi_write_complete(r
, -ENOMEDIUM
);
327 bdrv_acct_start(s
->qdev
.conf
.bs
, &r
->acct
, n
* BDRV_SECTOR_SIZE
, BDRV_ACCT_WRITE
);
328 r
->req
.aiocb
= bdrv_aio_writev(s
->qdev
.conf
.bs
, r
->sector
, &r
->qiov
, n
,
329 scsi_write_complete
, r
);
330 if (r
->req
.aiocb
== NULL
) {
331 scsi_write_complete(r
, -ENOMEM
);
334 /* Called for the first time. Ask the driver to send us more data. */
335 scsi_write_complete(r
, 0);
339 /* Return a pointer to the data buffer. */
340 static uint8_t *scsi_get_buf(SCSIRequest
*req
)
342 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
344 return (uint8_t *)r
->iov
.iov_base
;
347 static int scsi_disk_emulate_inquiry(SCSIRequest
*req
, uint8_t *outbuf
)
349 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
352 if (req
->cmd
.buf
[1] & 0x2) {
353 /* Command support data - optional, not implemented */
354 BADF("optional INQUIRY command support request not implemented\n");
358 if (req
->cmd
.buf
[1] & 0x1) {
359 /* Vital product data */
360 uint8_t page_code
= req
->cmd
.buf
[2];
361 if (req
->cmd
.xfer
< 4) {
362 BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
363 "less than 4\n", page_code
, req
->cmd
.xfer
);
367 outbuf
[buflen
++] = s
->qdev
.type
& 0x1f;
368 outbuf
[buflen
++] = page_code
; // this page
369 outbuf
[buflen
++] = 0x00;
372 case 0x00: /* Supported page codes, mandatory */
375 DPRINTF("Inquiry EVPD[Supported pages] "
376 "buffer size %zd\n", req
->cmd
.xfer
);
378 outbuf
[buflen
++] = 0x00; // list of supported pages (this page)
380 outbuf
[buflen
++] = 0x80; // unit serial number
382 outbuf
[buflen
++] = 0x83; // device identification
383 if (s
->qdev
.type
== TYPE_DISK
) {
384 outbuf
[buflen
++] = 0xb0; // block limits
385 outbuf
[buflen
++] = 0xb2; // thin provisioning
387 outbuf
[pages
] = buflen
- pages
- 1; // number of pages
390 case 0x80: /* Device serial number, optional */
395 DPRINTF("Inquiry (EVPD[Serial number] not supported\n");
399 l
= strlen(s
->serial
);
400 if (l
> req
->cmd
.xfer
) {
407 DPRINTF("Inquiry EVPD[Serial number] "
408 "buffer size %zd\n", req
->cmd
.xfer
);
409 outbuf
[buflen
++] = l
;
410 memcpy(outbuf
+buflen
, s
->serial
, l
);
415 case 0x83: /* Device identification page, mandatory */
417 int max_len
= 255 - 8;
418 int id_len
= strlen(bdrv_get_device_name(s
->qdev
.conf
.bs
));
420 if (id_len
> max_len
) {
423 DPRINTF("Inquiry EVPD[Device identification] "
424 "buffer size %zd\n", req
->cmd
.xfer
);
426 outbuf
[buflen
++] = 4 + id_len
;
427 outbuf
[buflen
++] = 0x2; // ASCII
428 outbuf
[buflen
++] = 0; // not officially assigned
429 outbuf
[buflen
++] = 0; // reserved
430 outbuf
[buflen
++] = id_len
; // length of data following
432 memcpy(outbuf
+buflen
, bdrv_get_device_name(s
->qdev
.conf
.bs
), id_len
);
436 case 0xb0: /* block limits */
438 unsigned int unmap_sectors
=
439 s
->qdev
.conf
.discard_granularity
/ s
->qdev
.blocksize
;
440 unsigned int min_io_size
=
441 s
->qdev
.conf
.min_io_size
/ s
->qdev
.blocksize
;
442 unsigned int opt_io_size
=
443 s
->qdev
.conf
.opt_io_size
/ s
->qdev
.blocksize
;
445 if (s
->qdev
.type
== TYPE_ROM
) {
446 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
450 /* required VPD size with unmap support */
451 outbuf
[3] = buflen
= 0x3c;
453 memset(outbuf
+ 4, 0, buflen
- 4);
455 /* optimal transfer length granularity */
456 outbuf
[6] = (min_io_size
>> 8) & 0xff;
457 outbuf
[7] = min_io_size
& 0xff;
459 /* optimal transfer length */
460 outbuf
[12] = (opt_io_size
>> 24) & 0xff;
461 outbuf
[13] = (opt_io_size
>> 16) & 0xff;
462 outbuf
[14] = (opt_io_size
>> 8) & 0xff;
463 outbuf
[15] = opt_io_size
& 0xff;
465 /* optimal unmap granularity */
466 outbuf
[28] = (unmap_sectors
>> 24) & 0xff;
467 outbuf
[29] = (unmap_sectors
>> 16) & 0xff;
468 outbuf
[30] = (unmap_sectors
>> 8) & 0xff;
469 outbuf
[31] = unmap_sectors
& 0xff;
472 case 0xb2: /* thin provisioning */
474 outbuf
[3] = buflen
= 8;
476 outbuf
[5] = 0x40; /* write same with unmap supported */
482 BADF("Error: unsupported Inquiry (EVPD[%02X]) "
483 "buffer size %zd\n", page_code
, req
->cmd
.xfer
);
490 /* Standard INQUIRY data */
491 if (req
->cmd
.buf
[2] != 0) {
492 BADF("Error: Inquiry (STANDARD) page or code "
493 "is non-zero [%02X]\n", req
->cmd
.buf
[2]);
498 if (req
->cmd
.xfer
< 5) {
499 BADF("Error: Inquiry (STANDARD) buffer size %zd "
500 "is less than 5\n", req
->cmd
.xfer
);
504 buflen
= req
->cmd
.xfer
;
505 if (buflen
> SCSI_MAX_INQUIRY_LEN
) {
506 buflen
= SCSI_MAX_INQUIRY_LEN
;
508 memset(outbuf
, 0, buflen
);
510 outbuf
[0] = s
->qdev
.type
& 0x1f;
511 outbuf
[1] = s
->removable
? 0x80 : 0;
512 if (s
->qdev
.type
== TYPE_ROM
) {
513 memcpy(&outbuf
[16], "QEMU CD-ROM ", 16);
515 memcpy(&outbuf
[16], "QEMU HARDDISK ", 16);
517 memcpy(&outbuf
[8], "QEMU ", 8);
518 memset(&outbuf
[32], 0, 4);
519 memcpy(&outbuf
[32], s
->version
, MIN(4, strlen(s
->version
)));
521 * We claim conformance to SPC-3, which is required for guests
522 * to ask for modern features like READ CAPACITY(16) or the
523 * block characteristics VPD page by default. Not all of SPC-3
524 * is actually implemented, but we're good enough.
527 outbuf
[3] = 2; /* Format 2 */
530 outbuf
[4] = buflen
- 5; /* Additional Length = (Len - 1) - 4 */
532 /* If the allocation length of CDB is too small,
533 the additional length is not adjusted */
537 /* Sync data transfer and TCQ. */
538 outbuf
[7] = 0x10 | (req
->bus
->info
->tcq
? 0x02 : 0);
542 static inline bool media_is_dvd(SCSIDiskState
*s
)
545 if (s
->qdev
.type
!= TYPE_ROM
) {
548 if (!bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
551 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
552 return nb_sectors
> CD_MAX_SECTORS
;
555 static inline bool media_is_cd(SCSIDiskState
*s
)
558 if (s
->qdev
.type
!= TYPE_ROM
) {
561 if (!bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
564 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
565 return nb_sectors
<= CD_MAX_SECTORS
;
568 static int scsi_read_dvd_structure(SCSIDiskState
*s
, SCSIDiskReq
*r
,
571 static const int rds_caps_size
[5] = {
578 uint8_t media
= r
->req
.cmd
.buf
[1];
579 uint8_t layer
= r
->req
.cmd
.buf
[6];
580 uint8_t format
= r
->req
.cmd
.buf
[7];
583 if (s
->qdev
.type
!= TYPE_ROM
) {
587 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
591 if (format
!= 0xff) {
592 if (s
->tray_open
|| !bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
593 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
596 if (media_is_cd(s
)) {
597 scsi_check_condition(r
, SENSE_CODE(INCOMPATIBLE_FORMAT
));
600 if (format
>= ARRAY_SIZE(rds_caps_size
)) {
603 size
= rds_caps_size
[format
];
604 memset(outbuf
, 0, size
);
609 /* Physical format information */
614 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
616 outbuf
[4] = 1; /* DVD-ROM, part version 1 */
617 outbuf
[5] = 0xf; /* 120mm disc, minimum rate unspecified */
618 outbuf
[6] = 1; /* one layer, read-only (per MMC-2 spec) */
619 outbuf
[7] = 0; /* default densities */
621 stl_be_p(&outbuf
[12], (nb_sectors
>> 2) - 1); /* end sector */
622 stl_be_p(&outbuf
[16], (nb_sectors
>> 2) - 1); /* l0 end sector */
626 case 0x01: /* DVD copyright information, all zeros */
629 case 0x03: /* BCA information - invalid field for no BCA info */
632 case 0x04: /* DVD disc manufacturing information, all zeros */
635 case 0xff: { /* List capabilities */
638 for (i
= 0; i
< ARRAY_SIZE(rds_caps_size
); i
++) {
639 if (!rds_caps_size
[i
]) {
643 outbuf
[size
+ 1] = 0x40; /* Not writable, readable */
644 stw_be_p(&outbuf
[size
+ 2], rds_caps_size
[i
]);
654 /* Size of buffer, not including 2 byte size field */
655 stw_be_p(outbuf
, size
- 2);
662 static int scsi_event_status_media(SCSIDiskState
*s
, uint8_t *outbuf
)
664 uint8_t event_code
, media_status
;
668 media_status
= MS_TRAY_OPEN
;
669 } else if (bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
670 media_status
= MS_MEDIA_PRESENT
;
673 /* Event notification descriptor */
674 event_code
= MEC_NO_CHANGE
;
675 if (media_status
!= MS_TRAY_OPEN
) {
676 if (s
->media_event
) {
677 event_code
= MEC_NEW_MEDIA
;
678 s
->media_event
= false;
679 } else if (s
->eject_request
) {
680 event_code
= MEC_EJECT_REQUESTED
;
681 s
->eject_request
= false;
685 outbuf
[0] = event_code
;
686 outbuf
[1] = media_status
;
688 /* These fields are reserved, just clear them. */
694 static int scsi_get_event_status_notification(SCSIDiskState
*s
, SCSIDiskReq
*r
,
698 uint8_t *buf
= r
->req
.cmd
.buf
;
699 uint8_t notification_class_request
= buf
[4];
700 if (s
->qdev
.type
!= TYPE_ROM
) {
703 if ((buf
[1] & 1) == 0) {
709 outbuf
[0] = outbuf
[1] = 0;
710 outbuf
[3] = 1 << GESN_MEDIA
; /* supported events */
711 if (notification_class_request
& (1 << GESN_MEDIA
)) {
712 outbuf
[2] = GESN_MEDIA
;
713 size
+= scsi_event_status_media(s
, &outbuf
[size
]);
717 stw_be_p(outbuf
, size
- 4);
721 static int scsi_get_configuration(SCSIDiskState
*s
, uint8_t *outbuf
)
725 if (s
->qdev
.type
!= TYPE_ROM
) {
728 current
= media_is_dvd(s
) ? MMC_PROFILE_DVD_ROM
: MMC_PROFILE_CD_ROM
;
729 memset(outbuf
, 0, 40);
730 stl_be_p(&outbuf
[0], 36); /* Bytes after the data length field */
731 stw_be_p(&outbuf
[6], current
);
732 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
733 outbuf
[10] = 0x03; /* persistent, current */
734 outbuf
[11] = 8; /* two profiles */
735 stw_be_p(&outbuf
[12], MMC_PROFILE_DVD_ROM
);
736 outbuf
[14] = (current
== MMC_PROFILE_DVD_ROM
);
737 stw_be_p(&outbuf
[16], MMC_PROFILE_CD_ROM
);
738 outbuf
[18] = (current
== MMC_PROFILE_CD_ROM
);
739 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
740 stw_be_p(&outbuf
[20], 1);
741 outbuf
[22] = 0x08 | 0x03; /* version 2, persistent, current */
743 stl_be_p(&outbuf
[24], 1); /* SCSI */
744 outbuf
[28] = 1; /* DBE = 1, mandatory */
745 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
746 stw_be_p(&outbuf
[32], 3);
747 outbuf
[34] = 0x08 | 0x03; /* version 2, persistent, current */
749 outbuf
[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
750 /* TODO: Random readable, CD read, DVD read, drive serial number,
755 static int scsi_emulate_mechanism_status(SCSIDiskState
*s
, uint8_t *outbuf
)
757 if (s
->qdev
.type
!= TYPE_ROM
) {
760 memset(outbuf
, 0, 8);
761 outbuf
[5] = 1; /* CD-ROM */
765 static int mode_sense_page(SCSIDiskState
*s
, int page
, uint8_t **p_outbuf
,
768 static const int mode_sense_valid
[0x3f] = {
769 [MODE_PAGE_HD_GEOMETRY
] = (1 << TYPE_DISK
),
770 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
] = (1 << TYPE_DISK
),
771 [MODE_PAGE_CACHING
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
772 [MODE_PAGE_R_W_ERROR
] = (1 << TYPE_DISK
) | (1 << TYPE_ROM
),
773 [MODE_PAGE_AUDIO_CTL
] = (1 << TYPE_ROM
),
774 [MODE_PAGE_CAPABILITIES
] = (1 << TYPE_ROM
),
777 BlockDriverState
*bdrv
= s
->qdev
.conf
.bs
;
778 int cylinders
, heads
, secs
;
779 uint8_t *p
= *p_outbuf
;
781 if ((mode_sense_valid
[page
] & (1 << s
->qdev
.type
)) == 0) {
788 * If Changeable Values are requested, a mask denoting those mode parameters
789 * that are changeable shall be returned. As we currently don't support
790 * parameter changes via MODE_SELECT all bits are returned set to zero.
791 * The buffer was already menset to zero by the caller of this function.
794 case MODE_PAGE_HD_GEOMETRY
:
796 if (page_control
== 1) { /* Changeable Values */
799 /* if a geometry hint is available, use it */
800 bdrv_guess_geometry(bdrv
, &cylinders
, &heads
, &secs
);
801 p
[2] = (cylinders
>> 16) & 0xff;
802 p
[3] = (cylinders
>> 8) & 0xff;
803 p
[4] = cylinders
& 0xff;
805 /* Write precomp start cylinder, disabled */
806 p
[6] = (cylinders
>> 16) & 0xff;
807 p
[7] = (cylinders
>> 8) & 0xff;
808 p
[8] = cylinders
& 0xff;
809 /* Reduced current start cylinder, disabled */
810 p
[9] = (cylinders
>> 16) & 0xff;
811 p
[10] = (cylinders
>> 8) & 0xff;
812 p
[11] = cylinders
& 0xff;
813 /* Device step rate [ns], 200ns */
816 /* Landing zone cylinder */
820 /* Medium rotation rate [rpm], 5400 rpm */
821 p
[20] = (5400 >> 8) & 0xff;
825 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY
:
827 if (page_control
== 1) { /* Changeable Values */
830 /* Transfer rate [kbit/s], 5Mbit/s */
833 /* if a geometry hint is available, use it */
834 bdrv_guess_geometry(bdrv
, &cylinders
, &heads
, &secs
);
837 p
[6] = s
->qdev
.blocksize
>> 8;
838 p
[8] = (cylinders
>> 8) & 0xff;
839 p
[9] = cylinders
& 0xff;
840 /* Write precomp start cylinder, disabled */
841 p
[10] = (cylinders
>> 8) & 0xff;
842 p
[11] = cylinders
& 0xff;
843 /* Reduced current start cylinder, disabled */
844 p
[12] = (cylinders
>> 8) & 0xff;
845 p
[13] = cylinders
& 0xff;
846 /* Device step rate [100us], 100us */
849 /* Device step pulse width [us], 1us */
851 /* Device head settle delay [100us], 100us */
854 /* Motor on delay [0.1s], 0.1s */
856 /* Motor off delay [0.1s], 0.1s */
858 /* Medium rotation rate [rpm], 5400 rpm */
859 p
[28] = (5400 >> 8) & 0xff;
863 case MODE_PAGE_CACHING
:
866 if (page_control
== 1) { /* Changeable Values */
869 if (bdrv_enable_write_cache(s
->qdev
.conf
.bs
)) {
874 case MODE_PAGE_R_W_ERROR
:
876 p
[2] = 0x80; /* Automatic Write Reallocation Enabled */
877 if (s
->qdev
.type
== TYPE_ROM
) {
878 p
[3] = 0x20; /* Read Retry Count */
882 case MODE_PAGE_AUDIO_CTL
:
886 case MODE_PAGE_CAPABILITIES
:
888 if (page_control
== 1) { /* Changeable Values */
892 p
[2] = 0x3b; /* CD-R & CD-RW read */
893 p
[3] = 0; /* Writing not supported */
894 p
[4] = 0x7f; /* Audio, composite, digital out,
895 mode 2 form 1&2, multi session */
896 p
[5] = 0xff; /* CD DA, DA accurate, RW supported,
897 RW corrected, C2 errors, ISRC,
899 p
[6] = 0x2d | (s
->tray_locked
? 2 : 0);
900 /* Locking supported, jumper present, eject, tray */
901 p
[7] = 0; /* no volume & mute control, no
903 p
[8] = (50 * 176) >> 8; /* 50x read speed */
904 p
[9] = (50 * 176) & 0xff;
905 p
[10] = 2 >> 8; /* Two volume levels */
907 p
[12] = 2048 >> 8; /* 2M buffer */
909 p
[14] = (16 * 176) >> 8; /* 16x read speed current */
910 p
[15] = (16 * 176) & 0xff;
911 p
[18] = (16 * 176) >> 8; /* 16x write speed */
912 p
[19] = (16 * 176) & 0xff;
913 p
[20] = (16 * 176) >> 8; /* 16x write speed current */
914 p
[21] = (16 * 176) & 0xff;
921 *p_outbuf
+= p
[1] + 2;
925 static int scsi_disk_emulate_mode_sense(SCSIDiskReq
*r
, uint8_t *outbuf
)
927 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
929 int page
, dbd
, buflen
, ret
, page_control
;
931 uint8_t dev_specific_param
;
933 dbd
= r
->req
.cmd
.buf
[1] & 0x8;
934 page
= r
->req
.cmd
.buf
[2] & 0x3f;
935 page_control
= (r
->req
.cmd
.buf
[2] & 0xc0) >> 6;
936 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
937 (r
->req
.cmd
.buf
[0] == MODE_SENSE
) ? 6 : 10, page
, r
->req
.cmd
.xfer
, page_control
);
938 memset(outbuf
, 0, r
->req
.cmd
.xfer
);
941 if (bdrv_is_read_only(s
->qdev
.conf
.bs
)) {
942 dev_specific_param
= 0x80; /* Readonly. */
944 dev_specific_param
= 0x00;
947 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
948 p
[1] = 0; /* Default media type. */
949 p
[2] = dev_specific_param
;
950 p
[3] = 0; /* Block descriptor length. */
952 } else { /* MODE_SENSE_10 */
953 p
[2] = 0; /* Default media type. */
954 p
[3] = dev_specific_param
;
955 p
[6] = p
[7] = 0; /* Block descriptor length. */
959 /* MMC prescribes that CD/DVD drives have no block descriptors. */
960 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
961 if (!dbd
&& s
->qdev
.type
== TYPE_DISK
&& nb_sectors
) {
962 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
963 outbuf
[3] = 8; /* Block descriptor length */
964 } else { /* MODE_SENSE_10 */
965 outbuf
[7] = 8; /* Block descriptor length */
967 nb_sectors
/= (s
->qdev
.blocksize
/ 512);
968 if (nb_sectors
> 0xffffff) {
971 p
[0] = 0; /* media density code */
972 p
[1] = (nb_sectors
>> 16) & 0xff;
973 p
[2] = (nb_sectors
>> 8) & 0xff;
974 p
[3] = nb_sectors
& 0xff;
975 p
[4] = 0; /* reserved */
976 p
[5] = 0; /* bytes 5-7 are the sector size in bytes */
977 p
[6] = s
->qdev
.blocksize
>> 8;
982 if (page_control
== 3) {
984 scsi_check_condition(r
, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED
));
989 for (page
= 0; page
<= 0x3e; page
++) {
990 mode_sense_page(s
, page
, &p
, page_control
);
993 ret
= mode_sense_page(s
, page
, &p
, page_control
);
1001 * The mode data length field specifies the length in bytes of the
1002 * following data that is available to be transferred. The mode data
1003 * length does not include itself.
1005 if (r
->req
.cmd
.buf
[0] == MODE_SENSE
) {
1006 outbuf
[0] = buflen
- 1;
1007 } else { /* MODE_SENSE_10 */
1008 outbuf
[0] = ((buflen
- 2) >> 8) & 0xff;
1009 outbuf
[1] = (buflen
- 2) & 0xff;
1011 if (buflen
> r
->req
.cmd
.xfer
) {
1012 buflen
= r
->req
.cmd
.xfer
;
1017 static int scsi_disk_emulate_read_toc(SCSIRequest
*req
, uint8_t *outbuf
)
1019 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1020 int start_track
, format
, msf
, toclen
;
1021 uint64_t nb_sectors
;
1023 msf
= req
->cmd
.buf
[1] & 2;
1024 format
= req
->cmd
.buf
[2] & 0xf;
1025 start_track
= req
->cmd
.buf
[6];
1026 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
1027 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track
, format
, msf
>> 1);
1028 nb_sectors
/= s
->qdev
.blocksize
/ 512;
1031 toclen
= cdrom_read_toc(nb_sectors
, outbuf
, msf
, start_track
);
1034 /* multi session : only a single session defined */
1036 memset(outbuf
, 0, 12);
1042 toclen
= cdrom_read_toc_raw(nb_sectors
, outbuf
, msf
, start_track
);
1047 if (toclen
> req
->cmd
.xfer
) {
1048 toclen
= req
->cmd
.xfer
;
1053 static int scsi_disk_emulate_start_stop(SCSIDiskReq
*r
)
1055 SCSIRequest
*req
= &r
->req
;
1056 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1057 bool start
= req
->cmd
.buf
[4] & 1;
1058 bool loej
= req
->cmd
.buf
[4] & 2; /* load on start, eject on !start */
1060 if (s
->qdev
.type
== TYPE_ROM
&& loej
) {
1061 if (!start
&& !s
->tray_open
&& s
->tray_locked
) {
1062 scsi_check_condition(r
,
1063 bdrv_is_inserted(s
->qdev
.conf
.bs
)
1064 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED
)
1065 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED
));
1068 bdrv_eject(s
->qdev
.conf
.bs
, !start
);
1069 s
->tray_open
= !start
;
1074 static int scsi_disk_emulate_command(SCSIDiskReq
*r
)
1076 SCSIRequest
*req
= &r
->req
;
1077 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1078 uint64_t nb_sectors
;
1082 if (!r
->iov
.iov_base
) {
1084 * FIXME: we shouldn't return anything bigger than 4k, but the code
1085 * requires the buffer to be as big as req->cmd.xfer in several
1086 * places. So, do not allow CDBs with a very large ALLOCATION
1087 * LENGTH. The real fix would be to modify scsi_read_data and
1088 * dma_buf_read, so that they return data beyond the buflen
1091 if (req
->cmd
.xfer
> 65536) {
1092 goto illegal_request
;
1094 r
->buflen
= MAX(4096, req
->cmd
.xfer
);
1095 r
->iov
.iov_base
= qemu_blockalign(s
->qdev
.conf
.bs
, r
->buflen
);
1098 outbuf
= r
->iov
.iov_base
;
1099 switch (req
->cmd
.buf
[0]) {
1100 case TEST_UNIT_READY
:
1101 if (s
->tray_open
|| !bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
1106 buflen
= scsi_disk_emulate_inquiry(req
, outbuf
);
1108 goto illegal_request
;
1113 buflen
= scsi_disk_emulate_mode_sense(r
, outbuf
);
1115 goto illegal_request
;
1119 buflen
= scsi_disk_emulate_read_toc(req
, outbuf
);
1121 goto illegal_request
;
1125 if (req
->cmd
.buf
[1] & 1) {
1126 goto illegal_request
;
1130 if (req
->cmd
.buf
[1] & 3) {
1131 goto illegal_request
;
1135 if (req
->cmd
.buf
[1] & 1) {
1136 goto illegal_request
;
1140 if (req
->cmd
.buf
[1] & 3) {
1141 goto illegal_request
;
1145 if (scsi_disk_emulate_start_stop(r
) < 0) {
1149 case ALLOW_MEDIUM_REMOVAL
:
1150 s
->tray_locked
= req
->cmd
.buf
[4] & 1;
1151 bdrv_lock_medium(s
->qdev
.conf
.bs
, req
->cmd
.buf
[4] & 1);
1153 case READ_CAPACITY_10
:
1154 /* The normal LEN field for this command is zero. */
1155 memset(outbuf
, 0, 8);
1156 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
1160 if ((req
->cmd
.buf
[8] & 1) == 0 && req
->cmd
.lba
) {
1161 goto illegal_request
;
1163 nb_sectors
/= s
->qdev
.blocksize
/ 512;
1164 /* Returned value is the address of the last sector. */
1166 /* Remember the new size for read/write sanity checking. */
1167 s
->qdev
.max_lba
= nb_sectors
;
1168 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
1169 if (nb_sectors
> UINT32_MAX
) {
1170 nb_sectors
= UINT32_MAX
;
1172 outbuf
[0] = (nb_sectors
>> 24) & 0xff;
1173 outbuf
[1] = (nb_sectors
>> 16) & 0xff;
1174 outbuf
[2] = (nb_sectors
>> 8) & 0xff;
1175 outbuf
[3] = nb_sectors
& 0xff;
1178 outbuf
[6] = s
->qdev
.blocksize
>> 8;
1183 /* Just return "NO SENSE". */
1184 buflen
= scsi_build_sense(NULL
, 0, outbuf
, r
->buflen
,
1185 (req
->cmd
.buf
[1] & 1) == 0);
1187 case MECHANISM_STATUS
:
1188 buflen
= scsi_emulate_mechanism_status(s
, outbuf
);
1190 goto illegal_request
;
1193 case GET_CONFIGURATION
:
1194 buflen
= scsi_get_configuration(s
, outbuf
);
1196 goto illegal_request
;
1199 case GET_EVENT_STATUS_NOTIFICATION
:
1200 buflen
= scsi_get_event_status_notification(s
, r
, outbuf
);
1202 goto illegal_request
;
1205 case READ_DVD_STRUCTURE
:
1206 buflen
= scsi_read_dvd_structure(s
, r
, outbuf
);
1208 goto illegal_request
;
1211 case SERVICE_ACTION_IN_16
:
1212 /* Service Action In subcommands. */
1213 if ((req
->cmd
.buf
[1] & 31) == SAI_READ_CAPACITY_16
) {
1214 DPRINTF("SAI READ CAPACITY(16)\n");
1215 memset(outbuf
, 0, req
->cmd
.xfer
);
1216 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
1220 if ((req
->cmd
.buf
[14] & 1) == 0 && req
->cmd
.lba
) {
1221 goto illegal_request
;
1223 nb_sectors
/= s
->qdev
.blocksize
/ 512;
1224 /* Returned value is the address of the last sector. */
1226 /* Remember the new size for read/write sanity checking. */
1227 s
->qdev
.max_lba
= nb_sectors
;
1228 outbuf
[0] = (nb_sectors
>> 56) & 0xff;
1229 outbuf
[1] = (nb_sectors
>> 48) & 0xff;
1230 outbuf
[2] = (nb_sectors
>> 40) & 0xff;
1231 outbuf
[3] = (nb_sectors
>> 32) & 0xff;
1232 outbuf
[4] = (nb_sectors
>> 24) & 0xff;
1233 outbuf
[5] = (nb_sectors
>> 16) & 0xff;
1234 outbuf
[6] = (nb_sectors
>> 8) & 0xff;
1235 outbuf
[7] = nb_sectors
& 0xff;
1238 outbuf
[10] = s
->qdev
.blocksize
>> 8;
1241 outbuf
[13] = get_physical_block_exp(&s
->qdev
.conf
);
1243 /* set TPE bit if the format supports discard */
1244 if (s
->qdev
.conf
.discard_granularity
) {
1248 /* Protection, exponent and lowest lba field left blank. */
1249 buflen
= req
->cmd
.xfer
;
1252 DPRINTF("Unsupported Service Action In\n");
1253 goto illegal_request
;
1257 scsi_check_condition(r
, SENSE_CODE(INVALID_OPCODE
));
1263 if (s
->tray_open
|| !bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
1264 scsi_check_condition(r
, SENSE_CODE(NO_MEDIUM
));
1266 scsi_check_condition(r
, SENSE_CODE(LUN_NOT_READY
));
1271 if (r
->req
.status
== -1) {
1272 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1277 /* Execute a scsi command. Returns the length of the data expected by the
1278 command. This will be Positive for data transfers from the device
1279 (eg. disk reads), negative for transfers to the device (eg. disk writes),
1280 and zero if the command does not transfer any data. */
1282 static int32_t scsi_send_command(SCSIRequest
*req
, uint8_t *buf
)
1284 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1285 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1291 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", req
->lun
, req
->tag
, buf
[0]);
1296 for (i
= 1; i
< r
->req
.cmd
.len
; i
++) {
1297 printf(" 0x%02x", buf
[i
]);
1304 case TEST_UNIT_READY
:
1313 case ALLOW_MEDIUM_REMOVAL
:
1314 case READ_CAPACITY_10
:
1316 case READ_DVD_STRUCTURE
:
1317 case GET_CONFIGURATION
:
1318 case GET_EVENT_STATUS_NOTIFICATION
:
1319 case MECHANISM_STATUS
:
1320 case SERVICE_ACTION_IN_16
:
1323 rc
= scsi_disk_emulate_command(r
);
1328 r
->iov
.iov_len
= rc
;
1330 case SYNCHRONIZE_CACHE
:
1331 /* The request is used as the AIO opaque value, so add a ref. */
1332 scsi_req_ref(&r
->req
);
1333 bdrv_acct_start(s
->qdev
.conf
.bs
, &r
->acct
, 0, BDRV_ACCT_FLUSH
);
1334 r
->req
.aiocb
= bdrv_aio_flush(s
->qdev
.conf
.bs
, scsi_flush_complete
, r
);
1335 if (r
->req
.aiocb
== NULL
) {
1336 scsi_flush_complete(r
, -EIO
);
1343 len
= r
->req
.cmd
.xfer
/ s
->qdev
.blocksize
;
1344 DPRINTF("Read (sector %" PRId64
", count %d)\n", r
->req
.cmd
.lba
, len
);
1345 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
1348 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512);
1349 r
->sector_count
= len
* (s
->qdev
.blocksize
/ 512);
1355 case WRITE_VERIFY_10
:
1356 case WRITE_VERIFY_12
:
1357 case WRITE_VERIFY_16
:
1358 len
= r
->req
.cmd
.xfer
/ s
->qdev
.blocksize
;
1359 DPRINTF("Write %s(sector %" PRId64
", count %d)\n",
1360 (command
& 0xe) == 0xe ? "And Verify " : "",
1361 r
->req
.cmd
.lba
, len
);
1362 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
1365 r
->sector
= r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512);
1366 r
->sector_count
= len
* (s
->qdev
.blocksize
/ 512);
1369 DPRINTF("Mode Select(6) (len %lu)\n", (long)r
->req
.cmd
.xfer
);
1370 /* We don't support mode parameter changes.
1371 Allow the mode parameter header + block descriptors only. */
1372 if (r
->req
.cmd
.xfer
> 12) {
1376 case MODE_SELECT_10
:
1377 DPRINTF("Mode Select(10) (len %lu)\n", (long)r
->req
.cmd
.xfer
);
1378 /* We don't support mode parameter changes.
1379 Allow the mode parameter header + block descriptors only. */
1380 if (r
->req
.cmd
.xfer
> 16) {
1385 DPRINTF("Seek(10) (sector %" PRId64
")\n", r
->req
.cmd
.lba
);
1386 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
1391 len
= r
->req
.cmd
.xfer
/ s
->qdev
.blocksize
;
1393 DPRINTF("WRITE SAME(16) (sector %" PRId64
", count %d)\n",
1394 r
->req
.cmd
.lba
, len
);
1396 if (r
->req
.cmd
.lba
> s
->qdev
.max_lba
) {
1401 * We only support WRITE SAME with the unmap bit set for now.
1403 if (!(buf
[1] & 0x8)) {
1407 rc
= bdrv_discard(s
->qdev
.conf
.bs
,
1408 r
->req
.cmd
.lba
* (s
->qdev
.blocksize
/ 512),
1409 len
* (s
->qdev
.blocksize
/ 512));
1411 /* XXX: better error code ?*/
1417 DPRINTF("Unknown SCSI command (%2.2x)\n", buf
[0]);
1418 scsi_check_condition(r
, SENSE_CODE(INVALID_OPCODE
));
1421 scsi_check_condition(r
, SENSE_CODE(INVALID_FIELD
));
1424 scsi_check_condition(r
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1427 if (r
->sector_count
== 0 && r
->iov
.iov_len
== 0) {
1428 scsi_req_complete(&r
->req
, GOOD
);
1430 len
= r
->sector_count
* 512 + r
->iov
.iov_len
;
1431 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
1434 if (!r
->sector_count
) {
1435 r
->sector_count
= -1;
1441 static void scsi_disk_reset(DeviceState
*dev
)
1443 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
.qdev
, dev
);
1444 uint64_t nb_sectors
;
1446 scsi_device_purge_requests(&s
->qdev
, SENSE_CODE(RESET
));
1448 bdrv_get_geometry(s
->qdev
.conf
.bs
, &nb_sectors
);
1449 nb_sectors
/= s
->qdev
.blocksize
/ 512;
1453 s
->qdev
.max_lba
= nb_sectors
;
1456 static void scsi_destroy(SCSIDevice
*dev
)
1458 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1460 scsi_device_purge_requests(&s
->qdev
, SENSE_CODE(NO_SENSE
));
1461 blockdev_mark_auto_del(s
->qdev
.conf
.bs
);
1464 static void scsi_cd_change_media_cb(void *opaque
, bool load
)
1466 SCSIDiskState
*s
= opaque
;
1469 * When a CD gets changed, we have to report an ejected state and
1470 * then a loaded state to guests so that they detect tray
1471 * open/close and media change events. Guests that do not use
1472 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
1473 * states rely on this behavior.
1475 * media_changed governs the state machine used for unit attention
1476 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
1478 s
->media_changed
= load
;
1479 s
->tray_open
= !load
;
1480 s
->qdev
.unit_attention
= SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM
);
1481 s
->media_event
= true;
1482 s
->eject_request
= false;
1485 static void scsi_cd_eject_request_cb(void *opaque
, bool force
)
1487 SCSIDiskState
*s
= opaque
;
1489 s
->eject_request
= true;
1491 s
->tray_locked
= false;
1495 static bool scsi_cd_is_tray_open(void *opaque
)
1497 return ((SCSIDiskState
*)opaque
)->tray_open
;
1500 static bool scsi_cd_is_medium_locked(void *opaque
)
1502 return ((SCSIDiskState
*)opaque
)->tray_locked
;
1505 static const BlockDevOps scsi_cd_block_ops
= {
1506 .change_media_cb
= scsi_cd_change_media_cb
,
1507 .eject_request_cb
= scsi_cd_eject_request_cb
,
1508 .is_tray_open
= scsi_cd_is_tray_open
,
1509 .is_medium_locked
= scsi_cd_is_medium_locked
,
1512 static void scsi_disk_unit_attention_reported(SCSIDevice
*dev
)
1514 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1515 if (s
->media_changed
) {
1516 s
->media_changed
= false;
1517 s
->qdev
.unit_attention
= SENSE_CODE(MEDIUM_CHANGED
);
1521 static int scsi_initfn(SCSIDevice
*dev
)
1523 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1526 if (!s
->qdev
.conf
.bs
) {
1527 error_report("scsi-disk: drive property not set");
1531 if (!s
->removable
&& !bdrv_is_inserted(s
->qdev
.conf
.bs
)) {
1532 error_report("Device needs media, but drive is empty");
1537 /* try to fall back to value set with legacy -drive serial=... */
1538 dinfo
= drive_get_by_blockdev(s
->qdev
.conf
.bs
);
1539 if (*dinfo
->serial
) {
1540 s
->serial
= g_strdup(dinfo
->serial
);
1545 s
->version
= g_strdup(QEMU_VERSION
);
1548 if (bdrv_is_sg(s
->qdev
.conf
.bs
)) {
1549 error_report("scsi-disk: unwanted /dev/sg*");
1554 bdrv_set_dev_ops(s
->qdev
.conf
.bs
, &scsi_cd_block_ops
, s
);
1556 bdrv_set_buffer_alignment(s
->qdev
.conf
.bs
, s
->qdev
.blocksize
);
1558 bdrv_iostatus_enable(s
->qdev
.conf
.bs
);
1559 add_boot_device_path(s
->qdev
.conf
.bootindex
, &dev
->qdev
, NULL
);
1563 static int scsi_hd_initfn(SCSIDevice
*dev
)
1565 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1566 s
->qdev
.blocksize
= s
->qdev
.conf
.logical_block_size
;
1567 s
->qdev
.type
= TYPE_DISK
;
1568 return scsi_initfn(&s
->qdev
);
1571 static int scsi_cd_initfn(SCSIDevice
*dev
)
1573 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1574 s
->qdev
.blocksize
= 2048;
1575 s
->qdev
.type
= TYPE_ROM
;
1576 s
->removable
= true;
1577 return scsi_initfn(&s
->qdev
);
1580 static int scsi_disk_initfn(SCSIDevice
*dev
)
1584 if (!dev
->conf
.bs
) {
1585 return scsi_initfn(dev
); /* ... and die there */
1588 dinfo
= drive_get_by_blockdev(dev
->conf
.bs
);
1589 if (dinfo
->media_cd
) {
1590 return scsi_cd_initfn(dev
);
1592 return scsi_hd_initfn(dev
);
1596 static const SCSIReqOps scsi_disk_reqops
= {
1597 .size
= sizeof(SCSIDiskReq
),
1598 .free_req
= scsi_free_request
,
1599 .send_command
= scsi_send_command
,
1600 .read_data
= scsi_read_data
,
1601 .write_data
= scsi_write_data
,
1602 .cancel_io
= scsi_cancel_io
,
1603 .get_buf
= scsi_get_buf
,
1606 static SCSIRequest
*scsi_new_request(SCSIDevice
*d
, uint32_t tag
, uint32_t lun
,
1607 uint8_t *buf
, void *hba_private
)
1609 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
1612 req
= scsi_req_alloc(&scsi_disk_reqops
, &s
->qdev
, tag
, lun
, hba_private
);
1617 static int get_device_type(SCSIDiskState
*s
)
1619 BlockDriverState
*bdrv
= s
->qdev
.conf
.bs
;
1622 uint8_t sensebuf
[8];
1623 sg_io_hdr_t io_header
;
1626 memset(cmd
, 0, sizeof(cmd
));
1627 memset(buf
, 0, sizeof(buf
));
1629 cmd
[4] = sizeof(buf
);
1631 memset(&io_header
, 0, sizeof(io_header
));
1632 io_header
.interface_id
= 'S';
1633 io_header
.dxfer_direction
= SG_DXFER_FROM_DEV
;
1634 io_header
.dxfer_len
= sizeof(buf
);
1635 io_header
.dxferp
= buf
;
1636 io_header
.cmdp
= cmd
;
1637 io_header
.cmd_len
= sizeof(cmd
);
1638 io_header
.mx_sb_len
= sizeof(sensebuf
);
1639 io_header
.sbp
= sensebuf
;
1640 io_header
.timeout
= 6000; /* XXX */
1642 ret
= bdrv_ioctl(bdrv
, SG_IO
, &io_header
);
1643 if (ret
< 0 || io_header
.driver_status
|| io_header
.host_status
) {
1646 s
->qdev
.type
= buf
[0];
1647 s
->removable
= (buf
[1] & 0x80) != 0;
1651 static int scsi_block_initfn(SCSIDevice
*dev
)
1653 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1657 if (!s
->qdev
.conf
.bs
) {
1658 error_report("scsi-block: drive property not set");
1662 /* check we are using a driver managing SG_IO (version 3 and after) */
1663 if (bdrv_ioctl(s
->qdev
.conf
.bs
, SG_GET_VERSION_NUM
, &sg_version
) < 0 ||
1664 sg_version
< 30000) {
1665 error_report("scsi-block: scsi generic interface too old");
1669 /* get device type from INQUIRY data */
1670 rc
= get_device_type(s
);
1672 error_report("scsi-block: INQUIRY failed");
1676 /* Make a guess for the block size, we'll fix it when the guest sends.
1677 * READ CAPACITY. If they don't, they likely would assume these sizes
1678 * anyway. (TODO: check in /sys).
1680 if (s
->qdev
.type
== TYPE_ROM
|| s
->qdev
.type
== TYPE_WORM
) {
1681 s
->qdev
.blocksize
= 2048;
1683 s
->qdev
.blocksize
= 512;
1685 return scsi_initfn(&s
->qdev
);
1688 static SCSIRequest
*scsi_block_new_request(SCSIDevice
*d
, uint32_t tag
,
1689 uint32_t lun
, uint8_t *buf
,
1692 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
1703 case WRITE_VERIFY_10
:
1704 case WRITE_VERIFY_12
:
1705 case WRITE_VERIFY_16
:
1706 /* MMC writing cannot be done via pread/pwrite, because it sometimes
1707 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
1708 * And once you do these writes, reading from the block device is
1709 * unreliable, too. It is even possible that reads deliver random data
1710 * from the host page cache (this is probably a Linux bug).
1712 * We might use scsi_disk_reqops as long as no writing commands are
1713 * seen, but performance usually isn't paramount on optical media. So,
1714 * just make scsi-block operate the same as scsi-generic for them.
1716 if (s
->qdev
.type
!= TYPE_ROM
) {
1717 return scsi_req_alloc(&scsi_disk_reqops
, &s
->qdev
, tag
, lun
,
1722 return scsi_req_alloc(&scsi_generic_req_ops
, &s
->qdev
, tag
, lun
,
1727 #define DEFINE_SCSI_DISK_PROPERTIES() \
1728 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
1729 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1730 DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1732 static SCSIDeviceInfo scsi_disk_info
[] = {
1734 .qdev
.name
= "scsi-hd",
1735 .qdev
.fw_name
= "disk",
1736 .qdev
.desc
= "virtual SCSI disk",
1737 .qdev
.size
= sizeof(SCSIDiskState
),
1738 .qdev
.reset
= scsi_disk_reset
,
1739 .init
= scsi_hd_initfn
,
1740 .destroy
= scsi_destroy
,
1741 .alloc_req
= scsi_new_request
,
1742 .unit_attention_reported
= scsi_disk_unit_attention_reported
,
1743 .qdev
.props
= (Property
[]) {
1744 DEFINE_SCSI_DISK_PROPERTIES(),
1745 DEFINE_PROP_BIT("removable", SCSIDiskState
, removable
, 0, false),
1746 DEFINE_PROP_END_OF_LIST(),
1749 .qdev
.name
= "scsi-cd",
1750 .qdev
.fw_name
= "disk",
1751 .qdev
.desc
= "virtual SCSI CD-ROM",
1752 .qdev
.size
= sizeof(SCSIDiskState
),
1753 .qdev
.reset
= scsi_disk_reset
,
1754 .init
= scsi_cd_initfn
,
1755 .destroy
= scsi_destroy
,
1756 .alloc_req
= scsi_new_request
,
1757 .unit_attention_reported
= scsi_disk_unit_attention_reported
,
1758 .qdev
.props
= (Property
[]) {
1759 DEFINE_SCSI_DISK_PROPERTIES(),
1760 DEFINE_PROP_END_OF_LIST(),
1764 .qdev
.name
= "scsi-block",
1765 .qdev
.fw_name
= "disk",
1766 .qdev
.desc
= "SCSI block device passthrough",
1767 .qdev
.size
= sizeof(SCSIDiskState
),
1768 .qdev
.reset
= scsi_disk_reset
,
1769 .init
= scsi_block_initfn
,
1770 .destroy
= scsi_destroy
,
1771 .alloc_req
= scsi_block_new_request
,
1772 .qdev
.props
= (Property
[]) {
1773 DEFINE_SCSI_DISK_PROPERTIES(),
1774 DEFINE_PROP_END_OF_LIST(),
1778 .qdev
.name
= "scsi-disk", /* legacy -device scsi-disk */
1779 .qdev
.fw_name
= "disk",
1780 .qdev
.desc
= "virtual SCSI disk or CD-ROM (legacy)",
1781 .qdev
.size
= sizeof(SCSIDiskState
),
1782 .qdev
.reset
= scsi_disk_reset
,
1783 .init
= scsi_disk_initfn
,
1784 .destroy
= scsi_destroy
,
1785 .alloc_req
= scsi_new_request
,
1786 .unit_attention_reported
= scsi_disk_unit_attention_reported
,
1787 .qdev
.props
= (Property
[]) {
1788 DEFINE_SCSI_DISK_PROPERTIES(),
1789 DEFINE_PROP_BIT("removable", SCSIDiskState
, removable
, 0, false),
1790 DEFINE_PROP_END_OF_LIST(),
1795 static void scsi_disk_register_devices(void)
1799 for (i
= 0; i
< ARRAY_SIZE(scsi_disk_info
); i
++) {
1800 scsi_qdev_register(&scsi_disk_info
[i
]);
1803 device_init(scsi_disk_register_devices
)