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