Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ 0056dcc1

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 =
400
                    s->qdev.conf.min_io_size / s->qdev.blocksize;
401
            unsigned int opt_io_size =
402
                    s->qdev.conf.opt_io_size / s->qdev.blocksize;
403

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

    
407
            memset(outbuf + 4, 0, buflen - 4);
408

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

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

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

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

    
443
    buflen = req->cmd.xfer;
444
    if (buflen > SCSI_MAX_INQUIRY_LEN)
445
        buflen = SCSI_MAX_INQUIRY_LEN;
446

    
447
    memset(outbuf, 0, buflen);
448

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

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

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

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

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

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

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

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

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

    
596
    default:
597
        return 0;
598
    }
599
}
600

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1039
    if (bdrv_get_type_hint(s->bs) == BDRV_TYPE_CDROM) {
1040
        s->qdev.blocksize = 2048;
1041
    } else {
1042
        s->qdev.blocksize = s->qdev.conf.logical_block_size;
1043
    }
1044
    s->cluster_size = s->qdev.blocksize / 512;
1045

    
1046
    s->qdev.type = TYPE_DISK;
1047
    bdrv_get_geometry(s->bs, &nb_sectors);
1048
    nb_sectors /= s->cluster_size;
1049
    if (nb_sectors)
1050
        nb_sectors--;
1051
    s->max_lba = nb_sectors;
1052
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
1053
    return 0;
1054
}
1055

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

    
1074
static void scsi_disk_register_devices(void)
1075
{
1076
    scsi_qdev_register(&scsi_disk_info);
1077
}
1078
device_init(scsi_disk_register_devices)