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