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 licenced 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"
41 #define SCSI_DMA_BUF_SIZE 131072
42 #define SCSI_MAX_INQUIRY_LEN 256
44 #define SCSI_REQ_STATUS_RETRY 0x01
45 #define SCSI_REQ_STATUS_RETRY_TYPE_MASK 0x06
46 #define SCSI_REQ_STATUS_RETRY_READ 0x00
47 #define SCSI_REQ_STATUS_RETRY_WRITE 0x02
48 #define SCSI_REQ_STATUS_RETRY_FLUSH 0x04
50 typedef struct SCSIDiskState SCSIDiskState
;
52 typedef struct SCSIDiskReq
{
54 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
56 uint32_t sector_count
;
62 typedef enum { SCSI_HD
, SCSI_CD
} SCSIDriveKind
;
68 /* The qemu block layer uses a fixed 512 byte sector size.
69 This is the number of 512 byte blocks in a single scsi sector. */
77 SCSIDriveKind drive_kind
;
80 static int scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, int type
);
81 static int scsi_disk_emulate_command(SCSIDiskReq
*r
, uint8_t *outbuf
);
83 static SCSIRequest
*scsi_new_request(SCSIDevice
*d
, uint32_t tag
,
86 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, d
);
90 req
= scsi_req_alloc(sizeof(SCSIDiskReq
), &s
->qdev
, tag
, lun
);
91 r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
92 r
->iov
.iov_base
= qemu_blockalign(s
->bs
, SCSI_DMA_BUF_SIZE
);
96 static void scsi_free_request(SCSIRequest
*req
)
98 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
100 qemu_vfree(r
->iov
.iov_base
);
103 static void scsi_disk_clear_sense(SCSIDiskState
*s
)
105 memset(&s
->sense
, 0, sizeof(s
->sense
));
108 static void scsi_req_set_status(SCSIDiskReq
*r
, int status
, SCSISense sense
)
110 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
112 r
->req
.status
= status
;
116 /* Helper function for command completion. */
117 static void scsi_command_complete(SCSIDiskReq
*r
, int status
, SCSISense sense
)
119 DPRINTF("Command complete tag=0x%x status=%d sense=%d/%d/%d\n",
120 r
->req
.tag
, status
, sense
.key
, sense
.asc
, sense
.ascq
);
121 scsi_req_set_status(r
, status
, sense
);
122 scsi_req_complete(&r
->req
);
125 /* Cancel a pending data transfer. */
126 static void scsi_cancel_io(SCSIRequest
*req
)
128 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
130 DPRINTF("Cancel tag=0x%x\n", req
->tag
);
132 bdrv_aio_cancel(r
->req
.aiocb
);
137 static void scsi_read_complete(void * opaque
, int ret
)
139 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
145 if (scsi_handle_rw_error(r
, -ret
, SCSI_REQ_STATUS_RETRY_READ
)) {
150 DPRINTF("Data ready tag=0x%x len=%zd\n", r
->req
.tag
, r
->iov
.iov_len
);
152 n
= r
->iov
.iov_len
/ 512;
154 r
->sector_count
-= n
;
155 scsi_req_data(&r
->req
, r
->iov
.iov_len
);
159 /* Read more data from scsi device into buffer. */
160 static void scsi_read_data(SCSIRequest
*req
)
162 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
163 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
166 if (r
->sector_count
== (uint32_t)-1) {
167 DPRINTF("Read buf_len=%zd\n", r
->iov
.iov_len
);
169 scsi_req_data(&r
->req
, r
->iov
.iov_len
);
172 DPRINTF("Read sector_count=%d\n", r
->sector_count
);
173 if (r
->sector_count
== 0) {
174 scsi_command_complete(r
, GOOD
, SENSE_CODE(NO_SENSE
));
178 /* No data transfer may already be in progress */
179 assert(r
->req
.aiocb
== NULL
);
181 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
182 DPRINTF("Data transfer direction invalid\n");
183 scsi_read_complete(r
, -EINVAL
);
188 if (n
> SCSI_DMA_BUF_SIZE
/ 512)
189 n
= SCSI_DMA_BUF_SIZE
/ 512;
191 r
->iov
.iov_len
= n
* 512;
192 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
193 r
->req
.aiocb
= bdrv_aio_readv(s
->bs
, r
->sector
, &r
->qiov
, n
,
194 scsi_read_complete
, r
);
195 if (r
->req
.aiocb
== NULL
) {
196 scsi_read_complete(r
, -EIO
);
200 static int scsi_handle_rw_error(SCSIDiskReq
*r
, int error
, int type
)
202 int is_read
= (type
== SCSI_REQ_STATUS_RETRY_READ
);
203 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
204 BlockErrorAction action
= bdrv_get_on_error(s
->bs
, is_read
);
206 if (action
== BLOCK_ERR_IGNORE
) {
207 bdrv_mon_event(s
->bs
, BDRV_ACTION_IGNORE
, is_read
);
211 if ((error
== ENOSPC
&& action
== BLOCK_ERR_STOP_ENOSPC
)
212 || action
== BLOCK_ERR_STOP_ANY
) {
214 type
&= SCSI_REQ_STATUS_RETRY_TYPE_MASK
;
215 r
->status
|= SCSI_REQ_STATUS_RETRY
| type
;
217 bdrv_mon_event(s
->bs
, BDRV_ACTION_STOP
, is_read
);
218 vm_stop(VMSTOP_DISKFULL
);
220 if (type
== SCSI_REQ_STATUS_RETRY_READ
) {
221 scsi_req_data(&r
->req
, 0);
225 scsi_command_complete(r
, CHECK_CONDITION
,
226 SENSE_CODE(TARGET_FAILURE
));
229 scsi_command_complete(r
, CHECK_CONDITION
,
230 SENSE_CODE(INVALID_FIELD
));
233 scsi_command_complete(r
, CHECK_CONDITION
,
234 SENSE_CODE(IO_ERROR
));
237 bdrv_mon_event(s
->bs
, BDRV_ACTION_REPORT
, is_read
);
242 static void scsi_write_complete(void * opaque
, int ret
)
244 SCSIDiskReq
*r
= (SCSIDiskReq
*)opaque
;
251 if (scsi_handle_rw_error(r
, -ret
, SCSI_REQ_STATUS_RETRY_WRITE
)) {
256 n
= r
->iov
.iov_len
/ 512;
258 r
->sector_count
-= n
;
259 if (r
->sector_count
== 0) {
260 scsi_command_complete(r
, GOOD
, SENSE_CODE(NO_SENSE
));
262 len
= r
->sector_count
* 512;
263 if (len
> SCSI_DMA_BUF_SIZE
) {
264 len
= SCSI_DMA_BUF_SIZE
;
266 r
->iov
.iov_len
= len
;
267 DPRINTF("Write complete tag=0x%x more=%d\n", r
->req
.tag
, len
);
268 scsi_req_data(&r
->req
, len
);
272 static void scsi_write_data(SCSIRequest
*req
)
274 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
275 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, r
->req
.dev
);
278 /* No data transfer may already be in progress */
279 assert(r
->req
.aiocb
== NULL
);
281 if (r
->req
.cmd
.mode
!= SCSI_XFER_TO_DEV
) {
282 DPRINTF("Data transfer direction invalid\n");
283 scsi_write_complete(r
, -EINVAL
);
287 n
= r
->iov
.iov_len
/ 512;
289 qemu_iovec_init_external(&r
->qiov
, &r
->iov
, 1);
290 r
->req
.aiocb
= bdrv_aio_writev(s
->bs
, r
->sector
, &r
->qiov
, n
,
291 scsi_write_complete
, r
);
292 if (r
->req
.aiocb
== NULL
) {
293 scsi_write_complete(r
, -ENOMEM
);
296 /* Invoke completion routine to fetch data from host. */
297 scsi_write_complete(r
, 0);
301 static void scsi_dma_restart_bh(void *opaque
)
303 SCSIDiskState
*s
= opaque
;
307 qemu_bh_delete(s
->bh
);
310 QTAILQ_FOREACH(req
, &s
->qdev
.requests
, next
) {
311 r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
312 if (r
->status
& SCSI_REQ_STATUS_RETRY
) {
313 int status
= r
->status
;
317 ~(SCSI_REQ_STATUS_RETRY
| SCSI_REQ_STATUS_RETRY_TYPE_MASK
);
319 switch (status
& SCSI_REQ_STATUS_RETRY_TYPE_MASK
) {
320 case SCSI_REQ_STATUS_RETRY_READ
:
321 scsi_read_data(&r
->req
);
323 case SCSI_REQ_STATUS_RETRY_WRITE
:
324 scsi_write_data(&r
->req
);
326 case SCSI_REQ_STATUS_RETRY_FLUSH
:
327 ret
= scsi_disk_emulate_command(r
, r
->iov
.iov_base
);
329 scsi_command_complete(r
, GOOD
, SENSE_CODE(NO_SENSE
));
336 static void scsi_dma_restart_cb(void *opaque
, int running
, int reason
)
338 SCSIDiskState
*s
= opaque
;
344 s
->bh
= qemu_bh_new(scsi_dma_restart_bh
, s
);
345 qemu_bh_schedule(s
->bh
);
349 /* Return a pointer to the data buffer. */
350 static uint8_t *scsi_get_buf(SCSIRequest
*req
)
352 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
354 return (uint8_t *)r
->iov
.iov_base
;
357 /* Copy sense information into the provided buffer */
358 static int scsi_get_sense(SCSIRequest
*req
, uint8_t *outbuf
, int len
)
360 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
362 return scsi_build_sense(s
->sense
, outbuf
, len
, len
> 14);
365 static int scsi_disk_emulate_inquiry(SCSIRequest
*req
, uint8_t *outbuf
)
367 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
370 if (req
->cmd
.buf
[1] & 0x2) {
371 /* Command support data - optional, not implemented */
372 BADF("optional INQUIRY command support request not implemented\n");
376 if (req
->cmd
.buf
[1] & 0x1) {
377 /* Vital product data */
378 uint8_t page_code
= req
->cmd
.buf
[2];
379 if (req
->cmd
.xfer
< 4) {
380 BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
381 "less than 4\n", page_code
, req
->cmd
.xfer
);
385 if (s
->drive_kind
== SCSI_CD
) {
386 outbuf
[buflen
++] = 5;
388 outbuf
[buflen
++] = 0;
390 outbuf
[buflen
++] = page_code
; // this page
391 outbuf
[buflen
++] = 0x00;
394 case 0x00: /* Supported page codes, mandatory */
397 DPRINTF("Inquiry EVPD[Supported pages] "
398 "buffer size %zd\n", req
->cmd
.xfer
);
400 outbuf
[buflen
++] = 0x00; // list of supported pages (this page)
401 outbuf
[buflen
++] = 0x80; // unit serial number
402 outbuf
[buflen
++] = 0x83; // device identification
403 if (s
->drive_kind
== SCSI_HD
) {
404 outbuf
[buflen
++] = 0xb0; // block limits
405 outbuf
[buflen
++] = 0xb2; // thin provisioning
407 outbuf
[pages
] = buflen
- pages
- 1; // number of pages
410 case 0x80: /* Device serial number, optional */
412 int l
= strlen(s
->serial
);
414 if (l
> req
->cmd
.xfer
)
419 DPRINTF("Inquiry EVPD[Serial number] "
420 "buffer size %zd\n", req
->cmd
.xfer
);
421 outbuf
[buflen
++] = l
;
422 memcpy(outbuf
+buflen
, s
->serial
, l
);
427 case 0x83: /* Device identification page, mandatory */
429 int max_len
= 255 - 8;
430 int id_len
= strlen(bdrv_get_device_name(s
->bs
));
432 if (id_len
> max_len
)
434 DPRINTF("Inquiry EVPD[Device identification] "
435 "buffer size %zd\n", req
->cmd
.xfer
);
437 outbuf
[buflen
++] = 4 + id_len
;
438 outbuf
[buflen
++] = 0x2; // ASCII
439 outbuf
[buflen
++] = 0; // not officially assigned
440 outbuf
[buflen
++] = 0; // reserved
441 outbuf
[buflen
++] = id_len
; // length of data following
443 memcpy(outbuf
+buflen
, bdrv_get_device_name(s
->bs
), id_len
);
447 case 0xb0: /* block limits */
449 unsigned int unmap_sectors
=
450 s
->qdev
.conf
.discard_granularity
/ s
->qdev
.blocksize
;
451 unsigned int min_io_size
=
452 s
->qdev
.conf
.min_io_size
/ s
->qdev
.blocksize
;
453 unsigned int opt_io_size
=
454 s
->qdev
.conf
.opt_io_size
/ s
->qdev
.blocksize
;
456 if (s
->drive_kind
== SCSI_CD
) {
457 DPRINTF("Inquiry (EVPD[%02X] not supported for CDROM\n",
461 /* required VPD size with unmap support */
462 outbuf
[3] = buflen
= 0x3c;
464 memset(outbuf
+ 4, 0, buflen
- 4);
466 /* optimal transfer length granularity */
467 outbuf
[6] = (min_io_size
>> 8) & 0xff;
468 outbuf
[7] = min_io_size
& 0xff;
470 /* optimal transfer length */
471 outbuf
[12] = (opt_io_size
>> 24) & 0xff;
472 outbuf
[13] = (opt_io_size
>> 16) & 0xff;
473 outbuf
[14] = (opt_io_size
>> 8) & 0xff;
474 outbuf
[15] = opt_io_size
& 0xff;
476 /* optimal unmap granularity */
477 outbuf
[28] = (unmap_sectors
>> 24) & 0xff;
478 outbuf
[29] = (unmap_sectors
>> 16) & 0xff;
479 outbuf
[30] = (unmap_sectors
>> 8) & 0xff;
480 outbuf
[31] = unmap_sectors
& 0xff;
483 case 0xb2: /* thin provisioning */
485 outbuf
[3] = buflen
= 8;
487 outbuf
[5] = 0x40; /* write same with unmap supported */
493 BADF("Error: unsupported Inquiry (EVPD[%02X]) "
494 "buffer size %zd\n", page_code
, req
->cmd
.xfer
);
501 /* Standard INQUIRY data */
502 if (req
->cmd
.buf
[2] != 0) {
503 BADF("Error: Inquiry (STANDARD) page or code "
504 "is non-zero [%02X]\n", req
->cmd
.buf
[2]);
509 if (req
->cmd
.xfer
< 5) {
510 BADF("Error: Inquiry (STANDARD) buffer size %zd "
511 "is less than 5\n", req
->cmd
.xfer
);
515 buflen
= req
->cmd
.xfer
;
516 if (buflen
> SCSI_MAX_INQUIRY_LEN
)
517 buflen
= SCSI_MAX_INQUIRY_LEN
;
519 memset(outbuf
, 0, buflen
);
522 outbuf
[0] = 0x7f; /* LUN not supported */
526 if (s
->drive_kind
== SCSI_CD
) {
529 memcpy(&outbuf
[16], "QEMU CD-ROM ", 16);
532 outbuf
[1] = s
->removable
? 0x80 : 0;
533 memcpy(&outbuf
[16], "QEMU HARDDISK ", 16);
535 memcpy(&outbuf
[8], "QEMU ", 8);
536 memset(&outbuf
[32], 0, 4);
537 memcpy(&outbuf
[32], s
->version
, MIN(4, strlen(s
->version
)));
539 * We claim conformance to SPC-3, which is required for guests
540 * to ask for modern features like READ CAPACITY(16) or the
541 * block characteristics VPD page by default. Not all of SPC-3
542 * is actually implemented, but we're good enough.
545 outbuf
[3] = 2; /* Format 2 */
548 outbuf
[4] = buflen
- 5; /* Additional Length = (Len - 1) - 4 */
550 /* If the allocation length of CDB is too small,
551 the additional length is not adjusted */
555 /* Sync data transfer and TCQ. */
556 outbuf
[7] = 0x10 | (req
->bus
->tcq
? 0x02 : 0);
560 static int mode_sense_page(SCSIRequest
*req
, int page
, uint8_t *p
,
563 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
564 BlockDriverState
*bdrv
= s
->bs
;
565 int cylinders
, heads
, secs
;
568 * If Changeable Values are requested, a mask denoting those mode parameters
569 * that are changeable shall be returned. As we currently don't support
570 * parameter changes via MODE_SELECT all bits are returned set to zero.
571 * The buffer was already menset to zero by the caller of this function.
574 case 4: /* Rigid disk device geometry page. */
577 if (page_control
== 1) { /* Changeable Values */
580 /* if a geometry hint is available, use it */
581 bdrv_get_geometry_hint(bdrv
, &cylinders
, &heads
, &secs
);
582 p
[2] = (cylinders
>> 16) & 0xff;
583 p
[3] = (cylinders
>> 8) & 0xff;
584 p
[4] = cylinders
& 0xff;
586 /* Write precomp start cylinder, disabled */
587 p
[6] = (cylinders
>> 16) & 0xff;
588 p
[7] = (cylinders
>> 8) & 0xff;
589 p
[8] = cylinders
& 0xff;
590 /* Reduced current start cylinder, disabled */
591 p
[9] = (cylinders
>> 16) & 0xff;
592 p
[10] = (cylinders
>> 8) & 0xff;
593 p
[11] = cylinders
& 0xff;
594 /* Device step rate [ns], 200ns */
597 /* Landing zone cylinder */
601 /* Medium rotation rate [rpm], 5400 rpm */
602 p
[20] = (5400 >> 8) & 0xff;
606 case 5: /* Flexible disk device geometry page. */
609 if (page_control
== 1) { /* Changeable Values */
612 /* Transfer rate [kbit/s], 5Mbit/s */
615 /* if a geometry hint is available, use it */
616 bdrv_get_geometry_hint(bdrv
, &cylinders
, &heads
, &secs
);
619 p
[6] = s
->cluster_size
* 2;
620 p
[8] = (cylinders
>> 8) & 0xff;
621 p
[9] = cylinders
& 0xff;
622 /* Write precomp start cylinder, disabled */
623 p
[10] = (cylinders
>> 8) & 0xff;
624 p
[11] = cylinders
& 0xff;
625 /* Reduced current start cylinder, disabled */
626 p
[12] = (cylinders
>> 8) & 0xff;
627 p
[13] = cylinders
& 0xff;
628 /* Device step rate [100us], 100us */
631 /* Device step pulse width [us], 1us */
633 /* Device head settle delay [100us], 100us */
636 /* Motor on delay [0.1s], 0.1s */
638 /* Motor off delay [0.1s], 0.1s */
640 /* Medium rotation rate [rpm], 5400 rpm */
641 p
[28] = (5400 >> 8) & 0xff;
645 case 8: /* Caching page. */
648 if (page_control
== 1) { /* Changeable Values */
651 if (bdrv_enable_write_cache(s
->bs
)) {
656 case 0x2a: /* CD Capabilities and Mechanical Status page. */
657 if (s
->drive_kind
!= SCSI_CD
)
661 if (page_control
== 1) { /* Changeable Values */
664 p
[2] = 3; // CD-R & CD-RW read
665 p
[3] = 0; // Writing not supported
666 p
[4] = 0x7f; /* Audio, composite, digital out,
667 mode 2 form 1&2, multi session */
668 p
[5] = 0xff; /* CD DA, DA accurate, RW supported,
669 RW corrected, C2 errors, ISRC,
671 p
[6] = 0x2d | (bdrv_is_locked(s
->bs
)? 2 : 0);
672 /* Locking supported, jumper present, eject, tray */
673 p
[7] = 0; /* no volume & mute control, no
675 p
[8] = (50 * 176) >> 8; // 50x read speed
676 p
[9] = (50 * 176) & 0xff;
677 p
[10] = 0 >> 8; // No volume
679 p
[12] = 2048 >> 8; // 2M buffer
681 p
[14] = (16 * 176) >> 8; // 16x read speed current
682 p
[15] = (16 * 176) & 0xff;
683 p
[18] = (16 * 176) >> 8; // 16x write speed
684 p
[19] = (16 * 176) & 0xff;
685 p
[20] = (16 * 176) >> 8; // 16x write speed current
686 p
[21] = (16 * 176) & 0xff;
694 static int scsi_disk_emulate_mode_sense(SCSIRequest
*req
, uint8_t *outbuf
)
696 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
698 int page
, dbd
, buflen
, page_control
;
700 uint8_t dev_specific_param
;
702 dbd
= req
->cmd
.buf
[1] & 0x8;
703 page
= req
->cmd
.buf
[2] & 0x3f;
704 page_control
= (req
->cmd
.buf
[2] & 0xc0) >> 6;
705 DPRINTF("Mode Sense(%d) (page %d, xfer %zd, page_control %d)\n",
706 (req
->cmd
.buf
[0] == MODE_SENSE
) ? 6 : 10, page
, req
->cmd
.xfer
, page_control
);
707 memset(outbuf
, 0, req
->cmd
.xfer
);
710 if (bdrv_is_read_only(s
->bs
)) {
711 dev_specific_param
= 0x80; /* Readonly. */
713 dev_specific_param
= 0x00;
716 if (req
->cmd
.buf
[0] == MODE_SENSE
) {
717 p
[1] = 0; /* Default media type. */
718 p
[2] = dev_specific_param
;
719 p
[3] = 0; /* Block descriptor length. */
721 } else { /* MODE_SENSE_10 */
722 p
[2] = 0; /* Default media type. */
723 p
[3] = dev_specific_param
;
724 p
[6] = p
[7] = 0; /* Block descriptor length. */
728 bdrv_get_geometry(s
->bs
, &nb_sectors
);
729 if (!dbd
&& nb_sectors
) {
730 if (req
->cmd
.buf
[0] == MODE_SENSE
) {
731 outbuf
[3] = 8; /* Block descriptor length */
732 } else { /* MODE_SENSE_10 */
733 outbuf
[7] = 8; /* Block descriptor length */
735 nb_sectors
/= s
->cluster_size
;
736 if (nb_sectors
> 0xffffff)
738 p
[0] = 0; /* media density code */
739 p
[1] = (nb_sectors
>> 16) & 0xff;
740 p
[2] = (nb_sectors
>> 8) & 0xff;
741 p
[3] = nb_sectors
& 0xff;
742 p
[4] = 0; /* reserved */
743 p
[5] = 0; /* bytes 5-7 are the sector size in bytes */
744 p
[6] = s
->cluster_size
* 2;
749 if (page_control
== 3) { /* Saved Values */
750 return -1; /* ILLEGAL_REQUEST */
758 p
+= mode_sense_page(req
, page
, p
, page_control
);
761 p
+= mode_sense_page(req
, 0x08, p
, page_control
);
762 p
+= mode_sense_page(req
, 0x2a, p
, page_control
);
765 return -1; /* ILLEGAL_REQUEST */
770 * The mode data length field specifies the length in bytes of the
771 * following data that is available to be transferred. The mode data
772 * length does not include itself.
774 if (req
->cmd
.buf
[0] == MODE_SENSE
) {
775 outbuf
[0] = buflen
- 1;
776 } else { /* MODE_SENSE_10 */
777 outbuf
[0] = ((buflen
- 2) >> 8) & 0xff;
778 outbuf
[1] = (buflen
- 2) & 0xff;
780 if (buflen
> req
->cmd
.xfer
)
781 buflen
= req
->cmd
.xfer
;
785 static int scsi_disk_emulate_read_toc(SCSIRequest
*req
, uint8_t *outbuf
)
787 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
788 int start_track
, format
, msf
, toclen
;
791 msf
= req
->cmd
.buf
[1] & 2;
792 format
= req
->cmd
.buf
[2] & 0xf;
793 start_track
= req
->cmd
.buf
[6];
794 bdrv_get_geometry(s
->bs
, &nb_sectors
);
795 DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track
, format
, msf
>> 1);
796 nb_sectors
/= s
->cluster_size
;
799 toclen
= cdrom_read_toc(nb_sectors
, outbuf
, msf
, start_track
);
802 /* multi session : only a single session defined */
804 memset(outbuf
, 0, 12);
810 toclen
= cdrom_read_toc_raw(nb_sectors
, outbuf
, msf
, start_track
);
815 if (toclen
> req
->cmd
.xfer
)
816 toclen
= req
->cmd
.xfer
;
820 static int scsi_disk_emulate_command(SCSIDiskReq
*r
, uint8_t *outbuf
)
822 SCSIRequest
*req
= &r
->req
;
823 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
828 switch (req
->cmd
.buf
[0]) {
829 case TEST_UNIT_READY
:
830 if (!bdrv_is_inserted(s
->bs
))
834 if (req
->cmd
.xfer
< 4)
835 goto illegal_request
;
836 buflen
= scsi_build_sense(s
->sense
, outbuf
, req
->cmd
.xfer
,
838 scsi_disk_clear_sense(s
);
841 buflen
= scsi_disk_emulate_inquiry(req
, outbuf
);
843 goto illegal_request
;
847 buflen
= scsi_disk_emulate_mode_sense(req
, outbuf
);
849 goto illegal_request
;
852 buflen
= scsi_disk_emulate_read_toc(req
, outbuf
);
854 goto illegal_request
;
857 if (req
->cmd
.buf
[1] & 1)
858 goto illegal_request
;
861 if (req
->cmd
.buf
[1] & 3)
862 goto illegal_request
;
865 if (req
->cmd
.buf
[1] & 1)
866 goto illegal_request
;
869 if (req
->cmd
.buf
[1] & 3)
870 goto illegal_request
;
873 if (s
->drive_kind
== SCSI_CD
&& (req
->cmd
.buf
[4] & 2)) {
874 /* load/eject medium */
875 bdrv_eject(s
->bs
, !(req
->cmd
.buf
[4] & 1));
878 case ALLOW_MEDIUM_REMOVAL
:
879 bdrv_set_locked(s
->bs
, req
->cmd
.buf
[4] & 1);
882 /* The normal LEN field for this command is zero. */
883 memset(outbuf
, 0, 8);
884 bdrv_get_geometry(s
->bs
, &nb_sectors
);
887 nb_sectors
/= s
->cluster_size
;
888 /* Returned value is the address of the last sector. */
890 /* Remember the new size for read/write sanity checking. */
891 s
->max_lba
= nb_sectors
;
892 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
893 if (nb_sectors
> UINT32_MAX
)
894 nb_sectors
= UINT32_MAX
;
895 outbuf
[0] = (nb_sectors
>> 24) & 0xff;
896 outbuf
[1] = (nb_sectors
>> 16) & 0xff;
897 outbuf
[2] = (nb_sectors
>> 8) & 0xff;
898 outbuf
[3] = nb_sectors
& 0xff;
901 outbuf
[6] = s
->cluster_size
* 2;
905 case SYNCHRONIZE_CACHE
:
906 ret
= bdrv_flush(s
->bs
);
908 if (scsi_handle_rw_error(r
, -ret
, SCSI_REQ_STATUS_RETRY_FLUSH
)) {
913 case GET_CONFIGURATION
:
914 memset(outbuf
, 0, 8);
915 /* ??? This should probably return much more information. For now
916 just return the basic header indicating the CD-ROM profile. */
917 outbuf
[7] = 8; // CD-ROM
920 case SERVICE_ACTION_IN
:
921 /* Service Action In subcommands. */
922 if ((req
->cmd
.buf
[1] & 31) == 0x10) {
923 DPRINTF("SAI READ CAPACITY(16)\n");
924 memset(outbuf
, 0, req
->cmd
.xfer
);
925 bdrv_get_geometry(s
->bs
, &nb_sectors
);
928 nb_sectors
/= s
->cluster_size
;
929 /* Returned value is the address of the last sector. */
931 /* Remember the new size for read/write sanity checking. */
932 s
->max_lba
= nb_sectors
;
933 outbuf
[0] = (nb_sectors
>> 56) & 0xff;
934 outbuf
[1] = (nb_sectors
>> 48) & 0xff;
935 outbuf
[2] = (nb_sectors
>> 40) & 0xff;
936 outbuf
[3] = (nb_sectors
>> 32) & 0xff;
937 outbuf
[4] = (nb_sectors
>> 24) & 0xff;
938 outbuf
[5] = (nb_sectors
>> 16) & 0xff;
939 outbuf
[6] = (nb_sectors
>> 8) & 0xff;
940 outbuf
[7] = nb_sectors
& 0xff;
943 outbuf
[10] = s
->cluster_size
* 2;
946 outbuf
[13] = get_physical_block_exp(&s
->qdev
.conf
);
948 /* set TPE bit if the format supports discard */
949 if (s
->qdev
.conf
.discard_granularity
) {
953 /* Protection, exponent and lowest lba field left blank. */
954 buflen
= req
->cmd
.xfer
;
957 DPRINTF("Unsupported Service Action In\n");
958 goto illegal_request
;
960 if (req
->cmd
.xfer
< 16)
961 goto illegal_request
;
962 memset(outbuf
, 0, 16);
969 DPRINTF("Rezero Unit\n");
970 if (!bdrv_is_inserted(s
->bs
)) {
975 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(INVALID_OPCODE
));
978 scsi_req_set_status(r
, GOOD
, SENSE_CODE(NO_SENSE
));
982 if (!bdrv_is_inserted(s
->bs
)) {
983 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(NO_MEDIUM
));
985 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(LUN_NOT_READY
));
990 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(INVALID_FIELD
));
994 /* Execute a scsi command. Returns the length of the data expected by the
995 command. This will be Positive for data transfers from the device
996 (eg. disk reads), negative for transfers to the device (eg. disk writes),
997 and zero if the command does not transfer any data. */
999 static int32_t scsi_send_command(SCSIRequest
*req
, uint8_t *buf
)
1001 SCSIDiskReq
*r
= DO_UPCAST(SCSIDiskReq
, req
, req
);
1002 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, req
->dev
);
1009 outbuf
= (uint8_t *)r
->iov
.iov_base
;
1010 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun
, tag
, buf
[0]);
1012 if (scsi_req_parse(&r
->req
, buf
) != 0) {
1013 BADF("Unsupported command length, command %x\n", command
);
1014 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(INVALID_OPCODE
));
1020 for (i
= 1; i
< r
->req
.cmd
.len
; i
++) {
1021 printf(" 0x%02x", buf
[i
]);
1028 /* Only LUN 0 supported. */
1029 DPRINTF("Unimplemented LUN %d\n", req
->lun
);
1030 if (command
!= REQUEST_SENSE
&& command
!= INQUIRY
) {
1031 scsi_command_complete(r
, CHECK_CONDITION
,
1032 SENSE_CODE(LUN_NOT_SUPPORTED
));
1037 case TEST_UNIT_READY
:
1047 case ALLOW_MEDIUM_REMOVAL
:
1049 case SYNCHRONIZE_CACHE
:
1051 case GET_CONFIGURATION
:
1052 case SERVICE_ACTION_IN
:
1056 rc
= scsi_disk_emulate_command(r
, outbuf
);
1061 r
->iov
.iov_len
= rc
;
1067 len
= r
->req
.cmd
.xfer
/ s
->qdev
.blocksize
;
1068 DPRINTF("Read (sector %" PRId64
", count %d)\n", r
->req
.cmd
.lba
, len
);
1069 if (r
->req
.cmd
.lba
> s
->max_lba
)
1071 r
->sector
= r
->req
.cmd
.lba
* s
->cluster_size
;
1072 r
->sector_count
= len
* s
->cluster_size
;
1079 case WRITE_VERIFY_12
:
1080 case WRITE_VERIFY_16
:
1081 len
= r
->req
.cmd
.xfer
/ s
->qdev
.blocksize
;
1082 DPRINTF("Write %s(sector %" PRId64
", count %d)\n",
1083 (command
& 0xe) == 0xe ? "And Verify " : "",
1084 r
->req
.cmd
.lba
, len
);
1085 if (r
->req
.cmd
.lba
> s
->max_lba
)
1087 r
->sector
= r
->req
.cmd
.lba
* s
->cluster_size
;
1088 r
->sector_count
= len
* s
->cluster_size
;
1091 DPRINTF("Mode Select(6) (len %lu)\n", (long)r
->req
.cmd
.xfer
);
1092 /* We don't support mode parameter changes.
1093 Allow the mode parameter header + block descriptors only. */
1094 if (r
->req
.cmd
.xfer
> 12) {
1098 case MODE_SELECT_10
:
1099 DPRINTF("Mode Select(10) (len %lu)\n", (long)r
->req
.cmd
.xfer
);
1100 /* We don't support mode parameter changes.
1101 Allow the mode parameter header + block descriptors only. */
1102 if (r
->req
.cmd
.xfer
> 16) {
1108 DPRINTF("Seek(%d) (sector %" PRId64
")\n", command
== SEEK_6
? 6 : 10,
1110 if (r
->req
.cmd
.lba
> s
->max_lba
) {
1115 len
= r
->req
.cmd
.xfer
/ s
->qdev
.blocksize
;
1117 DPRINTF("WRITE SAME(16) (sector %" PRId64
", count %d)\n",
1118 r
->req
.cmd
.lba
, len
);
1120 if (r
->req
.cmd
.lba
> s
->max_lba
) {
1125 * We only support WRITE SAME with the unmap bit set for now.
1127 if (!(buf
[1] & 0x8)) {
1131 rc
= bdrv_discard(s
->bs
, r
->req
.cmd
.lba
* s
->cluster_size
,
1132 len
* s
->cluster_size
);
1134 /* XXX: better error code ?*/
1140 DPRINTF("Unknown SCSI command (%2.2x)\n", buf
[0]);
1141 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(INVALID_OPCODE
));
1144 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(INVALID_FIELD
));
1147 scsi_command_complete(r
, CHECK_CONDITION
, SENSE_CODE(LBA_OUT_OF_RANGE
));
1150 if (r
->sector_count
== 0 && r
->iov
.iov_len
== 0) {
1151 scsi_command_complete(r
, GOOD
, SENSE_CODE(NO_SENSE
));
1153 len
= r
->sector_count
* 512 + r
->iov
.iov_len
;
1154 if (r
->req
.cmd
.mode
== SCSI_XFER_TO_DEV
) {
1157 if (!r
->sector_count
)
1158 r
->sector_count
= -1;
1163 static void scsi_disk_reset(DeviceState
*dev
)
1165 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
.qdev
, dev
);
1166 uint64_t nb_sectors
;
1168 scsi_device_purge_requests(&s
->qdev
);
1170 bdrv_get_geometry(s
->bs
, &nb_sectors
);
1171 nb_sectors
/= s
->cluster_size
;
1175 s
->max_lba
= nb_sectors
;
1178 static void scsi_destroy(SCSIDevice
*dev
)
1180 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1182 scsi_device_purge_requests(&s
->qdev
);
1183 blockdev_mark_auto_del(s
->qdev
.conf
.bs
);
1186 static int scsi_initfn(SCSIDevice
*dev
, SCSIDriveKind kind
)
1188 SCSIDiskState
*s
= DO_UPCAST(SCSIDiskState
, qdev
, dev
);
1191 if (!s
->qdev
.conf
.bs
) {
1192 error_report("scsi-disk: drive property not set");
1195 s
->bs
= s
->qdev
.conf
.bs
;
1196 s
->drive_kind
= kind
;
1198 if (kind
== SCSI_HD
&& !bdrv_is_inserted(s
->bs
)) {
1199 error_report("Device needs media, but drive is empty");
1204 /* try to fall back to value set with legacy -drive serial=... */
1205 dinfo
= drive_get_by_blockdev(s
->bs
);
1206 s
->serial
= qemu_strdup(*dinfo
->serial
? dinfo
->serial
: "0");
1210 s
->version
= qemu_strdup(QEMU_VERSION
);
1213 if (bdrv_is_sg(s
->bs
)) {
1214 error_report("scsi-disk: unwanted /dev/sg*");
1218 if (kind
== SCSI_CD
) {
1219 s
->qdev
.blocksize
= 2048;
1221 s
->qdev
.blocksize
= s
->qdev
.conf
.logical_block_size
;
1223 s
->cluster_size
= s
->qdev
.blocksize
/ 512;
1224 s
->bs
->buffer_alignment
= s
->qdev
.blocksize
;
1226 s
->qdev
.type
= TYPE_DISK
;
1227 qemu_add_vm_change_state_handler(scsi_dma_restart_cb
, s
);
1228 bdrv_set_removable(s
->bs
, kind
== SCSI_CD
);
1229 add_boot_device_path(s
->qdev
.conf
.bootindex
, &dev
->qdev
, ",0");
1233 static int scsi_hd_initfn(SCSIDevice
*dev
)
1235 return scsi_initfn(dev
, SCSI_HD
);
1238 static int scsi_cd_initfn(SCSIDevice
*dev
)
1240 return scsi_initfn(dev
, SCSI_CD
);
1243 static int scsi_disk_initfn(SCSIDevice
*dev
)
1248 if (!dev
->conf
.bs
) {
1249 kind
= SCSI_HD
; /* will die in scsi_initfn() */
1251 dinfo
= drive_get_by_blockdev(dev
->conf
.bs
);
1252 kind
= dinfo
->media_cd
? SCSI_CD
: SCSI_HD
;
1255 return scsi_initfn(dev
, kind
);
1258 #define DEFINE_SCSI_DISK_PROPERTIES() \
1259 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
1260 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
1261 DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
1263 static SCSIDeviceInfo scsi_disk_info
[] = {
1265 .qdev
.name
= "scsi-hd",
1266 .qdev
.fw_name
= "disk",
1267 .qdev
.desc
= "virtual SCSI disk",
1268 .qdev
.size
= sizeof(SCSIDiskState
),
1269 .qdev
.reset
= scsi_disk_reset
,
1270 .init
= scsi_hd_initfn
,
1271 .destroy
= scsi_destroy
,
1272 .alloc_req
= scsi_new_request
,
1273 .free_req
= scsi_free_request
,
1274 .send_command
= scsi_send_command
,
1275 .read_data
= scsi_read_data
,
1276 .write_data
= scsi_write_data
,
1277 .cancel_io
= scsi_cancel_io
,
1278 .get_buf
= scsi_get_buf
,
1279 .get_sense
= scsi_get_sense
,
1280 .qdev
.props
= (Property
[]) {
1281 DEFINE_SCSI_DISK_PROPERTIES(),
1282 DEFINE_PROP_BIT("removable", SCSIDiskState
, removable
, 0, false),
1283 DEFINE_PROP_END_OF_LIST(),
1286 .qdev
.name
= "scsi-cd",
1287 .qdev
.fw_name
= "disk",
1288 .qdev
.desc
= "virtual SCSI CD-ROM",
1289 .qdev
.size
= sizeof(SCSIDiskState
),
1290 .qdev
.reset
= scsi_disk_reset
,
1291 .init
= scsi_cd_initfn
,
1292 .destroy
= scsi_destroy
,
1293 .alloc_req
= scsi_new_request
,
1294 .free_req
= scsi_free_request
,
1295 .send_command
= scsi_send_command
,
1296 .read_data
= scsi_read_data
,
1297 .write_data
= scsi_write_data
,
1298 .cancel_io
= scsi_cancel_io
,
1299 .get_buf
= scsi_get_buf
,
1300 .get_sense
= scsi_get_sense
,
1301 .qdev
.props
= (Property
[]) {
1302 DEFINE_SCSI_DISK_PROPERTIES(),
1303 DEFINE_PROP_END_OF_LIST(),
1306 .qdev
.name
= "scsi-disk", /* legacy -device scsi-disk */
1307 .qdev
.fw_name
= "disk",
1308 .qdev
.desc
= "virtual SCSI disk or CD-ROM (legacy)",
1309 .qdev
.size
= sizeof(SCSIDiskState
),
1310 .qdev
.reset
= scsi_disk_reset
,
1311 .init
= scsi_disk_initfn
,
1312 .destroy
= scsi_destroy
,
1313 .alloc_req
= scsi_new_request
,
1314 .free_req
= scsi_free_request
,
1315 .send_command
= scsi_send_command
,
1316 .read_data
= scsi_read_data
,
1317 .write_data
= scsi_write_data
,
1318 .cancel_io
= scsi_cancel_io
,
1319 .get_buf
= scsi_get_buf
,
1320 .get_sense
= scsi_get_sense
,
1321 .qdev
.props
= (Property
[]) {
1322 DEFINE_SCSI_DISK_PROPERTIES(),
1323 DEFINE_PROP_BIT("removable", SCSIDiskState
, removable
, 0, false),
1324 DEFINE_PROP_END_OF_LIST(),
1329 static void scsi_disk_register_devices(void)
1333 for (i
= 0; i
< ARRAY_SIZE(scsi_disk_info
); i
++) {
1334 scsi_qdev_register(&scsi_disk_info
[i
]);
1337 device_init(scsi_disk_register_devices
)