ppc/pnv: Add POWER10 quads
[qemu.git] / hw / scsi / scsi-disk.c
blob3666b8d94687ff97f481f6e49127ec0737b08371
1 /*
2 * SCSI Device emulation
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
7 * Written by Paul Brook
8 * Modifications:
9 * 2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10 * when the allocation length of CDB is smaller
11 * than 36.
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 "qemu/hw-version.h"
29 #include "hw/scsi/scsi.h"
30 #include "migration/qemu-file-types.h"
31 #include "migration/vmstate.h"
32 #include "hw/scsi/emulation.h"
33 #include "scsi/constants.h"
34 #include "sysemu/block-backend.h"
35 #include "sysemu/blockdev.h"
36 #include "hw/block/block.h"
37 #include "hw/qdev-properties.h"
38 #include "hw/qdev-properties-system.h"
39 #include "sysemu/dma.h"
40 #include "sysemu/sysemu.h"
41 #include "qemu/cutils.h"
42 #include "trace.h"
43 #include "qom/object.h"
45 #ifdef __linux
46 #include <scsi/sg.h>
47 #endif
49 #define SCSI_WRITE_SAME_MAX (512 * KiB)
50 #define SCSI_DMA_BUF_SIZE (128 * KiB)
51 #define SCSI_MAX_INQUIRY_LEN 256
52 #define SCSI_MAX_MODE_LEN 256
54 #define DEFAULT_DISCARD_GRANULARITY (4 * KiB)
55 #define DEFAULT_MAX_UNMAP_SIZE (1 * GiB)
56 #define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
58 #define TYPE_SCSI_DISK_BASE "scsi-disk-base"
60 OBJECT_DECLARE_TYPE(SCSIDiskState, SCSIDiskClass, SCSI_DISK_BASE)
62 struct SCSIDiskClass {
63 SCSIDeviceClass parent_class;
64 DMAIOFunc *dma_readv;
65 DMAIOFunc *dma_writev;
66 bool (*need_fua_emulation)(SCSICommand *cmd);
67 void (*update_sense)(SCSIRequest *r);
70 typedef struct SCSIDiskReq {
71 SCSIRequest req;
72 /* Both sector and sector_count are in terms of BDRV_SECTOR_SIZE bytes. */
73 uint64_t sector;
74 uint32_t sector_count;
75 uint32_t buflen;
76 bool started;
77 bool need_fua_emulation;
78 struct iovec iov;
79 QEMUIOVector qiov;
80 BlockAcctCookie acct;
81 } SCSIDiskReq;
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 {
88 SCSIDevice qdev;
89 uint32_t features;
90 bool media_changed;
91 bool media_event;
92 bool eject_request;
93 uint16_t port_index;
94 uint64_t max_unmap_size;
95 uint64_t max_io_size;
96 QEMUBH *bh;
97 char *version;
98 char *serial;
99 char *vendor;
100 char *product;
101 char *device_id;
102 bool tray_open;
103 bool tray_locked;
105 * 0x0000 - rotation rate not reported
106 * 0x0001 - non-rotating medium (SSD)
107 * 0x0002-0x0400 - reserved
108 * 0x0401-0xffe - rotations per minute
109 * 0xffff - reserved
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,
125 sense.ascq);
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) {
135 r->buflen = size;
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);
149 if (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);
167 if (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) {
172 uint32_t len;
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 ret, 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 SCSISense sense = SENSE_CODE(NO_SENSE);
196 int error = 0;
197 bool req_has_sense = false;
198 BlockErrorAction action;
199 int status;
201 if (ret < 0) {
202 status = scsi_sense_from_errno(-ret, &sense);
203 error = -ret;
204 } else {
205 /* A passthrough command has completed with nonzero status. */
206 status = ret;
207 if (status == CHECK_CONDITION) {
208 req_has_sense = true;
209 error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
210 } else {
211 error = EINVAL;
216 * Check whether the error has to be handled by the guest or should
217 * rather follow the rerror=/werror= settings. Guest-handled errors
218 * are usually retried immediately, so do not post them to QMP and
219 * do not account them as failed I/O.
221 if (req_has_sense &&
222 scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) {
223 action = BLOCK_ERROR_ACTION_REPORT;
224 acct_failed = false;
225 } else {
226 action = blk_get_error_action(s->qdev.conf.blk, is_read, error);
227 blk_error_action(s->qdev.conf.blk, action, is_read, error);
230 switch (action) {
231 case BLOCK_ERROR_ACTION_REPORT:
232 if (acct_failed) {
233 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
235 if (req_has_sense) {
236 sdc->update_sense(&r->req);
237 } else if (status == CHECK_CONDITION) {
238 scsi_req_build_sense(&r->req, sense);
240 scsi_req_complete(&r->req, status);
241 return true;
243 case BLOCK_ERROR_ACTION_IGNORE:
244 return false;
246 case BLOCK_ERROR_ACTION_STOP:
247 scsi_req_retry(&r->req);
248 return true;
250 default:
251 g_assert_not_reached();
255 static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed)
257 if (r->req.io_canceled) {
258 scsi_req_cancel_complete(&r->req);
259 return true;
262 if (ret < 0) {
263 return scsi_handle_rw_error(r, ret, acct_failed);
266 return false;
269 static void scsi_aio_complete(void *opaque, int ret)
271 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
272 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
274 assert(r->req.aiocb != NULL);
275 r->req.aiocb = NULL;
276 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
277 if (scsi_disk_req_check_error(r, ret, true)) {
278 goto done;
281 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
282 scsi_req_complete(&r->req, GOOD);
284 done:
285 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
286 scsi_req_unref(&r->req);
289 static bool scsi_is_cmd_fua(SCSICommand *cmd)
291 switch (cmd->buf[0]) {
292 case READ_10:
293 case READ_12:
294 case READ_16:
295 case WRITE_10:
296 case WRITE_12:
297 case WRITE_16:
298 return (cmd->buf[1] & 8) != 0;
300 case VERIFY_10:
301 case VERIFY_12:
302 case VERIFY_16:
303 case WRITE_VERIFY_10:
304 case WRITE_VERIFY_12:
305 case WRITE_VERIFY_16:
306 return true;
308 case READ_6:
309 case WRITE_6:
310 default:
311 return false;
315 static void scsi_write_do_fua(SCSIDiskReq *r)
317 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
319 assert(r->req.aiocb == NULL);
320 assert(!r->req.io_canceled);
322 if (r->need_fua_emulation) {
323 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
324 BLOCK_ACCT_FLUSH);
325 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
326 return;
329 scsi_req_complete(&r->req, GOOD);
330 scsi_req_unref(&r->req);
333 static void scsi_dma_complete_noio(SCSIDiskReq *r, int ret)
335 assert(r->req.aiocb == NULL);
336 if (scsi_disk_req_check_error(r, ret, false)) {
337 goto done;
340 r->sector += r->sector_count;
341 r->sector_count = 0;
342 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
343 scsi_write_do_fua(r);
344 return;
345 } else {
346 scsi_req_complete(&r->req, GOOD);
349 done:
350 scsi_req_unref(&r->req);
353 static void scsi_dma_complete(void *opaque, int ret)
355 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
356 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
358 assert(r->req.aiocb != NULL);
359 r->req.aiocb = NULL;
361 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
362 if (ret < 0) {
363 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
364 } else {
365 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
367 scsi_dma_complete_noio(r, ret);
368 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
371 static void scsi_read_complete_noio(SCSIDiskReq *r, int ret)
373 uint32_t n;
375 assert(r->req.aiocb == NULL);
376 if (scsi_disk_req_check_error(r, ret, false)) {
377 goto done;
380 n = r->qiov.size / BDRV_SECTOR_SIZE;
381 r->sector += n;
382 r->sector_count -= n;
383 scsi_req_data(&r->req, r->qiov.size);
385 done:
386 scsi_req_unref(&r->req);
389 static void scsi_read_complete(void *opaque, int ret)
391 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
392 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
394 assert(r->req.aiocb != NULL);
395 r->req.aiocb = NULL;
397 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
398 if (ret < 0) {
399 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
400 } else {
401 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
402 trace_scsi_disk_read_complete(r->req.tag, r->qiov.size);
404 scsi_read_complete_noio(r, ret);
405 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
408 /* Actually issue a read to the block device. */
409 static void scsi_do_read(SCSIDiskReq *r, int ret)
411 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
412 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
414 assert (r->req.aiocb == NULL);
415 if (scsi_disk_req_check_error(r, ret, false)) {
416 goto done;
419 /* The request is used as the AIO opaque value, so add a ref. */
420 scsi_req_ref(&r->req);
422 if (r->req.sg) {
423 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
424 r->req.residual -= r->req.sg->size;
425 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
426 r->req.sg, r->sector << BDRV_SECTOR_BITS,
427 BDRV_SECTOR_SIZE,
428 sdc->dma_readv, r, scsi_dma_complete, r,
429 DMA_DIRECTION_FROM_DEVICE);
430 } else {
431 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
432 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
433 r->qiov.size, BLOCK_ACCT_READ);
434 r->req.aiocb = sdc->dma_readv(r->sector << BDRV_SECTOR_BITS, &r->qiov,
435 scsi_read_complete, r, r);
438 done:
439 scsi_req_unref(&r->req);
442 static void scsi_do_read_cb(void *opaque, int ret)
444 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
445 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
447 assert (r->req.aiocb != NULL);
448 r->req.aiocb = NULL;
450 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
451 if (ret < 0) {
452 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
453 } else {
454 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
456 scsi_do_read(opaque, ret);
457 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
460 /* Read more data from scsi device into buffer. */
461 static void scsi_read_data(SCSIRequest *req)
463 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
464 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
465 bool first;
467 trace_scsi_disk_read_data_count(r->sector_count);
468 if (r->sector_count == 0) {
469 /* This also clears the sense buffer for REQUEST SENSE. */
470 scsi_req_complete(&r->req, GOOD);
471 return;
474 /* No data transfer may already be in progress */
475 assert(r->req.aiocb == NULL);
477 /* The request is used as the AIO opaque value, so add a ref. */
478 scsi_req_ref(&r->req);
479 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
480 trace_scsi_disk_read_data_invalid();
481 scsi_read_complete_noio(r, -EINVAL);
482 return;
485 if (!blk_is_available(req->dev->conf.blk)) {
486 scsi_read_complete_noio(r, -ENOMEDIUM);
487 return;
490 first = !r->started;
491 r->started = true;
492 if (first && r->need_fua_emulation) {
493 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
494 BLOCK_ACCT_FLUSH);
495 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_do_read_cb, r);
496 } else {
497 scsi_do_read(r, 0);
501 static void scsi_write_complete_noio(SCSIDiskReq *r, int ret)
503 uint32_t n;
505 assert (r->req.aiocb == NULL);
506 if (scsi_disk_req_check_error(r, ret, false)) {
507 goto done;
510 n = r->qiov.size / BDRV_SECTOR_SIZE;
511 r->sector += n;
512 r->sector_count -= n;
513 if (r->sector_count == 0) {
514 scsi_write_do_fua(r);
515 return;
516 } else {
517 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
518 trace_scsi_disk_write_complete_noio(r->req.tag, r->qiov.size);
519 scsi_req_data(&r->req, r->qiov.size);
522 done:
523 scsi_req_unref(&r->req);
526 static void scsi_write_complete(void * opaque, int ret)
528 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
529 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
531 assert (r->req.aiocb != NULL);
532 r->req.aiocb = NULL;
534 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
535 if (ret < 0) {
536 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
537 } else {
538 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
540 scsi_write_complete_noio(r, ret);
541 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
544 static void scsi_write_data(SCSIRequest *req)
546 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
547 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
548 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
550 /* No data transfer may already be in progress */
551 assert(r->req.aiocb == NULL);
553 /* The request is used as the AIO opaque value, so add a ref. */
554 scsi_req_ref(&r->req);
555 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
556 trace_scsi_disk_write_data_invalid();
557 scsi_write_complete_noio(r, -EINVAL);
558 return;
561 if (!r->req.sg && !r->qiov.size) {
562 /* Called for the first time. Ask the driver to send us more data. */
563 r->started = true;
564 scsi_write_complete_noio(r, 0);
565 return;
567 if (!blk_is_available(req->dev->conf.blk)) {
568 scsi_write_complete_noio(r, -ENOMEDIUM);
569 return;
572 if (r->req.cmd.buf[0] == VERIFY_10 || r->req.cmd.buf[0] == VERIFY_12 ||
573 r->req.cmd.buf[0] == VERIFY_16) {
574 if (r->req.sg) {
575 scsi_dma_complete_noio(r, 0);
576 } else {
577 scsi_write_complete_noio(r, 0);
579 return;
582 if (r->req.sg) {
583 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
584 r->req.residual -= r->req.sg->size;
585 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
586 r->req.sg, r->sector << BDRV_SECTOR_BITS,
587 BDRV_SECTOR_SIZE,
588 sdc->dma_writev, r, scsi_dma_complete, r,
589 DMA_DIRECTION_TO_DEVICE);
590 } else {
591 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
592 r->qiov.size, BLOCK_ACCT_WRITE);
593 r->req.aiocb = sdc->dma_writev(r->sector << BDRV_SECTOR_BITS, &r->qiov,
594 scsi_write_complete, r, r);
598 /* Return a pointer to the data buffer. */
599 static uint8_t *scsi_get_buf(SCSIRequest *req)
601 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
603 return (uint8_t *)r->iov.iov_base;
606 static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf)
608 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
609 uint8_t page_code = req->cmd.buf[2];
610 int start, buflen = 0;
612 outbuf[buflen++] = s->qdev.type & 0x1f;
613 outbuf[buflen++] = page_code;
614 outbuf[buflen++] = 0x00;
615 outbuf[buflen++] = 0x00;
616 start = buflen;
618 switch (page_code) {
619 case 0x00: /* Supported page codes, mandatory */
621 trace_scsi_disk_emulate_vpd_page_00(req->cmd.xfer);
622 outbuf[buflen++] = 0x00; /* list of supported pages (this page) */
623 if (s->serial) {
624 outbuf[buflen++] = 0x80; /* unit serial number */
626 outbuf[buflen++] = 0x83; /* device identification */
627 if (s->qdev.type == TYPE_DISK) {
628 outbuf[buflen++] = 0xb0; /* block limits */
629 outbuf[buflen++] = 0xb1; /* block device characteristics */
630 outbuf[buflen++] = 0xb2; /* thin provisioning */
632 break;
634 case 0x80: /* Device serial number, optional */
636 int l;
638 if (!s->serial) {
639 trace_scsi_disk_emulate_vpd_page_80_not_supported();
640 return -1;
643 l = strlen(s->serial);
644 if (l > 36) {
645 l = 36;
648 trace_scsi_disk_emulate_vpd_page_80(req->cmd.xfer);
649 memcpy(outbuf + buflen, s->serial, l);
650 buflen += l;
651 break;
654 case 0x83: /* Device identification page, mandatory */
656 int id_len = s->device_id ? MIN(strlen(s->device_id), 255 - 8) : 0;
658 trace_scsi_disk_emulate_vpd_page_83(req->cmd.xfer);
660 if (id_len) {
661 outbuf[buflen++] = 0x2; /* ASCII */
662 outbuf[buflen++] = 0; /* not officially assigned */
663 outbuf[buflen++] = 0; /* reserved */
664 outbuf[buflen++] = id_len; /* length of data following */
665 memcpy(outbuf + buflen, s->device_id, id_len);
666 buflen += id_len;
669 if (s->qdev.wwn) {
670 outbuf[buflen++] = 0x1; /* Binary */
671 outbuf[buflen++] = 0x3; /* NAA */
672 outbuf[buflen++] = 0; /* reserved */
673 outbuf[buflen++] = 8;
674 stq_be_p(&outbuf[buflen], s->qdev.wwn);
675 buflen += 8;
678 if (s->qdev.port_wwn) {
679 outbuf[buflen++] = 0x61; /* SAS / Binary */
680 outbuf[buflen++] = 0x93; /* PIV / Target port / NAA */
681 outbuf[buflen++] = 0; /* reserved */
682 outbuf[buflen++] = 8;
683 stq_be_p(&outbuf[buflen], s->qdev.port_wwn);
684 buflen += 8;
687 if (s->port_index) {
688 outbuf[buflen++] = 0x61; /* SAS / Binary */
690 /* PIV/Target port/relative target port */
691 outbuf[buflen++] = 0x94;
693 outbuf[buflen++] = 0; /* reserved */
694 outbuf[buflen++] = 4;
695 stw_be_p(&outbuf[buflen + 2], s->port_index);
696 buflen += 4;
698 break;
700 case 0xb0: /* block limits */
702 SCSIBlockLimits bl = {};
704 if (s->qdev.type == TYPE_ROM) {
705 trace_scsi_disk_emulate_vpd_page_b0_not_supported();
706 return -1;
708 bl.wsnz = 1;
709 bl.unmap_sectors =
710 s->qdev.conf.discard_granularity / s->qdev.blocksize;
711 bl.min_io_size =
712 s->qdev.conf.min_io_size / s->qdev.blocksize;
713 bl.opt_io_size =
714 s->qdev.conf.opt_io_size / s->qdev.blocksize;
715 bl.max_unmap_sectors =
716 s->max_unmap_size / s->qdev.blocksize;
717 bl.max_io_sectors =
718 s->max_io_size / s->qdev.blocksize;
719 /* 255 descriptors fit in 4 KiB with an 8-byte header */
720 bl.max_unmap_descr = 255;
722 if (s->qdev.type == TYPE_DISK) {
723 int max_transfer_blk = blk_get_max_transfer(s->qdev.conf.blk);
724 int max_io_sectors_blk =
725 max_transfer_blk / s->qdev.blocksize;
727 bl.max_io_sectors =
728 MIN_NON_ZERO(max_io_sectors_blk, bl.max_io_sectors);
730 buflen += scsi_emulate_block_limits(outbuf + buflen, &bl);
731 break;
733 case 0xb1: /* block device characteristics */
735 buflen = 0x40;
736 outbuf[4] = (s->rotation_rate >> 8) & 0xff;
737 outbuf[5] = s->rotation_rate & 0xff;
738 outbuf[6] = 0; /* PRODUCT TYPE */
739 outbuf[7] = 0; /* WABEREQ | WACEREQ | NOMINAL FORM FACTOR */
740 outbuf[8] = 0; /* VBULS */
741 break;
743 case 0xb2: /* thin provisioning */
745 buflen = 8;
746 outbuf[4] = 0;
747 outbuf[5] = 0xe0; /* unmap & write_same 10/16 all supported */
748 outbuf[6] = s->qdev.conf.discard_granularity ? 2 : 1;
749 outbuf[7] = 0;
750 break;
752 default:
753 return -1;
755 /* done with EVPD */
756 assert(buflen - start <= 255);
757 outbuf[start - 1] = buflen - start;
758 return buflen;
761 static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
763 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
764 int buflen = 0;
766 if (req->cmd.buf[1] & 0x1) {
767 /* Vital product data */
768 return scsi_disk_emulate_vpd_page(req, outbuf);
771 /* Standard INQUIRY data */
772 if (req->cmd.buf[2] != 0) {
773 return -1;
776 /* PAGE CODE == 0 */
777 buflen = req->cmd.xfer;
778 if (buflen > SCSI_MAX_INQUIRY_LEN) {
779 buflen = SCSI_MAX_INQUIRY_LEN;
782 outbuf[0] = s->qdev.type & 0x1f;
783 outbuf[1] = (s->features & (1 << SCSI_DISK_F_REMOVABLE)) ? 0x80 : 0;
785 strpadcpy((char *) &outbuf[16], 16, s->product, ' ');
786 strpadcpy((char *) &outbuf[8], 8, s->vendor, ' ');
788 memset(&outbuf[32], 0, 4);
789 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
791 * We claim conformance to SPC-3, which is required for guests
792 * to ask for modern features like READ CAPACITY(16) or the
793 * block characteristics VPD page by default. Not all of SPC-3
794 * is actually implemented, but we're good enough.
796 outbuf[2] = s->qdev.default_scsi_version;
797 outbuf[3] = 2 | 0x10; /* Format 2, HiSup */
799 if (buflen > 36) {
800 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
801 } else {
802 /* If the allocation length of CDB is too small,
803 the additional length is not adjusted */
804 outbuf[4] = 36 - 5;
807 /* Sync data transfer and TCQ. */
808 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
809 return buflen;
812 static inline bool media_is_dvd(SCSIDiskState *s)
814 uint64_t nb_sectors;
815 if (s->qdev.type != TYPE_ROM) {
816 return false;
818 if (!blk_is_available(s->qdev.conf.blk)) {
819 return false;
821 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
822 return nb_sectors > CD_MAX_SECTORS;
825 static inline bool media_is_cd(SCSIDiskState *s)
827 uint64_t nb_sectors;
828 if (s->qdev.type != TYPE_ROM) {
829 return false;
831 if (!blk_is_available(s->qdev.conf.blk)) {
832 return false;
834 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
835 return nb_sectors <= CD_MAX_SECTORS;
838 static int scsi_read_disc_information(SCSIDiskState *s, SCSIDiskReq *r,
839 uint8_t *outbuf)
841 uint8_t type = r->req.cmd.buf[1] & 7;
843 if (s->qdev.type != TYPE_ROM) {
844 return -1;
847 /* Types 1/2 are only defined for Blu-Ray. */
848 if (type != 0) {
849 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
850 return -1;
853 memset(outbuf, 0, 34);
854 outbuf[1] = 32;
855 outbuf[2] = 0xe; /* last session complete, disc finalized */
856 outbuf[3] = 1; /* first track on disc */
857 outbuf[4] = 1; /* # of sessions */
858 outbuf[5] = 1; /* first track of last session */
859 outbuf[6] = 1; /* last track of last session */
860 outbuf[7] = 0x20; /* unrestricted use */
861 outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */
862 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
863 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
864 /* 24-31: disc bar code */
865 /* 32: disc application code */
866 /* 33: number of OPC tables */
868 return 34;
871 static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
872 uint8_t *outbuf)
874 static const int rds_caps_size[5] = {
875 [0] = 2048 + 4,
876 [1] = 4 + 4,
877 [3] = 188 + 4,
878 [4] = 2048 + 4,
881 uint8_t media = r->req.cmd.buf[1];
882 uint8_t layer = r->req.cmd.buf[6];
883 uint8_t format = r->req.cmd.buf[7];
884 int size = -1;
886 if (s->qdev.type != TYPE_ROM) {
887 return -1;
889 if (media != 0) {
890 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
891 return -1;
894 if (format != 0xff) {
895 if (!blk_is_available(s->qdev.conf.blk)) {
896 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
897 return -1;
899 if (media_is_cd(s)) {
900 scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
901 return -1;
903 if (format >= ARRAY_SIZE(rds_caps_size)) {
904 return -1;
906 size = rds_caps_size[format];
907 memset(outbuf, 0, size);
910 switch (format) {
911 case 0x00: {
912 /* Physical format information */
913 uint64_t nb_sectors;
914 if (layer != 0) {
915 goto fail;
917 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
919 outbuf[4] = 1; /* DVD-ROM, part version 1 */
920 outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
921 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
922 outbuf[7] = 0; /* default densities */
924 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
925 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
926 break;
929 case 0x01: /* DVD copyright information, all zeros */
930 break;
932 case 0x03: /* BCA information - invalid field for no BCA info */
933 return -1;
935 case 0x04: /* DVD disc manufacturing information, all zeros */
936 break;
938 case 0xff: { /* List capabilities */
939 int i;
940 size = 4;
941 for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
942 if (!rds_caps_size[i]) {
943 continue;
945 outbuf[size] = i;
946 outbuf[size + 1] = 0x40; /* Not writable, readable */
947 stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
948 size += 4;
950 break;
953 default:
954 return -1;
957 /* Size of buffer, not including 2 byte size field */
958 stw_be_p(outbuf, size - 2);
959 return size;
961 fail:
962 return -1;
965 static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
967 uint8_t event_code, media_status;
969 media_status = 0;
970 if (s->tray_open) {
971 media_status = MS_TRAY_OPEN;
972 } else if (blk_is_inserted(s->qdev.conf.blk)) {
973 media_status = MS_MEDIA_PRESENT;
976 /* Event notification descriptor */
977 event_code = MEC_NO_CHANGE;
978 if (media_status != MS_TRAY_OPEN) {
979 if (s->media_event) {
980 event_code = MEC_NEW_MEDIA;
981 s->media_event = false;
982 } else if (s->eject_request) {
983 event_code = MEC_EJECT_REQUESTED;
984 s->eject_request = false;
988 outbuf[0] = event_code;
989 outbuf[1] = media_status;
991 /* These fields are reserved, just clear them. */
992 outbuf[2] = 0;
993 outbuf[3] = 0;
994 return 4;
997 static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
998 uint8_t *outbuf)
1000 int size;
1001 uint8_t *buf = r->req.cmd.buf;
1002 uint8_t notification_class_request = buf[4];
1003 if (s->qdev.type != TYPE_ROM) {
1004 return -1;
1006 if ((buf[1] & 1) == 0) {
1007 /* asynchronous */
1008 return -1;
1011 size = 4;
1012 outbuf[0] = outbuf[1] = 0;
1013 outbuf[3] = 1 << GESN_MEDIA; /* supported events */
1014 if (notification_class_request & (1 << GESN_MEDIA)) {
1015 outbuf[2] = GESN_MEDIA;
1016 size += scsi_event_status_media(s, &outbuf[size]);
1017 } else {
1018 outbuf[2] = 0x80;
1020 stw_be_p(outbuf, size - 4);
1021 return size;
1024 static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
1026 int current;
1028 if (s->qdev.type != TYPE_ROM) {
1029 return -1;
1032 if (media_is_dvd(s)) {
1033 current = MMC_PROFILE_DVD_ROM;
1034 } else if (media_is_cd(s)) {
1035 current = MMC_PROFILE_CD_ROM;
1036 } else {
1037 current = MMC_PROFILE_NONE;
1040 memset(outbuf, 0, 40);
1041 stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
1042 stw_be_p(&outbuf[6], current);
1043 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
1044 outbuf[10] = 0x03; /* persistent, current */
1045 outbuf[11] = 8; /* two profiles */
1046 stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
1047 outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
1048 stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
1049 outbuf[18] = (current == MMC_PROFILE_CD_ROM);
1050 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
1051 stw_be_p(&outbuf[20], 1);
1052 outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
1053 outbuf[23] = 8;
1054 stl_be_p(&outbuf[24], 1); /* SCSI */
1055 outbuf[28] = 1; /* DBE = 1, mandatory */
1056 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
1057 stw_be_p(&outbuf[32], 3);
1058 outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
1059 outbuf[35] = 4;
1060 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
1061 /* TODO: Random readable, CD read, DVD read, drive serial number,
1062 power management */
1063 return 40;
1066 static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
1068 if (s->qdev.type != TYPE_ROM) {
1069 return -1;
1071 memset(outbuf, 0, 8);
1072 outbuf[5] = 1; /* CD-ROM */
1073 return 8;
1076 static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
1077 int page_control)
1079 static const int mode_sense_valid[0x3f] = {
1080 [MODE_PAGE_HD_GEOMETRY] = (1 << TYPE_DISK),
1081 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
1082 [MODE_PAGE_CACHING] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
1083 [MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
1084 [MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
1085 [MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
1088 uint8_t *p = *p_outbuf + 2;
1089 int length;
1091 assert(page < ARRAY_SIZE(mode_sense_valid));
1092 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
1093 return -1;
1097 * If Changeable Values are requested, a mask denoting those mode parameters
1098 * that are changeable shall be returned. As we currently don't support
1099 * parameter changes via MODE_SELECT all bits are returned set to zero.
1100 * The buffer was already menset to zero by the caller of this function.
1102 * The offsets here are off by two compared to the descriptions in the
1103 * SCSI specs, because those include a 2-byte header. This is unfortunate,
1104 * but it is done so that offsets are consistent within our implementation
1105 * of MODE SENSE and MODE SELECT. MODE SELECT has to deal with both
1106 * 2-byte and 4-byte headers.
1108 switch (page) {
1109 case MODE_PAGE_HD_GEOMETRY:
1110 length = 0x16;
1111 if (page_control == 1) { /* Changeable Values */
1112 break;
1114 /* if a geometry hint is available, use it */
1115 p[0] = (s->qdev.conf.cyls >> 16) & 0xff;
1116 p[1] = (s->qdev.conf.cyls >> 8) & 0xff;
1117 p[2] = s->qdev.conf.cyls & 0xff;
1118 p[3] = s->qdev.conf.heads & 0xff;
1119 /* Write precomp start cylinder, disabled */
1120 p[4] = (s->qdev.conf.cyls >> 16) & 0xff;
1121 p[5] = (s->qdev.conf.cyls >> 8) & 0xff;
1122 p[6] = s->qdev.conf.cyls & 0xff;
1123 /* Reduced current start cylinder, disabled */
1124 p[7] = (s->qdev.conf.cyls >> 16) & 0xff;
1125 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1126 p[9] = s->qdev.conf.cyls & 0xff;
1127 /* Device step rate [ns], 200ns */
1128 p[10] = 0;
1129 p[11] = 200;
1130 /* Landing zone cylinder */
1131 p[12] = 0xff;
1132 p[13] = 0xff;
1133 p[14] = 0xff;
1134 /* Medium rotation rate [rpm], 5400 rpm */
1135 p[18] = (5400 >> 8) & 0xff;
1136 p[19] = 5400 & 0xff;
1137 break;
1139 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
1140 length = 0x1e;
1141 if (page_control == 1) { /* Changeable Values */
1142 break;
1144 /* Transfer rate [kbit/s], 5Mbit/s */
1145 p[0] = 5000 >> 8;
1146 p[1] = 5000 & 0xff;
1147 /* if a geometry hint is available, use it */
1148 p[2] = s->qdev.conf.heads & 0xff;
1149 p[3] = s->qdev.conf.secs & 0xff;
1150 p[4] = s->qdev.blocksize >> 8;
1151 p[6] = (s->qdev.conf.cyls >> 8) & 0xff;
1152 p[7] = s->qdev.conf.cyls & 0xff;
1153 /* Write precomp start cylinder, disabled */
1154 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1155 p[9] = s->qdev.conf.cyls & 0xff;
1156 /* Reduced current start cylinder, disabled */
1157 p[10] = (s->qdev.conf.cyls >> 8) & 0xff;
1158 p[11] = s->qdev.conf.cyls & 0xff;
1159 /* Device step rate [100us], 100us */
1160 p[12] = 0;
1161 p[13] = 1;
1162 /* Device step pulse width [us], 1us */
1163 p[14] = 1;
1164 /* Device head settle delay [100us], 100us */
1165 p[15] = 0;
1166 p[16] = 1;
1167 /* Motor on delay [0.1s], 0.1s */
1168 p[17] = 1;
1169 /* Motor off delay [0.1s], 0.1s */
1170 p[18] = 1;
1171 /* Medium rotation rate [rpm], 5400 rpm */
1172 p[26] = (5400 >> 8) & 0xff;
1173 p[27] = 5400 & 0xff;
1174 break;
1176 case MODE_PAGE_CACHING:
1177 length = 0x12;
1178 if (page_control == 1 || /* Changeable Values */
1179 blk_enable_write_cache(s->qdev.conf.blk)) {
1180 p[0] = 4; /* WCE */
1182 break;
1184 case MODE_PAGE_R_W_ERROR:
1185 length = 10;
1186 if (page_control == 1) { /* Changeable Values */
1187 break;
1189 p[0] = 0x80; /* Automatic Write Reallocation Enabled */
1190 if (s->qdev.type == TYPE_ROM) {
1191 p[1] = 0x20; /* Read Retry Count */
1193 break;
1195 case MODE_PAGE_AUDIO_CTL:
1196 length = 14;
1197 break;
1199 case MODE_PAGE_CAPABILITIES:
1200 length = 0x14;
1201 if (page_control == 1) { /* Changeable Values */
1202 break;
1205 p[0] = 0x3b; /* CD-R & CD-RW read */
1206 p[1] = 0; /* Writing not supported */
1207 p[2] = 0x7f; /* Audio, composite, digital out,
1208 mode 2 form 1&2, multi session */
1209 p[3] = 0xff; /* CD DA, DA accurate, RW supported,
1210 RW corrected, C2 errors, ISRC,
1211 UPC, Bar code */
1212 p[4] = 0x2d | (s->tray_locked ? 2 : 0);
1213 /* Locking supported, jumper present, eject, tray */
1214 p[5] = 0; /* no volume & mute control, no
1215 changer */
1216 p[6] = (50 * 176) >> 8; /* 50x read speed */
1217 p[7] = (50 * 176) & 0xff;
1218 p[8] = 2 >> 8; /* Two volume levels */
1219 p[9] = 2 & 0xff;
1220 p[10] = 2048 >> 8; /* 2M buffer */
1221 p[11] = 2048 & 0xff;
1222 p[12] = (16 * 176) >> 8; /* 16x read speed current */
1223 p[13] = (16 * 176) & 0xff;
1224 p[16] = (16 * 176) >> 8; /* 16x write speed */
1225 p[17] = (16 * 176) & 0xff;
1226 p[18] = (16 * 176) >> 8; /* 16x write speed current */
1227 p[19] = (16 * 176) & 0xff;
1228 break;
1230 default:
1231 return -1;
1234 assert(length < 256);
1235 (*p_outbuf)[0] = page;
1236 (*p_outbuf)[1] = length;
1237 *p_outbuf += length + 2;
1238 return length + 2;
1241 static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
1243 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1244 uint64_t nb_sectors;
1245 bool dbd;
1246 int page, buflen, ret, page_control;
1247 uint8_t *p;
1248 uint8_t dev_specific_param;
1250 dbd = (r->req.cmd.buf[1] & 0x8) != 0;
1251 page = r->req.cmd.buf[2] & 0x3f;
1252 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
1254 trace_scsi_disk_emulate_mode_sense((r->req.cmd.buf[0] == MODE_SENSE) ? 6 :
1255 10, page, r->req.cmd.xfer, page_control);
1256 memset(outbuf, 0, r->req.cmd.xfer);
1257 p = outbuf;
1259 if (s->qdev.type == TYPE_DISK) {
1260 dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
1261 if (!blk_is_writable(s->qdev.conf.blk)) {
1262 dev_specific_param |= 0x80; /* Readonly. */
1264 } else {
1265 /* MMC prescribes that CD/DVD drives have no block descriptors,
1266 * and defines no device-specific parameter. */
1267 dev_specific_param = 0x00;
1268 dbd = true;
1271 if (r->req.cmd.buf[0] == MODE_SENSE) {
1272 p[1] = 0; /* Default media type. */
1273 p[2] = dev_specific_param;
1274 p[3] = 0; /* Block descriptor length. */
1275 p += 4;
1276 } else { /* MODE_SENSE_10 */
1277 p[2] = 0; /* Default media type. */
1278 p[3] = dev_specific_param;
1279 p[6] = p[7] = 0; /* Block descriptor length. */
1280 p += 8;
1283 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
1284 if (!dbd && nb_sectors) {
1285 if (r->req.cmd.buf[0] == MODE_SENSE) {
1286 outbuf[3] = 8; /* Block descriptor length */
1287 } else { /* MODE_SENSE_10 */
1288 outbuf[7] = 8; /* Block descriptor length */
1290 nb_sectors /= (s->qdev.blocksize / BDRV_SECTOR_SIZE);
1291 if (nb_sectors > 0xffffff) {
1292 nb_sectors = 0;
1294 p[0] = 0; /* media density code */
1295 p[1] = (nb_sectors >> 16) & 0xff;
1296 p[2] = (nb_sectors >> 8) & 0xff;
1297 p[3] = nb_sectors & 0xff;
1298 p[4] = 0; /* reserved */
1299 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
1300 p[6] = s->qdev.blocksize >> 8;
1301 p[7] = 0;
1302 p += 8;
1305 if (page_control == 3) {
1306 /* Saved Values */
1307 scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
1308 return -1;
1311 if (page == 0x3f) {
1312 for (page = 0; page <= 0x3e; page++) {
1313 mode_sense_page(s, page, &p, page_control);
1315 } else {
1316 ret = mode_sense_page(s, page, &p, page_control);
1317 if (ret == -1) {
1318 return -1;
1322 buflen = p - outbuf;
1324 * The mode data length field specifies the length in bytes of the
1325 * following data that is available to be transferred. The mode data
1326 * length does not include itself.
1328 if (r->req.cmd.buf[0] == MODE_SENSE) {
1329 outbuf[0] = buflen - 1;
1330 } else { /* MODE_SENSE_10 */
1331 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1332 outbuf[1] = (buflen - 2) & 0xff;
1334 return buflen;
1337 static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1339 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1340 int start_track, format, msf, toclen;
1341 uint64_t nb_sectors;
1343 msf = req->cmd.buf[1] & 2;
1344 format = req->cmd.buf[2] & 0xf;
1345 start_track = req->cmd.buf[6];
1346 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
1347 trace_scsi_disk_emulate_read_toc(start_track, format, msf >> 1);
1348 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE;
1349 switch (format) {
1350 case 0:
1351 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1352 break;
1353 case 1:
1354 /* multi session : only a single session defined */
1355 toclen = 12;
1356 memset(outbuf, 0, 12);
1357 outbuf[1] = 0x0a;
1358 outbuf[2] = 0x01;
1359 outbuf[3] = 0x01;
1360 break;
1361 case 2:
1362 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1363 break;
1364 default:
1365 return -1;
1367 return toclen;
1370 static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
1372 SCSIRequest *req = &r->req;
1373 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1374 bool start = req->cmd.buf[4] & 1;
1375 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
1376 int pwrcnd = req->cmd.buf[4] & 0xf0;
1378 if (pwrcnd) {
1379 /* eject/load only happens for power condition == 0 */
1380 return 0;
1383 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && loej) {
1384 if (!start && !s->tray_open && s->tray_locked) {
1385 scsi_check_condition(r,
1386 blk_is_inserted(s->qdev.conf.blk)
1387 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1388 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1389 return -1;
1392 if (s->tray_open != !start) {
1393 blk_eject(s->qdev.conf.blk, !start);
1394 s->tray_open = !start;
1397 return 0;
1400 static void scsi_disk_emulate_read_data(SCSIRequest *req)
1402 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1403 int buflen = r->iov.iov_len;
1405 if (buflen) {
1406 trace_scsi_disk_emulate_read_data(buflen);
1407 r->iov.iov_len = 0;
1408 r->started = true;
1409 scsi_req_data(&r->req, buflen);
1410 return;
1413 /* This also clears the sense buffer for REQUEST SENSE. */
1414 scsi_req_complete(&r->req, GOOD);
1417 static int scsi_disk_check_mode_select(SCSIDiskState *s, int page,
1418 uint8_t *inbuf, int inlen)
1420 uint8_t mode_current[SCSI_MAX_MODE_LEN];
1421 uint8_t mode_changeable[SCSI_MAX_MODE_LEN];
1422 uint8_t *p;
1423 int len, expected_len, changeable_len, i;
1425 /* The input buffer does not include the page header, so it is
1426 * off by 2 bytes.
1428 expected_len = inlen + 2;
1429 if (expected_len > SCSI_MAX_MODE_LEN) {
1430 return -1;
1433 /* MODE_PAGE_ALLS is only valid for MODE SENSE commands */
1434 if (page == MODE_PAGE_ALLS) {
1435 return -1;
1438 p = mode_current;
1439 memset(mode_current, 0, inlen + 2);
1440 len = mode_sense_page(s, page, &p, 0);
1441 if (len < 0 || len != expected_len) {
1442 return -1;
1445 p = mode_changeable;
1446 memset(mode_changeable, 0, inlen + 2);
1447 changeable_len = mode_sense_page(s, page, &p, 1);
1448 assert(changeable_len == len);
1450 /* Check that unchangeable bits are the same as what MODE SENSE
1451 * would return.
1453 for (i = 2; i < len; i++) {
1454 if (((mode_current[i] ^ inbuf[i - 2]) & ~mode_changeable[i]) != 0) {
1455 return -1;
1458 return 0;
1461 static void scsi_disk_apply_mode_select(SCSIDiskState *s, int page, uint8_t *p)
1463 switch (page) {
1464 case MODE_PAGE_CACHING:
1465 blk_set_enable_write_cache(s->qdev.conf.blk, (p[0] & 4) != 0);
1466 break;
1468 default:
1469 break;
1473 static int mode_select_pages(SCSIDiskReq *r, uint8_t *p, int len, bool change)
1475 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1477 while (len > 0) {
1478 int page, subpage, page_len;
1480 /* Parse both possible formats for the mode page headers. */
1481 page = p[0] & 0x3f;
1482 if (p[0] & 0x40) {
1483 if (len < 4) {
1484 goto invalid_param_len;
1486 subpage = p[1];
1487 page_len = lduw_be_p(&p[2]);
1488 p += 4;
1489 len -= 4;
1490 } else {
1491 if (len < 2) {
1492 goto invalid_param_len;
1494 subpage = 0;
1495 page_len = p[1];
1496 p += 2;
1497 len -= 2;
1500 if (subpage) {
1501 goto invalid_param;
1503 if (page_len > len) {
1504 goto invalid_param_len;
1507 if (!change) {
1508 if (scsi_disk_check_mode_select(s, page, p, page_len) < 0) {
1509 goto invalid_param;
1511 } else {
1512 scsi_disk_apply_mode_select(s, page, p);
1515 p += page_len;
1516 len -= page_len;
1518 return 0;
1520 invalid_param:
1521 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM));
1522 return -1;
1524 invalid_param_len:
1525 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1526 return -1;
1529 static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf)
1531 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1532 uint8_t *p = inbuf;
1533 int cmd = r->req.cmd.buf[0];
1534 int len = r->req.cmd.xfer;
1535 int hdr_len = (cmd == MODE_SELECT ? 4 : 8);
1536 int bd_len;
1537 int pass;
1539 /* We only support PF=1, SP=0. */
1540 if ((r->req.cmd.buf[1] & 0x11) != 0x10) {
1541 goto invalid_field;
1544 if (len < hdr_len) {
1545 goto invalid_param_len;
1548 bd_len = (cmd == MODE_SELECT ? p[3] : lduw_be_p(&p[6]));
1549 len -= hdr_len;
1550 p += hdr_len;
1551 if (len < bd_len) {
1552 goto invalid_param_len;
1554 if (bd_len != 0 && bd_len != 8) {
1555 goto invalid_param;
1558 len -= bd_len;
1559 p += bd_len;
1561 /* Ensure no change is made if there is an error! */
1562 for (pass = 0; pass < 2; pass++) {
1563 if (mode_select_pages(r, p, len, pass == 1) < 0) {
1564 assert(pass == 0);
1565 return;
1568 if (!blk_enable_write_cache(s->qdev.conf.blk)) {
1569 /* The request is used as the AIO opaque value, so add a ref. */
1570 scsi_req_ref(&r->req);
1571 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
1572 BLOCK_ACCT_FLUSH);
1573 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
1574 return;
1577 scsi_req_complete(&r->req, GOOD);
1578 return;
1580 invalid_param:
1581 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM));
1582 return;
1584 invalid_param_len:
1585 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1586 return;
1588 invalid_field:
1589 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1592 /* sector_num and nb_sectors expected to be in qdev blocksize */
1593 static inline bool check_lba_range(SCSIDiskState *s,
1594 uint64_t sector_num, uint32_t nb_sectors)
1597 * The first line tests that no overflow happens when computing the last
1598 * sector. The second line tests that the last accessed sector is in
1599 * range.
1601 * Careful, the computations should not underflow for nb_sectors == 0,
1602 * and a 0-block read to the first LBA beyond the end of device is
1603 * valid.
1605 return (sector_num <= sector_num + nb_sectors &&
1606 sector_num + nb_sectors <= s->qdev.max_lba + 1);
1609 typedef struct UnmapCBData {
1610 SCSIDiskReq *r;
1611 uint8_t *inbuf;
1612 int count;
1613 } UnmapCBData;
1615 static void scsi_unmap_complete(void *opaque, int ret);
1617 static void scsi_unmap_complete_noio(UnmapCBData *data, int ret)
1619 SCSIDiskReq *r = data->r;
1620 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1622 assert(r->req.aiocb == NULL);
1624 if (data->count > 0) {
1625 uint64_t sector_num = ldq_be_p(&data->inbuf[0]);
1626 uint32_t nb_sectors = ldl_be_p(&data->inbuf[8]) & 0xffffffffULL;
1627 r->sector = sector_num * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
1628 r->sector_count = nb_sectors * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
1630 if (!check_lba_range(s, sector_num, nb_sectors)) {
1631 block_acct_invalid(blk_get_stats(s->qdev.conf.blk),
1632 BLOCK_ACCT_UNMAP);
1633 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1634 goto done;
1637 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
1638 r->sector_count * BDRV_SECTOR_SIZE,
1639 BLOCK_ACCT_UNMAP);
1641 r->req.aiocb = blk_aio_pdiscard(s->qdev.conf.blk,
1642 r->sector * BDRV_SECTOR_SIZE,
1643 r->sector_count * BDRV_SECTOR_SIZE,
1644 scsi_unmap_complete, data);
1645 data->count--;
1646 data->inbuf += 16;
1647 return;
1650 scsi_req_complete(&r->req, GOOD);
1652 done:
1653 scsi_req_unref(&r->req);
1654 g_free(data);
1657 static void scsi_unmap_complete(void *opaque, int ret)
1659 UnmapCBData *data = opaque;
1660 SCSIDiskReq *r = data->r;
1661 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1663 assert(r->req.aiocb != NULL);
1664 r->req.aiocb = NULL;
1666 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
1667 if (scsi_disk_req_check_error(r, ret, true)) {
1668 scsi_req_unref(&r->req);
1669 g_free(data);
1670 } else {
1671 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
1672 scsi_unmap_complete_noio(data, ret);
1674 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
1677 static void scsi_disk_emulate_unmap(SCSIDiskReq *r, uint8_t *inbuf)
1679 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1680 uint8_t *p = inbuf;
1681 int len = r->req.cmd.xfer;
1682 UnmapCBData *data;
1684 /* Reject ANCHOR=1. */
1685 if (r->req.cmd.buf[1] & 0x1) {
1686 goto invalid_field;
1689 if (len < 8) {
1690 goto invalid_param_len;
1692 if (len < lduw_be_p(&p[0]) + 2) {
1693 goto invalid_param_len;
1695 if (len < lduw_be_p(&p[2]) + 8) {
1696 goto invalid_param_len;
1698 if (lduw_be_p(&p[2]) & 15) {
1699 goto invalid_param_len;
1702 if (!blk_is_writable(s->qdev.conf.blk)) {
1703 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP);
1704 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
1705 return;
1708 data = g_new0(UnmapCBData, 1);
1709 data->r = r;
1710 data->inbuf = &p[8];
1711 data->count = lduw_be_p(&p[2]) >> 4;
1713 /* The matching unref is in scsi_unmap_complete, before data is freed. */
1714 scsi_req_ref(&r->req);
1715 scsi_unmap_complete_noio(data, 0);
1716 return;
1718 invalid_param_len:
1719 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP);
1720 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1721 return;
1723 invalid_field:
1724 block_acct_invalid(blk_get_stats(s->qdev.conf.blk), BLOCK_ACCT_UNMAP);
1725 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1728 typedef struct WriteSameCBData {
1729 SCSIDiskReq *r;
1730 int64_t sector;
1731 int nb_sectors;
1732 QEMUIOVector qiov;
1733 struct iovec iov;
1734 } WriteSameCBData;
1736 static void scsi_write_same_complete(void *opaque, int ret)
1738 WriteSameCBData *data = opaque;
1739 SCSIDiskReq *r = data->r;
1740 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1742 assert(r->req.aiocb != NULL);
1743 r->req.aiocb = NULL;
1744 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
1745 if (scsi_disk_req_check_error(r, ret, true)) {
1746 goto done;
1749 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
1751 data->nb_sectors -= data->iov.iov_len / BDRV_SECTOR_SIZE;
1752 data->sector += data->iov.iov_len / BDRV_SECTOR_SIZE;
1753 data->iov.iov_len = MIN(data->nb_sectors * BDRV_SECTOR_SIZE,
1754 data->iov.iov_len);
1755 if (data->iov.iov_len) {
1756 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
1757 data->iov.iov_len, BLOCK_ACCT_WRITE);
1758 /* Reinitialize qiov, to handle unaligned WRITE SAME request
1759 * where final qiov may need smaller size */
1760 qemu_iovec_init_external(&data->qiov, &data->iov, 1);
1761 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
1762 data->sector << BDRV_SECTOR_BITS,
1763 &data->qiov, 0,
1764 scsi_write_same_complete, data);
1765 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
1766 return;
1769 scsi_req_complete(&r->req, GOOD);
1771 done:
1772 scsi_req_unref(&r->req);
1773 qemu_vfree(data->iov.iov_base);
1774 g_free(data);
1775 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
1778 static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
1780 SCSIRequest *req = &r->req;
1781 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1782 uint32_t nb_sectors = scsi_data_cdb_xfer(r->req.cmd.buf);
1783 WriteSameCBData *data;
1784 uint8_t *buf;
1785 int i;
1787 /* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
1788 if (nb_sectors == 0 || (req->cmd.buf[1] & 0x16)) {
1789 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1790 return;
1793 if (!blk_is_writable(s->qdev.conf.blk)) {
1794 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
1795 return;
1797 if (!check_lba_range(s, r->req.cmd.lba, nb_sectors)) {
1798 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1799 return;
1802 if ((req->cmd.buf[1] & 0x1) || buffer_is_zero(inbuf, s->qdev.blocksize)) {
1803 int flags = (req->cmd.buf[1] & 0x8) ? BDRV_REQ_MAY_UNMAP : 0;
1805 /* The request is used as the AIO opaque value, so add a ref. */
1806 scsi_req_ref(&r->req);
1807 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
1808 nb_sectors * s->qdev.blocksize,
1809 BLOCK_ACCT_WRITE);
1810 r->req.aiocb = blk_aio_pwrite_zeroes(s->qdev.conf.blk,
1811 r->req.cmd.lba * s->qdev.blocksize,
1812 nb_sectors * s->qdev.blocksize,
1813 flags, scsi_aio_complete, r);
1814 return;
1817 data = g_new0(WriteSameCBData, 1);
1818 data->r = r;
1819 data->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
1820 data->nb_sectors = nb_sectors * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
1821 data->iov.iov_len = MIN(data->nb_sectors * BDRV_SECTOR_SIZE,
1822 SCSI_WRITE_SAME_MAX);
1823 data->iov.iov_base = buf = blk_blockalign(s->qdev.conf.blk,
1824 data->iov.iov_len);
1825 qemu_iovec_init_external(&data->qiov, &data->iov, 1);
1827 for (i = 0; i < data->iov.iov_len; i += s->qdev.blocksize) {
1828 memcpy(&buf[i], inbuf, s->qdev.blocksize);
1831 scsi_req_ref(&r->req);
1832 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
1833 data->iov.iov_len, BLOCK_ACCT_WRITE);
1834 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
1835 data->sector << BDRV_SECTOR_BITS,
1836 &data->qiov, 0,
1837 scsi_write_same_complete, data);
1840 static void scsi_disk_emulate_write_data(SCSIRequest *req)
1842 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1844 if (r->iov.iov_len) {
1845 int buflen = r->iov.iov_len;
1846 trace_scsi_disk_emulate_write_data(buflen);
1847 r->iov.iov_len = 0;
1848 scsi_req_data(&r->req, buflen);
1849 return;
1852 switch (req->cmd.buf[0]) {
1853 case MODE_SELECT:
1854 case MODE_SELECT_10:
1855 /* This also clears the sense buffer for REQUEST SENSE. */
1856 scsi_disk_emulate_mode_select(r, r->iov.iov_base);
1857 break;
1859 case UNMAP:
1860 scsi_disk_emulate_unmap(r, r->iov.iov_base);
1861 break;
1863 case VERIFY_10:
1864 case VERIFY_12:
1865 case VERIFY_16:
1866 if (r->req.status == -1) {
1867 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1869 break;
1871 case WRITE_SAME_10:
1872 case WRITE_SAME_16:
1873 scsi_disk_emulate_write_same(r, r->iov.iov_base);
1874 break;
1876 default:
1877 abort();
1881 static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
1883 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1884 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1885 uint64_t nb_sectors;
1886 uint8_t *outbuf;
1887 int buflen;
1889 switch (req->cmd.buf[0]) {
1890 case INQUIRY:
1891 case MODE_SENSE:
1892 case MODE_SENSE_10:
1893 case RESERVE:
1894 case RESERVE_10:
1895 case RELEASE:
1896 case RELEASE_10:
1897 case START_STOP:
1898 case ALLOW_MEDIUM_REMOVAL:
1899 case GET_CONFIGURATION:
1900 case GET_EVENT_STATUS_NOTIFICATION:
1901 case MECHANISM_STATUS:
1902 case REQUEST_SENSE:
1903 break;
1905 default:
1906 if (!blk_is_available(s->qdev.conf.blk)) {
1907 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1908 return 0;
1910 break;
1914 * FIXME: we shouldn't return anything bigger than 4k, but the code
1915 * requires the buffer to be as big as req->cmd.xfer in several
1916 * places. So, do not allow CDBs with a very large ALLOCATION
1917 * LENGTH. The real fix would be to modify scsi_read_data and
1918 * dma_buf_read, so that they return data beyond the buflen
1919 * as all zeros.
1921 if (req->cmd.xfer > 65536) {
1922 goto illegal_request;
1924 r->buflen = MAX(4096, req->cmd.xfer);
1926 if (!r->iov.iov_base) {
1927 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
1930 outbuf = r->iov.iov_base;
1931 memset(outbuf, 0, r->buflen);
1932 switch (req->cmd.buf[0]) {
1933 case TEST_UNIT_READY:
1934 assert(blk_is_available(s->qdev.conf.blk));
1935 break;
1936 case INQUIRY:
1937 buflen = scsi_disk_emulate_inquiry(req, outbuf);
1938 if (buflen < 0) {
1939 goto illegal_request;
1941 break;
1942 case MODE_SENSE:
1943 case MODE_SENSE_10:
1944 buflen = scsi_disk_emulate_mode_sense(r, outbuf);
1945 if (buflen < 0) {
1946 goto illegal_request;
1948 break;
1949 case READ_TOC:
1950 buflen = scsi_disk_emulate_read_toc(req, outbuf);
1951 if (buflen < 0) {
1952 goto illegal_request;
1954 break;
1955 case RESERVE:
1956 if (req->cmd.buf[1] & 1) {
1957 goto illegal_request;
1959 break;
1960 case RESERVE_10:
1961 if (req->cmd.buf[1] & 3) {
1962 goto illegal_request;
1964 break;
1965 case RELEASE:
1966 if (req->cmd.buf[1] & 1) {
1967 goto illegal_request;
1969 break;
1970 case RELEASE_10:
1971 if (req->cmd.buf[1] & 3) {
1972 goto illegal_request;
1974 break;
1975 case START_STOP:
1976 if (scsi_disk_emulate_start_stop(r) < 0) {
1977 return 0;
1979 break;
1980 case ALLOW_MEDIUM_REMOVAL:
1981 s->tray_locked = req->cmd.buf[4] & 1;
1982 blk_lock_medium(s->qdev.conf.blk, req->cmd.buf[4] & 1);
1983 break;
1984 case READ_CAPACITY_10:
1985 /* The normal LEN field for this command is zero. */
1986 memset(outbuf, 0, 8);
1987 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
1988 if (!nb_sectors) {
1989 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
1990 return 0;
1992 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1993 goto illegal_request;
1995 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE;
1996 /* Returned value is the address of the last sector. */
1997 nb_sectors--;
1998 /* Remember the new size for read/write sanity checking. */
1999 s->qdev.max_lba = nb_sectors;
2000 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
2001 if (nb_sectors > UINT32_MAX) {
2002 nb_sectors = UINT32_MAX;
2004 outbuf[0] = (nb_sectors >> 24) & 0xff;
2005 outbuf[1] = (nb_sectors >> 16) & 0xff;
2006 outbuf[2] = (nb_sectors >> 8) & 0xff;
2007 outbuf[3] = nb_sectors & 0xff;
2008 outbuf[4] = 0;
2009 outbuf[5] = 0;
2010 outbuf[6] = s->qdev.blocksize >> 8;
2011 outbuf[7] = 0;
2012 break;
2013 case REQUEST_SENSE:
2014 /* Just return "NO SENSE". */
2015 buflen = scsi_convert_sense(NULL, 0, outbuf, r->buflen,
2016 (req->cmd.buf[1] & 1) == 0);
2017 if (buflen < 0) {
2018 goto illegal_request;
2020 break;
2021 case MECHANISM_STATUS:
2022 buflen = scsi_emulate_mechanism_status(s, outbuf);
2023 if (buflen < 0) {
2024 goto illegal_request;
2026 break;
2027 case GET_CONFIGURATION:
2028 buflen = scsi_get_configuration(s, outbuf);
2029 if (buflen < 0) {
2030 goto illegal_request;
2032 break;
2033 case GET_EVENT_STATUS_NOTIFICATION:
2034 buflen = scsi_get_event_status_notification(s, r, outbuf);
2035 if (buflen < 0) {
2036 goto illegal_request;
2038 break;
2039 case READ_DISC_INFORMATION:
2040 buflen = scsi_read_disc_information(s, r, outbuf);
2041 if (buflen < 0) {
2042 goto illegal_request;
2044 break;
2045 case READ_DVD_STRUCTURE:
2046 buflen = scsi_read_dvd_structure(s, r, outbuf);
2047 if (buflen < 0) {
2048 goto illegal_request;
2050 break;
2051 case SERVICE_ACTION_IN_16:
2052 /* Service Action In subcommands. */
2053 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
2054 trace_scsi_disk_emulate_command_SAI_16();
2055 memset(outbuf, 0, req->cmd.xfer);
2056 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
2057 if (!nb_sectors) {
2058 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
2059 return 0;
2061 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
2062 goto illegal_request;
2064 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE;
2065 /* Returned value is the address of the last sector. */
2066 nb_sectors--;
2067 /* Remember the new size for read/write sanity checking. */
2068 s->qdev.max_lba = nb_sectors;
2069 outbuf[0] = (nb_sectors >> 56) & 0xff;
2070 outbuf[1] = (nb_sectors >> 48) & 0xff;
2071 outbuf[2] = (nb_sectors >> 40) & 0xff;
2072 outbuf[3] = (nb_sectors >> 32) & 0xff;
2073 outbuf[4] = (nb_sectors >> 24) & 0xff;
2074 outbuf[5] = (nb_sectors >> 16) & 0xff;
2075 outbuf[6] = (nb_sectors >> 8) & 0xff;
2076 outbuf[7] = nb_sectors & 0xff;
2077 outbuf[8] = 0;
2078 outbuf[9] = 0;
2079 outbuf[10] = s->qdev.blocksize >> 8;
2080 outbuf[11] = 0;
2081 outbuf[12] = 0;
2082 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
2084 /* set TPE bit if the format supports discard */
2085 if (s->qdev.conf.discard_granularity) {
2086 outbuf[14] = 0x80;
2089 /* Protection, exponent and lowest lba field left blank. */
2090 break;
2092 trace_scsi_disk_emulate_command_SAI_unsupported();
2093 goto illegal_request;
2094 case SYNCHRONIZE_CACHE:
2095 /* The request is used as the AIO opaque value, so add a ref. */
2096 scsi_req_ref(&r->req);
2097 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
2098 BLOCK_ACCT_FLUSH);
2099 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
2100 return 0;
2101 case SEEK_10:
2102 trace_scsi_disk_emulate_command_SEEK_10(r->req.cmd.lba);
2103 if (r->req.cmd.lba > s->qdev.max_lba) {
2104 goto illegal_lba;
2106 break;
2107 case MODE_SELECT:
2108 trace_scsi_disk_emulate_command_MODE_SELECT(r->req.cmd.xfer);
2109 break;
2110 case MODE_SELECT_10:
2111 trace_scsi_disk_emulate_command_MODE_SELECT_10(r->req.cmd.xfer);
2112 break;
2113 case UNMAP:
2114 trace_scsi_disk_emulate_command_UNMAP(r->req.cmd.xfer);
2115 break;
2116 case VERIFY_10:
2117 case VERIFY_12:
2118 case VERIFY_16:
2119 trace_scsi_disk_emulate_command_VERIFY((req->cmd.buf[1] >> 1) & 3);
2120 if (req->cmd.buf[1] & 6) {
2121 goto illegal_request;
2123 break;
2124 case WRITE_SAME_10:
2125 case WRITE_SAME_16:
2126 trace_scsi_disk_emulate_command_WRITE_SAME(
2127 req->cmd.buf[0] == WRITE_SAME_10 ? 10 : 16, r->req.cmd.xfer);
2128 break;
2129 default:
2130 trace_scsi_disk_emulate_command_UNKNOWN(buf[0],
2131 scsi_command_name(buf[0]));
2132 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
2133 return 0;
2135 assert(!r->req.aiocb);
2136 r->iov.iov_len = MIN(r->buflen, req->cmd.xfer);
2137 if (r->iov.iov_len == 0) {
2138 scsi_req_complete(&r->req, GOOD);
2140 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
2141 assert(r->iov.iov_len == req->cmd.xfer);
2142 return -r->iov.iov_len;
2143 } else {
2144 return r->iov.iov_len;
2147 illegal_request:
2148 if (r->req.status == -1) {
2149 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2151 return 0;
2153 illegal_lba:
2154 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
2155 return 0;
2158 /* Execute a scsi command. Returns the length of the data expected by the
2159 command. This will be Positive for data transfers from the device
2160 (eg. disk reads), negative for transfers to the device (eg. disk writes),
2161 and zero if the command does not transfer any data. */
2163 static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf)
2165 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2166 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
2167 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
2168 uint32_t len;
2169 uint8_t command;
2171 command = buf[0];
2173 if (!blk_is_available(s->qdev.conf.blk)) {
2174 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
2175 return 0;
2178 len = scsi_data_cdb_xfer(r->req.cmd.buf);
2179 switch (command) {
2180 case READ_6:
2181 case READ_10:
2182 case READ_12:
2183 case READ_16:
2184 trace_scsi_disk_dma_command_READ(r->req.cmd.lba, len);
2185 /* Protection information is not supported. For SCSI versions 2 and
2186 * older (as determined by snooping the guest's INQUIRY commands),
2187 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2189 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) {
2190 goto illegal_request;
2192 if (!check_lba_range(s, r->req.cmd.lba, len)) {
2193 goto illegal_lba;
2195 r->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
2196 r->sector_count = len * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
2197 break;
2198 case WRITE_6:
2199 case WRITE_10:
2200 case WRITE_12:
2201 case WRITE_16:
2202 case WRITE_VERIFY_10:
2203 case WRITE_VERIFY_12:
2204 case WRITE_VERIFY_16:
2205 if (!blk_is_writable(s->qdev.conf.blk)) {
2206 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
2207 return 0;
2209 trace_scsi_disk_dma_command_WRITE(
2210 (command & 0xe) == 0xe ? "And Verify " : "",
2211 r->req.cmd.lba, len);
2212 /* fall through */
2213 case VERIFY_10:
2214 case VERIFY_12:
2215 case VERIFY_16:
2216 /* We get here only for BYTCHK == 0x01 and only for scsi-block.
2217 * As far as DMA is concerned, we can treat it the same as a write;
2218 * scsi_block_do_sgio will send VERIFY commands.
2220 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) {
2221 goto illegal_request;
2223 if (!check_lba_range(s, r->req.cmd.lba, len)) {
2224 goto illegal_lba;
2226 r->sector = r->req.cmd.lba * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
2227 r->sector_count = len * (s->qdev.blocksize / BDRV_SECTOR_SIZE);
2228 break;
2229 default:
2230 abort();
2231 illegal_request:
2232 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2233 return 0;
2234 illegal_lba:
2235 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
2236 return 0;
2238 r->need_fua_emulation = sdc->need_fua_emulation(&r->req.cmd);
2239 if (r->sector_count == 0) {
2240 scsi_req_complete(&r->req, GOOD);
2242 assert(r->iov.iov_len == 0);
2243 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
2244 return -r->sector_count * BDRV_SECTOR_SIZE;
2245 } else {
2246 return r->sector_count * BDRV_SECTOR_SIZE;
2250 static void scsi_disk_reset(DeviceState *dev)
2252 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
2253 uint64_t nb_sectors;
2255 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
2257 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
2258 nb_sectors /= s->qdev.blocksize / BDRV_SECTOR_SIZE;
2259 if (nb_sectors) {
2260 nb_sectors--;
2262 s->qdev.max_lba = nb_sectors;
2263 /* reset tray statuses */
2264 s->tray_locked = 0;
2265 s->tray_open = 0;
2267 s->qdev.scsi_version = s->qdev.default_scsi_version;
2270 static void scsi_disk_resize_cb(void *opaque)
2272 SCSIDiskState *s = opaque;
2274 /* SPC lists this sense code as available only for
2275 * direct-access devices.
2277 if (s->qdev.type == TYPE_DISK) {
2278 scsi_device_report_change(&s->qdev, SENSE_CODE(CAPACITY_CHANGED));
2282 static void scsi_cd_change_media_cb(void *opaque, bool load, Error **errp)
2284 SCSIDiskState *s = opaque;
2287 * When a CD gets changed, we have to report an ejected state and
2288 * then a loaded state to guests so that they detect tray
2289 * open/close and media change events. Guests that do not use
2290 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
2291 * states rely on this behavior.
2293 * media_changed governs the state machine used for unit attention
2294 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
2296 s->media_changed = load;
2297 s->tray_open = !load;
2298 scsi_device_set_ua(&s->qdev, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM));
2299 s->media_event = true;
2300 s->eject_request = false;
2303 static void scsi_cd_eject_request_cb(void *opaque, bool force)
2305 SCSIDiskState *s = opaque;
2307 s->eject_request = true;
2308 if (force) {
2309 s->tray_locked = false;
2313 static bool scsi_cd_is_tray_open(void *opaque)
2315 return ((SCSIDiskState *)opaque)->tray_open;
2318 static bool scsi_cd_is_medium_locked(void *opaque)
2320 return ((SCSIDiskState *)opaque)->tray_locked;
2323 static const BlockDevOps scsi_disk_removable_block_ops = {
2324 .change_media_cb = scsi_cd_change_media_cb,
2325 .eject_request_cb = scsi_cd_eject_request_cb,
2326 .is_tray_open = scsi_cd_is_tray_open,
2327 .is_medium_locked = scsi_cd_is_medium_locked,
2329 .resize_cb = scsi_disk_resize_cb,
2332 static const BlockDevOps scsi_disk_block_ops = {
2333 .resize_cb = scsi_disk_resize_cb,
2336 static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
2338 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2339 if (s->media_changed) {
2340 s->media_changed = false;
2341 scsi_device_set_ua(&s->qdev, SENSE_CODE(MEDIUM_CHANGED));
2345 static void scsi_realize(SCSIDevice *dev, Error **errp)
2347 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2348 bool read_only;
2350 if (!s->qdev.conf.blk) {
2351 error_setg(errp, "drive property not set");
2352 return;
2355 if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
2356 !blk_is_inserted(s->qdev.conf.blk)) {
2357 error_setg(errp, "Device needs media, but drive is empty");
2358 return;
2361 if (!blkconf_blocksizes(&s->qdev.conf, errp)) {
2362 return;
2365 if (blk_get_aio_context(s->qdev.conf.blk) != qemu_get_aio_context() &&
2366 !s->qdev.hba_supports_iothread)
2368 error_setg(errp, "HBA does not support iothreads");
2369 return;
2372 if (dev->type == TYPE_DISK) {
2373 if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) {
2374 return;
2378 read_only = !blk_supports_write_perm(s->qdev.conf.blk);
2379 if (dev->type == TYPE_ROM) {
2380 read_only = true;
2383 if (!blkconf_apply_backend_options(&dev->conf, read_only,
2384 dev->type == TYPE_DISK, errp)) {
2385 return;
2388 if (s->qdev.conf.discard_granularity == -1) {
2389 s->qdev.conf.discard_granularity =
2390 MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY);
2393 if (!s->version) {
2394 s->version = g_strdup(qemu_hw_version());
2396 if (!s->vendor) {
2397 s->vendor = g_strdup("QEMU");
2399 if (!s->device_id) {
2400 if (s->serial) {
2401 s->device_id = g_strdup_printf("%.20s", s->serial);
2402 } else {
2403 const char *str = blk_name(s->qdev.conf.blk);
2404 if (str && *str) {
2405 s->device_id = g_strdup(str);
2410 if (blk_is_sg(s->qdev.conf.blk)) {
2411 error_setg(errp, "unwanted /dev/sg*");
2412 return;
2415 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
2416 !(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) {
2417 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_removable_block_ops, s);
2418 } else {
2419 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_block_ops, s);
2421 blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
2423 blk_iostatus_enable(s->qdev.conf.blk);
2425 add_boot_device_lchs(&dev->qdev, NULL,
2426 dev->conf.lcyls,
2427 dev->conf.lheads,
2428 dev->conf.lsecs);
2431 static void scsi_unrealize(SCSIDevice *dev)
2433 del_boot_device_lchs(&dev->qdev, NULL);
2436 static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
2438 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2439 AioContext *ctx = NULL;
2440 /* can happen for devices without drive. The error message for missing
2441 * backend will be issued in scsi_realize
2443 if (s->qdev.conf.blk) {
2444 ctx = blk_get_aio_context(s->qdev.conf.blk);
2445 aio_context_acquire(ctx);
2446 if (!blkconf_blocksizes(&s->qdev.conf, errp)) {
2447 goto out;
2450 s->qdev.blocksize = s->qdev.conf.logical_block_size;
2451 s->qdev.type = TYPE_DISK;
2452 if (!s->product) {
2453 s->product = g_strdup("QEMU HARDDISK");
2455 scsi_realize(&s->qdev, errp);
2456 out:
2457 if (ctx) {
2458 aio_context_release(ctx);
2462 static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
2464 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2465 AioContext *ctx;
2466 int ret;
2468 if (!dev->conf.blk) {
2469 /* Anonymous BlockBackend for an empty drive. As we put it into
2470 * dev->conf, qdev takes care of detaching on unplug. */
2471 dev->conf.blk = blk_new(qemu_get_aio_context(), 0, BLK_PERM_ALL);
2472 ret = blk_attach_dev(dev->conf.blk, &dev->qdev);
2473 assert(ret == 0);
2476 ctx = blk_get_aio_context(dev->conf.blk);
2477 aio_context_acquire(ctx);
2478 s->qdev.blocksize = 2048;
2479 s->qdev.type = TYPE_ROM;
2480 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
2481 if (!s->product) {
2482 s->product = g_strdup("QEMU CD-ROM");
2484 scsi_realize(&s->qdev, errp);
2485 aio_context_release(ctx);
2489 static const SCSIReqOps scsi_disk_emulate_reqops = {
2490 .size = sizeof(SCSIDiskReq),
2491 .free_req = scsi_free_request,
2492 .send_command = scsi_disk_emulate_command,
2493 .read_data = scsi_disk_emulate_read_data,
2494 .write_data = scsi_disk_emulate_write_data,
2495 .get_buf = scsi_get_buf,
2498 static const SCSIReqOps scsi_disk_dma_reqops = {
2499 .size = sizeof(SCSIDiskReq),
2500 .free_req = scsi_free_request,
2501 .send_command = scsi_disk_dma_command,
2502 .read_data = scsi_read_data,
2503 .write_data = scsi_write_data,
2504 .get_buf = scsi_get_buf,
2505 .load_request = scsi_disk_load_request,
2506 .save_request = scsi_disk_save_request,
2509 static const SCSIReqOps *const scsi_disk_reqops_dispatch[256] = {
2510 [TEST_UNIT_READY] = &scsi_disk_emulate_reqops,
2511 [INQUIRY] = &scsi_disk_emulate_reqops,
2512 [MODE_SENSE] = &scsi_disk_emulate_reqops,
2513 [MODE_SENSE_10] = &scsi_disk_emulate_reqops,
2514 [START_STOP] = &scsi_disk_emulate_reqops,
2515 [ALLOW_MEDIUM_REMOVAL] = &scsi_disk_emulate_reqops,
2516 [READ_CAPACITY_10] = &scsi_disk_emulate_reqops,
2517 [READ_TOC] = &scsi_disk_emulate_reqops,
2518 [READ_DVD_STRUCTURE] = &scsi_disk_emulate_reqops,
2519 [READ_DISC_INFORMATION] = &scsi_disk_emulate_reqops,
2520 [GET_CONFIGURATION] = &scsi_disk_emulate_reqops,
2521 [GET_EVENT_STATUS_NOTIFICATION] = &scsi_disk_emulate_reqops,
2522 [MECHANISM_STATUS] = &scsi_disk_emulate_reqops,
2523 [SERVICE_ACTION_IN_16] = &scsi_disk_emulate_reqops,
2524 [REQUEST_SENSE] = &scsi_disk_emulate_reqops,
2525 [SYNCHRONIZE_CACHE] = &scsi_disk_emulate_reqops,
2526 [SEEK_10] = &scsi_disk_emulate_reqops,
2527 [MODE_SELECT] = &scsi_disk_emulate_reqops,
2528 [MODE_SELECT_10] = &scsi_disk_emulate_reqops,
2529 [UNMAP] = &scsi_disk_emulate_reqops,
2530 [WRITE_SAME_10] = &scsi_disk_emulate_reqops,
2531 [WRITE_SAME_16] = &scsi_disk_emulate_reqops,
2532 [VERIFY_10] = &scsi_disk_emulate_reqops,
2533 [VERIFY_12] = &scsi_disk_emulate_reqops,
2534 [VERIFY_16] = &scsi_disk_emulate_reqops,
2536 [READ_6] = &scsi_disk_dma_reqops,
2537 [READ_10] = &scsi_disk_dma_reqops,
2538 [READ_12] = &scsi_disk_dma_reqops,
2539 [READ_16] = &scsi_disk_dma_reqops,
2540 [WRITE_6] = &scsi_disk_dma_reqops,
2541 [WRITE_10] = &scsi_disk_dma_reqops,
2542 [WRITE_12] = &scsi_disk_dma_reqops,
2543 [WRITE_16] = &scsi_disk_dma_reqops,
2544 [WRITE_VERIFY_10] = &scsi_disk_dma_reqops,
2545 [WRITE_VERIFY_12] = &scsi_disk_dma_reqops,
2546 [WRITE_VERIFY_16] = &scsi_disk_dma_reqops,
2549 static void scsi_disk_new_request_dump(uint32_t lun, uint32_t tag, uint8_t *buf)
2551 int i;
2552 int len = scsi_cdb_length(buf);
2553 char *line_buffer, *p;
2555 assert(len > 0 && len <= 16);
2556 line_buffer = g_malloc(len * 5 + 1);
2558 for (i = 0, p = line_buffer; i < len; i++) {
2559 p += sprintf(p, " 0x%02x", buf[i]);
2561 trace_scsi_disk_new_request(lun, tag, line_buffer);
2563 g_free(line_buffer);
2566 static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
2567 uint8_t *buf, void *hba_private)
2569 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2570 SCSIRequest *req;
2571 const SCSIReqOps *ops;
2572 uint8_t command;
2574 command = buf[0];
2575 ops = scsi_disk_reqops_dispatch[command];
2576 if (!ops) {
2577 ops = &scsi_disk_emulate_reqops;
2579 req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private);
2581 if (trace_event_get_state_backends(TRACE_SCSI_DISK_NEW_REQUEST)) {
2582 scsi_disk_new_request_dump(lun, tag, buf);
2585 return req;
2588 #ifdef __linux__
2589 static int get_device_type(SCSIDiskState *s)
2591 uint8_t cmd[16];
2592 uint8_t buf[36];
2593 int ret;
2595 memset(cmd, 0, sizeof(cmd));
2596 memset(buf, 0, sizeof(buf));
2597 cmd[0] = INQUIRY;
2598 cmd[4] = sizeof(buf);
2600 ret = scsi_SG_IO_FROM_DEV(s->qdev.conf.blk, cmd, sizeof(cmd),
2601 buf, sizeof(buf), s->qdev.io_timeout);
2602 if (ret < 0) {
2603 return -1;
2605 s->qdev.type = buf[0];
2606 if (buf[1] & 0x80) {
2607 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
2609 return 0;
2612 static void scsi_block_realize(SCSIDevice *dev, Error **errp)
2614 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2615 AioContext *ctx;
2616 int sg_version;
2617 int rc;
2619 if (!s->qdev.conf.blk) {
2620 error_setg(errp, "drive property not set");
2621 return;
2624 if (s->rotation_rate) {
2625 error_report_once("rotation_rate is specified for scsi-block but is "
2626 "not implemented. This option is deprecated and will "
2627 "be removed in a future version");
2630 ctx = blk_get_aio_context(s->qdev.conf.blk);
2631 aio_context_acquire(ctx);
2633 /* check we are using a driver managing SG_IO (version 3 and after) */
2634 rc = blk_ioctl(s->qdev.conf.blk, SG_GET_VERSION_NUM, &sg_version);
2635 if (rc < 0) {
2636 error_setg_errno(errp, -rc, "cannot get SG_IO version number");
2637 if (rc != -EPERM) {
2638 error_append_hint(errp, "Is this a SCSI device?\n");
2640 goto out;
2642 if (sg_version < 30000) {
2643 error_setg(errp, "scsi generic interface too old");
2644 goto out;
2647 /* get device type from INQUIRY data */
2648 rc = get_device_type(s);
2649 if (rc < 0) {
2650 error_setg(errp, "INQUIRY failed");
2651 goto out;
2654 /* Make a guess for the block size, we'll fix it when the guest sends.
2655 * READ CAPACITY. If they don't, they likely would assume these sizes
2656 * anyway. (TODO: check in /sys).
2658 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
2659 s->qdev.blocksize = 2048;
2660 } else {
2661 s->qdev.blocksize = 512;
2664 /* Makes the scsi-block device not removable by using HMP and QMP eject
2665 * command.
2667 s->features |= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS);
2669 scsi_realize(&s->qdev, errp);
2670 scsi_generic_read_device_inquiry(&s->qdev);
2672 out:
2673 aio_context_release(ctx);
2676 typedef struct SCSIBlockReq {
2677 SCSIDiskReq req;
2678 sg_io_hdr_t io_header;
2680 /* Selected bytes of the original CDB, copied into our own CDB. */
2681 uint8_t cmd, cdb1, group_number;
2683 /* CDB passed to SG_IO. */
2684 uint8_t cdb[16];
2685 BlockCompletionFunc *cb;
2686 void *cb_opaque;
2687 } SCSIBlockReq;
2689 static void scsi_block_sgio_complete(void *opaque, int ret)
2691 SCSIBlockReq *req = (SCSIBlockReq *)opaque;
2692 SCSIDiskReq *r = &req->req;
2693 SCSIDevice *s = r->req.dev;
2694 sg_io_hdr_t *io_hdr = &req->io_header;
2696 if (ret == 0) {
2697 if (io_hdr->host_status != SCSI_HOST_OK) {
2698 scsi_req_complete_failed(&r->req, io_hdr->host_status);
2699 scsi_req_unref(&r->req);
2700 return;
2703 if (io_hdr->driver_status & SG_ERR_DRIVER_TIMEOUT) {
2704 ret = BUSY;
2705 } else {
2706 ret = io_hdr->status;
2709 if (ret > 0) {
2710 aio_context_acquire(blk_get_aio_context(s->conf.blk));
2711 if (scsi_handle_rw_error(r, ret, true)) {
2712 aio_context_release(blk_get_aio_context(s->conf.blk));
2713 scsi_req_unref(&r->req);
2714 return;
2716 aio_context_release(blk_get_aio_context(s->conf.blk));
2718 /* Ignore error. */
2719 ret = 0;
2723 req->cb(req->cb_opaque, ret);
2726 static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req,
2727 int64_t offset, QEMUIOVector *iov,
2728 int direction,
2729 BlockCompletionFunc *cb, void *opaque)
2731 sg_io_hdr_t *io_header = &req->io_header;
2732 SCSIDiskReq *r = &req->req;
2733 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2734 int nb_logical_blocks;
2735 uint64_t lba;
2736 BlockAIOCB *aiocb;
2738 /* This is not supported yet. It can only happen if the guest does
2739 * reads and writes that are not aligned to one logical sectors
2740 * _and_ cover multiple MemoryRegions.
2742 assert(offset % s->qdev.blocksize == 0);
2743 assert(iov->size % s->qdev.blocksize == 0);
2745 io_header->interface_id = 'S';
2747 /* The data transfer comes from the QEMUIOVector. */
2748 io_header->dxfer_direction = direction;
2749 io_header->dxfer_len = iov->size;
2750 io_header->dxferp = (void *)iov->iov;
2751 io_header->iovec_count = iov->niov;
2752 assert(io_header->iovec_count == iov->niov); /* no overflow! */
2754 /* Build a new CDB with the LBA and length patched in, in case
2755 * DMA helpers split the transfer in multiple segments. Do not
2756 * build a CDB smaller than what the guest wanted, and only build
2757 * a larger one if strictly necessary.
2759 io_header->cmdp = req->cdb;
2760 lba = offset / s->qdev.blocksize;
2761 nb_logical_blocks = io_header->dxfer_len / s->qdev.blocksize;
2763 if ((req->cmd >> 5) == 0 && lba <= 0x1ffff) {
2764 /* 6-byte CDB */
2765 stl_be_p(&req->cdb[0], lba | (req->cmd << 24));
2766 req->cdb[4] = nb_logical_blocks;
2767 req->cdb[5] = 0;
2768 io_header->cmd_len = 6;
2769 } else if ((req->cmd >> 5) <= 1 && lba <= 0xffffffffULL) {
2770 /* 10-byte CDB */
2771 req->cdb[0] = (req->cmd & 0x1f) | 0x20;
2772 req->cdb[1] = req->cdb1;
2773 stl_be_p(&req->cdb[2], lba);
2774 req->cdb[6] = req->group_number;
2775 stw_be_p(&req->cdb[7], nb_logical_blocks);
2776 req->cdb[9] = 0;
2777 io_header->cmd_len = 10;
2778 } else if ((req->cmd >> 5) != 4 && lba <= 0xffffffffULL) {
2779 /* 12-byte CDB */
2780 req->cdb[0] = (req->cmd & 0x1f) | 0xA0;
2781 req->cdb[1] = req->cdb1;
2782 stl_be_p(&req->cdb[2], lba);
2783 stl_be_p(&req->cdb[6], nb_logical_blocks);
2784 req->cdb[10] = req->group_number;
2785 req->cdb[11] = 0;
2786 io_header->cmd_len = 12;
2787 } else {
2788 /* 16-byte CDB */
2789 req->cdb[0] = (req->cmd & 0x1f) | 0x80;
2790 req->cdb[1] = req->cdb1;
2791 stq_be_p(&req->cdb[2], lba);
2792 stl_be_p(&req->cdb[10], nb_logical_blocks);
2793 req->cdb[14] = req->group_number;
2794 req->cdb[15] = 0;
2795 io_header->cmd_len = 16;
2798 /* The rest is as in scsi-generic.c. */
2799 io_header->mx_sb_len = sizeof(r->req.sense);
2800 io_header->sbp = r->req.sense;
2801 io_header->timeout = s->qdev.io_timeout * 1000;
2802 io_header->usr_ptr = r;
2803 io_header->flags |= SG_FLAG_DIRECT_IO;
2804 req->cb = cb;
2805 req->cb_opaque = opaque;
2806 trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba,
2807 nb_logical_blocks, io_header->timeout);
2808 aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, scsi_block_sgio_complete, req);
2809 assert(aiocb != NULL);
2810 return aiocb;
2813 static bool scsi_block_no_fua(SCSICommand *cmd)
2815 return false;
2818 static BlockAIOCB *scsi_block_dma_readv(int64_t offset,
2819 QEMUIOVector *iov,
2820 BlockCompletionFunc *cb, void *cb_opaque,
2821 void *opaque)
2823 SCSIBlockReq *r = opaque;
2824 return scsi_block_do_sgio(r, offset, iov,
2825 SG_DXFER_FROM_DEV, cb, cb_opaque);
2828 static BlockAIOCB *scsi_block_dma_writev(int64_t offset,
2829 QEMUIOVector *iov,
2830 BlockCompletionFunc *cb, void *cb_opaque,
2831 void *opaque)
2833 SCSIBlockReq *r = opaque;
2834 return scsi_block_do_sgio(r, offset, iov,
2835 SG_DXFER_TO_DEV, cb, cb_opaque);
2838 static bool scsi_block_is_passthrough(SCSIDiskState *s, uint8_t *buf)
2840 switch (buf[0]) {
2841 case VERIFY_10:
2842 case VERIFY_12:
2843 case VERIFY_16:
2844 /* Check if BYTCHK == 0x01 (data-out buffer contains data
2845 * for the number of logical blocks specified in the length
2846 * field). For other modes, do not use scatter/gather operation.
2848 if ((buf[1] & 6) == 2) {
2849 return false;
2851 break;
2853 case READ_6:
2854 case READ_10:
2855 case READ_12:
2856 case READ_16:
2857 case WRITE_6:
2858 case WRITE_10:
2859 case WRITE_12:
2860 case WRITE_16:
2861 case WRITE_VERIFY_10:
2862 case WRITE_VERIFY_12:
2863 case WRITE_VERIFY_16:
2864 /* MMC writing cannot be done via DMA helpers, because it sometimes
2865 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
2866 * We might use scsi_block_dma_reqops as long as no writing commands are
2867 * seen, but performance usually isn't paramount on optical media. So,
2868 * just make scsi-block operate the same as scsi-generic for them.
2870 if (s->qdev.type != TYPE_ROM) {
2871 return false;
2873 break;
2875 default:
2876 break;
2879 return true;
2883 static int32_t scsi_block_dma_command(SCSIRequest *req, uint8_t *buf)
2885 SCSIBlockReq *r = (SCSIBlockReq *)req;
2886 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
2888 r->cmd = req->cmd.buf[0];
2889 switch (r->cmd >> 5) {
2890 case 0:
2891 /* 6-byte CDB. */
2892 r->cdb1 = r->group_number = 0;
2893 break;
2894 case 1:
2895 /* 10-byte CDB. */
2896 r->cdb1 = req->cmd.buf[1];
2897 r->group_number = req->cmd.buf[6];
2898 break;
2899 case 4:
2900 /* 12-byte CDB. */
2901 r->cdb1 = req->cmd.buf[1];
2902 r->group_number = req->cmd.buf[10];
2903 break;
2904 case 5:
2905 /* 16-byte CDB. */
2906 r->cdb1 = req->cmd.buf[1];
2907 r->group_number = req->cmd.buf[14];
2908 break;
2909 default:
2910 abort();
2913 /* Protection information is not supported. For SCSI versions 2 and
2914 * older (as determined by snooping the guest's INQUIRY commands),
2915 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2917 if (s->qdev.scsi_version > 2 && (req->cmd.buf[1] & 0xe0)) {
2918 scsi_check_condition(&r->req, SENSE_CODE(INVALID_FIELD));
2919 return 0;
2922 return scsi_disk_dma_command(req, buf);
2925 static const SCSIReqOps scsi_block_dma_reqops = {
2926 .size = sizeof(SCSIBlockReq),
2927 .free_req = scsi_free_request,
2928 .send_command = scsi_block_dma_command,
2929 .read_data = scsi_read_data,
2930 .write_data = scsi_write_data,
2931 .get_buf = scsi_get_buf,
2932 .load_request = scsi_disk_load_request,
2933 .save_request = scsi_disk_save_request,
2936 static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
2937 uint32_t lun, uint8_t *buf,
2938 void *hba_private)
2940 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2942 if (scsi_block_is_passthrough(s, buf)) {
2943 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
2944 hba_private);
2945 } else {
2946 return scsi_req_alloc(&scsi_block_dma_reqops, &s->qdev, tag, lun,
2947 hba_private);
2951 static int scsi_block_parse_cdb(SCSIDevice *d, SCSICommand *cmd,
2952 uint8_t *buf, void *hba_private)
2954 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2956 if (scsi_block_is_passthrough(s, buf)) {
2957 return scsi_bus_parse_cdb(&s->qdev, cmd, buf, hba_private);
2958 } else {
2959 return scsi_req_parse_cdb(&s->qdev, cmd, buf);
2963 static void scsi_block_update_sense(SCSIRequest *req)
2965 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2966 SCSIBlockReq *br = DO_UPCAST(SCSIBlockReq, req, r);
2967 r->req.sense_len = MIN(br->io_header.sb_len_wr, sizeof(r->req.sense));
2969 #endif
2971 static
2972 BlockAIOCB *scsi_dma_readv(int64_t offset, QEMUIOVector *iov,
2973 BlockCompletionFunc *cb, void *cb_opaque,
2974 void *opaque)
2976 SCSIDiskReq *r = opaque;
2977 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2978 return blk_aio_preadv(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2981 static
2982 BlockAIOCB *scsi_dma_writev(int64_t offset, QEMUIOVector *iov,
2983 BlockCompletionFunc *cb, void *cb_opaque,
2984 void *opaque)
2986 SCSIDiskReq *r = opaque;
2987 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2988 return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2991 static void scsi_disk_base_class_initfn(ObjectClass *klass, void *data)
2993 DeviceClass *dc = DEVICE_CLASS(klass);
2994 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
2996 dc->fw_name = "disk";
2997 dc->reset = scsi_disk_reset;
2998 sdc->dma_readv = scsi_dma_readv;
2999 sdc->dma_writev = scsi_dma_writev;
3000 sdc->need_fua_emulation = scsi_is_cmd_fua;
3003 static const TypeInfo scsi_disk_base_info = {
3004 .name = TYPE_SCSI_DISK_BASE,
3005 .parent = TYPE_SCSI_DEVICE,
3006 .class_init = scsi_disk_base_class_initfn,
3007 .instance_size = sizeof(SCSIDiskState),
3008 .class_size = sizeof(SCSIDiskClass),
3009 .abstract = true,
3012 #define DEFINE_SCSI_DISK_PROPERTIES() \
3013 DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSIDiskState, qdev.conf.blk), \
3014 DEFINE_BLOCK_PROPERTIES_BASE(SCSIDiskState, qdev.conf), \
3015 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
3016 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
3017 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
3018 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
3019 DEFINE_PROP_STRING("product", SCSIDiskState, product), \
3020 DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)
3023 static Property scsi_hd_properties[] = {
3024 DEFINE_SCSI_DISK_PROPERTIES(),
3025 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
3026 SCSI_DISK_F_REMOVABLE, false),
3027 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
3028 SCSI_DISK_F_DPOFUA, false),
3029 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
3030 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
3031 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
3032 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
3033 DEFAULT_MAX_UNMAP_SIZE),
3034 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3035 DEFAULT_MAX_IO_SIZE),
3036 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
3037 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
3039 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
3040 DEFINE_PROP_END_OF_LIST(),
3043 static const VMStateDescription vmstate_scsi_disk_state = {
3044 .name = "scsi-disk",
3045 .version_id = 1,
3046 .minimum_version_id = 1,
3047 .fields = (VMStateField[]) {
3048 VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
3049 VMSTATE_BOOL(media_changed, SCSIDiskState),
3050 VMSTATE_BOOL(media_event, SCSIDiskState),
3051 VMSTATE_BOOL(eject_request, SCSIDiskState),
3052 VMSTATE_BOOL(tray_open, SCSIDiskState),
3053 VMSTATE_BOOL(tray_locked, SCSIDiskState),
3054 VMSTATE_END_OF_LIST()
3058 static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
3060 DeviceClass *dc = DEVICE_CLASS(klass);
3061 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3063 sc->realize = scsi_hd_realize;
3064 sc->unrealize = scsi_unrealize;
3065 sc->alloc_req = scsi_new_request;
3066 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
3067 dc->desc = "virtual SCSI disk";
3068 device_class_set_props(dc, scsi_hd_properties);
3069 dc->vmsd = &vmstate_scsi_disk_state;
3072 static const TypeInfo scsi_hd_info = {
3073 .name = "scsi-hd",
3074 .parent = TYPE_SCSI_DISK_BASE,
3075 .class_init = scsi_hd_class_initfn,
3078 static Property scsi_cd_properties[] = {
3079 DEFINE_SCSI_DISK_PROPERTIES(),
3080 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
3081 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
3082 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
3083 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3084 DEFAULT_MAX_IO_SIZE),
3085 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
3087 DEFINE_PROP_END_OF_LIST(),
3090 static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
3092 DeviceClass *dc = DEVICE_CLASS(klass);
3093 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3095 sc->realize = scsi_cd_realize;
3096 sc->alloc_req = scsi_new_request;
3097 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
3098 dc->desc = "virtual SCSI CD-ROM";
3099 device_class_set_props(dc, scsi_cd_properties);
3100 dc->vmsd = &vmstate_scsi_disk_state;
3103 static const TypeInfo scsi_cd_info = {
3104 .name = "scsi-cd",
3105 .parent = TYPE_SCSI_DISK_BASE,
3106 .class_init = scsi_cd_class_initfn,
3109 #ifdef __linux__
3110 static Property scsi_block_properties[] = {
3111 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf),
3112 DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.blk),
3113 DEFINE_PROP_BOOL("share-rw", SCSIDiskState, qdev.conf.share_rw, false),
3114 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
3115 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
3116 DEFAULT_MAX_UNMAP_SIZE),
3117 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3118 DEFAULT_MAX_IO_SIZE),
3119 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
3120 -1),
3121 DEFINE_PROP_UINT32("io_timeout", SCSIDiskState, qdev.io_timeout,
3122 DEFAULT_IO_TIMEOUT),
3123 DEFINE_PROP_END_OF_LIST(),
3126 static void scsi_block_class_initfn(ObjectClass *klass, void *data)
3128 DeviceClass *dc = DEVICE_CLASS(klass);
3129 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3130 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
3132 sc->realize = scsi_block_realize;
3133 sc->alloc_req = scsi_block_new_request;
3134 sc->parse_cdb = scsi_block_parse_cdb;
3135 sdc->dma_readv = scsi_block_dma_readv;
3136 sdc->dma_writev = scsi_block_dma_writev;
3137 sdc->update_sense = scsi_block_update_sense;
3138 sdc->need_fua_emulation = scsi_block_no_fua;
3139 dc->desc = "SCSI block device passthrough";
3140 device_class_set_props(dc, scsi_block_properties);
3141 dc->vmsd = &vmstate_scsi_disk_state;
3144 static const TypeInfo scsi_block_info = {
3145 .name = "scsi-block",
3146 .parent = TYPE_SCSI_DISK_BASE,
3147 .class_init = scsi_block_class_initfn,
3149 #endif
3151 static void scsi_disk_register_types(void)
3153 type_register_static(&scsi_disk_base_info);
3154 type_register_static(&scsi_hd_info);
3155 type_register_static(&scsi_cd_info);
3156 #ifdef __linux__
3157 type_register_static(&scsi_block_info);
3158 #endif
3161 type_init(scsi_disk_register_types)