]> git.proxmox.com Git - mirror_qemu.git/blame - hw/scsi/scsi-disk.c
hw/arm/virt-acpi-build: Fix SMMUv3 GSIV values
[mirror_qemu.git] / hw / scsi / scsi-disk.c
CommitLineData
2e5d83bb
PB
1/*
2 * SCSI Device emulation
3 *
4 * Copyright (c) 2006 CodeSourcery.
5 * Based on code by Fabrice Bellard
6 *
7 * Written by Paul Brook
ad3cea42
AT
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.
2e5d83bb 14 *
8e31bf38 15 * This code is licensed under the LGPL.
a917d384
PB
16 *
17 * Note that this file only handles the SCSI architecture model and device
1d4db89c
AZ
18 * commands. Emulation of interface/link layer protocols is handled by
19 * the host adapter emulator.
2e5d83bb
PB
20 */
21
a4ab4792 22#include "qemu/osdep.h"
7e462605 23#include "qemu/units.h"
da34e65c 24#include "qapi/error.h"
1de7afc9 25#include "qemu/error-report.h"
0d09e41a 26#include "hw/scsi/scsi.h"
3d4a8bf0 27#include "hw/scsi/emulation.h"
08e2c9f1 28#include "scsi/constants.h"
9c17d615 29#include "sysemu/sysemu.h"
4be74634 30#include "sysemu/block-backend.h"
9c17d615 31#include "sysemu/blockdev.h"
0d09e41a 32#include "hw/block/block.h"
9c17d615 33#include "sysemu/dma.h"
f348b6d1 34#include "qemu/cutils.h"
59ee9500 35#include "trace.h"
22864256 36
336a6915
PB
37#ifdef __linux
38#include <scsi/sg.h>
39#endif
40
7e462605
PMD
41#define SCSI_WRITE_SAME_MAX (512 * KiB)
42#define SCSI_DMA_BUF_SIZE (128 * KiB)
215e47b9
PB
43#define SCSI_MAX_INQUIRY_LEN 256
44#define SCSI_MAX_MODE_LEN 256
45
7e462605
PMD
46#define DEFAULT_DISCARD_GRANULARITY (4 * KiB)
47#define DEFAULT_MAX_UNMAP_SIZE (1 * GiB)
f8e1f533 48#define DEFAULT_MAX_IO_SIZE INT_MAX /* 2 GB - 1 block */
a917d384 49
993935f3
PB
50#define TYPE_SCSI_DISK_BASE "scsi-disk-base"
51
fcaafb10
PB
52#define SCSI_DISK_BASE(obj) \
53 OBJECT_CHECK(SCSIDiskState, (obj), TYPE_SCSI_DISK_BASE)
54#define SCSI_DISK_BASE_CLASS(klass) \
55 OBJECT_CLASS_CHECK(SCSIDiskClass, (klass), TYPE_SCSI_DISK_BASE)
56#define SCSI_DISK_BASE_GET_CLASS(obj) \
57 OBJECT_GET_CLASS(SCSIDiskClass, (obj), TYPE_SCSI_DISK_BASE)
58
59typedef struct SCSIDiskClass {
60 SCSIDeviceClass parent_class;
61 DMAIOFunc *dma_readv;
62 DMAIOFunc *dma_writev;
94f8ba11 63 bool (*need_fua_emulation)(SCSICommand *cmd);
fcaafb10 64} SCSIDiskClass;
d52affa7 65
4c41d2ef
GH
66typedef struct SCSIDiskReq {
67 SCSIRequest req;
a917d384 68 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
e035b43d
AL
69 uint64_t sector;
70 uint32_t sector_count;
7285477a 71 uint32_t buflen;
a0e66a69 72 bool started;
94f8ba11 73 bool need_fua_emulation;
c87c0672
AL
74 struct iovec iov;
75 QEMUIOVector qiov;
a597e79c 76 BlockAcctCookie acct;
8fdc7839 77 unsigned char *status;
4c41d2ef 78} SCSIDiskReq;
a917d384 79
18e673b8
PH
80#define SCSI_DISK_F_REMOVABLE 0
81#define SCSI_DISK_F_DPOFUA 1
82#define SCSI_DISK_F_NO_REMOVABLE_DEVOPS 2
bfe3d7ac 83
fcaafb10 84typedef struct SCSIDiskState
a917d384 85{
d52affa7 86 SCSIDevice qdev;
bfe3d7ac 87 uint32_t features;
8a9c16f6 88 bool media_changed;
3c2f7c12 89 bool media_event;
4480de19 90 bool eject_request;
64cc2284 91 uint16_t port_index;
8a1bd297 92 uint64_t max_unmap_size;
f8e1f533 93 uint64_t max_io_size;
213189ab 94 QEMUBH *bh;
383b4d9b 95 char *version;
a0fef654 96 char *serial;
353815aa
DF
97 char *vendor;
98 char *product;
7471a649 99 char *device_id;
ece0d5e9 100 bool tray_open;
81b1008d 101 bool tray_locked;
070f8009
DB
102 /*
103 * 0x0000 - rotation rate not reported
104 * 0x0001 - non-rotating medium (SSD)
105 * 0x0002-0x0400 - reserved
106 * 0x0401-0xffe - rotations per minute
107 * 0xffff - reserved
108 */
109 uint16_t rotation_rate;
fcaafb10 110} SCSIDiskState;
2e5d83bb 111
14b20748 112static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed);
5dba48a8 113
ad2d30f7 114static void scsi_free_request(SCSIRequest *req)
4d611c9a 115{
ad2d30f7
PB
116 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
117
db4c34c3 118 qemu_vfree(r->iov.iov_base);
4d611c9a
PB
119}
120
b45ef674
PB
121/* Helper function for command completion with sense. */
122static void scsi_check_condition(SCSIDiskReq *r, SCSISense sense)
ed3a34a3 123{
59ee9500
LV
124 trace_scsi_disk_check_condition(r->req.tag, sense.key, sense.asc,
125 sense.ascq);
b45ef674
PB
126 scsi_req_build_sense(&r->req, sense);
127 scsi_req_complete(&r->req, CHECK_CONDITION);
4d611c9a
PB
128}
129
03c90063 130static void scsi_init_iovec(SCSIDiskReq *r, size_t size)
103b40f5 131{
7285477a
PB
132 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
133
134 if (!r->iov.iov_base) {
43b978b9 135 r->buflen = size;
4be74634 136 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
7285477a
PB
137 }
138 r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
103b40f5 139 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
103b40f5
PB
140}
141
43b978b9
PB
142static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
143{
144 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
145
146 qemu_put_be64s(f, &r->sector);
147 qemu_put_be32s(f, &r->sector_count);
148 qemu_put_be32s(f, &r->buflen);
18eef3bc
GH
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);
156 }
43b978b9
PB
157 }
158}
159
160static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
161{
162 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
163
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);
18eef3bc
GH
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);
43b978b9
PB
177 }
178 }
179
180 qemu_iovec_init_external(&r->qiov, &r->iov, 1);
181}
182
5b956f41
PB
183static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed)
184{
185 if (r->req.io_canceled) {
186 scsi_req_cancel_complete(&r->req);
187 return true;
188 }
189
14b20748 190 if (ret < 0 || (r->status && *r->status)) {
5b956f41
PB
191 return scsi_handle_rw_error(r, -ret, acct_failed);
192 }
193
194 return false;
195}
196
c1b35247 197static void scsi_aio_complete(void *opaque, int ret)
5d0d2467
PB
198{
199 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
200 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
201
46e3f30e
PB
202 assert(r->req.aiocb != NULL);
203 r->req.aiocb = NULL;
b9e413dd 204 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5b956f41 205 if (scsi_disk_req_check_error(r, ret, true)) {
0c92e0e6
PB
206 goto done;
207 }
5d0d2467 208
d7628080 209 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
5d0d2467
PB
210 scsi_req_complete(&r->req, GOOD);
211
212done:
b9e413dd 213 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
3df9caf8 214 scsi_req_unref(&r->req);
5d0d2467
PB
215}
216
7e8c49c5
PB
217static bool scsi_is_cmd_fua(SCSICommand *cmd)
218{
219 switch (cmd->buf[0]) {
220 case READ_10:
221 case READ_12:
222 case READ_16:
223 case WRITE_10:
224 case WRITE_12:
225 case WRITE_16:
226 return (cmd->buf[1] & 8) != 0;
227
7f64f8e2
PB
228 case VERIFY_10:
229 case VERIFY_12:
230 case VERIFY_16:
7e8c49c5
PB
231 case WRITE_VERIFY_10:
232 case WRITE_VERIFY_12:
233 case WRITE_VERIFY_16:
234 return true;
235
236 case READ_6:
237 case WRITE_6:
238 default:
239 return false;
240 }
241}
242
243static void scsi_write_do_fua(SCSIDiskReq *r)
244{
245 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
246
5fd2b563 247 assert(r->req.aiocb == NULL);
5b956f41 248 assert(!r->req.io_canceled);
0c92e0e6 249
94f8ba11 250 if (r->need_fua_emulation) {
4be74634 251 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 252 BLOCK_ACCT_FLUSH);
4be74634 253 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
7e8c49c5
PB
254 return;
255 }
256
257 scsi_req_complete(&r->req, GOOD);
3df9caf8 258 scsi_req_unref(&r->req);
7e8c49c5
PB
259}
260
5fd2b563 261static void scsi_dma_complete_noio(SCSIDiskReq *r, int ret)
a917d384 262{
5fd2b563 263 assert(r->req.aiocb == NULL);
5b956f41 264 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
265 goto done;
266 }
a597e79c 267
b77912a7
PB
268 r->sector += r->sector_count;
269 r->sector_count = 0;
7e8c49c5
PB
270 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
271 scsi_write_do_fua(r);
272 return;
273 } else {
274 scsi_req_complete(&r->req, GOOD);
275 }
c7bae6a7
PB
276
277done:
3df9caf8 278 scsi_req_unref(&r->req);
4d611c9a
PB
279}
280
ef8489d4
PB
281static void scsi_dma_complete(void *opaque, int ret)
282{
283 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
5fd2b563 284 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ef8489d4
PB
285
286 assert(r->req.aiocb != NULL);
5fd2b563
PB
287 r->req.aiocb = NULL;
288
b9e413dd 289 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
d7628080
AG
290 if (ret < 0) {
291 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
292 } else {
293 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
294 }
5fd2b563 295 scsi_dma_complete_noio(r, ret);
b9e413dd 296 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
ef8489d4
PB
297}
298
1505421a 299static void scsi_read_complete_noio(SCSIDiskReq *r, int ret)
0a4ac106 300{
1505421a 301 uint32_t n;
0a4ac106 302
1505421a
ZL
303 assert(r->req.aiocb == NULL);
304 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
305 goto done;
306 }
0a4ac106 307
b77912a7
PB
308 n = r->qiov.size / 512;
309 r->sector += n;
310 r->sector_count -= n;
311 scsi_req_data(&r->req, r->qiov.size);
c7bae6a7
PB
312
313done:
3df9caf8 314 scsi_req_unref(&r->req);
1505421a
ZL
315}
316
317static void scsi_read_complete(void *opaque, int ret)
318{
319 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
320 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
321
322 assert(r->req.aiocb != NULL);
323 r->req.aiocb = NULL;
324
325 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
326 if (ret < 0) {
327 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
328 } else {
329 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
330 trace_scsi_disk_read_complete(r->req.tag, r->qiov.size);
331 }
332 scsi_read_complete_noio(r, ret);
b9e413dd 333 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
0a4ac106 334}
5dba48a8 335
ac668426 336/* Actually issue a read to the block device. */
5fd2b563 337static void scsi_do_read(SCSIDiskReq *r, int ret)
ac668426 338{
ac668426 339 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
fcaafb10 340 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
ac668426 341
5fd2b563 342 assert (r->req.aiocb == NULL);
5b956f41 343 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
344 goto done;
345 }
ac668426 346
31e8fd86
PB
347 /* The request is used as the AIO opaque value, so add a ref. */
348 scsi_req_ref(&r->req);
349
ac668426 350 if (r->req.sg) {
4be74634 351 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
ac668426 352 r->req.resid -= r->req.sg->size;
fcaafb10
PB
353 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
354 r->req.sg, r->sector << BDRV_SECTOR_BITS,
99868af3 355 BDRV_SECTOR_SIZE,
fcaafb10
PB
356 sdc->dma_readv, r, scsi_dma_complete, r,
357 DMA_DIRECTION_FROM_DEVICE);
ac668426 358 } else {
03c90063 359 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
4be74634 360 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
03c90063 361 r->qiov.size, BLOCK_ACCT_READ);
890e48d7 362 r->req.aiocb = sdc->dma_readv(r->sector << BDRV_SECTOR_BITS, &r->qiov,
fcaafb10 363 scsi_read_complete, r, r);
ac668426
PB
364 }
365
366done:
3df9caf8 367 scsi_req_unref(&r->req);
ac668426
PB
368}
369
5fd2b563
PB
370static void scsi_do_read_cb(void *opaque, int ret)
371{
372 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
373 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
374
375 assert (r->req.aiocb != NULL);
376 r->req.aiocb = NULL;
377
b9e413dd 378 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
d7628080
AG
379 if (ret < 0) {
380 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
381 } else {
382 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
383 }
5fd2b563 384 scsi_do_read(opaque, ret);
b9e413dd 385 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563
PB
386}
387
5c6c0e51
HR
388/* Read more data from scsi device into buffer. */
389static void scsi_read_data(SCSIRequest *req)
2e5d83bb 390{
5c6c0e51 391 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
5dba48a8 392 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ac668426 393 bool first;
2e5d83bb 394
59ee9500 395 trace_scsi_disk_read_data_count(r->sector_count);
a917d384 396 if (r->sector_count == 0) {
b45ef674
PB
397 /* This also clears the sense buffer for REQUEST SENSE. */
398 scsi_req_complete(&r->req, GOOD);
a917d384 399 return;
2e5d83bb
PB
400 }
401
6fa2c95f
SH
402 /* No data transfer may already be in progress */
403 assert(r->req.aiocb == NULL);
404
c7bae6a7
PB
405 /* The request is used as the AIO opaque value, so add a ref. */
406 scsi_req_ref(&r->req);
efb9ee02 407 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
59ee9500 408 trace_scsi_disk_read_data_invalid();
1505421a 409 scsi_read_complete_noio(r, -EINVAL);
efb9ee02
HR
410 return;
411 }
412
cd723b85 413 if (!blk_is_available(req->dev->conf.blk)) {
1505421a 414 scsi_read_complete_noio(r, -ENOMEDIUM);
c7bae6a7 415 return;
a1aff5bf 416 }
c7bae6a7 417
ac668426 418 first = !r->started;
a0e66a69 419 r->started = true;
94f8ba11 420 if (first && r->need_fua_emulation) {
4be74634 421 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 422 BLOCK_ACCT_FLUSH);
5fd2b563 423 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_do_read_cb, r);
5d0d2467 424 } else {
ac668426 425 scsi_do_read(r, 0);
5d0d2467 426 }
2e5d83bb
PB
427}
428
c7bae6a7 429/*
14b20748
FZ
430 * scsi_handle_rw_error has two return values. False means that the error
431 * must be ignored, true means that the error has been processed and the
c7bae6a7
PB
432 * caller should not do anything else for this request. Note that
433 * scsi_handle_rw_error always manages its reference counts, independent
434 * of the return value.
435 */
14b20748 436static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed)
5dba48a8 437{
c85a7a00 438 bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV);
4c41d2ef 439 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
4be74634
MA
440 BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk,
441 is_read, error);
ea8a5d7f 442
a589569f 443 if (action == BLOCK_ERROR_ACTION_REPORT) {
d7628080
AG
444 if (acct_failed) {
445 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
446 }
efb9ee02 447 switch (error) {
14b20748 448 case 0:
e6aa5ba4
PB
449 /* A passthrough command has run and has produced sense data; check
450 * whether the error has to be handled by the guest or should rather
451 * pause the host.
452 */
14b20748 453 assert(r->status && *r->status);
e6aa5ba4
PB
454 error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
455 if (error == ECANCELED || error == EAGAIN || error == ENOTCONN ||
456 error == 0) {
457 /* These errors are handled by guest. */
458 scsi_req_complete(&r->req, *r->status);
459 return true;
460 }
14b20748 461 break;
7e218df5
PB
462 case ENOMEDIUM:
463 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
464 break;
efb9ee02 465 case ENOMEM:
b45ef674 466 scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
efb9ee02
HR
467 break;
468 case EINVAL:
b45ef674 469 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
efb9ee02 470 break;
703dd81a
PB
471 case ENOSPC:
472 scsi_check_condition(r, SENSE_CODE(SPACE_ALLOC_FAILED));
473 break;
efb9ee02 474 default:
b45ef674 475 scsi_check_condition(r, SENSE_CODE(IO_ERROR));
efb9ee02 476 break;
a1f0cce2 477 }
ea8a5d7f 478 }
14b20748 479
4be74634 480 blk_error_action(s->qdev.conf.blk, action, is_read, error);
40dce4ee
PB
481 if (action == BLOCK_ERROR_ACTION_IGNORE) {
482 scsi_req_complete(&r->req, 0);
483 return true;
484 }
485
a589569f 486 if (action == BLOCK_ERROR_ACTION_STOP) {
3e1caa5f
PB
487 scsi_req_retry(&r->req);
488 }
1c7f618f 489 return true;
ea8a5d7f
AL
490}
491
5fd2b563 492static void scsi_write_complete_noio(SCSIDiskReq *r, int ret)
4d611c9a 493{
ea8a5d7f
AL
494 uint32_t n;
495
5fd2b563 496 assert (r->req.aiocb == NULL);
5b956f41 497 if (scsi_disk_req_check_error(r, ret, false)) {
0c92e0e6
PB
498 goto done;
499 }
a597e79c 500
103b40f5 501 n = r->qiov.size / 512;
ea8a5d7f
AL
502 r->sector += n;
503 r->sector_count -= n;
a917d384 504 if (r->sector_count == 0) {
7e8c49c5
PB
505 scsi_write_do_fua(r);
506 return;
a917d384 507 } else {
43b978b9 508 scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
59ee9500 509 trace_scsi_disk_write_complete_noio(r->req.tag, r->qiov.size);
103b40f5 510 scsi_req_data(&r->req, r->qiov.size);
4d611c9a 511 }
c7bae6a7
PB
512
513done:
3df9caf8 514 scsi_req_unref(&r->req);
4d611c9a
PB
515}
516
5fd2b563
PB
517static void scsi_write_complete(void * opaque, int ret)
518{
519 SCSIDiskReq *r = (SCSIDiskReq *)opaque;
520 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
521
522 assert (r->req.aiocb != NULL);
523 r->req.aiocb = NULL;
524
b9e413dd 525 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
d7628080
AG
526 if (ret < 0) {
527 block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
528 } else {
529 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
530 }
5fd2b563 531 scsi_write_complete_noio(r, ret);
b9e413dd 532 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563
PB
533}
534
42741212 535static void scsi_write_data(SCSIRequest *req)
ea8a5d7f 536{
5c6c0e51 537 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
4c41d2ef 538 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
fcaafb10 539 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
ea8a5d7f 540
6fa2c95f
SH
541 /* No data transfer may already be in progress */
542 assert(r->req.aiocb == NULL);
543
c7bae6a7
PB
544 /* The request is used as the AIO opaque value, so add a ref. */
545 scsi_req_ref(&r->req);
efb9ee02 546 if (r->req.cmd.mode != SCSI_XFER_TO_DEV) {
59ee9500 547 trace_scsi_disk_write_data_invalid();
5fd2b563 548 scsi_write_complete_noio(r, -EINVAL);
42741212 549 return;
efb9ee02
HR
550 }
551
5d0d2467
PB
552 if (!r->req.sg && !r->qiov.size) {
553 /* Called for the first time. Ask the driver to send us more data. */
a0e66a69 554 r->started = true;
5fd2b563 555 scsi_write_complete_noio(r, 0);
5d0d2467
PB
556 return;
557 }
cd723b85 558 if (!blk_is_available(req->dev->conf.blk)) {
5fd2b563 559 scsi_write_complete_noio(r, -ENOMEDIUM);
5d0d2467
PB
560 return;
561 }
562
7f64f8e2
PB
563 if (r->req.cmd.buf[0] == VERIFY_10 || r->req.cmd.buf[0] == VERIFY_12 ||
564 r->req.cmd.buf[0] == VERIFY_16) {
565 if (r->req.sg) {
ef8489d4 566 scsi_dma_complete_noio(r, 0);
7f64f8e2 567 } else {
5fd2b563 568 scsi_write_complete_noio(r, 0);
7f64f8e2
PB
569 }
570 return;
571 }
572
5d0d2467 573 if (r->req.sg) {
4be74634 574 dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
5d0d2467 575 r->req.resid -= r->req.sg->size;
fcaafb10
PB
576 r->req.aiocb = dma_blk_io(blk_get_aio_context(s->qdev.conf.blk),
577 r->req.sg, r->sector << BDRV_SECTOR_BITS,
99868af3 578 BDRV_SECTOR_SIZE,
fcaafb10
PB
579 sdc->dma_writev, r, scsi_dma_complete, r,
580 DMA_DIRECTION_TO_DEVICE);
5d0d2467 581 } else {
4be74634 582 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
03c90063 583 r->qiov.size, BLOCK_ACCT_WRITE);
fcaafb10
PB
584 r->req.aiocb = sdc->dma_writev(r->sector << BDRV_SECTOR_BITS, &r->qiov,
585 scsi_write_complete, r, r);
ea8a5d7f 586 }
a917d384 587}
2e5d83bb 588
a917d384 589/* Return a pointer to the data buffer. */
5c6c0e51 590static uint8_t *scsi_get_buf(SCSIRequest *req)
a917d384 591{
5c6c0e51 592 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2e5d83bb 593
3f4cb3d3 594 return (uint8_t *)r->iov.iov_base;
2e5d83bb
PB
595}
596
3d4a8bf0 597static int scsi_disk_emulate_vpd_page(SCSIRequest *req, uint8_t *outbuf)
0b06c059 598{
383b4d9b 599 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
0a96ca24
DHB
600 uint8_t page_code = req->cmd.buf[2];
601 int start, buflen = 0;
0b06c059 602
0a96ca24
DHB
603 outbuf[buflen++] = s->qdev.type & 0x1f;
604 outbuf[buflen++] = page_code;
605 outbuf[buflen++] = 0x00;
606 outbuf[buflen++] = 0x00;
607 start = buflen;
3e1c0c9a 608
0a96ca24
DHB
609 switch (page_code) {
610 case 0x00: /* Supported page codes, mandatory */
611 {
59ee9500 612 trace_scsi_disk_emulate_vpd_page_00(req->cmd.xfer);
0a96ca24
DHB
613 outbuf[buflen++] = 0x00; /* list of supported pages (this page) */
614 if (s->serial) {
615 outbuf[buflen++] = 0x80; /* unit serial number */
616 }
617 outbuf[buflen++] = 0x83; /* device identification */
618 if (s->qdev.type == TYPE_DISK) {
619 outbuf[buflen++] = 0xb0; /* block limits */
620 outbuf[buflen++] = 0xb1; /* block device characteristics */
621 outbuf[buflen++] = 0xb2; /* thin provisioning */
622 }
623 break;
624 }
625 case 0x80: /* Device serial number, optional */
626 {
627 int l;
0b06c059 628
0a96ca24 629 if (!s->serial) {
59ee9500 630 trace_scsi_disk_emulate_vpd_page_80_not_supported();
0a96ca24 631 return -1;
0b06c059
GH
632 }
633
0a96ca24
DHB
634 l = strlen(s->serial);
635 if (l > 36) {
636 l = 36;
637 }
0b06c059 638
59ee9500 639 trace_scsi_disk_emulate_vpd_page_80(req->cmd.xfer);
0a96ca24
DHB
640 memcpy(outbuf + buflen, s->serial, l);
641 buflen += l;
642 break;
643 }
64cc2284 644
0a96ca24
DHB
645 case 0x83: /* Device identification page, mandatory */
646 {
7471a649 647 int id_len = s->device_id ? MIN(strlen(s->device_id), 255 - 8) : 0;
64cc2284 648
59ee9500 649 trace_scsi_disk_emulate_vpd_page_83(req->cmd.xfer);
0a96ca24 650
a8f58afc
KW
651 if (id_len) {
652 outbuf[buflen++] = 0x2; /* ASCII */
653 outbuf[buflen++] = 0; /* not officially assigned */
654 outbuf[buflen++] = 0; /* reserved */
655 outbuf[buflen++] = id_len; /* length of data following */
7471a649 656 memcpy(outbuf + buflen, s->device_id, id_len);
a8f58afc
KW
657 buflen += id_len;
658 }
0a96ca24
DHB
659
660 if (s->qdev.wwn) {
661 outbuf[buflen++] = 0x1; /* Binary */
662 outbuf[buflen++] = 0x3; /* NAA */
663 outbuf[buflen++] = 0; /* reserved */
664 outbuf[buflen++] = 8;
665 stq_be_p(&outbuf[buflen], s->qdev.wwn);
666 buflen += 8;
ea3bd56f 667 }
0a96ca24
DHB
668
669 if (s->qdev.port_wwn) {
670 outbuf[buflen++] = 0x61; /* SAS / Binary */
671 outbuf[buflen++] = 0x93; /* PIV / Target port / NAA */
672 outbuf[buflen++] = 0; /* reserved */
673 outbuf[buflen++] = 8;
674 stq_be_p(&outbuf[buflen], s->qdev.port_wwn);
675 buflen += 8;
070f8009 676 }
0a96ca24
DHB
677
678 if (s->port_index) {
679 outbuf[buflen++] = 0x61; /* SAS / Binary */
680
681 /* PIV/Target port/relative target port */
682 outbuf[buflen++] = 0x94;
683
684 outbuf[buflen++] = 0; /* reserved */
685 outbuf[buflen++] = 4;
686 stw_be_p(&outbuf[buflen + 2], s->port_index);
687 buflen += 4;
ee3659e3 688 }
0a96ca24
DHB
689 break;
690 }
691 case 0xb0: /* block limits */
692 {
3d4a8bf0 693 SCSIBlockLimits bl = {};
0a96ca24
DHB
694
695 if (s->qdev.type == TYPE_ROM) {
59ee9500 696 trace_scsi_disk_emulate_vpd_page_b0_not_supported();
0b06c059
GH
697 return -1;
698 }
3d4a8bf0
PB
699 bl.wsnz = 1;
700 bl.unmap_sectors =
701 s->qdev.conf.discard_granularity / s->qdev.blocksize;
702 bl.min_io_size =
703 s->qdev.conf.min_io_size / s->qdev.blocksize;
704 bl.opt_io_size =
705 s->qdev.conf.opt_io_size / s->qdev.blocksize;
706 bl.max_unmap_sectors =
707 s->max_unmap_size / s->qdev.blocksize;
708 bl.max_io_sectors =
709 s->max_io_size / s->qdev.blocksize;
710 /* 255 descriptors fit in 4 KiB with an 8-byte header */
711 bl.max_unmap_descr = 255;
712
0a96ca24
DHB
713 if (s->qdev.type == TYPE_DISK) {
714 int max_transfer_blk = blk_get_max_transfer(s->qdev.conf.blk);
715 int max_io_sectors_blk =
716 max_transfer_blk / s->qdev.blocksize;
717
3d4a8bf0
PB
718 bl.max_io_sectors =
719 MIN_NON_ZERO(max_io_sectors_blk, bl.max_io_sectors);
0a96ca24 720 }
3d4a8bf0 721 buflen += scsi_emulate_block_limits(outbuf + buflen, &bl);
0a96ca24
DHB
722 break;
723 }
724 case 0xb1: /* block device characteristics */
725 {
740842c9 726 buflen = 0x40;
0a96ca24
DHB
727 outbuf[4] = (s->rotation_rate >> 8) & 0xff;
728 outbuf[5] = s->rotation_rate & 0xff;
740842c9
DHB
729 outbuf[6] = 0; /* PRODUCT TYPE */
730 outbuf[7] = 0; /* WABEREQ | WACEREQ | NOMINAL FORM FACTOR */
731 outbuf[8] = 0; /* VBULS */
0a96ca24
DHB
732 break;
733 }
734 case 0xb2: /* thin provisioning */
735 {
736 buflen = 8;
737 outbuf[4] = 0;
738 outbuf[5] = 0xe0; /* unmap & write_same 10/16 all supported */
739 outbuf[6] = s->qdev.conf.discard_granularity ? 2 : 1;
740 outbuf[7] = 0;
741 break;
742 }
743 default:
744 return -1;
745 }
746 /* done with EVPD */
747 assert(buflen - start <= 255);
748 outbuf[start - 1] = buflen - start;
749 return buflen;
750}
751
752static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
753{
754 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
755 int buflen = 0;
756
757 if (req->cmd.buf[1] & 0x1) {
758 /* Vital product data */
759 return scsi_disk_emulate_vpd_page(req, outbuf);
0b06c059
GH
760 }
761
762 /* Standard INQUIRY data */
763 if (req->cmd.buf[2] != 0) {
0b06c059
GH
764 return -1;
765 }
766
767 /* PAGE CODE == 0 */
0b06c059 768 buflen = req->cmd.xfer;
f01b5931 769 if (buflen > SCSI_MAX_INQUIRY_LEN) {
0b06c059 770 buflen = SCSI_MAX_INQUIRY_LEN;
f01b5931 771 }
0b06c059 772
f37bd73b 773 outbuf[0] = s->qdev.type & 0x1f;
bfe3d7ac 774 outbuf[1] = (s->features & (1 << SCSI_DISK_F_REMOVABLE)) ? 0x80 : 0;
353815aa
DF
775
776 strpadcpy((char *) &outbuf[16], 16, s->product, ' ');
777 strpadcpy((char *) &outbuf[8], 8, s->vendor, ' ');
778
314b1811 779 memset(&outbuf[32], 0, 4);
552fee93 780 memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
99aba0c4
CH
781 /*
782 * We claim conformance to SPC-3, which is required for guests
783 * to ask for modern features like READ CAPACITY(16) or the
784 * block characteristics VPD page by default. Not all of SPC-3
785 * is actually implemented, but we're good enough.
786 */
2343be0d 787 outbuf[2] = s->qdev.default_scsi_version;
1109c894 788 outbuf[3] = 2 | 0x10; /* Format 2, HiSup */
ad3cea42
AT
789
790 if (buflen > 36) {
791 outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
792 } else {
793 /* If the allocation length of CDB is too small,
794 the additional length is not adjusted */
795 outbuf[4] = 36 - 5;
796 }
797
0b06c059 798 /* Sync data transfer and TCQ. */
afd4030c 799 outbuf[7] = 0x10 | (req->bus->info->tcq ? 0x02 : 0);
0b06c059
GH
800 return buflen;
801}
802
430ee2f2
PB
803static inline bool media_is_dvd(SCSIDiskState *s)
804{
805 uint64_t nb_sectors;
806 if (s->qdev.type != TYPE_ROM) {
807 return false;
808 }
cd723b85 809 if (!blk_is_available(s->qdev.conf.blk)) {
7d99f4c1
MR
810 return false;
811 }
4be74634 812 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
430ee2f2
PB
813 return nb_sectors > CD_MAX_SECTORS;
814}
815
ceb792ef
PB
816static inline bool media_is_cd(SCSIDiskState *s)
817{
818 uint64_t nb_sectors;
819 if (s->qdev.type != TYPE_ROM) {
820 return false;
821 }
cd723b85 822 if (!blk_is_available(s->qdev.conf.blk)) {
7d99f4c1
MR
823 return false;
824 }
4be74634 825 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
ceb792ef
PB
826 return nb_sectors <= CD_MAX_SECTORS;
827}
828
1a4f0c3a
PB
829static int scsi_read_disc_information(SCSIDiskState *s, SCSIDiskReq *r,
830 uint8_t *outbuf)
831{
832 uint8_t type = r->req.cmd.buf[1] & 7;
833
834 if (s->qdev.type != TYPE_ROM) {
835 return -1;
836 }
837
838 /* Types 1/2 are only defined for Blu-Ray. */
839 if (type != 0) {
840 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
841 return -1;
842 }
843
844 memset(outbuf, 0, 34);
845 outbuf[1] = 32;
846 outbuf[2] = 0xe; /* last session complete, disc finalized */
847 outbuf[3] = 1; /* first track on disc */
848 outbuf[4] = 1; /* # of sessions */
849 outbuf[5] = 1; /* first track of last session */
850 outbuf[6] = 1; /* last track of last session */
851 outbuf[7] = 0x20; /* unrestricted use */
852 outbuf[8] = 0x00; /* CD-ROM or DVD-ROM */
853 /* 9-10-11: most significant byte corresponding bytes 4-5-6 */
854 /* 12-23: not meaningful for CD-ROM or DVD-ROM */
855 /* 24-31: disc bar code */
856 /* 32: disc application code */
857 /* 33: number of OPC tables */
858
859 return 34;
860}
861
b6c251ab
PB
862static int scsi_read_dvd_structure(SCSIDiskState *s, SCSIDiskReq *r,
863 uint8_t *outbuf)
864{
ceb792ef
PB
865 static const int rds_caps_size[5] = {
866 [0] = 2048 + 4,
867 [1] = 4 + 4,
868 [3] = 188 + 4,
869 [4] = 2048 + 4,
870 };
871
872 uint8_t media = r->req.cmd.buf[1];
873 uint8_t layer = r->req.cmd.buf[6];
874 uint8_t format = r->req.cmd.buf[7];
875 int size = -1;
876
877 if (s->qdev.type != TYPE_ROM) {
878 return -1;
879 }
880 if (media != 0) {
881 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
882 return -1;
883 }
884
885 if (format != 0xff) {
cd723b85 886 if (!blk_is_available(s->qdev.conf.blk)) {
ceb792ef
PB
887 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
888 return -1;
889 }
890 if (media_is_cd(s)) {
891 scsi_check_condition(r, SENSE_CODE(INCOMPATIBLE_FORMAT));
892 return -1;
893 }
894 if (format >= ARRAY_SIZE(rds_caps_size)) {
895 return -1;
896 }
897 size = rds_caps_size[format];
898 memset(outbuf, 0, size);
899 }
900
901 switch (format) {
902 case 0x00: {
903 /* Physical format information */
904 uint64_t nb_sectors;
905 if (layer != 0) {
906 goto fail;
907 }
4be74634 908 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
ceb792ef
PB
909
910 outbuf[4] = 1; /* DVD-ROM, part version 1 */
911 outbuf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
912 outbuf[6] = 1; /* one layer, read-only (per MMC-2 spec) */
913 outbuf[7] = 0; /* default densities */
914
915 stl_be_p(&outbuf[12], (nb_sectors >> 2) - 1); /* end sector */
916 stl_be_p(&outbuf[16], (nb_sectors >> 2) - 1); /* l0 end sector */
917 break;
918 }
919
920 case 0x01: /* DVD copyright information, all zeros */
921 break;
922
923 case 0x03: /* BCA information - invalid field for no BCA info */
924 return -1;
925
926 case 0x04: /* DVD disc manufacturing information, all zeros */
927 break;
928
929 case 0xff: { /* List capabilities */
930 int i;
931 size = 4;
932 for (i = 0; i < ARRAY_SIZE(rds_caps_size); i++) {
933 if (!rds_caps_size[i]) {
934 continue;
935 }
936 outbuf[size] = i;
937 outbuf[size + 1] = 0x40; /* Not writable, readable */
938 stw_be_p(&outbuf[size + 2], rds_caps_size[i]);
939 size += 4;
940 }
941 break;
942 }
943
944 default:
945 return -1;
946 }
947
948 /* Size of buffer, not including 2 byte size field */
949 stw_be_p(outbuf, size - 2);
950 return size;
951
952fail:
b6c251ab
PB
953 return -1;
954}
955
3c2f7c12 956static int scsi_event_status_media(SCSIDiskState *s, uint8_t *outbuf)
b6c251ab 957{
3c2f7c12
PB
958 uint8_t event_code, media_status;
959
960 media_status = 0;
961 if (s->tray_open) {
962 media_status = MS_TRAY_OPEN;
4be74634 963 } else if (blk_is_inserted(s->qdev.conf.blk)) {
3c2f7c12
PB
964 media_status = MS_MEDIA_PRESENT;
965 }
966
967 /* Event notification descriptor */
968 event_code = MEC_NO_CHANGE;
4480de19
PB
969 if (media_status != MS_TRAY_OPEN) {
970 if (s->media_event) {
971 event_code = MEC_NEW_MEDIA;
972 s->media_event = false;
973 } else if (s->eject_request) {
974 event_code = MEC_EJECT_REQUESTED;
975 s->eject_request = false;
976 }
3c2f7c12
PB
977 }
978
979 outbuf[0] = event_code;
980 outbuf[1] = media_status;
981
982 /* These fields are reserved, just clear them. */
983 outbuf[2] = 0;
984 outbuf[3] = 0;
985 return 4;
986}
987
988static int scsi_get_event_status_notification(SCSIDiskState *s, SCSIDiskReq *r,
989 uint8_t *outbuf)
990{
991 int size;
992 uint8_t *buf = r->req.cmd.buf;
993 uint8_t notification_class_request = buf[4];
994 if (s->qdev.type != TYPE_ROM) {
995 return -1;
996 }
997 if ((buf[1] & 1) == 0) {
998 /* asynchronous */
999 return -1;
1000 }
1001
1002 size = 4;
1003 outbuf[0] = outbuf[1] = 0;
1004 outbuf[3] = 1 << GESN_MEDIA; /* supported events */
1005 if (notification_class_request & (1 << GESN_MEDIA)) {
1006 outbuf[2] = GESN_MEDIA;
1007 size += scsi_event_status_media(s, &outbuf[size]);
1008 } else {
1009 outbuf[2] = 0x80;
1010 }
1011 stw_be_p(outbuf, size - 4);
1012 return size;
b6c251ab
PB
1013}
1014
430ee2f2 1015static int scsi_get_configuration(SCSIDiskState *s, uint8_t *outbuf)
b6c251ab 1016{
430ee2f2
PB
1017 int current;
1018
b6c251ab
PB
1019 if (s->qdev.type != TYPE_ROM) {
1020 return -1;
1021 }
7d99f4c1
MR
1022
1023 if (media_is_dvd(s)) {
1024 current = MMC_PROFILE_DVD_ROM;
1025 } else if (media_is_cd(s)) {
1026 current = MMC_PROFILE_CD_ROM;
1027 } else {
1028 current = MMC_PROFILE_NONE;
1029 }
1030
430ee2f2
PB
1031 memset(outbuf, 0, 40);
1032 stl_be_p(&outbuf[0], 36); /* Bytes after the data length field */
1033 stw_be_p(&outbuf[6], current);
1034 /* outbuf[8] - outbuf[19]: Feature 0 - Profile list */
1035 outbuf[10] = 0x03; /* persistent, current */
1036 outbuf[11] = 8; /* two profiles */
1037 stw_be_p(&outbuf[12], MMC_PROFILE_DVD_ROM);
1038 outbuf[14] = (current == MMC_PROFILE_DVD_ROM);
1039 stw_be_p(&outbuf[16], MMC_PROFILE_CD_ROM);
1040 outbuf[18] = (current == MMC_PROFILE_CD_ROM);
1041 /* outbuf[20] - outbuf[31]: Feature 1 - Core feature */
1042 stw_be_p(&outbuf[20], 1);
1043 outbuf[22] = 0x08 | 0x03; /* version 2, persistent, current */
1044 outbuf[23] = 8;
1045 stl_be_p(&outbuf[24], 1); /* SCSI */
1046 outbuf[28] = 1; /* DBE = 1, mandatory */
1047 /* outbuf[32] - outbuf[39]: Feature 3 - Removable media feature */
1048 stw_be_p(&outbuf[32], 3);
1049 outbuf[34] = 0x08 | 0x03; /* version 2, persistent, current */
1050 outbuf[35] = 4;
1051 outbuf[36] = 0x39; /* tray, load=1, eject=1, unlocked at powerup, lock=1 */
1052 /* TODO: Random readable, CD read, DVD read, drive serial number,
1053 power management */
1054 return 40;
b6c251ab
PB
1055}
1056
1057static int scsi_emulate_mechanism_status(SCSIDiskState *s, uint8_t *outbuf)
1058{
1059 if (s->qdev.type != TYPE_ROM) {
1060 return -1;
1061 }
1062 memset(outbuf, 0, 8);
1063 outbuf[5] = 1; /* CD-ROM */
1064 return 8;
1065}
1066
cfc606da 1067static int mode_sense_page(SCSIDiskState *s, int page, uint8_t **p_outbuf,
282ab04e 1068 int page_control)
ebddfcbe 1069{
a8f4bbe2
PB
1070 static const int mode_sense_valid[0x3f] = {
1071 [MODE_PAGE_HD_GEOMETRY] = (1 << TYPE_DISK),
1072 [MODE_PAGE_FLEXIBLE_DISK_GEOMETRY] = (1 << TYPE_DISK),
1073 [MODE_PAGE_CACHING] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
a07c7dcd
PB
1074 [MODE_PAGE_R_W_ERROR] = (1 << TYPE_DISK) | (1 << TYPE_ROM),
1075 [MODE_PAGE_AUDIO_CTL] = (1 << TYPE_ROM),
a8f4bbe2
PB
1076 [MODE_PAGE_CAPABILITIES] = (1 << TYPE_ROM),
1077 };
ef405611
PB
1078
1079 uint8_t *p = *p_outbuf + 2;
1080 int length;
ebddfcbe 1081
a8f4bbe2
PB
1082 if ((mode_sense_valid[page] & (1 << s->qdev.type)) == 0) {
1083 return -1;
1084 }
1085
282ab04e
BK
1086 /*
1087 * If Changeable Values are requested, a mask denoting those mode parameters
1088 * that are changeable shall be returned. As we currently don't support
1089 * parameter changes via MODE_SELECT all bits are returned set to zero.
1090 * The buffer was already menset to zero by the caller of this function.
ef405611
PB
1091 *
1092 * The offsets here are off by two compared to the descriptions in the
1093 * SCSI specs, because those include a 2-byte header. This is unfortunate,
1094 * but it is done so that offsets are consistent within our implementation
1095 * of MODE SENSE and MODE SELECT. MODE SELECT has to deal with both
1096 * 2-byte and 4-byte headers.
282ab04e 1097 */
ebddfcbe 1098 switch (page) {
67cc61e4 1099 case MODE_PAGE_HD_GEOMETRY:
ef405611 1100 length = 0x16;
282ab04e 1101 if (page_control == 1) { /* Changeable Values */
cfc606da 1102 break;
282ab04e 1103 }
ebddfcbe 1104 /* if a geometry hint is available, use it */
ef405611
PB
1105 p[0] = (s->qdev.conf.cyls >> 16) & 0xff;
1106 p[1] = (s->qdev.conf.cyls >> 8) & 0xff;
1107 p[2] = s->qdev.conf.cyls & 0xff;
1108 p[3] = s->qdev.conf.heads & 0xff;
ebddfcbe 1109 /* Write precomp start cylinder, disabled */
ef405611
PB
1110 p[4] = (s->qdev.conf.cyls >> 16) & 0xff;
1111 p[5] = (s->qdev.conf.cyls >> 8) & 0xff;
1112 p[6] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1113 /* Reduced current start cylinder, disabled */
ef405611
PB
1114 p[7] = (s->qdev.conf.cyls >> 16) & 0xff;
1115 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1116 p[9] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1117 /* Device step rate [ns], 200ns */
ef405611
PB
1118 p[10] = 0;
1119 p[11] = 200;
ebddfcbe 1120 /* Landing zone cylinder */
ef405611
PB
1121 p[12] = 0xff;
1122 p[13] = 0xff;
ebddfcbe 1123 p[14] = 0xff;
ebddfcbe 1124 /* Medium rotation rate [rpm], 5400 rpm */
ef405611
PB
1125 p[18] = (5400 >> 8) & 0xff;
1126 p[19] = 5400 & 0xff;
cfc606da 1127 break;
ebddfcbe 1128
67cc61e4 1129 case MODE_PAGE_FLEXIBLE_DISK_GEOMETRY:
ef405611 1130 length = 0x1e;
282ab04e 1131 if (page_control == 1) { /* Changeable Values */
cfc606da 1132 break;
282ab04e 1133 }
ebddfcbe 1134 /* Transfer rate [kbit/s], 5Mbit/s */
ef405611
PB
1135 p[0] = 5000 >> 8;
1136 p[1] = 5000 & 0xff;
ebddfcbe 1137 /* if a geometry hint is available, use it */
ef405611
PB
1138 p[2] = s->qdev.conf.heads & 0xff;
1139 p[3] = s->qdev.conf.secs & 0xff;
1140 p[4] = s->qdev.blocksize >> 8;
1141 p[6] = (s->qdev.conf.cyls >> 8) & 0xff;
1142 p[7] = s->qdev.conf.cyls & 0xff;
1143 /* Write precomp start cylinder, disabled */
d252df48
MA
1144 p[8] = (s->qdev.conf.cyls >> 8) & 0xff;
1145 p[9] = s->qdev.conf.cyls & 0xff;
ef405611 1146 /* Reduced current start cylinder, disabled */
d252df48
MA
1147 p[10] = (s->qdev.conf.cyls >> 8) & 0xff;
1148 p[11] = s->qdev.conf.cyls & 0xff;
ebddfcbe 1149 /* Device step rate [100us], 100us */
ef405611
PB
1150 p[12] = 0;
1151 p[13] = 1;
ebddfcbe 1152 /* Device step pulse width [us], 1us */
ef405611 1153 p[14] = 1;
ebddfcbe 1154 /* Device head settle delay [100us], 100us */
ef405611
PB
1155 p[15] = 0;
1156 p[16] = 1;
ebddfcbe 1157 /* Motor on delay [0.1s], 0.1s */
ef405611 1158 p[17] = 1;
ebddfcbe 1159 /* Motor off delay [0.1s], 0.1s */
ef405611 1160 p[18] = 1;
ebddfcbe 1161 /* Medium rotation rate [rpm], 5400 rpm */
ef405611
PB
1162 p[26] = (5400 >> 8) & 0xff;
1163 p[27] = 5400 & 0xff;
cfc606da 1164 break;
ebddfcbe 1165
67cc61e4 1166 case MODE_PAGE_CACHING:
ef405611 1167 length = 0x12;
96c91bbf 1168 if (page_control == 1 || /* Changeable Values */
4be74634 1169 blk_enable_write_cache(s->qdev.conf.blk)) {
ef405611 1170 p[0] = 4; /* WCE */
ebddfcbe 1171 }
cfc606da 1172 break;
ebddfcbe 1173
a07c7dcd 1174 case MODE_PAGE_R_W_ERROR:
ef405611 1175 length = 10;
4f588b15
PB
1176 if (page_control == 1) { /* Changeable Values */
1177 break;
1178 }
ef405611 1179 p[0] = 0x80; /* Automatic Write Reallocation Enabled */
a07c7dcd 1180 if (s->qdev.type == TYPE_ROM) {
ef405611 1181 p[1] = 0x20; /* Read Retry Count */
a07c7dcd
PB
1182 }
1183 break;
1184
1185 case MODE_PAGE_AUDIO_CTL:
ef405611 1186 length = 14;
a07c7dcd
PB
1187 break;
1188
67cc61e4 1189 case MODE_PAGE_CAPABILITIES:
ef405611 1190 length = 0x14;
282ab04e 1191 if (page_control == 1) { /* Changeable Values */
cfc606da 1192 break;
282ab04e 1193 }
a07c7dcd 1194
ef405611
PB
1195 p[0] = 0x3b; /* CD-R & CD-RW read */
1196 p[1] = 0; /* Writing not supported */
1197 p[2] = 0x7f; /* Audio, composite, digital out,
ebddfcbe 1198 mode 2 form 1&2, multi session */
ef405611 1199 p[3] = 0xff; /* CD DA, DA accurate, RW supported,
ebddfcbe
GH
1200 RW corrected, C2 errors, ISRC,
1201 UPC, Bar code */
ef405611 1202 p[4] = 0x2d | (s->tray_locked ? 2 : 0);
ebddfcbe 1203 /* Locking supported, jumper present, eject, tray */
ef405611 1204 p[5] = 0; /* no volume & mute control, no
ebddfcbe 1205 changer */
ef405611
PB
1206 p[6] = (50 * 176) >> 8; /* 50x read speed */
1207 p[7] = (50 * 176) & 0xff;
1208 p[8] = 2 >> 8; /* Two volume levels */
1209 p[9] = 2 & 0xff;
1210 p[10] = 2048 >> 8; /* 2M buffer */
1211 p[11] = 2048 & 0xff;
1212 p[12] = (16 * 176) >> 8; /* 16x read speed current */
1213 p[13] = (16 * 176) & 0xff;
1214 p[16] = (16 * 176) >> 8; /* 16x write speed */
1215 p[17] = (16 * 176) & 0xff;
1216 p[18] = (16 * 176) >> 8; /* 16x write speed current */
ebddfcbe 1217 p[19] = (16 * 176) & 0xff;
cfc606da 1218 break;
ebddfcbe
GH
1219
1220 default:
cfc606da 1221 return -1;
ebddfcbe 1222 }
cfc606da 1223
ef405611
PB
1224 assert(length < 256);
1225 (*p_outbuf)[0] = page;
1226 (*p_outbuf)[1] = length;
1227 *p_outbuf += length + 2;
1228 return length + 2;
ebddfcbe
GH
1229}
1230
cfc606da 1231static int scsi_disk_emulate_mode_sense(SCSIDiskReq *r, uint8_t *outbuf)
ebddfcbe 1232{
cfc606da 1233 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
ebddfcbe 1234 uint64_t nb_sectors;
e590ecbe
PB
1235 bool dbd;
1236 int page, buflen, ret, page_control;
ebddfcbe 1237 uint8_t *p;
ce512ee1 1238 uint8_t dev_specific_param;
ebddfcbe 1239
e590ecbe 1240 dbd = (r->req.cmd.buf[1] & 0x8) != 0;
cfc606da
PB
1241 page = r->req.cmd.buf[2] & 0x3f;
1242 page_control = (r->req.cmd.buf[2] & 0xc0) >> 6;
59ee9500
LV
1243
1244 trace_scsi_disk_emulate_mode_sense((r->req.cmd.buf[0] == MODE_SENSE) ? 6 :
1245 10, page, r->req.cmd.xfer, page_control);
cfc606da 1246 memset(outbuf, 0, r->req.cmd.xfer);
ebddfcbe
GH
1247 p = outbuf;
1248
e590ecbe 1249 if (s->qdev.type == TYPE_DISK) {
da8365db 1250 dev_specific_param = s->features & (1 << SCSI_DISK_F_DPOFUA) ? 0x10 : 0;
4be74634 1251 if (blk_is_read_only(s->qdev.conf.blk)) {
e590ecbe
PB
1252 dev_specific_param |= 0x80; /* Readonly. */
1253 }
ce512ee1 1254 } else {
e590ecbe
PB
1255 /* MMC prescribes that CD/DVD drives have no block descriptors,
1256 * and defines no device-specific parameter. */
6a2de0f2 1257 dev_specific_param = 0x00;
e590ecbe 1258 dbd = true;
ce512ee1
BK
1259 }
1260
cfc606da 1261 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1262 p[1] = 0; /* Default media type. */
1263 p[2] = dev_specific_param;
1264 p[3] = 0; /* Block descriptor length. */
1265 p += 4;
1266 } else { /* MODE_SENSE_10 */
1267 p[2] = 0; /* Default media type. */
1268 p[3] = dev_specific_param;
1269 p[6] = p[7] = 0; /* Block descriptor length. */
1270 p += 8;
ebddfcbe 1271 }
ebddfcbe 1272
4be74634 1273 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
e590ecbe 1274 if (!dbd && nb_sectors) {
cfc606da 1275 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1276 outbuf[3] = 8; /* Block descriptor length */
1277 } else { /* MODE_SENSE_10 */
1278 outbuf[7] = 8; /* Block descriptor length */
1279 }
69377307 1280 nb_sectors /= (s->qdev.blocksize / 512);
f01b5931 1281 if (nb_sectors > 0xffffff) {
2488b740 1282 nb_sectors = 0;
f01b5931 1283 }
ebddfcbe
GH
1284 p[0] = 0; /* media density code */
1285 p[1] = (nb_sectors >> 16) & 0xff;
1286 p[2] = (nb_sectors >> 8) & 0xff;
1287 p[3] = nb_sectors & 0xff;
1288 p[4] = 0; /* reserved */
1289 p[5] = 0; /* bytes 5-7 are the sector size in bytes */
69377307 1290 p[6] = s->qdev.blocksize >> 8;
ebddfcbe
GH
1291 p[7] = 0;
1292 p += 8;
1293 }
1294
cfc606da
PB
1295 if (page_control == 3) {
1296 /* Saved Values */
1297 scsi_check_condition(r, SENSE_CODE(SAVING_PARAMS_NOT_SUPPORTED));
1298 return -1;
282ab04e
BK
1299 }
1300
cfc606da
PB
1301 if (page == 0x3f) {
1302 for (page = 0; page <= 0x3e; page++) {
1303 mode_sense_page(s, page, &p, page_control);
1304 }
1305 } else {
1306 ret = mode_sense_page(s, page, &p, page_control);
1307 if (ret == -1) {
1308 return -1;
1309 }
ebddfcbe
GH
1310 }
1311
1312 buflen = p - outbuf;
ce512ee1
BK
1313 /*
1314 * The mode data length field specifies the length in bytes of the
1315 * following data that is available to be transferred. The mode data
1316 * length does not include itself.
1317 */
cfc606da 1318 if (r->req.cmd.buf[0] == MODE_SENSE) {
ce512ee1
BK
1319 outbuf[0] = buflen - 1;
1320 } else { /* MODE_SENSE_10 */
1321 outbuf[0] = ((buflen - 2) >> 8) & 0xff;
1322 outbuf[1] = (buflen - 2) & 0xff;
1323 }
ebddfcbe
GH
1324 return buflen;
1325}
1326
02880f43
GH
1327static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
1328{
1329 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
02880f43
GH
1330 int start_track, format, msf, toclen;
1331 uint64_t nb_sectors;
1332
1333 msf = req->cmd.buf[1] & 2;
1334 format = req->cmd.buf[2] & 0xf;
1335 start_track = req->cmd.buf[6];
4be74634 1336 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
59ee9500 1337 trace_scsi_disk_emulate_read_toc(start_track, format, msf >> 1);
69377307 1338 nb_sectors /= s->qdev.blocksize / 512;
02880f43
GH
1339 switch (format) {
1340 case 0:
1341 toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
1342 break;
1343 case 1:
1344 /* multi session : only a single session defined */
1345 toclen = 12;
1346 memset(outbuf, 0, 12);
1347 outbuf[1] = 0x0a;
1348 outbuf[2] = 0x01;
1349 outbuf[3] = 0x01;
1350 break;
1351 case 2:
1352 toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
1353 break;
1354 default:
1355 return -1;
1356 }
02880f43
GH
1357 return toclen;
1358}
1359
68bb01f3 1360static int scsi_disk_emulate_start_stop(SCSIDiskReq *r)
bfd52647
MA
1361{
1362 SCSIRequest *req = &r->req;
1363 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1364 bool start = req->cmd.buf[4] & 1;
1365 bool loej = req->cmd.buf[4] & 2; /* load on start, eject on !start */
ae5708b3
RS
1366 int pwrcnd = req->cmd.buf[4] & 0xf0;
1367
1368 if (pwrcnd) {
1369 /* eject/load only happens for power condition == 0 */
1370 return 0;
1371 }
bfd52647 1372
b456a71c 1373 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) && loej) {
68bb01f3
MA
1374 if (!start && !s->tray_open && s->tray_locked) {
1375 scsi_check_condition(r,
4be74634 1376 blk_is_inserted(s->qdev.conf.blk)
68bb01f3
MA
1377 ? SENSE_CODE(ILLEGAL_REQ_REMOVAL_PREVENTED)
1378 : SENSE_CODE(NOT_READY_REMOVAL_PREVENTED));
1379 return -1;
fdec4404 1380 }
d88b1819
LC
1381
1382 if (s->tray_open != !start) {
4be74634 1383 blk_eject(s->qdev.conf.blk, !start);
d88b1819
LC
1384 s->tray_open = !start;
1385 }
bfd52647 1386 }
68bb01f3 1387 return 0;
bfd52647
MA
1388}
1389
314a3299
PB
1390static void scsi_disk_emulate_read_data(SCSIRequest *req)
1391{
1392 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1393 int buflen = r->iov.iov_len;
1394
1395 if (buflen) {
59ee9500 1396 trace_scsi_disk_emulate_read_data(buflen);
314a3299
PB
1397 r->iov.iov_len = 0;
1398 r->started = true;
1399 scsi_req_data(&r->req, buflen);
1400 return;
1401 }
1402
1403 /* This also clears the sense buffer for REQUEST SENSE. */
1404 scsi_req_complete(&r->req, GOOD);
1405}
1406
380feaff
PB
1407static int scsi_disk_check_mode_select(SCSIDiskState *s, int page,
1408 uint8_t *inbuf, int inlen)
1409{
1410 uint8_t mode_current[SCSI_MAX_MODE_LEN];
1411 uint8_t mode_changeable[SCSI_MAX_MODE_LEN];
1412 uint8_t *p;
1413 int len, expected_len, changeable_len, i;
1414
1415 /* The input buffer does not include the page header, so it is
1416 * off by 2 bytes.
1417 */
1418 expected_len = inlen + 2;
1419 if (expected_len > SCSI_MAX_MODE_LEN) {
1420 return -1;
1421 }
1422
1423 p = mode_current;
1424 memset(mode_current, 0, inlen + 2);
1425 len = mode_sense_page(s, page, &p, 0);
1426 if (len < 0 || len != expected_len) {
1427 return -1;
1428 }
1429
1430 p = mode_changeable;
1431 memset(mode_changeable, 0, inlen + 2);
1432 changeable_len = mode_sense_page(s, page, &p, 1);
1433 assert(changeable_len == len);
1434
1435 /* Check that unchangeable bits are the same as what MODE SENSE
1436 * would return.
1437 */
1438 for (i = 2; i < len; i++) {
1439 if (((mode_current[i] ^ inbuf[i - 2]) & ~mode_changeable[i]) != 0) {
1440 return -1;
1441 }
1442 }
1443 return 0;
1444}
1445
1446static void scsi_disk_apply_mode_select(SCSIDiskState *s, int page, uint8_t *p)
1447{
96c91bbf
PB
1448 switch (page) {
1449 case MODE_PAGE_CACHING:
4be74634 1450 blk_set_enable_write_cache(s->qdev.conf.blk, (p[0] & 4) != 0);
96c91bbf
PB
1451 break;
1452
1453 default:
1454 break;
1455 }
380feaff
PB
1456}
1457
1458static int mode_select_pages(SCSIDiskReq *r, uint8_t *p, int len, bool change)
1459{
1460 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1461
1462 while (len > 0) {
1463 int page, subpage, page_len;
1464
1465 /* Parse both possible formats for the mode page headers. */
1466 page = p[0] & 0x3f;
1467 if (p[0] & 0x40) {
1468 if (len < 4) {
1469 goto invalid_param_len;
1470 }
1471 subpage = p[1];
1472 page_len = lduw_be_p(&p[2]);
1473 p += 4;
1474 len -= 4;
1475 } else {
1476 if (len < 2) {
1477 goto invalid_param_len;
1478 }
1479 subpage = 0;
1480 page_len = p[1];
1481 p += 2;
1482 len -= 2;
1483 }
1484
1485 if (subpage) {
1486 goto invalid_param;
1487 }
1488 if (page_len > len) {
1489 goto invalid_param_len;
1490 }
1491
1492 if (!change) {
1493 if (scsi_disk_check_mode_select(s, page, p, page_len) < 0) {
1494 goto invalid_param;
1495 }
1496 } else {
1497 scsi_disk_apply_mode_select(s, page, p);
1498 }
1499
1500 p += page_len;
1501 len -= page_len;
1502 }
1503 return 0;
1504
1505invalid_param:
1506 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM));
1507 return -1;
1508
1509invalid_param_len:
1510 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1511 return -1;
1512}
1513
1514static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf)
1515{
accfeb2d 1516 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
380feaff
PB
1517 uint8_t *p = inbuf;
1518 int cmd = r->req.cmd.buf[0];
1519 int len = r->req.cmd.xfer;
1520 int hdr_len = (cmd == MODE_SELECT ? 4 : 8);
1521 int bd_len;
1522 int pass;
1523
1524 /* We only support PF=1, SP=0. */
1525 if ((r->req.cmd.buf[1] & 0x11) != 0x10) {
1526 goto invalid_field;
1527 }
1528
1529 if (len < hdr_len) {
1530 goto invalid_param_len;
1531 }
1532
1533 bd_len = (cmd == MODE_SELECT ? p[3] : lduw_be_p(&p[6]));
1534 len -= hdr_len;
1535 p += hdr_len;
1536 if (len < bd_len) {
1537 goto invalid_param_len;
1538 }
1539 if (bd_len != 0 && bd_len != 8) {
1540 goto invalid_param;
1541 }
1542
1543 len -= bd_len;
1544 p += bd_len;
1545
1546 /* Ensure no change is made if there is an error! */
1547 for (pass = 0; pass < 2; pass++) {
1548 if (mode_select_pages(r, p, len, pass == 1) < 0) {
1549 assert(pass == 0);
1550 return;
1551 }
1552 }
4be74634 1553 if (!blk_enable_write_cache(s->qdev.conf.blk)) {
accfeb2d
PB
1554 /* The request is used as the AIO opaque value, so add a ref. */
1555 scsi_req_ref(&r->req);
4be74634 1556 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 1557 BLOCK_ACCT_FLUSH);
4be74634 1558 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
accfeb2d
PB
1559 return;
1560 }
1561
380feaff
PB
1562 scsi_req_complete(&r->req, GOOD);
1563 return;
1564
1565invalid_param:
1566 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM));
1567 return;
1568
1569invalid_param_len:
1570 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
1571 return;
1572
1573invalid_field:
1574 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
380feaff
PB
1575}
1576
444bc908
PB
1577static inline bool check_lba_range(SCSIDiskState *s,
1578 uint64_t sector_num, uint32_t nb_sectors)
1579{
1580 /*
1581 * The first line tests that no overflow happens when computing the last
1582 * sector. The second line tests that the last accessed sector is in
1583 * range.
12ca76fc
PB
1584 *
1585 * Careful, the computations should not underflow for nb_sectors == 0,
1586 * and a 0-block read to the first LBA beyond the end of device is
1587 * valid.
444bc908
PB
1588 */
1589 return (sector_num <= sector_num + nb_sectors &&
12ca76fc 1590 sector_num + nb_sectors <= s->qdev.max_lba + 1);
444bc908
PB
1591}
1592
5222aaf2
PB
1593typedef struct UnmapCBData {
1594 SCSIDiskReq *r;
1595 uint8_t *inbuf;
1596 int count;
1597} UnmapCBData;
1598
5fd2b563
PB
1599static void scsi_unmap_complete(void *opaque, int ret);
1600
1601static void scsi_unmap_complete_noio(UnmapCBData *data, int ret)
5222aaf2 1602{
5222aaf2
PB
1603 SCSIDiskReq *r = data->r;
1604 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1605 uint64_t sector_num;
5bb0b62e 1606 uint32_t nb_sectors;
5222aaf2 1607
5fd2b563 1608 assert(r->req.aiocb == NULL);
5b956f41 1609 if (scsi_disk_req_check_error(r, ret, false)) {
d0242ead
PB
1610 goto done;
1611 }
1612
d0242ead 1613 if (data->count > 0) {
5222aaf2
PB
1614 sector_num = ldq_be_p(&data->inbuf[0]);
1615 nb_sectors = ldl_be_p(&data->inbuf[8]) & 0xffffffffULL;
444bc908 1616 if (!check_lba_range(s, sector_num, nb_sectors)) {
5222aaf2
PB
1617 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1618 goto done;
1619 }
1620
1c6c4bb7
EB
1621 r->req.aiocb = blk_aio_pdiscard(s->qdev.conf.blk,
1622 sector_num * s->qdev.blocksize,
1623 nb_sectors * s->qdev.blocksize,
1624 scsi_unmap_complete, data);
5222aaf2
PB
1625 data->count--;
1626 data->inbuf += 16;
1627 return;
1628 }
1629
d0242ead
PB
1630 scsi_req_complete(&r->req, GOOD);
1631
5222aaf2 1632done:
3df9caf8 1633 scsi_req_unref(&r->req);
5222aaf2
PB
1634 g_free(data);
1635}
1636
5fd2b563
PB
1637static void scsi_unmap_complete(void *opaque, int ret)
1638{
1639 UnmapCBData *data = opaque;
1640 SCSIDiskReq *r = data->r;
b9e413dd 1641 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
5fd2b563
PB
1642
1643 assert(r->req.aiocb != NULL);
1644 r->req.aiocb = NULL;
1645
b9e413dd 1646 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563 1647 scsi_unmap_complete_noio(data, ret);
b9e413dd 1648 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
5fd2b563
PB
1649}
1650
5222aaf2
PB
1651static void scsi_disk_emulate_unmap(SCSIDiskReq *r, uint8_t *inbuf)
1652{
c5fd1fb0 1653 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
5222aaf2
PB
1654 uint8_t *p = inbuf;
1655 int len = r->req.cmd.xfer;
1656 UnmapCBData *data;
1657
823bd739
PB
1658 /* Reject ANCHOR=1. */
1659 if (r->req.cmd.buf[1] & 0x1) {
1660 goto invalid_field;
1661 }
1662
5222aaf2
PB
1663 if (len < 8) {
1664 goto invalid_param_len;
1665 }
1666 if (len < lduw_be_p(&p[0]) + 2) {
1667 goto invalid_param_len;
1668 }
1669 if (len < lduw_be_p(&p[2]) + 8) {
1670 goto invalid_param_len;
1671 }
1672 if (lduw_be_p(&p[2]) & 15) {
1673 goto invalid_param_len;
1674 }
1675
4be74634 1676 if (blk_is_read_only(s->qdev.conf.blk)) {
c5fd1fb0
PB
1677 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
1678 return;
1679 }
1680
5222aaf2
PB
1681 data = g_new0(UnmapCBData, 1);
1682 data->r = r;
1683 data->inbuf = &p[8];
1684 data->count = lduw_be_p(&p[2]) >> 4;
1685
1686 /* The matching unref is in scsi_unmap_complete, before data is freed. */
1687 scsi_req_ref(&r->req);
5fd2b563 1688 scsi_unmap_complete_noio(data, 0);
5222aaf2
PB
1689 return;
1690
1691invalid_param_len:
1692 scsi_check_condition(r, SENSE_CODE(INVALID_PARAM_LEN));
823bd739
PB
1693 return;
1694
1695invalid_field:
1696 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
5222aaf2
PB
1697}
1698
84f94a9a
PB
1699typedef struct WriteSameCBData {
1700 SCSIDiskReq *r;
1701 int64_t sector;
1702 int nb_sectors;
1703 QEMUIOVector qiov;
1704 struct iovec iov;
1705} WriteSameCBData;
1706
1707static void scsi_write_same_complete(void *opaque, int ret)
1708{
1709 WriteSameCBData *data = opaque;
1710 SCSIDiskReq *r = data->r;
1711 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
1712
1713 assert(r->req.aiocb != NULL);
1714 r->req.aiocb = NULL;
b9e413dd 1715 aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
5b956f41 1716 if (scsi_disk_req_check_error(r, ret, true)) {
84f94a9a
PB
1717 goto done;
1718 }
1719
d7628080
AG
1720 block_acct_done(blk_get_stats(s->qdev.conf.blk), &r->acct);
1721
84f94a9a
PB
1722 data->nb_sectors -= data->iov.iov_len / 512;
1723 data->sector += data->iov.iov_len / 512;
1724 data->iov.iov_len = MIN(data->nb_sectors * 512, data->iov.iov_len);
1725 if (data->iov.iov_len) {
4be74634 1726 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
5366d0c8 1727 data->iov.iov_len, BLOCK_ACCT_WRITE);
03c90063
EB
1728 /* Reinitialize qiov, to handle unaligned WRITE SAME request
1729 * where final qiov may need smaller size */
a56537a1 1730 qemu_iovec_init_external(&data->qiov, &data->iov, 1);
03c90063
EB
1731 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
1732 data->sector << BDRV_SECTOR_BITS,
1733 &data->qiov, 0,
1734 scsi_write_same_complete, data);
24355b79 1735 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
84f94a9a
PB
1736 return;
1737 }
1738
1739 scsi_req_complete(&r->req, GOOD);
1740
1741done:
3df9caf8 1742 scsi_req_unref(&r->req);
84f94a9a
PB
1743 qemu_vfree(data->iov.iov_base);
1744 g_free(data);
b9e413dd 1745 aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
84f94a9a
PB
1746}
1747
1748static void scsi_disk_emulate_write_same(SCSIDiskReq *r, uint8_t *inbuf)
1749{
1750 SCSIRequest *req = &r->req;
1751 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
1894df02 1752 uint32_t nb_sectors = scsi_data_cdb_xfer(r->req.cmd.buf);
84f94a9a
PB
1753 WriteSameCBData *data;
1754 uint8_t *buf;
1755 int i;
1756
1757 /* Fail if PBDATA=1 or LBDATA=1 or ANCHOR=1. */
1758 if (nb_sectors == 0 || (req->cmd.buf[1] & 0x16)) {
1759 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1760 return;
1761 }
1762
4be74634 1763 if (blk_is_read_only(s->qdev.conf.blk)) {
84f94a9a
PB
1764 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
1765 return;
1766 }
1767 if (!check_lba_range(s, r->req.cmd.lba, nb_sectors)) {
1768 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
1769 return;
1770 }
1771
4397a018 1772 if ((req->cmd.buf[1] & 0x1) || buffer_is_zero(inbuf, s->qdev.blocksize)) {
84f94a9a
PB
1773 int flags = (req->cmd.buf[1] & 0x8) ? BDRV_REQ_MAY_UNMAP : 0;
1774
1775 /* The request is used as the AIO opaque value, so add a ref. */
1776 scsi_req_ref(&r->req);
4be74634 1777 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
5366d0c8
BC
1778 nb_sectors * s->qdev.blocksize,
1779 BLOCK_ACCT_WRITE);
d004bd52 1780 r->req.aiocb = blk_aio_pwrite_zeroes(s->qdev.conf.blk,
983a1600
EB
1781 r->req.cmd.lba * s->qdev.blocksize,
1782 nb_sectors * s->qdev.blocksize,
4be74634 1783 flags, scsi_aio_complete, r);
84f94a9a
PB
1784 return;
1785 }
1786
1787 data = g_new0(WriteSameCBData, 1);
1788 data->r = r;
1789 data->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
1790 data->nb_sectors = nb_sectors * (s->qdev.blocksize / 512);
1791 data->iov.iov_len = MIN(data->nb_sectors * 512, SCSI_WRITE_SAME_MAX);
4be74634
MA
1792 data->iov.iov_base = buf = blk_blockalign(s->qdev.conf.blk,
1793 data->iov.iov_len);
84f94a9a
PB
1794 qemu_iovec_init_external(&data->qiov, &data->iov, 1);
1795
1796 for (i = 0; i < data->iov.iov_len; i += s->qdev.blocksize) {
1797 memcpy(&buf[i], inbuf, s->qdev.blocksize);
1798 }
1799
1800 scsi_req_ref(&r->req);
4be74634 1801 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
5366d0c8 1802 data->iov.iov_len, BLOCK_ACCT_WRITE);
03c90063
EB
1803 r->req.aiocb = blk_aio_pwritev(s->qdev.conf.blk,
1804 data->sector << BDRV_SECTOR_BITS,
1805 &data->qiov, 0,
1806 scsi_write_same_complete, data);
84f94a9a
PB
1807}
1808
314a3299
PB
1809static void scsi_disk_emulate_write_data(SCSIRequest *req)
1810{
af6d510d
PB
1811 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
1812
1813 if (r->iov.iov_len) {
1814 int buflen = r->iov.iov_len;
59ee9500 1815 trace_scsi_disk_emulate_write_data(buflen);
af6d510d
PB
1816 r->iov.iov_len = 0;
1817 scsi_req_data(&r->req, buflen);
1818 return;
1819 }
1820
1821 switch (req->cmd.buf[0]) {
1822 case MODE_SELECT:
1823 case MODE_SELECT_10:
1824 /* This also clears the sense buffer for REQUEST SENSE. */
380feaff 1825 scsi_disk_emulate_mode_select(r, r->iov.iov_base);
af6d510d
PB
1826 break;
1827
5222aaf2
PB
1828 case UNMAP:
1829 scsi_disk_emulate_unmap(r, r->iov.iov_base);
1830 break;
1831
d97e7730
PB
1832 case VERIFY_10:
1833 case VERIFY_12:
1834 case VERIFY_16:
1835 if (r->req.status == -1) {
1836 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
1837 }
1838 break;
1839
84f94a9a
PB
1840 case WRITE_SAME_10:
1841 case WRITE_SAME_16:
1842 scsi_disk_emulate_write_same(r, r->iov.iov_base);
1843 break;
d97e7730 1844
af6d510d
PB
1845 default:
1846 abort();
1847 }
314a3299
PB
1848}
1849
b08d0ea0 1850static int32_t scsi_disk_emulate_command(SCSIRequest *req, uint8_t *buf)
aa5dbdc1 1851{
b08d0ea0 1852 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
e7e25e32 1853 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
e7e25e32 1854 uint64_t nb_sectors;
7285477a 1855 uint8_t *outbuf;
af6d510d 1856 int buflen;
aa5dbdc1 1857
b08d0ea0
PB
1858 switch (req->cmd.buf[0]) {
1859 case INQUIRY:
1860 case MODE_SENSE:
1861 case MODE_SENSE_10:
1862 case RESERVE:
1863 case RESERVE_10:
1864 case RELEASE:
1865 case RELEASE_10:
1866 case START_STOP:
1867 case ALLOW_MEDIUM_REMOVAL:
1868 case GET_CONFIGURATION:
1869 case GET_EVENT_STATUS_NOTIFICATION:
1870 case MECHANISM_STATUS:
1871 case REQUEST_SENSE:
1872 break;
1873
1874 default:
cd723b85 1875 if (!blk_is_available(s->qdev.conf.blk)) {
b08d0ea0
PB
1876 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
1877 return 0;
1878 }
1879 break;
1880 }
1881
c8dcb531
PB
1882 /*
1883 * FIXME: we shouldn't return anything bigger than 4k, but the code
1884 * requires the buffer to be as big as req->cmd.xfer in several
1885 * places. So, do not allow CDBs with a very large ALLOCATION
1886 * LENGTH. The real fix would be to modify scsi_read_data and
1887 * dma_buf_read, so that they return data beyond the buflen
1888 * as all zeros.
1889 */
1890 if (req->cmd.xfer > 65536) {
1891 goto illegal_request;
1892 }
1893 r->buflen = MAX(4096, req->cmd.xfer);
1894
7285477a 1895 if (!r->iov.iov_base) {
4be74634 1896 r->iov.iov_base = blk_blockalign(s->qdev.conf.blk, r->buflen);
7285477a
PB
1897 }
1898
af6d510d 1899 buflen = req->cmd.xfer;
7285477a 1900 outbuf = r->iov.iov_base;
c8dcb531 1901 memset(outbuf, 0, r->buflen);
aa5dbdc1
GH
1902 switch (req->cmd.buf[0]) {
1903 case TEST_UNIT_READY:
cd723b85 1904 assert(blk_is_available(s->qdev.conf.blk));
5f71d32f 1905 break;
0b06c059
GH
1906 case INQUIRY:
1907 buflen = scsi_disk_emulate_inquiry(req, outbuf);
f01b5931 1908 if (buflen < 0) {
0b06c059 1909 goto illegal_request;
f01b5931 1910 }
5f71d32f 1911 break;
ebddfcbe
GH
1912 case MODE_SENSE:
1913 case MODE_SENSE_10:
cfc606da 1914 buflen = scsi_disk_emulate_mode_sense(r, outbuf);
f01b5931 1915 if (buflen < 0) {
ebddfcbe 1916 goto illegal_request;
f01b5931 1917 }
ebddfcbe 1918 break;
02880f43
GH
1919 case READ_TOC:
1920 buflen = scsi_disk_emulate_read_toc(req, outbuf);
f01b5931 1921 if (buflen < 0) {
02880f43 1922 goto illegal_request;
f01b5931 1923 }
02880f43 1924 break;
3d53ba18 1925 case RESERVE:
f01b5931 1926 if (req->cmd.buf[1] & 1) {
3d53ba18 1927 goto illegal_request;
f01b5931 1928 }
3d53ba18
GH
1929 break;
1930 case RESERVE_10:
f01b5931 1931 if (req->cmd.buf[1] & 3) {
3d53ba18 1932 goto illegal_request;
f01b5931 1933 }
3d53ba18
GH
1934 break;
1935 case RELEASE:
f01b5931 1936 if (req->cmd.buf[1] & 1) {
3d53ba18 1937 goto illegal_request;
f01b5931 1938 }
3d53ba18
GH
1939 break;
1940 case RELEASE_10:
f01b5931 1941 if (req->cmd.buf[1] & 3) {
3d53ba18 1942 goto illegal_request;
f01b5931 1943 }
3d53ba18 1944 break;
8d3628ff 1945 case START_STOP:
68bb01f3 1946 if (scsi_disk_emulate_start_stop(r) < 0) {
b08d0ea0 1947 return 0;
68bb01f3 1948 }
5f71d32f 1949 break;
c68b9f34 1950 case ALLOW_MEDIUM_REMOVAL:
81b1008d 1951 s->tray_locked = req->cmd.buf[4] & 1;
4be74634 1952 blk_lock_medium(s->qdev.conf.blk, req->cmd.buf[4] & 1);
5f71d32f 1953 break;
5e30a07d 1954 case READ_CAPACITY_10:
e7e25e32 1955 /* The normal LEN field for this command is zero. */
5f71d32f 1956 memset(outbuf, 0, 8);
4be74634 1957 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
f01b5931 1958 if (!nb_sectors) {
9bcaf4fe 1959 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
0369f06f 1960 return 0;
f01b5931 1961 }
7cec78b6
PB
1962 if ((req->cmd.buf[8] & 1) == 0 && req->cmd.lba) {
1963 goto illegal_request;
1964 }
69377307 1965 nb_sectors /= s->qdev.blocksize / 512;
e7e25e32
GH
1966 /* Returned value is the address of the last sector. */
1967 nb_sectors--;
1968 /* Remember the new size for read/write sanity checking. */
7877903a 1969 s->qdev.max_lba = nb_sectors;
e7e25e32 1970 /* Clip to 2TB, instead of returning capacity modulo 2TB. */
f01b5931 1971 if (nb_sectors > UINT32_MAX) {
e7e25e32 1972 nb_sectors = UINT32_MAX;
f01b5931 1973 }
e7e25e32
GH
1974 outbuf[0] = (nb_sectors >> 24) & 0xff;
1975 outbuf[1] = (nb_sectors >> 16) & 0xff;
1976 outbuf[2] = (nb_sectors >> 8) & 0xff;
1977 outbuf[3] = nb_sectors & 0xff;
1978 outbuf[4] = 0;
1979 outbuf[5] = 0;
69377307 1980 outbuf[6] = s->qdev.blocksize >> 8;
e7e25e32 1981 outbuf[7] = 0;
5f71d32f 1982 break;
f3b338ef
PB
1983 case REQUEST_SENSE:
1984 /* Just return "NO SENSE". */
37b6045c
PB
1985 buflen = scsi_convert_sense(NULL, 0, outbuf, r->buflen,
1986 (req->cmd.buf[1] & 1) == 0);
c8dcb531
PB
1987 if (buflen < 0) {
1988 goto illegal_request;
1989 }
f3b338ef 1990 break;
b6c251ab
PB
1991 case MECHANISM_STATUS:
1992 buflen = scsi_emulate_mechanism_status(s, outbuf);
1993 if (buflen < 0) {
1994 goto illegal_request;
1995 }
1996 break;
38215553 1997 case GET_CONFIGURATION:
430ee2f2 1998 buflen = scsi_get_configuration(s, outbuf);
b6c251ab
PB
1999 if (buflen < 0) {
2000 goto illegal_request;
2001 }
2002 break;
2003 case GET_EVENT_STATUS_NOTIFICATION:
2004 buflen = scsi_get_event_status_notification(s, r, outbuf);
2005 if (buflen < 0) {
2006 goto illegal_request;
2007 }
2008 break;
1a4f0c3a
PB
2009 case READ_DISC_INFORMATION:
2010 buflen = scsi_read_disc_information(s, r, outbuf);
2011 if (buflen < 0) {
2012 goto illegal_request;
2013 }
2014 break;
b6c251ab
PB
2015 case READ_DVD_STRUCTURE:
2016 buflen = scsi_read_dvd_structure(s, r, outbuf);
2017 if (buflen < 0) {
2018 goto illegal_request;
2019 }
38215553 2020 break;
f6515262 2021 case SERVICE_ACTION_IN_16:
5dd90e2a 2022 /* Service Action In subcommands. */
f6515262 2023 if ((req->cmd.buf[1] & 31) == SAI_READ_CAPACITY_16) {
59ee9500 2024 trace_scsi_disk_emulate_command_SAI_16();
5dd90e2a 2025 memset(outbuf, 0, req->cmd.xfer);
4be74634 2026 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
f01b5931 2027 if (!nb_sectors) {
9bcaf4fe 2028 scsi_check_condition(r, SENSE_CODE(LUN_NOT_READY));
0369f06f 2029 return 0;
f01b5931 2030 }
7cec78b6
PB
2031 if ((req->cmd.buf[14] & 1) == 0 && req->cmd.lba) {
2032 goto illegal_request;
2033 }
69377307 2034 nb_sectors /= s->qdev.blocksize / 512;
5dd90e2a
GH
2035 /* Returned value is the address of the last sector. */
2036 nb_sectors--;
2037 /* Remember the new size for read/write sanity checking. */
7877903a 2038 s->qdev.max_lba = nb_sectors;
5dd90e2a
GH
2039 outbuf[0] = (nb_sectors >> 56) & 0xff;
2040 outbuf[1] = (nb_sectors >> 48) & 0xff;
2041 outbuf[2] = (nb_sectors >> 40) & 0xff;
2042 outbuf[3] = (nb_sectors >> 32) & 0xff;
2043 outbuf[4] = (nb_sectors >> 24) & 0xff;
2044 outbuf[5] = (nb_sectors >> 16) & 0xff;
2045 outbuf[6] = (nb_sectors >> 8) & 0xff;
2046 outbuf[7] = nb_sectors & 0xff;
2047 outbuf[8] = 0;
2048 outbuf[9] = 0;
69377307 2049 outbuf[10] = s->qdev.blocksize >> 8;
5dd90e2a 2050 outbuf[11] = 0;
ee3659e3
CH
2051 outbuf[12] = 0;
2052 outbuf[13] = get_physical_block_exp(&s->qdev.conf);
ea3bd56f
CH
2053
2054 /* set TPE bit if the format supports discard */
2055 if (s->qdev.conf.discard_granularity) {
2056 outbuf[14] = 0x80;
2057 }
2058
5dd90e2a 2059 /* Protection, exponent and lowest lba field left blank. */
5dd90e2a
GH
2060 break;
2061 }
59ee9500 2062 trace_scsi_disk_emulate_command_SAI_unsupported();
5dd90e2a 2063 goto illegal_request;
101aa85f
PB
2064 case SYNCHRONIZE_CACHE:
2065 /* The request is used as the AIO opaque value, so add a ref. */
2066 scsi_req_ref(&r->req);
4be74634 2067 block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct, 0,
5366d0c8 2068 BLOCK_ACCT_FLUSH);
4be74634 2069 r->req.aiocb = blk_aio_flush(s->qdev.conf.blk, scsi_aio_complete, r);
101aa85f
PB
2070 return 0;
2071 case SEEK_10:
59ee9500 2072 trace_scsi_disk_emulate_command_SEEK_10(r->req.cmd.lba);
101aa85f
PB
2073 if (r->req.cmd.lba > s->qdev.max_lba) {
2074 goto illegal_lba;
2075 }
2076 break;
101aa85f 2077 case MODE_SELECT:
59ee9500 2078 trace_scsi_disk_emulate_command_MODE_SELECT(r->req.cmd.xfer);
101aa85f
PB
2079 break;
2080 case MODE_SELECT_10:
59ee9500 2081 trace_scsi_disk_emulate_command_MODE_SELECT_10(r->req.cmd.xfer);
101aa85f 2082 break;
5222aaf2 2083 case UNMAP:
59ee9500 2084 trace_scsi_disk_emulate_command_UNMAP(r->req.cmd.xfer);
5222aaf2 2085 break;
d97e7730
PB
2086 case VERIFY_10:
2087 case VERIFY_12:
2088 case VERIFY_16:
59ee9500 2089 trace_scsi_disk_emulate_command_VERIFY((req->cmd.buf[1] >> 1) & 3);
d97e7730
PB
2090 if (req->cmd.buf[1] & 6) {
2091 goto illegal_request;
2092 }
2093 break;
101aa85f 2094 case WRITE_SAME_10:
101aa85f 2095 case WRITE_SAME_16:
59ee9500
LV
2096 trace_scsi_disk_emulate_command_WRITE_SAME(
2097 req->cmd.buf[0] == WRITE_SAME_10 ? 10 : 16, r->req.cmd.xfer);
84f94a9a 2098 break;
aa5dbdc1 2099 default:
59ee9500
LV
2100 trace_scsi_disk_emulate_command_UNKNOWN(buf[0],
2101 scsi_command_name(buf[0]));
b45ef674 2102 scsi_check_condition(r, SENSE_CODE(INVALID_OPCODE));
b08d0ea0 2103 return 0;
aa5dbdc1 2104 }
314a3299 2105 assert(!r->req.aiocb);
c8dcb531 2106 r->iov.iov_len = MIN(r->buflen, req->cmd.xfer);
b08d0ea0
PB
2107 if (r->iov.iov_len == 0) {
2108 scsi_req_complete(&r->req, GOOD);
2109 }
af6d510d
PB
2110 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
2111 assert(r->iov.iov_len == req->cmd.xfer);
2112 return -r->iov.iov_len;
2113 } else {
2114 return r->iov.iov_len;
2115 }
aa5dbdc1 2116
aa5dbdc1 2117illegal_request:
cfc606da
PB
2118 if (r->req.status == -1) {
2119 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2120 }
b08d0ea0 2121 return 0;
101aa85f
PB
2122
2123illegal_lba:
2124 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
2125 return 0;
aa5dbdc1
GH
2126}
2127
2e5d83bb
PB
2128/* Execute a scsi command. Returns the length of the data expected by the
2129 command. This will be Positive for data transfers from the device
2130 (eg. disk reads), negative for transfers to the device (eg. disk writes),
2131 and zero if the command does not transfer any data. */
2132
b08d0ea0 2133static int32_t scsi_disk_dma_command(SCSIRequest *req, uint8_t *buf)
2e5d83bb 2134{
5c6c0e51
HR
2135 SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
2136 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
94f8ba11 2137 SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
e93176d5 2138 uint32_t len;
a917d384 2139 uint8_t command;
a917d384
PB
2140
2141 command = buf[0];
aa5dbdc1 2142
cd723b85 2143 if (!blk_is_available(s->qdev.conf.blk)) {
b08d0ea0
PB
2144 scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
2145 return 0;
9bcaf4fe
PB
2146 }
2147
1894df02 2148 len = scsi_data_cdb_xfer(r->req.cmd.buf);
a917d384 2149 switch (command) {
ebf46023
GH
2150 case READ_6:
2151 case READ_10:
bd536cf3
GH
2152 case READ_12:
2153 case READ_16:
59ee9500 2154 trace_scsi_disk_dma_command_READ(r->req.cmd.lba, len);
2343be0d
PB
2155 /* Protection information is not supported. For SCSI versions 2 and
2156 * older (as determined by snooping the guest's INQUIRY commands),
2157 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2158 */
2159 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) {
96bdbbab
RS
2160 goto illegal_request;
2161 }
444bc908 2162 if (!check_lba_range(s, r->req.cmd.lba, len)) {
274fb0e1 2163 goto illegal_lba;
f01b5931 2164 }
69377307
PB
2165 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
2166 r->sector_count = len * (s->qdev.blocksize / 512);
2e5d83bb 2167 break;
ebf46023
GH
2168 case WRITE_6:
2169 case WRITE_10:
bd536cf3
GH
2170 case WRITE_12:
2171 case WRITE_16:
5e30a07d 2172 case WRITE_VERIFY_10:
ebef0bbb
BK
2173 case WRITE_VERIFY_12:
2174 case WRITE_VERIFY_16:
4be74634 2175 if (blk_is_read_only(s->qdev.conf.blk)) {
6a8a685c
RS
2176 scsi_check_condition(r, SENSE_CODE(WRITE_PROTECTED));
2177 return 0;
2178 }
59ee9500 2179 trace_scsi_disk_dma_command_WRITE(
2dd791b6
HR
2180 (command & 0xe) == 0xe ? "And Verify " : "",
2181 r->req.cmd.lba, len);
4f04560b 2182 /* fall through */
166dbda7
PB
2183 case VERIFY_10:
2184 case VERIFY_12:
2185 case VERIFY_16:
2186 /* We get here only for BYTCHK == 0x01 and only for scsi-block.
2187 * As far as DMA is concerned, we can treat it the same as a write;
2188 * scsi_block_do_sgio will send VERIFY commands.
2189 */
2343be0d 2190 if (s->qdev.scsi_version > 2 && (r->req.cmd.buf[1] & 0xe0)) {
96bdbbab
RS
2191 goto illegal_request;
2192 }
444bc908 2193 if (!check_lba_range(s, r->req.cmd.lba, len)) {
274fb0e1 2194 goto illegal_lba;
f01b5931 2195 }
69377307
PB
2196 r->sector = r->req.cmd.lba * (s->qdev.blocksize / 512);
2197 r->sector_count = len * (s->qdev.blocksize / 512);
2e5d83bb 2198 break;
101aa85f 2199 default:
b08d0ea0 2200 abort();
96bdbbab
RS
2201 illegal_request:
2202 scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
2203 return 0;
274fb0e1 2204 illegal_lba:
b45ef674 2205 scsi_check_condition(r, SENSE_CODE(LBA_OUT_OF_RANGE));
274fb0e1 2206 return 0;
2e5d83bb 2207 }
94f8ba11 2208 r->need_fua_emulation = sdc->need_fua_emulation(&r->req.cmd);
b08d0ea0 2209 if (r->sector_count == 0) {
b45ef674 2210 scsi_req_complete(&r->req, GOOD);
a917d384 2211 }
b08d0ea0 2212 assert(r->iov.iov_len == 0);
efb9ee02 2213 if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
b08d0ea0 2214 return -r->sector_count * 512;
a917d384 2215 } else {
b08d0ea0 2216 return r->sector_count * 512;
2e5d83bb 2217 }
2e5d83bb
PB
2218}
2219
e9447f35
JK
2220static void scsi_disk_reset(DeviceState *dev)
2221{
2222 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
2223 uint64_t nb_sectors;
2224
c7b48872 2225 scsi_device_purge_requests(&s->qdev, SENSE_CODE(RESET));
e9447f35 2226
4be74634 2227 blk_get_geometry(s->qdev.conf.blk, &nb_sectors);
69377307 2228 nb_sectors /= s->qdev.blocksize / 512;
e9447f35
JK
2229 if (nb_sectors) {
2230 nb_sectors--;
2231 }
7877903a 2232 s->qdev.max_lba = nb_sectors;
7721c7f7
PH
2233 /* reset tray statuses */
2234 s->tray_locked = 0;
2235 s->tray_open = 0;
2343be0d
PB
2236
2237 s->qdev.scsi_version = s->qdev.default_scsi_version;
e9447f35
JK
2238}
2239
aaebacef
PB
2240static void scsi_disk_resize_cb(void *opaque)
2241{
2242 SCSIDiskState *s = opaque;
2243
2244 /* SPC lists this sense code as available only for
2245 * direct-access devices.
2246 */
2247 if (s->qdev.type == TYPE_DISK) {
53200fad 2248 scsi_device_report_change(&s->qdev, SENSE_CODE(CAPACITY_CHANGED));
aaebacef
PB
2249 }
2250}
2251
39829a01 2252static void scsi_cd_change_media_cb(void *opaque, bool load, Error **errp)
2c6942fa 2253{
8a9c16f6
PB
2254 SCSIDiskState *s = opaque;
2255
2256 /*
2257 * When a CD gets changed, we have to report an ejected state and
2258 * then a loaded state to guests so that they detect tray
2259 * open/close and media change events. Guests that do not use
2260 * GET_EVENT_STATUS_NOTIFICATION to detect such tray open/close
2261 * states rely on this behavior.
2262 *
2263 * media_changed governs the state machine used for unit attention
2264 * report. media_event is used by GET EVENT STATUS NOTIFICATION.
2265 */
2266 s->media_changed = load;
2267 s->tray_open = !load;
e48e84ea 2268 scsi_device_set_ua(&s->qdev, SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM));
3c2f7c12 2269 s->media_event = true;
4480de19
PB
2270 s->eject_request = false;
2271}
2272
2273static void scsi_cd_eject_request_cb(void *opaque, bool force)
2274{
2275 SCSIDiskState *s = opaque;
2276
2277 s->eject_request = true;
2278 if (force) {
2279 s->tray_locked = false;
2280 }
2c6942fa
MA
2281}
2282
e4def80b
MA
2283static bool scsi_cd_is_tray_open(void *opaque)
2284{
2285 return ((SCSIDiskState *)opaque)->tray_open;
2286}
2287
f107639a
MA
2288static bool scsi_cd_is_medium_locked(void *opaque)
2289{
2290 return ((SCSIDiskState *)opaque)->tray_locked;
2291}
2292
aaebacef 2293static const BlockDevOps scsi_disk_removable_block_ops = {
2c6942fa 2294 .change_media_cb = scsi_cd_change_media_cb,
4480de19 2295 .eject_request_cb = scsi_cd_eject_request_cb,
e4def80b 2296 .is_tray_open = scsi_cd_is_tray_open,
f107639a 2297 .is_medium_locked = scsi_cd_is_medium_locked,
aaebacef
PB
2298
2299 .resize_cb = scsi_disk_resize_cb,
2300};
2301
2302static const BlockDevOps scsi_disk_block_ops = {
2303 .resize_cb = scsi_disk_resize_cb,
f107639a
MA
2304};
2305
8a9c16f6
PB
2306static void scsi_disk_unit_attention_reported(SCSIDevice *dev)
2307{
2308 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2309 if (s->media_changed) {
2310 s->media_changed = false;
e48e84ea 2311 scsi_device_set_ua(&s->qdev, SENSE_CODE(MEDIUM_CHANGED));
8a9c16f6
PB
2312 }
2313}
2314
a818a4b6 2315static void scsi_realize(SCSIDevice *dev, Error **errp)
2e5d83bb 2316{
d52affa7 2317 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
2e5d83bb 2318
4be74634 2319 if (!s->qdev.conf.blk) {
a818a4b6
FZ
2320 error_setg(errp, "drive property not set");
2321 return;
d52affa7
GH
2322 }
2323
bfe3d7ac 2324 if (!(s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
4be74634 2325 !blk_is_inserted(s->qdev.conf.blk)) {
a818a4b6
FZ
2326 error_setg(errp, "Device needs media, but drive is empty");
2327 return;
98f28ad7
MA
2328 }
2329
0eb28a42 2330 blkconf_blocksizes(&s->qdev.conf);
3da023b5
MK
2331
2332 if (s->qdev.conf.logical_block_size >
2333 s->qdev.conf.physical_block_size) {
2334 error_setg(errp,
2335 "logical_block_size > physical_block_size not supported");
2336 return;
2337 }
2338
5ff5efb4 2339 if (dev->type == TYPE_DISK) {
ceff3e1f 2340 if (!blkconf_geometry(&dev->conf, NULL, 65535, 255, 255, errp)) {
a818a4b6 2341 return;
5ff5efb4 2342 }
b7eb0c9f 2343 }
ceff3e1f
MZ
2344 if (!blkconf_apply_backend_options(&dev->conf,
2345 blk_is_read_only(s->qdev.conf.blk),
2346 dev->type == TYPE_DISK, errp)) {
a17c17a2
KW
2347 return;
2348 }
a0fef654 2349
215e47b9
PB
2350 if (s->qdev.conf.discard_granularity == -1) {
2351 s->qdev.conf.discard_granularity =
2352 MAX(s->qdev.conf.logical_block_size, DEFAULT_DISCARD_GRANULARITY);
2353 }
2354
552fee93 2355 if (!s->version) {
35c2c8dc 2356 s->version = g_strdup(qemu_hw_version());
552fee93 2357 }
353815aa
DF
2358 if (!s->vendor) {
2359 s->vendor = g_strdup("QEMU");
2360 }
7471a649
KW
2361 if (!s->device_id) {
2362 if (s->serial) {
2363 s->device_id = g_strdup_printf("%.20s", s->serial);
2364 } else {
2365 const char *str = blk_name(s->qdev.conf.blk);
2366 if (str && *str) {
2367 s->device_id = g_strdup(str);
2368 }
2369 }
2370 }
552fee93 2371
4be74634 2372 if (blk_is_sg(s->qdev.conf.blk)) {
a818a4b6
FZ
2373 error_setg(errp, "unwanted /dev/sg*");
2374 return;
32bb404a
MA
2375 }
2376
18e673b8
PH
2377 if ((s->features & (1 << SCSI_DISK_F_REMOVABLE)) &&
2378 !(s->features & (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS))) {
4be74634 2379 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_removable_block_ops, s);
aaebacef 2380 } else {
4be74634 2381 blk_set_dev_ops(s->qdev.conf.blk, &scsi_disk_block_ops, s);
2e5d83bb 2382 }
4be74634 2383 blk_set_guest_block_size(s->qdev.conf.blk, s->qdev.blocksize);
8cfacf07 2384
4be74634 2385 blk_iostatus_enable(s->qdev.conf.blk);
d52affa7
GH
2386}
2387
a818a4b6 2388static void scsi_hd_realize(SCSIDevice *dev, Error **errp)
b443ae67 2389{
e39be482 2390 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
3ff35ba3 2391 AioContext *ctx = NULL;
df1d4c34
ET
2392 /* can happen for devices without drive. The error message for missing
2393 * backend will be issued in scsi_realize
2394 */
2395 if (s->qdev.conf.blk) {
3ff35ba3
AG
2396 ctx = blk_get_aio_context(s->qdev.conf.blk);
2397 aio_context_acquire(ctx);
df1d4c34
ET
2398 blkconf_blocksizes(&s->qdev.conf);
2399 }
e39be482
PB
2400 s->qdev.blocksize = s->qdev.conf.logical_block_size;
2401 s->qdev.type = TYPE_DISK;
353815aa
DF
2402 if (!s->product) {
2403 s->product = g_strdup("QEMU HARDDISK");
2404 }
a818a4b6 2405 scsi_realize(&s->qdev, errp);
3ff35ba3
AG
2406 if (ctx) {
2407 aio_context_release(ctx);
2408 }
b443ae67
MA
2409}
2410
a818a4b6 2411static void scsi_cd_realize(SCSIDevice *dev, Error **errp)
b443ae67 2412{
e39be482 2413 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
3ff35ba3 2414 AioContext *ctx;
83b4fe0e 2415 int ret;
9ef6e505
KW
2416
2417 if (!dev->conf.blk) {
83b4fe0e
KW
2418 /* Anonymous BlockBackend for an empty drive. As we put it into
2419 * dev->conf, qdev takes care of detaching on unplug. */
6d0eb64d 2420 dev->conf.blk = blk_new(0, BLK_PERM_ALL);
83b4fe0e
KW
2421 ret = blk_attach_dev(dev->conf.blk, &dev->qdev);
2422 assert(ret == 0);
9ef6e505
KW
2423 }
2424
3ff35ba3
AG
2425 ctx = blk_get_aio_context(dev->conf.blk);
2426 aio_context_acquire(ctx);
e39be482
PB
2427 s->qdev.blocksize = 2048;
2428 s->qdev.type = TYPE_ROM;
bfe3d7ac 2429 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
353815aa
DF
2430 if (!s->product) {
2431 s->product = g_strdup("QEMU CD-ROM");
2432 }
a818a4b6 2433 scsi_realize(&s->qdev, errp);
3ff35ba3 2434 aio_context_release(ctx);
b443ae67
MA
2435}
2436
a818a4b6 2437static void scsi_disk_realize(SCSIDevice *dev, Error **errp)
b443ae67 2438{
95b5edcd 2439 DriveInfo *dinfo;
a818a4b6 2440 Error *local_err = NULL;
b443ae67 2441
4be74634 2442 if (!dev->conf.blk) {
a818a4b6
FZ
2443 scsi_realize(dev, &local_err);
2444 assert(local_err);
2445 error_propagate(errp, local_err);
2446 return;
b443ae67
MA
2447 }
2448
4be74634 2449 dinfo = blk_legacy_dinfo(dev->conf.blk);
26f8b3a8 2450 if (dinfo && dinfo->media_cd) {
a818a4b6 2451 scsi_cd_realize(dev, errp);
e39be482 2452 } else {
a818a4b6 2453 scsi_hd_realize(dev, errp);
e39be482 2454 }
b443ae67
MA
2455}
2456
b08d0ea0 2457static const SCSIReqOps scsi_disk_emulate_reqops = {
8dbd4574 2458 .size = sizeof(SCSIDiskReq),
12010e7b 2459 .free_req = scsi_free_request,
b08d0ea0 2460 .send_command = scsi_disk_emulate_command,
314a3299
PB
2461 .read_data = scsi_disk_emulate_read_data,
2462 .write_data = scsi_disk_emulate_write_data,
b08d0ea0
PB
2463 .get_buf = scsi_get_buf,
2464};
2465
2466static const SCSIReqOps scsi_disk_dma_reqops = {
2467 .size = sizeof(SCSIDiskReq),
2468 .free_req = scsi_free_request,
2469 .send_command = scsi_disk_dma_command,
12010e7b
PB
2470 .read_data = scsi_read_data,
2471 .write_data = scsi_write_data,
12010e7b 2472 .get_buf = scsi_get_buf,
43b978b9
PB
2473 .load_request = scsi_disk_load_request,
2474 .save_request = scsi_disk_save_request,
8dbd4574
PB
2475};
2476
b08d0ea0
PB
2477static const SCSIReqOps *const scsi_disk_reqops_dispatch[256] = {
2478 [TEST_UNIT_READY] = &scsi_disk_emulate_reqops,
2479 [INQUIRY] = &scsi_disk_emulate_reqops,
2480 [MODE_SENSE] = &scsi_disk_emulate_reqops,
2481 [MODE_SENSE_10] = &scsi_disk_emulate_reqops,
2482 [START_STOP] = &scsi_disk_emulate_reqops,
2483 [ALLOW_MEDIUM_REMOVAL] = &scsi_disk_emulate_reqops,
2484 [READ_CAPACITY_10] = &scsi_disk_emulate_reqops,
2485 [READ_TOC] = &scsi_disk_emulate_reqops,
2486 [READ_DVD_STRUCTURE] = &scsi_disk_emulate_reqops,
2487 [READ_DISC_INFORMATION] = &scsi_disk_emulate_reqops,
2488 [GET_CONFIGURATION] = &scsi_disk_emulate_reqops,
2489 [GET_EVENT_STATUS_NOTIFICATION] = &scsi_disk_emulate_reqops,
2490 [MECHANISM_STATUS] = &scsi_disk_emulate_reqops,
2491 [SERVICE_ACTION_IN_16] = &scsi_disk_emulate_reqops,
2492 [REQUEST_SENSE] = &scsi_disk_emulate_reqops,
2493 [SYNCHRONIZE_CACHE] = &scsi_disk_emulate_reqops,
2494 [SEEK_10] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2495 [MODE_SELECT] = &scsi_disk_emulate_reqops,
2496 [MODE_SELECT_10] = &scsi_disk_emulate_reqops,
5222aaf2 2497 [UNMAP] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2498 [WRITE_SAME_10] = &scsi_disk_emulate_reqops,
2499 [WRITE_SAME_16] = &scsi_disk_emulate_reqops,
d97e7730
PB
2500 [VERIFY_10] = &scsi_disk_emulate_reqops,
2501 [VERIFY_12] = &scsi_disk_emulate_reqops,
2502 [VERIFY_16] = &scsi_disk_emulate_reqops,
b08d0ea0
PB
2503
2504 [READ_6] = &scsi_disk_dma_reqops,
2505 [READ_10] = &scsi_disk_dma_reqops,
2506 [READ_12] = &scsi_disk_dma_reqops,
2507 [READ_16] = &scsi_disk_dma_reqops,
b08d0ea0
PB
2508 [WRITE_6] = &scsi_disk_dma_reqops,
2509 [WRITE_10] = &scsi_disk_dma_reqops,
2510 [WRITE_12] = &scsi_disk_dma_reqops,
2511 [WRITE_16] = &scsi_disk_dma_reqops,
2512 [WRITE_VERIFY_10] = &scsi_disk_dma_reqops,
2513 [WRITE_VERIFY_12] = &scsi_disk_dma_reqops,
2514 [WRITE_VERIFY_16] = &scsi_disk_dma_reqops,
2515};
2516
59ee9500
LV
2517static void scsi_disk_new_request_dump(uint32_t lun, uint32_t tag, uint8_t *buf)
2518{
2519 int i;
2520 int len = scsi_cdb_length(buf);
2521 char *line_buffer, *p;
2522
2523 line_buffer = g_malloc(len * 5 + 1);
2524
2525 for (i = 0, p = line_buffer; i < len; i++) {
2526 p += sprintf(p, " 0x%02x", buf[i]);
2527 }
2528 trace_scsi_disk_new_request(lun, tag, line_buffer);
2529
2530 g_free(line_buffer);
2531}
2532
63db0f0e
PB
2533static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
2534 uint8_t *buf, void *hba_private)
8dbd4574
PB
2535{
2536 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2537 SCSIRequest *req;
b08d0ea0
PB
2538 const SCSIReqOps *ops;
2539 uint8_t command;
8dbd4574 2540
79fb50bb
PB
2541 command = buf[0];
2542 ops = scsi_disk_reqops_dispatch[command];
2543 if (!ops) {
2544 ops = &scsi_disk_emulate_reqops;
2545 }
2546 req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private);
2547
59ee9500
LV
2548 if (trace_event_get_state_backends(TRACE_SCSI_DISK_NEW_REQUEST)) {
2549 scsi_disk_new_request_dump(lun, tag, buf);
b08d0ea0 2550 }
b08d0ea0 2551
8dbd4574
PB
2552 return req;
2553}
2554
336a6915
PB
2555#ifdef __linux__
2556static int get_device_type(SCSIDiskState *s)
2557{
336a6915
PB
2558 uint8_t cmd[16];
2559 uint8_t buf[36];
336a6915
PB
2560 int ret;
2561
2562 memset(cmd, 0, sizeof(cmd));
2563 memset(buf, 0, sizeof(buf));
2564 cmd[0] = INQUIRY;
2565 cmd[4] = sizeof(buf);
2566
a0c7e35b
DHB
2567 ret = scsi_SG_IO_FROM_DEV(s->qdev.conf.blk, cmd, sizeof(cmd),
2568 buf, sizeof(buf));
2569 if (ret < 0) {
336a6915
PB
2570 return -1;
2571 }
2572 s->qdev.type = buf[0];
bfe3d7ac
PB
2573 if (buf[1] & 0x80) {
2574 s->features |= 1 << SCSI_DISK_F_REMOVABLE;
2575 }
336a6915
PB
2576 return 0;
2577}
2578
a818a4b6 2579static void scsi_block_realize(SCSIDevice *dev, Error **errp)
336a6915
PB
2580{
2581 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
3ff35ba3 2582 AioContext *ctx;
336a6915
PB
2583 int sg_version;
2584 int rc;
2585
4be74634 2586 if (!s->qdev.conf.blk) {
a818a4b6
FZ
2587 error_setg(errp, "drive property not set");
2588 return;
336a6915
PB
2589 }
2590
51f43d57
FZ
2591 if (s->rotation_rate) {
2592 error_report_once("rotation_rate is specified for scsi-block but is "
2593 "not implemented. This option is deprecated and will "
2594 "be removed in a future version");
2595 }
2596
3ff35ba3
AG
2597 ctx = blk_get_aio_context(s->qdev.conf.blk);
2598 aio_context_acquire(ctx);
2599
336a6915 2600 /* check we are using a driver managing SG_IO (version 3 and after) */
4be74634 2601 rc = blk_ioctl(s->qdev.conf.blk, SG_GET_VERSION_NUM, &sg_version);
4bbeb8b1 2602 if (rc < 0) {
09c2c6ff
PB
2603 error_setg_errno(errp, -rc, "cannot get SG_IO version number");
2604 if (rc != -EPERM) {
2605 error_append_hint(errp, "Is this a SCSI device?\n");
2606 }
3ff35ba3 2607 goto out;
4bbeb8b1
FZ
2608 }
2609 if (sg_version < 30000) {
a818a4b6 2610 error_setg(errp, "scsi generic interface too old");
3ff35ba3 2611 goto out;
336a6915
PB
2612 }
2613
2614 /* get device type from INQUIRY data */
2615 rc = get_device_type(s);
2616 if (rc < 0) {
a818a4b6 2617 error_setg(errp, "INQUIRY failed");
3ff35ba3 2618 goto out;
336a6915
PB
2619 }
2620
2621 /* Make a guess for the block size, we'll fix it when the guest sends.
2622 * READ CAPACITY. If they don't, they likely would assume these sizes
2623 * anyway. (TODO: check in /sys).
2624 */
2625 if (s->qdev.type == TYPE_ROM || s->qdev.type == TYPE_WORM) {
2626 s->qdev.blocksize = 2048;
2627 } else {
2628 s->qdev.blocksize = 512;
2629 }
18e673b8
PH
2630
2631 /* Makes the scsi-block device not removable by using HMP and QMP eject
2632 * command.
2633 */
2634 s->features |= (1 << SCSI_DISK_F_NO_REMOVABLE_DEVOPS);
2635
a818a4b6 2636 scsi_realize(&s->qdev, errp);
a71c775b 2637 scsi_generic_read_device_inquiry(&s->qdev);
3ff35ba3
AG
2638
2639out:
2640 aio_context_release(ctx);
336a6915
PB
2641}
2642
8fdc7839
PB
2643typedef struct SCSIBlockReq {
2644 SCSIDiskReq req;
2645 sg_io_hdr_t io_header;
2646
2647 /* Selected bytes of the original CDB, copied into our own CDB. */
2648 uint8_t cmd, cdb1, group_number;
2649
2650 /* CDB passed to SG_IO. */
2651 uint8_t cdb[16];
2652} SCSIBlockReq;
2653
2654static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req,
2655 int64_t offset, QEMUIOVector *iov,
2656 int direction,
2657 BlockCompletionFunc *cb, void *opaque)
2658{
2659 sg_io_hdr_t *io_header = &req->io_header;
2660 SCSIDiskReq *r = &req->req;
2661 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2662 int nb_logical_blocks;
2663 uint64_t lba;
2664 BlockAIOCB *aiocb;
2665
2666 /* This is not supported yet. It can only happen if the guest does
2667 * reads and writes that are not aligned to one logical sectors
2668 * _and_ cover multiple MemoryRegions.
2669 */
2670 assert(offset % s->qdev.blocksize == 0);
2671 assert(iov->size % s->qdev.blocksize == 0);
2672
2673 io_header->interface_id = 'S';
2674
2675 /* The data transfer comes from the QEMUIOVector. */
2676 io_header->dxfer_direction = direction;
2677 io_header->dxfer_len = iov->size;
2678 io_header->dxferp = (void *)iov->iov;
2679 io_header->iovec_count = iov->niov;
2680 assert(io_header->iovec_count == iov->niov); /* no overflow! */
2681
2682 /* Build a new CDB with the LBA and length patched in, in case
2683 * DMA helpers split the transfer in multiple segments. Do not
2684 * build a CDB smaller than what the guest wanted, and only build
2685 * a larger one if strictly necessary.
2686 */
2687 io_header->cmdp = req->cdb;
2688 lba = offset / s->qdev.blocksize;
2689 nb_logical_blocks = io_header->dxfer_len / s->qdev.blocksize;
2690
2691 if ((req->cmd >> 5) == 0 && lba <= 0x1ffff) {
2692 /* 6-byte CDB */
2693 stl_be_p(&req->cdb[0], lba | (req->cmd << 24));
2694 req->cdb[4] = nb_logical_blocks;
2695 req->cdb[5] = 0;
2696 io_header->cmd_len = 6;
2697 } else if ((req->cmd >> 5) <= 1 && lba <= 0xffffffffULL) {
2698 /* 10-byte CDB */
2699 req->cdb[0] = (req->cmd & 0x1f) | 0x20;
2700 req->cdb[1] = req->cdb1;
2701 stl_be_p(&req->cdb[2], lba);
2702 req->cdb[6] = req->group_number;
2703 stw_be_p(&req->cdb[7], nb_logical_blocks);
2704 req->cdb[9] = 0;
2705 io_header->cmd_len = 10;
2706 } else if ((req->cmd >> 5) != 4 && lba <= 0xffffffffULL) {
2707 /* 12-byte CDB */
2708 req->cdb[0] = (req->cmd & 0x1f) | 0xA0;
2709 req->cdb[1] = req->cdb1;
2710 stl_be_p(&req->cdb[2], lba);
2711 stl_be_p(&req->cdb[6], nb_logical_blocks);
2712 req->cdb[10] = req->group_number;
2713 req->cdb[11] = 0;
2714 io_header->cmd_len = 12;
2715 } else {
2716 /* 16-byte CDB */
2717 req->cdb[0] = (req->cmd & 0x1f) | 0x80;
2718 req->cdb[1] = req->cdb1;
2719 stq_be_p(&req->cdb[2], lba);
2720 stl_be_p(&req->cdb[10], nb_logical_blocks);
2721 req->cdb[14] = req->group_number;
2722 req->cdb[15] = 0;
2723 io_header->cmd_len = 16;
2724 }
2725
2726 /* The rest is as in scsi-generic.c. */
2727 io_header->mx_sb_len = sizeof(r->req.sense);
2728 io_header->sbp = r->req.sense;
2729 io_header->timeout = UINT_MAX;
2730 io_header->usr_ptr = r;
2731 io_header->flags |= SG_FLAG_DIRECT_IO;
2732
2733 aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque);
2734 assert(aiocb != NULL);
2735 return aiocb;
2736}
2737
2738static bool scsi_block_no_fua(SCSICommand *cmd)
2739{
2740 return false;
2741}
2742
2743static BlockAIOCB *scsi_block_dma_readv(int64_t offset,
2744 QEMUIOVector *iov,
2745 BlockCompletionFunc *cb, void *cb_opaque,
2746 void *opaque)
2747{
2748 SCSIBlockReq *r = opaque;
2749 return scsi_block_do_sgio(r, offset, iov,
2750 SG_DXFER_FROM_DEV, cb, cb_opaque);
2751}
2752
2753static BlockAIOCB *scsi_block_dma_writev(int64_t offset,
2754 QEMUIOVector *iov,
2755 BlockCompletionFunc *cb, void *cb_opaque,
2756 void *opaque)
2757{
2758 SCSIBlockReq *r = opaque;
2759 return scsi_block_do_sgio(r, offset, iov,
2760 SG_DXFER_TO_DEV, cb, cb_opaque);
2761}
2762
592c3b28 2763static bool scsi_block_is_passthrough(SCSIDiskState *s, uint8_t *buf)
336a6915 2764{
336a6915 2765 switch (buf[0]) {
8fdc7839
PB
2766 case VERIFY_10:
2767 case VERIFY_12:
2768 case VERIFY_16:
2769 /* Check if BYTCHK == 0x01 (data-out buffer contains data
2770 * for the number of logical blocks specified in the length
2771 * field). For other modes, do not use scatter/gather operation.
2772 */
1f8af0d1 2773 if ((buf[1] & 6) == 2) {
8fdc7839
PB
2774 return false;
2775 }
2776 break;
2777
336a6915
PB
2778 case READ_6:
2779 case READ_10:
2780 case READ_12:
2781 case READ_16:
2782 case WRITE_6:
2783 case WRITE_10:
2784 case WRITE_12:
2785 case WRITE_16:
2786 case WRITE_VERIFY_10:
2787 case WRITE_VERIFY_12:
2788 case WRITE_VERIFY_16:
8fdc7839 2789 /* MMC writing cannot be done via DMA helpers, because it sometimes
33ebad12 2790 * involves writing beyond the maximum LBA or to negative LBA (lead-in).
166dbda7 2791 * We might use scsi_block_dma_reqops as long as no writing commands are
33ebad12
PB
2792 * seen, but performance usually isn't paramount on optical media. So,
2793 * just make scsi-block operate the same as scsi-generic for them.
2794 */
b08d0ea0 2795 if (s->qdev.type != TYPE_ROM) {
592c3b28 2796 return false;
b08d0ea0 2797 }
592c3b28
PB
2798 break;
2799
2800 default:
2801 break;
336a6915
PB
2802 }
2803
592c3b28
PB
2804 return true;
2805}
2806
2807
8fdc7839
PB
2808static int32_t scsi_block_dma_command(SCSIRequest *req, uint8_t *buf)
2809{
2810 SCSIBlockReq *r = (SCSIBlockReq *)req;
2343be0d
PB
2811 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
2812
8fdc7839
PB
2813 r->cmd = req->cmd.buf[0];
2814 switch (r->cmd >> 5) {
2815 case 0:
2816 /* 6-byte CDB. */
2817 r->cdb1 = r->group_number = 0;
2818 break;
2819 case 1:
2820 /* 10-byte CDB. */
2821 r->cdb1 = req->cmd.buf[1];
2822 r->group_number = req->cmd.buf[6];
ed45cae3 2823 break;
8fdc7839
PB
2824 case 4:
2825 /* 12-byte CDB. */
2826 r->cdb1 = req->cmd.buf[1];
2827 r->group_number = req->cmd.buf[10];
2828 break;
2829 case 5:
2830 /* 16-byte CDB. */
2831 r->cdb1 = req->cmd.buf[1];
2832 r->group_number = req->cmd.buf[14];
2833 break;
2834 default:
2835 abort();
2836 }
2837
2343be0d
PB
2838 /* Protection information is not supported. For SCSI versions 2 and
2839 * older (as determined by snooping the guest's INQUIRY commands),
2840 * there is no RD/WR/VRPROTECT, so skip this check in these versions.
2841 */
2842 if (s->qdev.scsi_version > 2 && (req->cmd.buf[1] & 0xe0)) {
8fdc7839
PB
2843 scsi_check_condition(&r->req, SENSE_CODE(INVALID_FIELD));
2844 return 0;
2845 }
2846
2847 r->req.status = &r->io_header.status;
2848 return scsi_disk_dma_command(req, buf);
2849}
2850
2851static const SCSIReqOps scsi_block_dma_reqops = {
2852 .size = sizeof(SCSIBlockReq),
2853 .free_req = scsi_free_request,
2854 .send_command = scsi_block_dma_command,
2855 .read_data = scsi_read_data,
2856 .write_data = scsi_write_data,
2857 .get_buf = scsi_get_buf,
2858 .load_request = scsi_disk_load_request,
2859 .save_request = scsi_disk_save_request,
2860};
2861
592c3b28
PB
2862static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
2863 uint32_t lun, uint8_t *buf,
2864 void *hba_private)
2865{
2866 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2867
2868 if (scsi_block_is_passthrough(s, buf)) {
2869 return scsi_req_alloc(&scsi_generic_req_ops, &s->qdev, tag, lun,
2870 hba_private);
2871 } else {
8fdc7839 2872 return scsi_req_alloc(&scsi_block_dma_reqops, &s->qdev, tag, lun,
592c3b28
PB
2873 hba_private);
2874 }
336a6915 2875}
3e7e180a
PB
2876
2877static int scsi_block_parse_cdb(SCSIDevice *d, SCSICommand *cmd,
2878 uint8_t *buf, void *hba_private)
2879{
2880 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
2881
2882 if (scsi_block_is_passthrough(s, buf)) {
2883 return scsi_bus_parse_cdb(&s->qdev, cmd, buf, hba_private);
2884 } else {
2885 return scsi_req_parse_cdb(&s->qdev, cmd, buf);
2886 }
2887}
2888
336a6915
PB
2889#endif
2890
fcaafb10
PB
2891static
2892BlockAIOCB *scsi_dma_readv(int64_t offset, QEMUIOVector *iov,
2893 BlockCompletionFunc *cb, void *cb_opaque,
2894 void *opaque)
2895{
2896 SCSIDiskReq *r = opaque;
2897 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2898 return blk_aio_preadv(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2899}
2900
2901static
2902BlockAIOCB *scsi_dma_writev(int64_t offset, QEMUIOVector *iov,
2903 BlockCompletionFunc *cb, void *cb_opaque,
2904 void *opaque)
2905{
2906 SCSIDiskReq *r = opaque;
2907 SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
2908 return blk_aio_pwritev(s->qdev.conf.blk, offset, iov, 0, cb, cb_opaque);
2909}
2910
993935f3
PB
2911static void scsi_disk_base_class_initfn(ObjectClass *klass, void *data)
2912{
2913 DeviceClass *dc = DEVICE_CLASS(klass);
fcaafb10 2914 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
993935f3
PB
2915
2916 dc->fw_name = "disk";
2917 dc->reset = scsi_disk_reset;
fcaafb10
PB
2918 sdc->dma_readv = scsi_dma_readv;
2919 sdc->dma_writev = scsi_dma_writev;
94f8ba11 2920 sdc->need_fua_emulation = scsi_is_cmd_fua;
993935f3
PB
2921}
2922
2923static const TypeInfo scsi_disk_base_info = {
2924 .name = TYPE_SCSI_DISK_BASE,
2925 .parent = TYPE_SCSI_DEVICE,
2926 .class_init = scsi_disk_base_class_initfn,
2927 .instance_size = sizeof(SCSIDiskState),
fcaafb10 2928 .class_size = sizeof(SCSIDiskClass),
6214a11a 2929 .abstract = true,
993935f3
PB
2930};
2931
353815aa
DF
2932#define DEFINE_SCSI_DISK_PROPERTIES() \
2933 DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf), \
8c398252 2934 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
353815aa
DF
2935 DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
2936 DEFINE_PROP_STRING("serial", SCSIDiskState, serial), \
2937 DEFINE_PROP_STRING("vendor", SCSIDiskState, vendor), \
7471a649
KW
2938 DEFINE_PROP_STRING("product", SCSIDiskState, product), \
2939 DEFINE_PROP_STRING("device_id", SCSIDiskState, device_id)
2940
b443ae67 2941
39bffca2
AL
2942static Property scsi_hd_properties[] = {
2943 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
2944 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
2945 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
2946 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
2947 SCSI_DISK_F_DPOFUA, false),
2ecab408
PB
2948 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
2949 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 2950 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
8a1bd297
PB
2951 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
2952 DEFAULT_MAX_UNMAP_SIZE),
f8e1f533
PB
2953 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
2954 DEFAULT_MAX_IO_SIZE),
070f8009 2955 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
2343be0d
PB
2956 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
2957 5),
d252df48 2958 DEFINE_BLOCK_CHS_PROPERTIES(SCSIDiskState, qdev.conf),
39bffca2
AL
2959 DEFINE_PROP_END_OF_LIST(),
2960};
2961
43b978b9
PB
2962static const VMStateDescription vmstate_scsi_disk_state = {
2963 .name = "scsi-disk",
2964 .version_id = 1,
2965 .minimum_version_id = 1,
43b978b9
PB
2966 .fields = (VMStateField[]) {
2967 VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
2968 VMSTATE_BOOL(media_changed, SCSIDiskState),
2969 VMSTATE_BOOL(media_event, SCSIDiskState),
2970 VMSTATE_BOOL(eject_request, SCSIDiskState),
2971 VMSTATE_BOOL(tray_open, SCSIDiskState),
2972 VMSTATE_BOOL(tray_locked, SCSIDiskState),
2973 VMSTATE_END_OF_LIST()
2974 }
2975};
2976
b9eea3e6
AL
2977static void scsi_hd_class_initfn(ObjectClass *klass, void *data)
2978{
39bffca2 2979 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
2980 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
2981
a818a4b6 2982 sc->realize = scsi_hd_realize;
b9eea3e6
AL
2983 sc->alloc_req = scsi_new_request;
2984 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2 2985 dc->desc = "virtual SCSI disk";
39bffca2 2986 dc->props = scsi_hd_properties;
43b978b9 2987 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
2988}
2989
8c43a6f0 2990static const TypeInfo scsi_hd_info = {
39bffca2 2991 .name = "scsi-hd",
993935f3 2992 .parent = TYPE_SCSI_DISK_BASE,
39bffca2
AL
2993 .class_init = scsi_hd_class_initfn,
2994};
2995
2996static Property scsi_cd_properties[] = {
2997 DEFINE_SCSI_DISK_PROPERTIES(),
2ecab408
PB
2998 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
2999 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 3000 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
f8e1f533
PB
3001 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3002 DEFAULT_MAX_IO_SIZE),
2343be0d
PB
3003 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
3004 5),
39bffca2 3005 DEFINE_PROP_END_OF_LIST(),
b9eea3e6
AL
3006};
3007
3008static void scsi_cd_class_initfn(ObjectClass *klass, void *data)
3009{
39bffca2 3010 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
3011 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3012
a818a4b6 3013 sc->realize = scsi_cd_realize;
b9eea3e6
AL
3014 sc->alloc_req = scsi_new_request;
3015 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2 3016 dc->desc = "virtual SCSI CD-ROM";
39bffca2 3017 dc->props = scsi_cd_properties;
43b978b9 3018 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3019}
3020
8c43a6f0 3021static const TypeInfo scsi_cd_info = {
39bffca2 3022 .name = "scsi-cd",
993935f3 3023 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3024 .class_init = scsi_cd_class_initfn,
b9eea3e6
AL
3025};
3026
336a6915 3027#ifdef __linux__
39bffca2 3028static Property scsi_block_properties[] = {
14b20748 3029 DEFINE_BLOCK_ERROR_PROPERTIES(SCSIDiskState, qdev.conf), \
4be74634 3030 DEFINE_PROP_DRIVE("drive", SCSIDiskState, qdev.conf.blk),
07488549 3031 DEFINE_PROP_BOOL("share-rw", SCSIDiskState, qdev.conf.share_rw, false),
070f8009 3032 DEFINE_PROP_UINT16("rotation_rate", SCSIDiskState, rotation_rate, 0),
0a96ca24
DHB
3033 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
3034 DEFAULT_MAX_UNMAP_SIZE),
3035 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3036 DEFAULT_MAX_IO_SIZE),
2343be0d 3037 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
29e560f0 3038 -1),
39bffca2
AL
3039 DEFINE_PROP_END_OF_LIST(),
3040};
3041
b9eea3e6
AL
3042static void scsi_block_class_initfn(ObjectClass *klass, void *data)
3043{
39bffca2 3044 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6 3045 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
8fdc7839 3046 SCSIDiskClass *sdc = SCSI_DISK_BASE_CLASS(klass);
b9eea3e6 3047
a818a4b6 3048 sc->realize = scsi_block_realize;
b9eea3e6 3049 sc->alloc_req = scsi_block_new_request;
3e7e180a 3050 sc->parse_cdb = scsi_block_parse_cdb;
8fdc7839
PB
3051 sdc->dma_readv = scsi_block_dma_readv;
3052 sdc->dma_writev = scsi_block_dma_writev;
3053 sdc->need_fua_emulation = scsi_block_no_fua;
39bffca2 3054 dc->desc = "SCSI block device passthrough";
39bffca2 3055 dc->props = scsi_block_properties;
43b978b9 3056 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3057}
3058
8c43a6f0 3059static const TypeInfo scsi_block_info = {
39bffca2 3060 .name = "scsi-block",
993935f3 3061 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3062 .class_init = scsi_block_class_initfn,
b9eea3e6 3063};
336a6915 3064#endif
b9eea3e6 3065
39bffca2
AL
3066static Property scsi_disk_properties[] = {
3067 DEFINE_SCSI_DISK_PROPERTIES(),
bfe3d7ac
PB
3068 DEFINE_PROP_BIT("removable", SCSIDiskState, features,
3069 SCSI_DISK_F_REMOVABLE, false),
da8365db
PB
3070 DEFINE_PROP_BIT("dpofua", SCSIDiskState, features,
3071 SCSI_DISK_F_DPOFUA, false),
2ecab408
PB
3072 DEFINE_PROP_UINT64("wwn", SCSIDiskState, qdev.wwn, 0),
3073 DEFINE_PROP_UINT64("port_wwn", SCSIDiskState, qdev.port_wwn, 0),
64cc2284 3074 DEFINE_PROP_UINT16("port_index", SCSIDiskState, port_index, 0),
8a1bd297
PB
3075 DEFINE_PROP_UINT64("max_unmap_size", SCSIDiskState, max_unmap_size,
3076 DEFAULT_MAX_UNMAP_SIZE),
f8e1f533
PB
3077 DEFINE_PROP_UINT64("max_io_size", SCSIDiskState, max_io_size,
3078 DEFAULT_MAX_IO_SIZE),
2343be0d
PB
3079 DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
3080 5),
39bffca2
AL
3081 DEFINE_PROP_END_OF_LIST(),
3082};
3083
b9eea3e6
AL
3084static void scsi_disk_class_initfn(ObjectClass *klass, void *data)
3085{
39bffca2 3086 DeviceClass *dc = DEVICE_CLASS(klass);
b9eea3e6
AL
3087 SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass);
3088
a818a4b6 3089 sc->realize = scsi_disk_realize;
b9eea3e6
AL
3090 sc->alloc_req = scsi_new_request;
3091 sc->unit_attention_reported = scsi_disk_unit_attention_reported;
39bffca2
AL
3092 dc->fw_name = "disk";
3093 dc->desc = "virtual SCSI disk or CD-ROM (legacy)";
3094 dc->reset = scsi_disk_reset;
3095 dc->props = scsi_disk_properties;
43b978b9 3096 dc->vmsd = &vmstate_scsi_disk_state;
b9eea3e6
AL
3097}
3098
8c43a6f0 3099static const TypeInfo scsi_disk_info = {
39bffca2 3100 .name = "scsi-disk",
993935f3 3101 .parent = TYPE_SCSI_DISK_BASE,
39bffca2 3102 .class_init = scsi_disk_class_initfn,
d52affa7
GH
3103};
3104
83f7d43a 3105static void scsi_disk_register_types(void)
d52affa7 3106{
993935f3 3107 type_register_static(&scsi_disk_base_info);
39bffca2
AL
3108 type_register_static(&scsi_hd_info);
3109 type_register_static(&scsi_cd_info);
b9eea3e6 3110#ifdef __linux__
39bffca2 3111 type_register_static(&scsi_block_info);
b9eea3e6 3112#endif
39bffca2 3113 type_register_static(&scsi_disk_info);
8ccc2ace 3114}
83f7d43a
AF
3115
3116type_init(scsi_disk_register_types)