Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ 2488b740

History | View | Annotate | Download (35 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
    }
694

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

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

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

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

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

    
899
not_ready:
900
    scsi_req_set_status(req, CHECK_CONDITION, NOT_READY);
901
    return 0;
902

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

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

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

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

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

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

    
1064
static void scsi_disk_purge_requests(SCSIDiskState *s)
1065
{
1066
    SCSIDiskReq *r;
1067

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

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

    
1082
    scsi_disk_purge_requests(s);
1083

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

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

    
1096
    scsi_disk_purge_requests(s);
1097
    blockdev_mark_auto_del(s->qdev.conf.bs);
1098
}
1099

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

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

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

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

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

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

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

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

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

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

    
1171
static void scsi_disk_register_devices(void)
1172
{
1173
    scsi_qdev_register(&scsi_disk_info);
1174
}
1175
device_init(scsi_disk_register_devices)