Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ a9c17b2b

History | View | Annotate | Download (35.1 kB)

1
/*
2
 * SCSI Device emulation
3
 *
4
 * Copyright (c) 2006 CodeSourcery.
5
 * Based on code by Fabrice Bellard
6
 *
7
 * Written by Paul Brook
8
 * Modifications:
9
 *  2009-Dec-12 Artyom Tarasenko : implemented stamdard inquiry for the case
10
 *                                 when the allocation length of CDB is smaller
11
 *                                 than 36.
12
 *  2009-Oct-13 Artyom Tarasenko : implemented the block descriptor in the
13
 *                                 MODE SENSE response.
14
 *
15
 * This code is licenced under the LGPL.
16
 *
17
 * Note that this file only handles the SCSI architecture model and device
18
 * commands.  Emulation of interface/link layer protocols is handled by
19
 * the host adapter emulator.
20
 */
21

    
22
//#define DEBUG_SCSI
23

    
24
#ifdef DEBUG_SCSI
25
#define DPRINTF(fmt, ...) \
26
do { printf("scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
27
#else
28
#define DPRINTF(fmt, ...) do {} while(0)
29
#endif
30

    
31
#define BADF(fmt, ...) \
32
do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
33

    
34
#include "qemu-common.h"
35
#include "qemu-error.h"
36
#include "scsi.h"
37
#include "scsi-defs.h"
38
#include "sysemu.h"
39
#include "blockdev.h"
40

    
41
#define SCSI_DMA_BUF_SIZE    131072
42
#define SCSI_MAX_INQUIRY_LEN 256
43

    
44
#define SCSI_REQ_STATUS_RETRY 0x01
45

    
46
typedef struct SCSIDiskState SCSIDiskState;
47

    
48
typedef struct SCSIDiskReq {
49
    SCSIRequest req;
50
    /* ??? We should probably keep track of whether the data transfer is
51
       a read or a write.  Currently we rely on the host getting it right.  */
52
    /* Both sector and sector_count are in terms of qemu 512 byte blocks.  */
53
    uint64_t sector;
54
    uint32_t sector_count;
55
    struct iovec iov;
56
    QEMUIOVector qiov;
57
    uint32_t status;
58
} SCSIDiskReq;
59

    
60
struct SCSIDiskState
61
{
62
    SCSIDevice qdev;
63
    BlockDriverState *bs;
64
    /* The qemu block layer uses a fixed 512 byte sector size.
65
       This is the number of 512 byte blocks in a single scsi sector.  */
66
    int cluster_size;
67
    uint64_t max_lba;
68
    QEMUBH *bh;
69
    char *version;
70
    char *serial;
71
};
72

    
73
static SCSIDiskReq *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun)
74
{
75
    SCSIRequest *req;
76
    SCSIDiskReq *r;
77

    
78
    req = scsi_req_alloc(sizeof(SCSIDiskReq), d, tag, lun);
79
    r = DO_UPCAST(SCSIDiskReq, req, req);
80
    r->iov.iov_base = qemu_memalign(512, SCSI_DMA_BUF_SIZE);
81
    return r;
82
}
83

    
84
static void scsi_remove_request(SCSIDiskReq *r)
85
{
86
    qemu_vfree(r->iov.iov_base);
87
    scsi_req_free(&r->req);
88
}
89

    
90
static SCSIDiskReq *scsi_find_request(SCSIDiskState *s, uint32_t tag)
91
{
92
    return DO_UPCAST(SCSIDiskReq, req, scsi_req_find(&s->qdev, tag));
93
}
94

    
95
static void scsi_req_set_status(SCSIRequest *req, int status, int sense_code)
96
{
97
    req->status = status;
98
    scsi_dev_set_sense(req->dev, sense_code);
99
}
100

    
101
/* Helper function for command completion.  */
102
static void scsi_command_complete(SCSIDiskReq *r, int status, int sense)
103
{
104
    DPRINTF("Command complete tag=0x%x status=%d sense=%d\n",
105
            r->req.tag, status, sense);
106
    scsi_req_set_status(&r->req, status, sense);
107
    scsi_req_complete(&r->req);
108
    scsi_remove_request(r);
109
}
110

    
111
/* Cancel a pending data transfer.  */
112
static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
113
{
114
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
115
    SCSIDiskReq *r;
116
    DPRINTF("Cancel tag=0x%x\n", tag);
117
    r = scsi_find_request(s, tag);
118
    if (r) {
119
        if (r->req.aiocb)
120
            bdrv_aio_cancel(r->req.aiocb);
121
        r->req.aiocb = NULL;
122
        scsi_remove_request(r);
123
    }
124
}
125

    
126
static void scsi_read_complete(void * opaque, int ret)
127
{
128
    SCSIDiskReq *r = (SCSIDiskReq *)opaque;
129

    
130
    r->req.aiocb = NULL;
131

    
132
    if (ret) {
133
        DPRINTF("IO error\n");
134
        r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, 0);
135
        scsi_command_complete(r, CHECK_CONDITION, NO_SENSE);
136
        return;
137
    }
138
    DPRINTF("Data ready tag=0x%x len=%" PRId64 "\n", r->req.tag, r->iov.iov_len);
139

    
140
    r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, r->iov.iov_len);
141
}
142

    
143
/* Read more data from scsi device into buffer.  */
144
static void scsi_read_data(SCSIDevice *d, uint32_t tag)
145
{
146
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
147
    SCSIDiskReq *r;
148
    uint32_t n;
149

    
150
    r = scsi_find_request(s, tag);
151
    if (!r) {
152
        BADF("Bad read tag 0x%x\n", tag);
153
        /* ??? This is the wrong error.  */
154
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
155
        return;
156
    }
157
    if (r->sector_count == (uint32_t)-1) {
158
        DPRINTF("Read buf_len=%" PRId64 "\n", r->iov.iov_len);
159
        r->sector_count = 0;
160
        r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, r->iov.iov_len);
161
        return;
162
    }
163
    DPRINTF("Read sector_count=%d\n", r->sector_count);
164
    if (r->sector_count == 0) {
165
        scsi_command_complete(r, GOOD, NO_SENSE);
166
        return;
167
    }
168

    
169
    n = r->sector_count;
170
    if (n > SCSI_DMA_BUF_SIZE / 512)
171
        n = SCSI_DMA_BUF_SIZE / 512;
172

    
173
    r->iov.iov_len = n * 512;
174
    qemu_iovec_init_external(&r->qiov, &r->iov, 1);
175
    r->req.aiocb = bdrv_aio_readv(s->bs, r->sector, &r->qiov, n,
176
                              scsi_read_complete, r);
177
    if (r->req.aiocb == NULL)
178
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
179
    r->sector += n;
180
    r->sector_count -= n;
181
}
182

    
183
static int scsi_handle_write_error(SCSIDiskReq *r, int error)
184
{
185
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
186
    BlockErrorAction action = bdrv_get_on_error(s->bs, 0);
187

    
188
    if (action == BLOCK_ERR_IGNORE) {
189
        bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, 0);
190
        return 0;
191
    }
192

    
193
    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
194
            || action == BLOCK_ERR_STOP_ANY) {
195
        r->status |= SCSI_REQ_STATUS_RETRY;
196
        bdrv_mon_event(s->bs, BDRV_ACTION_STOP, 0);
197
        vm_stop(0);
198
    } else {
199
        scsi_command_complete(r, CHECK_CONDITION,
200
                HARDWARE_ERROR);
201
        bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, 0);
202
    }
203

    
204
    return 1;
205
}
206

    
207
static void scsi_write_complete(void * opaque, int ret)
208
{
209
    SCSIDiskReq *r = (SCSIDiskReq *)opaque;
210
    uint32_t len;
211
    uint32_t n;
212

    
213
    r->req.aiocb = NULL;
214

    
215
    if (ret) {
216
        if (scsi_handle_write_error(r, -ret))
217
            return;
218
    }
219

    
220
    n = r->iov.iov_len / 512;
221
    r->sector += n;
222
    r->sector_count -= n;
223
    if (r->sector_count == 0) {
224
        scsi_command_complete(r, GOOD, NO_SENSE);
225
    } else {
226
        len = r->sector_count * 512;
227
        if (len > SCSI_DMA_BUF_SIZE) {
228
            len = SCSI_DMA_BUF_SIZE;
229
        }
230
        r->iov.iov_len = len;
231
        DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, len);
232
        r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, len);
233
    }
234
}
235

    
236
static void scsi_write_request(SCSIDiskReq *r)
237
{
238
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
239
    uint32_t n;
240

    
241
    n = r->iov.iov_len / 512;
242
    if (n) {
243
        qemu_iovec_init_external(&r->qiov, &r->iov, 1);
244
        r->req.aiocb = bdrv_aio_writev(s->bs, r->sector, &r->qiov, n,
245
                                   scsi_write_complete, r);
246
        if (r->req.aiocb == NULL)
247
            scsi_command_complete(r, CHECK_CONDITION,
248
                                  HARDWARE_ERROR);
249
    } else {
250
        /* Invoke completion routine to fetch data from host.  */
251
        scsi_write_complete(r, 0);
252
    }
253
}
254

    
255
/* Write data to a scsi device.  Returns nonzero on failure.
256
   The transfer may complete asynchronously.  */
257
static int scsi_write_data(SCSIDevice *d, uint32_t tag)
258
{
259
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
260
    SCSIDiskReq *r;
261

    
262
    DPRINTF("Write data tag=0x%x\n", tag);
263
    r = scsi_find_request(s, tag);
264
    if (!r) {
265
        BADF("Bad write tag 0x%x\n", tag);
266
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
267
        return 1;
268
    }
269

    
270
    if (r->req.aiocb)
271
        BADF("Data transfer already in progress\n");
272

    
273
    scsi_write_request(r);
274

    
275
    return 0;
276
}
277

    
278
static void scsi_dma_restart_bh(void *opaque)
279
{
280
    SCSIDiskState *s = opaque;
281
    SCSIRequest *req;
282
    SCSIDiskReq *r;
283

    
284
    qemu_bh_delete(s->bh);
285
    s->bh = NULL;
286

    
287
    QTAILQ_FOREACH(req, &s->qdev.requests, next) {
288
        r = DO_UPCAST(SCSIDiskReq, req, req);
289
        if (r->status & SCSI_REQ_STATUS_RETRY) {
290
            r->status &= ~SCSI_REQ_STATUS_RETRY;
291
            scsi_write_request(r); 
292
        }
293
    }
294
}
295

    
296
static void scsi_dma_restart_cb(void *opaque, int running, int reason)
297
{
298
    SCSIDiskState *s = opaque;
299

    
300
    if (!running)
301
        return;
302

    
303
    if (!s->bh) {
304
        s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
305
        qemu_bh_schedule(s->bh);
306
    }
307
}
308

    
309
/* Return a pointer to the data buffer.  */
310
static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
311
{
312
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
313
    SCSIDiskReq *r;
314

    
315
    r = scsi_find_request(s, tag);
316
    if (!r) {
317
        BADF("Bad buffer tag 0x%x\n", tag);
318
        return NULL;
319
    }
320
    return (uint8_t *)r->iov.iov_base;
321
}
322

    
323
static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
324
{
325
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
326
    int buflen = 0;
327

    
328
    if (req->cmd.buf[1] & 0x2) {
329
        /* Command support data - optional, not implemented */
330
        BADF("optional INQUIRY command support request not implemented\n");
331
        return -1;
332
    }
333

    
334
    if (req->cmd.buf[1] & 0x1) {
335
        /* Vital product data */
336
        uint8_t page_code = req->cmd.buf[2];
337
        if (req->cmd.xfer < 4) {
338
            BADF("Error: Inquiry (EVPD[%02X]) buffer size %zd is "
339
                 "less than 4\n", page_code, req->cmd.xfer);
340
            return -1;
341
        }
342

    
343
        if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
344
            outbuf[buflen++] = 5;
345
        } else {
346
            outbuf[buflen++] = 0;
347
        }
348
        outbuf[buflen++] = page_code ; // this page
349
        outbuf[buflen++] = 0x00;
350

    
351
        switch (page_code) {
352
        case 0x00: /* Supported page codes, mandatory */
353
            DPRINTF("Inquiry EVPD[Supported pages] "
354
                    "buffer size %zd\n", req->cmd.xfer);
355
            outbuf[buflen++] = 4;    // number of pages
356
            outbuf[buflen++] = 0x00; // list of supported pages (this page)
357
            outbuf[buflen++] = 0x80; // unit serial number
358
            outbuf[buflen++] = 0x83; // device identification
359
            outbuf[buflen++] = 0xb0; // block device characteristics
360
            break;
361

    
362
        case 0x80: /* Device serial number, optional */
363
        {
364
            int l = strlen(s->serial);
365

    
366
            if (l > req->cmd.xfer)
367
                l = req->cmd.xfer;
368
            if (l > 20)
369
                l = 20;
370

    
371
            DPRINTF("Inquiry EVPD[Serial number] "
372
                    "buffer size %zd\n", req->cmd.xfer);
373
            outbuf[buflen++] = l;
374
            memcpy(outbuf+buflen, s->serial, l);
375
            buflen += l;
376
            break;
377
        }
378

    
379
        case 0x83: /* Device identification page, mandatory */
380
        {
381
            int max_len = 255 - 8;
382
            int id_len = strlen(bdrv_get_device_name(s->bs));
383

    
384
            if (id_len > max_len)
385
                id_len = max_len;
386
            DPRINTF("Inquiry EVPD[Device identification] "
387
                    "buffer size %zd\n", req->cmd.xfer);
388

    
389
            outbuf[buflen++] = 3 + id_len;
390
            outbuf[buflen++] = 0x2; // ASCII
391
            outbuf[buflen++] = 0;   // not officially assigned
392
            outbuf[buflen++] = 0;   // reserved
393
            outbuf[buflen++] = id_len; // length of data following
394

    
395
            memcpy(outbuf+buflen, bdrv_get_device_name(s->bs), id_len);
396
            buflen += id_len;
397
            break;
398
        }
399
        case 0xb0: /* block device characteristics */
400
        {
401
            unsigned int min_io_size =
402
                    s->qdev.conf.min_io_size / s->qdev.blocksize;
403
            unsigned int opt_io_size =
404
                    s->qdev.conf.opt_io_size / s->qdev.blocksize;
405

    
406
            /* required VPD size with unmap support */
407
            outbuf[3] = buflen = 0x3c;
408

    
409
            memset(outbuf + 4, 0, buflen - 4);
410

    
411
            /* optimal transfer length granularity */
412
            outbuf[6] = (min_io_size >> 8) & 0xff;
413
            outbuf[7] = min_io_size & 0xff;
414

    
415
            /* optimal transfer length */
416
            outbuf[12] = (opt_io_size >> 24) & 0xff;
417
            outbuf[13] = (opt_io_size >> 16) & 0xff;
418
            outbuf[14] = (opt_io_size >> 8) & 0xff;
419
            outbuf[15] = opt_io_size & 0xff;
420
            break;
421
        }
422
        default:
423
            BADF("Error: unsupported Inquiry (EVPD[%02X]) "
424
                 "buffer size %zd\n", page_code, req->cmd.xfer);
425
            return -1;
426
        }
427
        /* done with EVPD */
428
        return buflen;
429
    }
430

    
431
    /* Standard INQUIRY data */
432
    if (req->cmd.buf[2] != 0) {
433
        BADF("Error: Inquiry (STANDARD) page or code "
434
             "is non-zero [%02X]\n", req->cmd.buf[2]);
435
        return -1;
436
    }
437

    
438
    /* PAGE CODE == 0 */
439
    if (req->cmd.xfer < 5) {
440
        BADF("Error: Inquiry (STANDARD) buffer size %zd "
441
             "is less than 5\n", req->cmd.xfer);
442
        return -1;
443
    }
444

    
445
    buflen = req->cmd.xfer;
446
    if (buflen > SCSI_MAX_INQUIRY_LEN)
447
        buflen = SCSI_MAX_INQUIRY_LEN;
448

    
449
    memset(outbuf, 0, buflen);
450

    
451
    if (req->lun || req->cmd.buf[1] >> 5) {
452
        outbuf[0] = 0x7f;        /* LUN not supported */
453
        return buflen;
454
    }
455

    
456
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
457
        outbuf[0] = 5;
458
        outbuf[1] = 0x80;
459
        memcpy(&outbuf[16], "QEMU CD-ROM     ", 16);
460
    } else {
461
        outbuf[0] = 0;
462
        memcpy(&outbuf[16], "QEMU HARDDISK   ", 16);
463
    }
464
    memcpy(&outbuf[8], "QEMU    ", 8);
465
    memset(&outbuf[32], 0, 4);
466
    memcpy(&outbuf[32], s->version, MIN(4, strlen(s->version)));
467
    /*
468
     * We claim conformance to SPC-3, which is required for guests
469
     * to ask for modern features like READ CAPACITY(16) or the
470
     * block characteristics VPD page by default.  Not all of SPC-3
471
     * is actually implemented, but we're good enough.
472
     */
473
    outbuf[2] = 5;
474
    outbuf[3] = 2; /* Format 2 */
475

    
476
    if (buflen > 36) {
477
        outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
478
    } else {
479
        /* If the allocation length of CDB is too small,
480
               the additional length is not adjusted */
481
        outbuf[4] = 36 - 5;
482
    }
483

    
484
    /* Sync data transfer and TCQ.  */
485
    outbuf[7] = 0x10 | (req->bus->tcq ? 0x02 : 0);
486
    return buflen;
487
}
488

    
489
static int mode_sense_page(SCSIRequest *req, int page, uint8_t *p,
490
                           int page_control)
491
{
492
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
493
    BlockDriverState *bdrv = s->bs;
494
    int cylinders, heads, secs;
495

    
496
    /*
497
     * If Changeable Values are requested, a mask denoting those mode parameters
498
     * that are changeable shall be returned. As we currently don't support
499
     * parameter changes via MODE_SELECT all bits are returned set to zero.
500
     * The buffer was already menset to zero by the caller of this function.
501
     */
502
    switch (page) {
503
    case 4: /* Rigid disk device geometry page. */
504
        p[0] = 4;
505
        p[1] = 0x16;
506
        if (page_control == 1) { /* Changeable Values */
507
            return p[1] + 2;
508
        }
509
        /* if a geometry hint is available, use it */
510
        bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
511
        p[2] = (cylinders >> 16) & 0xff;
512
        p[3] = (cylinders >> 8) & 0xff;
513
        p[4] = cylinders & 0xff;
514
        p[5] = heads & 0xff;
515
        /* Write precomp start cylinder, disabled */
516
        p[6] = (cylinders >> 16) & 0xff;
517
        p[7] = (cylinders >> 8) & 0xff;
518
        p[8] = cylinders & 0xff;
519
        /* Reduced current start cylinder, disabled */
520
        p[9] = (cylinders >> 16) & 0xff;
521
        p[10] = (cylinders >> 8) & 0xff;
522
        p[11] = cylinders & 0xff;
523
        /* Device step rate [ns], 200ns */
524
        p[12] = 0;
525
        p[13] = 200;
526
        /* Landing zone cylinder */
527
        p[14] = 0xff;
528
        p[15] =  0xff;
529
        p[16] = 0xff;
530
        /* Medium rotation rate [rpm], 5400 rpm */
531
        p[20] = (5400 >> 8) & 0xff;
532
        p[21] = 5400 & 0xff;
533
        return p[1] + 2;
534

    
535
    case 5: /* Flexible disk device geometry page. */
536
        p[0] = 5;
537
        p[1] = 0x1e;
538
        if (page_control == 1) { /* Changeable Values */
539
            return p[1] + 2;
540
        }
541
        /* Transfer rate [kbit/s], 5Mbit/s */
542
        p[2] = 5000 >> 8;
543
        p[3] = 5000 & 0xff;
544
        /* if a geometry hint is available, use it */
545
        bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
546
        p[4] = heads & 0xff;
547
        p[5] = secs & 0xff;
548
        p[6] = s->cluster_size * 2;
549
        p[8] = (cylinders >> 8) & 0xff;
550
        p[9] = cylinders & 0xff;
551
        /* Write precomp start cylinder, disabled */
552
        p[10] = (cylinders >> 8) & 0xff;
553
        p[11] = cylinders & 0xff;
554
        /* Reduced current start cylinder, disabled */
555
        p[12] = (cylinders >> 8) & 0xff;
556
        p[13] = cylinders & 0xff;
557
        /* Device step rate [100us], 100us */
558
        p[14] = 0;
559
        p[15] = 1;
560
        /* Device step pulse width [us], 1us */
561
        p[16] = 1;
562
        /* Device head settle delay [100us], 100us */
563
        p[17] = 0;
564
        p[18] = 1;
565
        /* Motor on delay [0.1s], 0.1s */
566
        p[19] = 1;
567
        /* Motor off delay [0.1s], 0.1s */
568
        p[20] = 1;
569
        /* Medium rotation rate [rpm], 5400 rpm */
570
        p[28] = (5400 >> 8) & 0xff;
571
        p[29] = 5400 & 0xff;
572
        return p[1] + 2;
573

    
574
    case 8: /* Caching page.  */
575
        p[0] = 8;
576
        p[1] = 0x12;
577
        if (page_control == 1) { /* Changeable Values */
578
            return p[1] + 2;
579
        }
580
        if (bdrv_enable_write_cache(s->bs)) {
581
            p[2] = 4; /* WCE */
582
        }
583
        return p[1] + 2;
584

    
585
    case 0x2a: /* CD Capabilities and Mechanical Status page. */
586
        if (bdrv_get_type_hint(bdrv) != BDRV_TYPE_CDROM)
587
            return 0;
588
        p[0] = 0x2a;
589
        p[1] = 0x14;
590
        if (page_control == 1) { /* Changeable Values */
591
            return p[1] + 2;
592
        }
593
        p[2] = 3; // CD-R & CD-RW read
594
        p[3] = 0; // Writing not supported
595
        p[4] = 0x7f; /* Audio, composite, digital out,
596
                        mode 2 form 1&2, multi session */
597
        p[5] = 0xff; /* CD DA, DA accurate, RW supported,
598
                        RW corrected, C2 errors, ISRC,
599
                        UPC, Bar code */
600
        p[6] = 0x2d | (bdrv_is_locked(s->bs)? 2 : 0);
601
        /* Locking supported, jumper present, eject, tray */
602
        p[7] = 0; /* no volume & mute control, no
603
                     changer */
604
        p[8] = (50 * 176) >> 8; // 50x read speed
605
        p[9] = (50 * 176) & 0xff;
606
        p[10] = 0 >> 8; // No volume
607
        p[11] = 0 & 0xff;
608
        p[12] = 2048 >> 8; // 2M buffer
609
        p[13] = 2048 & 0xff;
610
        p[14] = (16 * 176) >> 8; // 16x read speed current
611
        p[15] = (16 * 176) & 0xff;
612
        p[18] = (16 * 176) >> 8; // 16x write speed
613
        p[19] = (16 * 176) & 0xff;
614
        p[20] = (16 * 176) >> 8; // 16x write speed current
615
        p[21] = (16 * 176) & 0xff;
616
        return p[1] + 2;
617

    
618
    default:
619
        return 0;
620
    }
621
}
622

    
623
static int scsi_disk_emulate_mode_sense(SCSIRequest *req, uint8_t *outbuf)
624
{
625
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
626
    uint64_t nb_sectors;
627
    int page, dbd, buflen, page_control;
628
    uint8_t *p;
629
    uint8_t dev_specific_param;
630

    
631
    dbd = req->cmd.buf[1]  & 0x8;
632
    page = req->cmd.buf[2] & 0x3f;
633
    page_control = (req->cmd.buf[2] & 0xc0) >> 6;
634
    DPRINTF("Mode Sense(%d) (page %d, len %d, page_control %d)\n",
635
        (req->cmd.buf[0] == MODE_SENSE) ? 6 : 10, page, len, page_control);
636
    memset(outbuf, 0, req->cmd.xfer);
637
    p = outbuf;
638

    
639
    if (bdrv_is_read_only(s->bs)) {
640
        dev_specific_param = 0x80; /* Readonly.  */
641
    } else {
642
        dev_specific_param = 0x00;
643
    }
644

    
645
    if (req->cmd.buf[0] == MODE_SENSE) {
646
        p[1] = 0; /* Default media type.  */
647
        p[2] = dev_specific_param;
648
        p[3] = 0; /* Block descriptor length.  */
649
        p += 4;
650
    } else { /* MODE_SENSE_10 */
651
        p[2] = 0; /* Default media type.  */
652
        p[3] = dev_specific_param;
653
        p[6] = p[7] = 0; /* Block descriptor length.  */
654
        p += 8;
655
    }
656

    
657
    bdrv_get_geometry(s->bs, &nb_sectors);
658
    if ((~dbd) & nb_sectors) {
659
        if (req->cmd.buf[0] == MODE_SENSE) {
660
            outbuf[3] = 8; /* Block descriptor length  */
661
        } else { /* MODE_SENSE_10 */
662
            outbuf[7] = 8; /* Block descriptor length  */
663
        }
664
        nb_sectors /= s->cluster_size;
665
        if (nb_sectors > 0xffffff)
666
            nb_sectors = 0;
667
        p[0] = 0; /* media density code */
668
        p[1] = (nb_sectors >> 16) & 0xff;
669
        p[2] = (nb_sectors >> 8) & 0xff;
670
        p[3] = nb_sectors & 0xff;
671
        p[4] = 0; /* reserved */
672
        p[5] = 0; /* bytes 5-7 are the sector size in bytes */
673
        p[6] = s->cluster_size * 2;
674
        p[7] = 0;
675
        p += 8;
676
    }
677

    
678
    if (page_control == 3) { /* Saved Values */
679
        return -1; /* ILLEGAL_REQUEST */
680
    }
681

    
682
    switch (page) {
683
    case 0x04:
684
    case 0x05:
685
    case 0x08:
686
    case 0x2a:
687
        p += mode_sense_page(req, page, p, page_control);
688
        break;
689
    case 0x3f:
690
        p += mode_sense_page(req, 0x08, p, page_control);
691
        p += mode_sense_page(req, 0x2a, p, page_control);
692
        break;
693
    default:
694
        return -1; /* ILLEGAL_REQUEST */
695
    }
696

    
697
    buflen = p - outbuf;
698
    /*
699
     * The mode data length field specifies the length in bytes of the
700
     * following data that is available to be transferred. The mode data
701
     * length does not include itself.
702
     */
703
    if (req->cmd.buf[0] == MODE_SENSE) {
704
        outbuf[0] = buflen - 1;
705
    } else { /* MODE_SENSE_10 */
706
        outbuf[0] = ((buflen - 2) >> 8) & 0xff;
707
        outbuf[1] = (buflen - 2) & 0xff;
708
    }
709
    if (buflen > req->cmd.xfer)
710
        buflen = req->cmd.xfer;
711
    return buflen;
712
}
713

    
714
static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
715
{
716
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
717
    int start_track, format, msf, toclen;
718
    uint64_t nb_sectors;
719

    
720
    msf = req->cmd.buf[1] & 2;
721
    format = req->cmd.buf[2] & 0xf;
722
    start_track = req->cmd.buf[6];
723
    bdrv_get_geometry(s->bs, &nb_sectors);
724
    DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
725
    nb_sectors /= s->cluster_size;
726
    switch (format) {
727
    case 0:
728
        toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
729
        break;
730
    case 1:
731
        /* multi session : only a single session defined */
732
        toclen = 12;
733
        memset(outbuf, 0, 12);
734
        outbuf[1] = 0x0a;
735
        outbuf[2] = 0x01;
736
        outbuf[3] = 0x01;
737
        break;
738
    case 2:
739
        toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
740
        break;
741
    default:
742
        return -1;
743
    }
744
    if (toclen > req->cmd.xfer)
745
        toclen = req->cmd.xfer;
746
    return toclen;
747
}
748

    
749
static int scsi_disk_emulate_command(SCSIRequest *req, uint8_t *outbuf)
750
{
751
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
752
    uint64_t nb_sectors;
753
    int buflen = 0;
754

    
755
    switch (req->cmd.buf[0]) {
756
    case TEST_UNIT_READY:
757
        if (!bdrv_is_inserted(s->bs))
758
            goto not_ready;
759
        break;
760
    case REQUEST_SENSE:
761
        if (req->cmd.xfer < 4)
762
            goto illegal_request;
763
        memset(outbuf, 0, 4);
764
        buflen = 4;
765
        if (req->dev->sense.key == NOT_READY && req->cmd.xfer >= 18) {
766
            memset(outbuf, 0, 18);
767
            buflen = 18;
768
            outbuf[7] = 10;
769
            /* asc 0x3a, ascq 0: Medium not present */
770
            outbuf[12] = 0x3a;
771
            outbuf[13] = 0;
772
        }
773
        outbuf[0] = 0xf0;
774
        outbuf[1] = 0;
775
        outbuf[2] = req->dev->sense.key;
776
        scsi_dev_clear_sense(req->dev);
777
        break;
778
    case INQUIRY:
779
        buflen = scsi_disk_emulate_inquiry(req, outbuf);
780
        if (buflen < 0)
781
            goto illegal_request;
782
        break;
783
    case MODE_SENSE:
784
    case MODE_SENSE_10:
785
        buflen = scsi_disk_emulate_mode_sense(req, outbuf);
786
        if (buflen < 0)
787
            goto illegal_request;
788
        break;
789
    case READ_TOC:
790
        buflen = scsi_disk_emulate_read_toc(req, outbuf);
791
        if (buflen < 0)
792
            goto illegal_request;
793
        break;
794
    case RESERVE:
795
        if (req->cmd.buf[1] & 1)
796
            goto illegal_request;
797
        break;
798
    case RESERVE_10:
799
        if (req->cmd.buf[1] & 3)
800
            goto illegal_request;
801
        break;
802
    case RELEASE:
803
        if (req->cmd.buf[1] & 1)
804
            goto illegal_request;
805
        break;
806
    case RELEASE_10:
807
        if (req->cmd.buf[1] & 3)
808
            goto illegal_request;
809
        break;
810
    case START_STOP:
811
        if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM && (req->cmd.buf[4] & 2)) {
812
            /* load/eject medium */
813
            bdrv_eject(s->bs, !(req->cmd.buf[4] & 1));
814
        }
815
        break;
816
    case ALLOW_MEDIUM_REMOVAL:
817
        bdrv_set_locked(s->bs, req->cmd.buf[4] & 1);
818
        break;
819
    case READ_CAPACITY:
820
        /* The normal LEN field for this command is zero.  */
821
        memset(outbuf, 0, 8);
822
        bdrv_get_geometry(s->bs, &nb_sectors);
823
        if (!nb_sectors)
824
            goto not_ready;
825
        nb_sectors /= s->cluster_size;
826
        /* Returned value is the address of the last sector.  */
827
        nb_sectors--;
828
        /* Remember the new size for read/write sanity checking. */
829
        s->max_lba = nb_sectors;
830
        /* Clip to 2TB, instead of returning capacity modulo 2TB. */
831
        if (nb_sectors > UINT32_MAX)
832
            nb_sectors = UINT32_MAX;
833
        outbuf[0] = (nb_sectors >> 24) & 0xff;
834
        outbuf[1] = (nb_sectors >> 16) & 0xff;
835
        outbuf[2] = (nb_sectors >> 8) & 0xff;
836
        outbuf[3] = nb_sectors & 0xff;
837
        outbuf[4] = 0;
838
        outbuf[5] = 0;
839
        outbuf[6] = s->cluster_size * 2;
840
        outbuf[7] = 0;
841
        buflen = 8;
842
        break;
843
    case SYNCHRONIZE_CACHE:
844
        bdrv_flush(s->bs);
845
        break;
846
    case GET_CONFIGURATION:
847
        memset(outbuf, 0, 8);
848
        /* ??? This should probably return much more information.  For now
849
           just return the basic header indicating the CD-ROM profile.  */
850
        outbuf[7] = 8; // CD-ROM
851
        buflen = 8;
852
        break;
853
    case SERVICE_ACTION_IN:
854
        /* Service Action In subcommands. */
855
        if ((req->cmd.buf[1] & 31) == 0x10) {
856
            DPRINTF("SAI READ CAPACITY(16)\n");
857
            memset(outbuf, 0, req->cmd.xfer);
858
            bdrv_get_geometry(s->bs, &nb_sectors);
859
            if (!nb_sectors)
860
                goto not_ready;
861
            nb_sectors /= s->cluster_size;
862
            /* Returned value is the address of the last sector.  */
863
            nb_sectors--;
864
            /* Remember the new size for read/write sanity checking. */
865
            s->max_lba = nb_sectors;
866
            outbuf[0] = (nb_sectors >> 56) & 0xff;
867
            outbuf[1] = (nb_sectors >> 48) & 0xff;
868
            outbuf[2] = (nb_sectors >> 40) & 0xff;
869
            outbuf[3] = (nb_sectors >> 32) & 0xff;
870
            outbuf[4] = (nb_sectors >> 24) & 0xff;
871
            outbuf[5] = (nb_sectors >> 16) & 0xff;
872
            outbuf[6] = (nb_sectors >> 8) & 0xff;
873
            outbuf[7] = nb_sectors & 0xff;
874
            outbuf[8] = 0;
875
            outbuf[9] = 0;
876
            outbuf[10] = s->cluster_size * 2;
877
            outbuf[11] = 0;
878
            outbuf[12] = 0;
879
            outbuf[13] = get_physical_block_exp(&s->qdev.conf);
880
            /* Protection, exponent and lowest lba field left blank. */
881
            buflen = req->cmd.xfer;
882
            break;
883
        }
884
        DPRINTF("Unsupported Service Action In\n");
885
        goto illegal_request;
886
    case REPORT_LUNS:
887
        if (req->cmd.xfer < 16)
888
            goto illegal_request;
889
        memset(outbuf, 0, 16);
890
        outbuf[3] = 8;
891
        buflen = 16;
892
        break;
893
    case VERIFY:
894
        break;
895
    default:
896
        goto illegal_request;
897
    }
898
    scsi_req_set_status(req, GOOD, NO_SENSE);
899
    return buflen;
900

    
901
not_ready:
902
    scsi_req_set_status(req, CHECK_CONDITION, NOT_READY);
903
    return 0;
904

    
905
illegal_request:
906
    scsi_req_set_status(req, CHECK_CONDITION, ILLEGAL_REQUEST);
907
    return 0;
908
}
909

    
910
/* Execute a scsi command.  Returns the length of the data expected by the
911
   command.  This will be Positive for data transfers from the device
912
   (eg. disk reads), negative for transfers to the device (eg. disk writes),
913
   and zero if the command does not transfer any data.  */
914

    
915
static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
916
                                 uint8_t *buf, int lun)
917
{
918
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
919
    uint64_t lba;
920
    uint32_t len;
921
    int cmdlen;
922
    int is_write;
923
    uint8_t command;
924
    uint8_t *outbuf;
925
    SCSIDiskReq *r;
926
    int rc;
927

    
928
    command = buf[0];
929
    r = scsi_find_request(s, tag);
930
    if (r) {
931
        BADF("Tag 0x%x already in use\n", tag);
932
        scsi_cancel_io(d, tag);
933
    }
934
    /* ??? Tags are not unique for different luns.  We only implement a
935
       single lun, so this should not matter.  */
936
    r = scsi_new_request(d, tag, lun);
937
    outbuf = (uint8_t *)r->iov.iov_base;
938
    is_write = 0;
939
    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
940
    switch (command >> 5) {
941
    case 0:
942
        lba = (uint64_t) buf[3] | ((uint64_t) buf[2] << 8) |
943
              (((uint64_t) buf[1] & 0x1f) << 16);
944
        len = buf[4];
945
        cmdlen = 6;
946
        break;
947
    case 1:
948
    case 2:
949
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
950
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
951
        len = buf[8] | (buf[7] << 8);
952
        cmdlen = 10;
953
        break;
954
    case 4:
955
        lba = (uint64_t) buf[9] | ((uint64_t) buf[8] << 8) |
956
              ((uint64_t) buf[7] << 16) | ((uint64_t) buf[6] << 24) |
957
              ((uint64_t) buf[5] << 32) | ((uint64_t) buf[4] << 40) |
958
              ((uint64_t) buf[3] << 48) | ((uint64_t) buf[2] << 56);
959
        len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
960
        cmdlen = 16;
961
        break;
962
    case 5:
963
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
964
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
965
        len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
966
        cmdlen = 12;
967
        break;
968
    default:
969
        BADF("Unsupported command length, command %x\n", command);
970
        goto fail;
971
    }
972
#ifdef DEBUG_SCSI
973
    {
974
        int i;
975
        for (i = 1; i < cmdlen; i++) {
976
            printf(" 0x%02x", buf[i]);
977
        }
978
        printf("\n");
979
    }
980
#endif
981

    
982
    if (scsi_req_parse(&r->req, buf) != 0) {
983
        BADF("Unsupported command length, command %x\n", command);
984
        goto fail;
985
    }
986
    assert(r->req.cmd.len == cmdlen);
987
    assert(r->req.cmd.lba == lba);
988

    
989
    if (lun || buf[1] >> 5) {
990
        /* Only LUN 0 supported.  */
991
        DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
992
        if (command != REQUEST_SENSE && command != INQUIRY)
993
            goto fail;
994
    }
995
    switch (command) {
996
    case TEST_UNIT_READY:
997
    case REQUEST_SENSE:
998
    case INQUIRY:
999
    case MODE_SENSE:
1000
    case MODE_SENSE_10:
1001
    case RESERVE:
1002
    case RESERVE_10:
1003
    case RELEASE:
1004
    case RELEASE_10:
1005
    case START_STOP:
1006
    case ALLOW_MEDIUM_REMOVAL:
1007
    case READ_CAPACITY:
1008
    case SYNCHRONIZE_CACHE:
1009
    case READ_TOC:
1010
    case GET_CONFIGURATION:
1011
    case SERVICE_ACTION_IN:
1012
    case REPORT_LUNS:
1013
    case VERIFY:
1014
        rc = scsi_disk_emulate_command(&r->req, outbuf);
1015
        if (rc > 0) {
1016
            r->iov.iov_len = rc;
1017
        } else {
1018
            scsi_req_complete(&r->req);
1019
            scsi_remove_request(r);
1020
            return 0;
1021
        }
1022
        break;
1023
    case READ_6:
1024
    case READ_10:
1025
    case READ_12:
1026
    case READ_16:
1027
        DPRINTF("Read (sector %" PRId64 ", count %d)\n", lba, len);
1028
        if (lba > s->max_lba)
1029
            goto illegal_lba;
1030
        r->sector = lba * s->cluster_size;
1031
        r->sector_count = len * s->cluster_size;
1032
        break;
1033
    case WRITE_6:
1034
    case WRITE_10:
1035
    case WRITE_12:
1036
    case WRITE_16:
1037
        DPRINTF("Write (sector %" PRId64 ", count %d)\n", lba, len);
1038
        if (lba > s->max_lba)
1039
            goto illegal_lba;
1040
        r->sector = lba * s->cluster_size;
1041
        r->sector_count = len * s->cluster_size;
1042
        is_write = 1;
1043
        break;
1044
    default:
1045
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
1046
    fail:
1047
        scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST);
1048
        return 0;
1049
    illegal_lba:
1050
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
1051
        return 0;
1052
    }
1053
    if (r->sector_count == 0 && r->iov.iov_len == 0) {
1054
        scsi_command_complete(r, GOOD, NO_SENSE);
1055
    }
1056
    len = r->sector_count * 512 + r->iov.iov_len;
1057
    if (is_write) {
1058
        return -len;
1059
    } else {
1060
        if (!r->sector_count)
1061
            r->sector_count = -1;
1062
        return len;
1063
    }
1064
}
1065

    
1066
static void scsi_disk_purge_requests(SCSIDiskState *s)
1067
{
1068
    SCSIDiskReq *r;
1069

    
1070
    while (!QTAILQ_EMPTY(&s->qdev.requests)) {
1071
        r = DO_UPCAST(SCSIDiskReq, req, QTAILQ_FIRST(&s->qdev.requests));
1072
        if (r->req.aiocb) {
1073
            bdrv_aio_cancel(r->req.aiocb);
1074
        }
1075
        scsi_remove_request(r);
1076
    }
1077
}
1078

    
1079
static void scsi_disk_reset(DeviceState *dev)
1080
{
1081
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev.qdev, dev);
1082
    uint64_t nb_sectors;
1083

    
1084
    scsi_disk_purge_requests(s);
1085

    
1086
    bdrv_get_geometry(s->bs, &nb_sectors);
1087
    nb_sectors /= s->cluster_size;
1088
    if (nb_sectors) {
1089
        nb_sectors--;
1090
    }
1091
    s->max_lba = nb_sectors;
1092
}
1093

    
1094
static void scsi_destroy(SCSIDevice *dev)
1095
{
1096
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1097

    
1098
    scsi_disk_purge_requests(s);
1099
    blockdev_mark_auto_del(s->qdev.conf.bs);
1100
}
1101

    
1102
static int scsi_disk_initfn(SCSIDevice *dev)
1103
{
1104
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1105
    int is_cd;
1106
    DriveInfo *dinfo;
1107

    
1108
    if (!s->qdev.conf.bs) {
1109
        error_report("scsi-disk: drive property not set");
1110
        return -1;
1111
    }
1112
    s->bs = s->qdev.conf.bs;
1113
    is_cd = bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM;
1114

    
1115
    if (!is_cd && !bdrv_is_inserted(s->bs)) {
1116
        error_report("Device needs media, but drive is empty");
1117
        return -1;
1118
    }
1119

    
1120
    if (bdrv_get_on_error(s->bs, 1) != BLOCK_ERR_REPORT) {
1121
        error_report("Device doesn't support drive option rerror");
1122
        return -1;
1123
    }
1124

    
1125
    if (!s->serial) {
1126
        /* try to fall back to value set with legacy -drive serial=... */
1127
        dinfo = drive_get_by_blockdev(s->bs);
1128
        s->serial = qemu_strdup(*dinfo->serial ? dinfo->serial : "0");
1129
    }
1130

    
1131
    if (!s->version) {
1132
        s->version = qemu_strdup(QEMU_VERSION);
1133
    }
1134

    
1135
    if (bdrv_is_sg(s->bs)) {
1136
        error_report("scsi-disk: unwanted /dev/sg*");
1137
        return -1;
1138
    }
1139

    
1140
    if (is_cd) {
1141
        s->qdev.blocksize = 2048;
1142
    } else {
1143
        s->qdev.blocksize = s->qdev.conf.logical_block_size;
1144
    }
1145
    s->cluster_size = s->qdev.blocksize / 512;
1146

    
1147
    s->qdev.type = TYPE_DISK;
1148
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
1149
    bdrv_set_removable(s->bs, is_cd);
1150
    return 0;
1151
}
1152

    
1153
static SCSIDeviceInfo scsi_disk_info = {
1154
    .qdev.name    = "scsi-disk",
1155
    .qdev.desc    = "virtual scsi disk or cdrom",
1156
    .qdev.size    = sizeof(SCSIDiskState),
1157
    .qdev.reset   = scsi_disk_reset,
1158
    .init         = scsi_disk_initfn,
1159
    .destroy      = scsi_destroy,
1160
    .send_command = scsi_send_command,
1161
    .read_data    = scsi_read_data,
1162
    .write_data   = scsi_write_data,
1163
    .cancel_io    = scsi_cancel_io,
1164
    .get_buf      = scsi_get_buf,
1165
    .qdev.props   = (Property[]) {
1166
        DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
1167
        DEFINE_PROP_STRING("ver",  SCSIDiskState, version),
1168
        DEFINE_PROP_STRING("serial",  SCSIDiskState, serial),
1169
        DEFINE_PROP_END_OF_LIST(),
1170
    },
1171
};
1172

    
1173
static void scsi_disk_register_devices(void)
1174
{
1175
    scsi_qdev_register(&scsi_disk_info);
1176
}
1177
device_init(scsi_disk_register_devices)