Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ 1ecda02b

History | View | Annotate | Download (32.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 "block.h"
37
#include "scsi.h"
38
#include "scsi-defs.h"
39

    
40
#define SCSI_DMA_BUF_SIZE    131072
41
#define SCSI_MAX_INQUIRY_LEN 256
42

    
43
#define SCSI_REQ_STATUS_RETRY 0x01
44

    
45
typedef struct SCSIDiskState SCSIDiskState;
46

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

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

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

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

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

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

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

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

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

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

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

    
136
    r->req.bus->complete(r->req.bus, SCSI_REASON_DATA, r->req.tag, r->iov.iov_len);
137
}
138

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

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

    
165
    n = r->sector_count;
166
    if (n > SCSI_DMA_BUF_SIZE / 512)
167
        n = SCSI_DMA_BUF_SIZE / 512;
168

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

    
179
static int scsi_handle_write_error(SCSIDiskReq *r, int error)
180
{
181
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
182
    BlockInterfaceErrorAction action = drive_get_on_error(s->bs, 0);
183

    
184
    if (action == BLOCK_ERR_IGNORE) {
185
        bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, 0);
186
        return 0;
187
    }
188

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

    
200
    return 1;
201
}
202

    
203
static void scsi_write_complete(void * opaque, int ret)
204
{
205
    SCSIDiskReq *r = (SCSIDiskReq *)opaque;
206
    uint32_t len;
207
    uint32_t n;
208

    
209
    r->req.aiocb = NULL;
210

    
211
    if (ret) {
212
        if (scsi_handle_write_error(r, -ret))
213
            return;
214
    }
215

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

    
232
static void scsi_write_request(SCSIDiskReq *r)
233
{
234
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
235
    uint32_t n;
236

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

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

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

    
266
    if (r->req.aiocb)
267
        BADF("Data transfer already in progress\n");
268

    
269
    scsi_write_request(r);
270

    
271
    return 0;
272
}
273

    
274
static void scsi_dma_restart_bh(void *opaque)
275
{
276
    SCSIDiskState *s = opaque;
277
    SCSIRequest *req;
278
    SCSIDiskReq *r;
279

    
280
    qemu_bh_delete(s->bh);
281
    s->bh = NULL;
282

    
283
    QTAILQ_FOREACH(req, &s->qdev.requests, next) {
284
        r = DO_UPCAST(SCSIDiskReq, req, req);
285
        if (r->status & SCSI_REQ_STATUS_RETRY) {
286
            r->status &= ~SCSI_REQ_STATUS_RETRY;
287
            scsi_write_request(r); 
288
        }
289
    }
290
}
291

    
292
static void scsi_dma_restart_cb(void *opaque, int running, int reason)
293
{
294
    SCSIDiskState *s = opaque;
295

    
296
    if (!running)
297
        return;
298

    
299
    if (!s->bh) {
300
        s->bh = qemu_bh_new(scsi_dma_restart_bh, s);
301
        qemu_bh_schedule(s->bh);
302
    }
303
}
304

    
305
/* Return a pointer to the data buffer.  */
306
static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
307
{
308
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
309
    SCSIDiskReq *r;
310

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

    
319
static int scsi_disk_emulate_inquiry(SCSIRequest *req, uint8_t *outbuf)
320
{
321
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
322
    int buflen = 0;
323

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

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

    
339
        if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
340
            outbuf[buflen++] = 5;
341
        } else {
342
            outbuf[buflen++] = 0;
343
        }
344
        outbuf[buflen++] = page_code ; // this page
345
        outbuf[buflen++] = 0x00;
346

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

    
358
        case 0x80: /* Device serial number, optional */
359
        {
360
            const char *serial = req->dev->conf.dinfo->serial ?
361
                req->dev->conf.dinfo->serial : "0";
362
            int l = strlen(serial);
363

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

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

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

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

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

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

    
402
            /* required VPD size with unmap support */
403
            outbuf[3] = buflen = 0x3c;
404

    
405
            memset(outbuf + 4, 0, buflen - 4);
406

    
407
            /* optimal transfer length granularity */
408
            outbuf[6] = (min_io_size >> 8) & 0xff;
409
            outbuf[7] = min_io_size & 0xff;
410

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

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

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

    
441
    buflen = req->cmd.xfer;
442
    if (buflen > SCSI_MAX_INQUIRY_LEN)
443
        buflen = SCSI_MAX_INQUIRY_LEN;
444

    
445
    memset(outbuf, 0, buflen);
446

    
447
    if (req->lun || req->cmd.buf[1] >> 5) {
448
        outbuf[0] = 0x7f;        /* LUN not supported */
449
        return buflen;
450
    }
451

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

    
471
    if (buflen > 36) {
472
        outbuf[4] = buflen - 5; /* Additional Length = (Len - 1) - 4 */
473
    } else {
474
        /* If the allocation length of CDB is too small,
475
               the additional length is not adjusted */
476
        outbuf[4] = 36 - 5;
477
    }
478

    
479
    /* Sync data transfer and TCQ.  */
480
    outbuf[7] = 0x10 | (req->bus->tcq ? 0x02 : 0);
481
    return buflen;
482
}
483

    
484
static int mode_sense_page(SCSIRequest *req, int page, uint8_t *p)
485
{
486
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
487
    BlockDriverState *bdrv = s->bs;
488
    int cylinders, heads, secs;
489

    
490
    switch (page) {
491
    case 4: /* Rigid disk device geometry page. */
492
        p[0] = 4;
493
        p[1] = 0x16;
494
        /* if a geometry hint is available, use it */
495
        bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
496
        p[2] = (cylinders >> 16) & 0xff;
497
        p[3] = (cylinders >> 8) & 0xff;
498
        p[4] = cylinders & 0xff;
499
        p[5] = heads & 0xff;
500
        /* Write precomp start cylinder, disabled */
501
        p[6] = (cylinders >> 16) & 0xff;
502
        p[7] = (cylinders >> 8) & 0xff;
503
        p[8] = cylinders & 0xff;
504
        /* Reduced current start cylinder, disabled */
505
        p[9] = (cylinders >> 16) & 0xff;
506
        p[10] = (cylinders >> 8) & 0xff;
507
        p[11] = cylinders & 0xff;
508
        /* Device step rate [ns], 200ns */
509
        p[12] = 0;
510
        p[13] = 200;
511
        /* Landing zone cylinder */
512
        p[14] = 0xff;
513
        p[15] =  0xff;
514
        p[16] = 0xff;
515
        /* Medium rotation rate [rpm], 5400 rpm */
516
        p[20] = (5400 >> 8) & 0xff;
517
        p[21] = 5400 & 0xff;
518
        return 0x16;
519

    
520
    case 5: /* Flexible disk device geometry page. */
521
        p[0] = 5;
522
        p[1] = 0x1e;
523
        /* Transfer rate [kbit/s], 5Mbit/s */
524
        p[2] = 5000 >> 8;
525
        p[3] = 5000 & 0xff;
526
        /* if a geometry hint is available, use it */
527
        bdrv_get_geometry_hint(bdrv, &cylinders, &heads, &secs);
528
        p[4] = heads & 0xff;
529
        p[5] = secs & 0xff;
530
        p[6] = s->cluster_size * 2;
531
        p[8] = (cylinders >> 8) & 0xff;
532
        p[9] = cylinders & 0xff;
533
        /* Write precomp start cylinder, disabled */
534
        p[10] = (cylinders >> 8) & 0xff;
535
        p[11] = cylinders & 0xff;
536
        /* Reduced current start cylinder, disabled */
537
        p[12] = (cylinders >> 8) & 0xff;
538
        p[13] = cylinders & 0xff;
539
        /* Device step rate [100us], 100us */
540
        p[14] = 0;
541
        p[15] = 1;
542
        /* Device step pulse width [us], 1us */
543
        p[16] = 1;
544
        /* Device head settle delay [100us], 100us */
545
        p[17] = 0;
546
        p[18] = 1;
547
        /* Motor on delay [0.1s], 0.1s */
548
        p[19] = 1;
549
        /* Motor off delay [0.1s], 0.1s */
550
        p[20] = 1;
551
        /* Medium rotation rate [rpm], 5400 rpm */
552
        p[28] = (5400 >> 8) & 0xff;
553
        p[29] = 5400 & 0xff;
554
        return 0x1e;
555

    
556
    case 8: /* Caching page.  */
557
        p[0] = 8;
558
        p[1] = 0x12;
559
        if (bdrv_enable_write_cache(s->bs)) {
560
            p[2] = 4; /* WCE */
561
        }
562
        return 20;
563

    
564
    case 0x2a: /* CD Capabilities and Mechanical Status page. */
565
        if (bdrv_get_type_hint(bdrv) != BDRV_TYPE_CDROM)
566
            return 0;
567
        p[0] = 0x2a;
568
        p[1] = 0x14;
569
        p[2] = 3; // CD-R & CD-RW read
570
        p[3] = 0; // Writing not supported
571
        p[4] = 0x7f; /* Audio, composite, digital out,
572
                        mode 2 form 1&2, multi session */
573
        p[5] = 0xff; /* CD DA, DA accurate, RW supported,
574
                        RW corrected, C2 errors, ISRC,
575
                        UPC, Bar code */
576
        p[6] = 0x2d | (bdrv_is_locked(s->bs)? 2 : 0);
577
        /* Locking supported, jumper present, eject, tray */
578
        p[7] = 0; /* no volume & mute control, no
579
                     changer */
580
        p[8] = (50 * 176) >> 8; // 50x read speed
581
        p[9] = (50 * 176) & 0xff;
582
        p[10] = 0 >> 8; // No volume
583
        p[11] = 0 & 0xff;
584
        p[12] = 2048 >> 8; // 2M buffer
585
        p[13] = 2048 & 0xff;
586
        p[14] = (16 * 176) >> 8; // 16x read speed current
587
        p[15] = (16 * 176) & 0xff;
588
        p[18] = (16 * 176) >> 8; // 16x write speed
589
        p[19] = (16 * 176) & 0xff;
590
        p[20] = (16 * 176) >> 8; // 16x write speed current
591
        p[21] = (16 * 176) & 0xff;
592
        return 22;
593

    
594
    default:
595
        return 0;
596
    }
597
}
598

    
599
static int scsi_disk_emulate_mode_sense(SCSIRequest *req, uint8_t *outbuf)
600
{
601
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
602
    uint64_t nb_sectors;
603
    int page, dbd, buflen;
604
    uint8_t *p;
605

    
606
    dbd = req->cmd.buf[1]  & 0x8;
607
    page = req->cmd.buf[2] & 0x3f;
608
    DPRINTF("Mode Sense (page %d, len %zd)\n", page, req->cmd.xfer);
609
    memset(outbuf, 0, req->cmd.xfer);
610
    p = outbuf;
611

    
612
    p[1] = 0; /* Default media type.  */
613
    p[3] = 0; /* Block descriptor length.  */
614
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM ||
615
        bdrv_is_read_only(s->bs)) {
616
        p[2] = 0x80; /* Readonly.  */
617
    }
618
    p += 4;
619

    
620
    bdrv_get_geometry(s->bs, &nb_sectors);
621
    if ((~dbd) & nb_sectors) {
622
        outbuf[3] = 8; /* Block descriptor length  */
623
        nb_sectors /= s->cluster_size;
624
        nb_sectors--;
625
        if (nb_sectors > 0xffffff)
626
            nb_sectors = 0xffffff;
627
        p[0] = 0; /* media density code */
628
        p[1] = (nb_sectors >> 16) & 0xff;
629
        p[2] = (nb_sectors >> 8) & 0xff;
630
        p[3] = nb_sectors & 0xff;
631
        p[4] = 0; /* reserved */
632
        p[5] = 0; /* bytes 5-7 are the sector size in bytes */
633
        p[6] = s->cluster_size * 2;
634
        p[7] = 0;
635
        p += 8;
636
    }
637

    
638
    switch (page) {
639
    case 0x04:
640
    case 0x05:
641
    case 0x08:
642
    case 0x2a:
643
        p += mode_sense_page(req, page, p);
644
        break;
645
    case 0x3f:
646
        p += mode_sense_page(req, 0x08, p);
647
        p += mode_sense_page(req, 0x2a, p);
648
        break;
649
    }
650

    
651
    buflen = p - outbuf;
652
    outbuf[0] = buflen - 4;
653
    if (buflen > req->cmd.xfer)
654
        buflen = req->cmd.xfer;
655
    return buflen;
656
}
657

    
658
static int scsi_disk_emulate_read_toc(SCSIRequest *req, uint8_t *outbuf)
659
{
660
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
661
    int start_track, format, msf, toclen;
662
    uint64_t nb_sectors;
663

    
664
    msf = req->cmd.buf[1] & 2;
665
    format = req->cmd.buf[2] & 0xf;
666
    start_track = req->cmd.buf[6];
667
    bdrv_get_geometry(s->bs, &nb_sectors);
668
    DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
669
    nb_sectors /= s->cluster_size;
670
    switch (format) {
671
    case 0:
672
        toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
673
        break;
674
    case 1:
675
        /* multi session : only a single session defined */
676
        toclen = 12;
677
        memset(outbuf, 0, 12);
678
        outbuf[1] = 0x0a;
679
        outbuf[2] = 0x01;
680
        outbuf[3] = 0x01;
681
        break;
682
    case 2:
683
        toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
684
        break;
685
    default:
686
        return -1;
687
    }
688
    if (toclen > req->cmd.xfer)
689
        toclen = req->cmd.xfer;
690
    return toclen;
691
}
692

    
693
static int scsi_disk_emulate_command(SCSIRequest *req, uint8_t *outbuf)
694
{
695
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, req->dev);
696
    uint64_t nb_sectors;
697
    int buflen = 0;
698

    
699
    switch (req->cmd.buf[0]) {
700
    case TEST_UNIT_READY:
701
        if (!bdrv_is_inserted(s->bs))
702
            goto not_ready;
703
        break;
704
    case REQUEST_SENSE:
705
        if (req->cmd.xfer < 4)
706
            goto illegal_request;
707
        memset(outbuf, 0, 4);
708
        buflen = 4;
709
        if (req->dev->sense.key == NOT_READY && req->cmd.xfer >= 18) {
710
            memset(outbuf, 0, 18);
711
            buflen = 18;
712
            outbuf[7] = 10;
713
            /* asc 0x3a, ascq 0: Medium not present */
714
            outbuf[12] = 0x3a;
715
            outbuf[13] = 0;
716
        }
717
        outbuf[0] = 0xf0;
718
        outbuf[1] = 0;
719
        outbuf[2] = req->dev->sense.key;
720
        scsi_dev_clear_sense(req->dev);
721
        break;
722
    case INQUIRY:
723
        buflen = scsi_disk_emulate_inquiry(req, outbuf);
724
        if (buflen < 0)
725
            goto illegal_request;
726
        break;
727
    case MODE_SENSE:
728
    case MODE_SENSE_10:
729
        buflen = scsi_disk_emulate_mode_sense(req, outbuf);
730
        if (buflen < 0)
731
            goto illegal_request;
732
        break;
733
    case READ_TOC:
734
        buflen = scsi_disk_emulate_read_toc(req, outbuf);
735
        if (buflen < 0)
736
            goto illegal_request;
737
        break;
738
    case RESERVE:
739
        if (req->cmd.buf[1] & 1)
740
            goto illegal_request;
741
        break;
742
    case RESERVE_10:
743
        if (req->cmd.buf[1] & 3)
744
            goto illegal_request;
745
        break;
746
    case RELEASE:
747
        if (req->cmd.buf[1] & 1)
748
            goto illegal_request;
749
        break;
750
    case RELEASE_10:
751
        if (req->cmd.buf[1] & 3)
752
            goto illegal_request;
753
        break;
754
    case START_STOP:
755
        if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM && (req->cmd.buf[4] & 2)) {
756
            /* load/eject medium */
757
            bdrv_eject(s->bs, !(req->cmd.buf[4] & 1));
758
        }
759
        break;
760
    case ALLOW_MEDIUM_REMOVAL:
761
        bdrv_set_locked(s->bs, req->cmd.buf[4] & 1);
762
        break;
763
    case READ_CAPACITY:
764
        /* The normal LEN field for this command is zero.  */
765
        memset(outbuf, 0, 8);
766
        bdrv_get_geometry(s->bs, &nb_sectors);
767
        if (!nb_sectors)
768
            goto not_ready;
769
        nb_sectors /= s->cluster_size;
770
        /* Returned value is the address of the last sector.  */
771
        nb_sectors--;
772
        /* Remember the new size for read/write sanity checking. */
773
        s->max_lba = nb_sectors;
774
        /* Clip to 2TB, instead of returning capacity modulo 2TB. */
775
        if (nb_sectors > UINT32_MAX)
776
            nb_sectors = UINT32_MAX;
777
        outbuf[0] = (nb_sectors >> 24) & 0xff;
778
        outbuf[1] = (nb_sectors >> 16) & 0xff;
779
        outbuf[2] = (nb_sectors >> 8) & 0xff;
780
        outbuf[3] = nb_sectors & 0xff;
781
        outbuf[4] = 0;
782
        outbuf[5] = 0;
783
        outbuf[6] = s->cluster_size * 2;
784
        outbuf[7] = 0;
785
        buflen = 8;
786
        break;
787
    case SYNCHRONIZE_CACHE:
788
        bdrv_flush(s->bs);
789
        break;
790
    case GET_CONFIGURATION:
791
        memset(outbuf, 0, 8);
792
        /* ??? This should probably return much more information.  For now
793
           just return the basic header indicating the CD-ROM profile.  */
794
        outbuf[7] = 8; // CD-ROM
795
        buflen = 8;
796
        break;
797
    case SERVICE_ACTION_IN:
798
        /* Service Action In subcommands. */
799
        if ((req->cmd.buf[1] & 31) == 0x10) {
800
            DPRINTF("SAI READ CAPACITY(16)\n");
801
            memset(outbuf, 0, req->cmd.xfer);
802
            bdrv_get_geometry(s->bs, &nb_sectors);
803
            if (!nb_sectors)
804
                goto not_ready;
805
            nb_sectors /= s->cluster_size;
806
            /* Returned value is the address of the last sector.  */
807
            nb_sectors--;
808
            /* Remember the new size for read/write sanity checking. */
809
            s->max_lba = nb_sectors;
810
            outbuf[0] = (nb_sectors >> 56) & 0xff;
811
            outbuf[1] = (nb_sectors >> 48) & 0xff;
812
            outbuf[2] = (nb_sectors >> 40) & 0xff;
813
            outbuf[3] = (nb_sectors >> 32) & 0xff;
814
            outbuf[4] = (nb_sectors >> 24) & 0xff;
815
            outbuf[5] = (nb_sectors >> 16) & 0xff;
816
            outbuf[6] = (nb_sectors >> 8) & 0xff;
817
            outbuf[7] = nb_sectors & 0xff;
818
            outbuf[8] = 0;
819
            outbuf[9] = 0;
820
            outbuf[10] = s->cluster_size * 2;
821
            outbuf[11] = 0;
822
            outbuf[12] = 0;
823
            outbuf[13] = get_physical_block_exp(&s->qdev.conf);
824
            /* Protection, exponent and lowest lba field left blank. */
825
            buflen = req->cmd.xfer;
826
            break;
827
        }
828
        DPRINTF("Unsupported Service Action In\n");
829
        goto illegal_request;
830
    case REPORT_LUNS:
831
        if (req->cmd.xfer < 16)
832
            goto illegal_request;
833
        memset(outbuf, 0, 16);
834
        outbuf[3] = 8;
835
        buflen = 16;
836
        break;
837
    case VERIFY:
838
        break;
839
    default:
840
        goto illegal_request;
841
    }
842
    scsi_req_set_status(req, GOOD, NO_SENSE);
843
    return buflen;
844

    
845
not_ready:
846
    scsi_req_set_status(req, CHECK_CONDITION, NOT_READY);
847
    return 0;
848

    
849
illegal_request:
850
    scsi_req_set_status(req, CHECK_CONDITION, ILLEGAL_REQUEST);
851
    return 0;
852
}
853

    
854
/* Execute a scsi command.  Returns the length of the data expected by the
855
   command.  This will be Positive for data transfers from the device
856
   (eg. disk reads), negative for transfers to the device (eg. disk writes),
857
   and zero if the command does not transfer any data.  */
858

    
859
static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
860
                                 uint8_t *buf, int lun)
861
{
862
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, d);
863
    uint64_t lba;
864
    uint32_t len;
865
    int cmdlen;
866
    int is_write;
867
    uint8_t command;
868
    uint8_t *outbuf;
869
    SCSIDiskReq *r;
870
    int rc;
871

    
872
    command = buf[0];
873
    r = scsi_find_request(s, tag);
874
    if (r) {
875
        BADF("Tag 0x%x already in use\n", tag);
876
        scsi_cancel_io(d, tag);
877
    }
878
    /* ??? Tags are not unique for different luns.  We only implement a
879
       single lun, so this should not matter.  */
880
    r = scsi_new_request(d, tag, lun);
881
    outbuf = (uint8_t *)r->iov.iov_base;
882
    is_write = 0;
883
    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
884
    switch (command >> 5) {
885
    case 0:
886
        lba = (uint64_t) buf[3] | ((uint64_t) buf[2] << 8) |
887
              (((uint64_t) buf[1] & 0x1f) << 16);
888
        len = buf[4];
889
        cmdlen = 6;
890
        break;
891
    case 1:
892
    case 2:
893
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
894
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
895
        len = buf[8] | (buf[7] << 8);
896
        cmdlen = 10;
897
        break;
898
    case 4:
899
        lba = (uint64_t) buf[9] | ((uint64_t) buf[8] << 8) |
900
              ((uint64_t) buf[7] << 16) | ((uint64_t) buf[6] << 24) |
901
              ((uint64_t) buf[5] << 32) | ((uint64_t) buf[4] << 40) |
902
              ((uint64_t) buf[3] << 48) | ((uint64_t) buf[2] << 56);
903
        len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
904
        cmdlen = 16;
905
        break;
906
    case 5:
907
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
908
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
909
        len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
910
        cmdlen = 12;
911
        break;
912
    default:
913
        BADF("Unsupported command length, command %x\n", command);
914
        goto fail;
915
    }
916
#ifdef DEBUG_SCSI
917
    {
918
        int i;
919
        for (i = 1; i < cmdlen; i++) {
920
            printf(" 0x%02x", buf[i]);
921
        }
922
        printf("\n");
923
    }
924
#endif
925

    
926
    if (scsi_req_parse(&r->req, buf) != 0) {
927
        BADF("Unsupported command length, command %x\n", command);
928
        goto fail;
929
    }
930
    assert(r->req.cmd.len == cmdlen);
931
    assert(r->req.cmd.lba == lba);
932

    
933
    if (lun || buf[1] >> 5) {
934
        /* Only LUN 0 supported.  */
935
        DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
936
        if (command != REQUEST_SENSE && command != INQUIRY)
937
            goto fail;
938
    }
939
    switch (command) {
940
    case TEST_UNIT_READY:
941
    case REQUEST_SENSE:
942
    case INQUIRY:
943
    case MODE_SENSE:
944
    case MODE_SENSE_10:
945
    case RESERVE:
946
    case RESERVE_10:
947
    case RELEASE:
948
    case RELEASE_10:
949
    case START_STOP:
950
    case ALLOW_MEDIUM_REMOVAL:
951
    case READ_CAPACITY:
952
    case SYNCHRONIZE_CACHE:
953
    case READ_TOC:
954
    case GET_CONFIGURATION:
955
    case SERVICE_ACTION_IN:
956
    case REPORT_LUNS:
957
    case VERIFY:
958
        rc = scsi_disk_emulate_command(&r->req, outbuf);
959
        if (rc > 0) {
960
            r->iov.iov_len = rc;
961
        } else {
962
            scsi_req_complete(&r->req);
963
            scsi_remove_request(r);
964
            return 0;
965
        }
966
        break;
967
    case READ_6:
968
    case READ_10:
969
    case READ_12:
970
    case READ_16:
971
        DPRINTF("Read (sector %" PRId64 ", count %d)\n", lba, len);
972
        if (lba > s->max_lba)
973
            goto illegal_lba;
974
        r->sector = lba * s->cluster_size;
975
        r->sector_count = len * s->cluster_size;
976
        break;
977
    case WRITE_6:
978
    case WRITE_10:
979
    case WRITE_12:
980
    case WRITE_16:
981
        DPRINTF("Write (sector %" PRId64 ", count %d)\n", lba, len);
982
        if (lba > s->max_lba)
983
            goto illegal_lba;
984
        r->sector = lba * s->cluster_size;
985
        r->sector_count = len * s->cluster_size;
986
        is_write = 1;
987
        break;
988
    default:
989
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
990
    fail:
991
        scsi_command_complete(r, CHECK_CONDITION, ILLEGAL_REQUEST);
992
        return 0;
993
    illegal_lba:
994
        scsi_command_complete(r, CHECK_CONDITION, HARDWARE_ERROR);
995
        return 0;
996
    }
997
    if (r->sector_count == 0 && r->iov.iov_len == 0) {
998
        scsi_command_complete(r, GOOD, NO_SENSE);
999
    }
1000
    len = r->sector_count * 512 + r->iov.iov_len;
1001
    if (is_write) {
1002
        return -len;
1003
    } else {
1004
        if (!r->sector_count)
1005
            r->sector_count = -1;
1006
        return len;
1007
    }
1008
}
1009

    
1010
static void scsi_destroy(SCSIDevice *dev)
1011
{
1012
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1013
    SCSIDiskReq *r;
1014

    
1015
    while (!QTAILQ_EMPTY(&s->qdev.requests)) {
1016
        r = DO_UPCAST(SCSIDiskReq, req, QTAILQ_FIRST(&s->qdev.requests));
1017
        scsi_remove_request(r);
1018
    }
1019
    drive_uninit(s->qdev.conf.dinfo);
1020
}
1021

    
1022
static int scsi_disk_initfn(SCSIDevice *dev)
1023
{
1024
    SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, dev);
1025
    uint64_t nb_sectors;
1026

    
1027
    if (!s->qdev.conf.dinfo || !s->qdev.conf.dinfo->bdrv) {
1028
        error_report("scsi-disk: drive property not set");
1029
        return -1;
1030
    }
1031
    s->bs = s->qdev.conf.dinfo->bdrv;
1032

    
1033
    if (bdrv_is_sg(s->bs)) {
1034
        error_report("scsi-disk: unwanted /dev/sg*");
1035
        return -1;
1036
    }
1037

    
1038
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
1039
        s->cluster_size = 4;
1040
    } else {
1041
        s->cluster_size = 1;
1042
    }
1043
    s->qdev.blocksize = 512 * s->cluster_size;
1044
    s->qdev.type = TYPE_DISK;
1045
    bdrv_get_geometry(s->bs, &nb_sectors);
1046
    nb_sectors /= s->cluster_size;
1047
    if (nb_sectors)
1048
        nb_sectors--;
1049
    s->max_lba = nb_sectors;
1050
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
1051
    return 0;
1052
}
1053

    
1054
static SCSIDeviceInfo scsi_disk_info = {
1055
    .qdev.name    = "scsi-disk",
1056
    .qdev.desc    = "virtual scsi disk or cdrom",
1057
    .qdev.size    = sizeof(SCSIDiskState),
1058
    .init         = scsi_disk_initfn,
1059
    .destroy      = scsi_destroy,
1060
    .send_command = scsi_send_command,
1061
    .read_data    = scsi_read_data,
1062
    .write_data   = scsi_write_data,
1063
    .cancel_io    = scsi_cancel_io,
1064
    .get_buf      = scsi_get_buf,
1065
    .qdev.props   = (Property[]) {
1066
        DEFINE_BLOCK_PROPERTIES(SCSIDiskState, qdev.conf),
1067
        DEFINE_PROP_STRING("ver",  SCSIDiskState, version),
1068
        DEFINE_PROP_END_OF_LIST(),
1069
    },
1070
};
1071

    
1072
static void scsi_disk_register_devices(void)
1073
{
1074
    scsi_qdev_register(&scsi_disk_info);
1075
}
1076
device_init(scsi_disk_register_devices)