Statistics
| Branch: | Revision:

root / hw / scsi-disk.c @ ee16b24a

History | View | Annotate | Download (30.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
 *
9
 * This code is licenced under the LGPL.
10
 *
11
 * Note that this file only handles the SCSI architecture model and device
12
 * commands.  Emulation of interface/link layer protocols is handled by
13
 * the host adapter emulator.
14
 */
15

    
16
#include <qemu-common.h>
17
#include <sysemu.h>
18
//#define DEBUG_SCSI
19

    
20
#ifdef DEBUG_SCSI
21
#define DPRINTF(fmt, args...) \
22
do { printf("scsi-disk: " fmt , ##args); } while (0)
23
#else
24
#define DPRINTF(fmt, args...) do {} while(0)
25
#endif
26

    
27
#define BADF(fmt, args...) \
28
do { fprintf(stderr, "scsi-disk: " fmt , ##args); } while (0)
29

    
30
#include "qemu-common.h"
31
#include "block.h"
32
#include "scsi-disk.h"
33

    
34
#define SENSE_NO_SENSE        0
35
#define SENSE_NOT_READY       2
36
#define SENSE_HARDWARE_ERROR  4
37
#define SENSE_ILLEGAL_REQUEST 5
38

    
39
#define STATUS_GOOD            0
40
#define STATUS_CHECK_CONDITION 2
41

    
42
#define SCSI_DMA_BUF_SIZE    131072
43
#define SCSI_MAX_INQUIRY_LEN 256
44

    
45
#define SCSI_REQ_STATUS_RETRY 0x01
46

    
47
typedef struct SCSIRequest {
48
    SCSIDeviceState *dev;
49
    uint32_t tag;
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
    /* The amounnt of data in the buffer.  */
56
    int buf_len;
57
    uint8_t *dma_buf;
58
    BlockDriverAIOCB *aiocb;
59
    struct SCSIRequest *next;
60
    uint32_t status;
61
} SCSIRequest;
62

    
63
struct SCSIDeviceState
64
{
65
    BlockDriverState *bdrv;
66
    SCSIRequest *requests;
67
    /* The qemu block layer uses a fixed 512 byte sector size.
68
       This is the number of 512 byte blocks in a single scsi sector.  */
69
    int cluster_size;
70
    uint64_t max_lba;
71
    int sense;
72
    int tcq;
73
    /* Completion functions may be called from either scsi_{read,write}_data
74
       or from the AIO completion routines.  */
75
    scsi_completionfn completion;
76
    void *opaque;
77
    char drive_serial_str[21];
78
};
79

    
80
/* Global pool of SCSIRequest structures.  */
81
static SCSIRequest *free_requests = NULL;
82

    
83
static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
84
{
85
    SCSIRequest *r;
86

    
87
    if (free_requests) {
88
        r = free_requests;
89
        free_requests = r->next;
90
    } else {
91
        r = qemu_malloc(sizeof(SCSIRequest));
92
        r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE);
93
    }
94
    r->dev = s;
95
    r->tag = tag;
96
    r->sector_count = 0;
97
    r->buf_len = 0;
98
    r->aiocb = NULL;
99
    r->status = 0;
100

    
101
    r->next = s->requests;
102
    s->requests = r;
103
    return r;
104
}
105

    
106
static void scsi_remove_request(SCSIRequest *r)
107
{
108
    SCSIRequest *last;
109
    SCSIDeviceState *s = r->dev;
110

    
111
    if (s->requests == r) {
112
        s->requests = r->next;
113
    } else {
114
        last = s->requests;
115
        while (last && last->next != r)
116
            last = last->next;
117
        if (last) {
118
            last->next = r->next;
119
        } else {
120
            BADF("Orphaned request\n");
121
        }
122
    }
123
    r->next = free_requests;
124
    free_requests = r;
125
}
126

    
127
static SCSIRequest *scsi_find_request(SCSIDeviceState *s, uint32_t tag)
128
{
129
    SCSIRequest *r;
130

    
131
    r = s->requests;
132
    while (r && r->tag != tag)
133
        r = r->next;
134

    
135
    return r;
136
}
137

    
138
/* Helper function for command completion.  */
139
static void scsi_command_complete(SCSIRequest *r, int status, int sense)
140
{
141
    SCSIDeviceState *s = r->dev;
142
    uint32_t tag;
143
    DPRINTF("Command complete tag=0x%x status=%d sense=%d\n", r->tag, status, sense);
144
    s->sense = sense;
145
    tag = r->tag;
146
    scsi_remove_request(r);
147
    s->completion(s->opaque, SCSI_REASON_DONE, tag, status);
148
}
149

    
150
/* Cancel a pending data transfer.  */
151
static void scsi_cancel_io(SCSIDevice *d, uint32_t tag)
152
{
153
    SCSIDeviceState *s = d->state;
154
    SCSIRequest *r;
155
    DPRINTF("Cancel tag=0x%x\n", tag);
156
    r = scsi_find_request(s, tag);
157
    if (r) {
158
        if (r->aiocb)
159
            bdrv_aio_cancel(r->aiocb);
160
        r->aiocb = NULL;
161
        scsi_remove_request(r);
162
    }
163
}
164

    
165
static void scsi_read_complete(void * opaque, int ret)
166
{
167
    SCSIRequest *r = (SCSIRequest *)opaque;
168
    SCSIDeviceState *s = r->dev;
169

    
170
    if (ret) {
171
        DPRINTF("IO error\n");
172
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, 0);
173
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE);
174
        return;
175
    }
176
    DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len);
177

    
178
    s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
179
}
180

    
181
/* Read more data from scsi device into buffer.  */
182
static void scsi_read_data(SCSIDevice *d, uint32_t tag)
183
{
184
    SCSIDeviceState *s = d->state;
185
    SCSIRequest *r;
186
    uint32_t n;
187

    
188
    r = scsi_find_request(s, tag);
189
    if (!r) {
190
        BADF("Bad read tag 0x%x\n", tag);
191
        /* ??? This is the wrong error.  */
192
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
193
        return;
194
    }
195
    if (r->sector_count == (uint32_t)-1) {
196
        DPRINTF("Read buf_len=%d\n", r->buf_len);
197
        r->sector_count = 0;
198
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len);
199
        return;
200
    }
201
    DPRINTF("Read sector_count=%d\n", r->sector_count);
202
    if (r->sector_count == 0) {
203
        scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
204
        return;
205
    }
206

    
207
    n = r->sector_count;
208
    if (n > SCSI_DMA_BUF_SIZE / 512)
209
        n = SCSI_DMA_BUF_SIZE / 512;
210

    
211
    r->buf_len = n * 512;
212
    r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n,
213
                             scsi_read_complete, r);
214
    if (r->aiocb == NULL)
215
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
216
    r->sector += n;
217
    r->sector_count -= n;
218
}
219

    
220
static int scsi_handle_write_error(SCSIRequest *r, int error)
221
{
222
    BlockInterfaceErrorAction action = drive_get_onerror(r->dev->bdrv);
223

    
224
    if (action == BLOCK_ERR_IGNORE)
225
        return 0;
226

    
227
    if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
228
            || action == BLOCK_ERR_STOP_ANY) {
229
        r->status |= SCSI_REQ_STATUS_RETRY;
230
        vm_stop(0);
231
    } else {
232
        scsi_command_complete(r, STATUS_CHECK_CONDITION,
233
                SENSE_HARDWARE_ERROR);
234
    }
235

    
236
    return 1;
237
}
238

    
239
static void scsi_write_complete(void * opaque, int ret)
240
{
241
    SCSIRequest *r = (SCSIRequest *)opaque;
242
    SCSIDeviceState *s = r->dev;
243
    uint32_t len;
244
    uint32_t n;
245

    
246
    r->aiocb = NULL;
247

    
248
    if (ret) {
249
        if (scsi_handle_write_error(r, -ret))
250
            return;
251
    }
252

    
253
    n = r->buf_len / 512;
254
    r->sector += n;
255
    r->sector_count -= n;
256
    if (r->sector_count == 0) {
257
        scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
258
    } else {
259
        len = r->sector_count * 512;
260
        if (len > SCSI_DMA_BUF_SIZE) {
261
            len = SCSI_DMA_BUF_SIZE;
262
        }
263
        r->buf_len = len;
264
        DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);
265
        s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len);
266
    }
267
}
268

    
269
static void scsi_write_request(SCSIRequest *r)
270
{
271
    SCSIDeviceState *s = r->dev;
272
    uint32_t n;
273

    
274
    n = r->buf_len / 512;
275
    if (n) {
276
        r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n,
277
                                  scsi_write_complete, r);
278
        if (r->aiocb == NULL)
279
            scsi_command_complete(r, STATUS_CHECK_CONDITION,
280
                                  SENSE_HARDWARE_ERROR);
281
    } else {
282
        /* Invoke completion routine to fetch data from host.  */
283
        scsi_write_complete(r, 0);
284
    }
285
}
286

    
287
/* Write data to a scsi device.  Returns nonzero on failure.
288
   The transfer may complete asynchronously.  */
289
static int scsi_write_data(SCSIDevice *d, uint32_t tag)
290
{
291
    SCSIDeviceState *s = d->state;
292
    SCSIRequest *r;
293

    
294
    DPRINTF("Write data tag=0x%x\n", tag);
295
    r = scsi_find_request(s, tag);
296
    if (!r) {
297
        BADF("Bad write tag 0x%x\n", tag);
298
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
299
        return 1;
300
    }
301

    
302
    if (r->aiocb)
303
        BADF("Data transfer already in progress\n");
304

    
305
    scsi_write_request(r);
306

    
307
    return 0;
308
}
309

    
310
static void scsi_dma_restart_cb(void *opaque, int running, int reason)
311
{
312
    SCSIDeviceState *s = opaque;
313
    SCSIRequest *r = s->requests;
314
    if (!running)
315
        return;
316

    
317
    while (r) {
318
        if (r->status & SCSI_REQ_STATUS_RETRY) {
319
            r->status &= ~SCSI_REQ_STATUS_RETRY;
320
            scsi_write_request(r); 
321
        }
322
        r = r->next;
323
    }
324
}
325

    
326
/* Return a pointer to the data buffer.  */
327
static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
328
{
329
    SCSIDeviceState *s = d->state;
330
    SCSIRequest *r;
331

    
332
    r = scsi_find_request(s, tag);
333
    if (!r) {
334
        BADF("Bad buffer tag 0x%x\n", tag);
335
        return NULL;
336
    }
337
    return r->dma_buf;
338
}
339

    
340
/* Execute a scsi command.  Returns the length of the data expected by the
341
   command.  This will be Positive for data transfers from the device
342
   (eg. disk reads), negative for transfers to the device (eg. disk writes),
343
   and zero if the command does not transfer any data.  */
344

    
345
static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
346
                                 uint8_t *buf, int lun)
347
{
348
    SCSIDeviceState *s = d->state;
349
    uint64_t nb_sectors;
350
    uint64_t lba;
351
    uint32_t len;
352
    int cmdlen;
353
    int is_write;
354
    uint8_t command;
355
    uint8_t *outbuf;
356
    SCSIRequest *r;
357

    
358
    command = buf[0];
359
    r = scsi_find_request(s, tag);
360
    if (r) {
361
        BADF("Tag 0x%x already in use\n", tag);
362
        scsi_cancel_io(d, tag);
363
    }
364
    /* ??? Tags are not unique for different luns.  We only implement a
365
       single lun, so this should not matter.  */
366
    r = scsi_new_request(s, tag);
367
    outbuf = r->dma_buf;
368
    is_write = 0;
369
    DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
370
    switch (command >> 5) {
371
    case 0:
372
        lba = (uint64_t) buf[3] | ((uint64_t) buf[2] << 8) |
373
              (((uint64_t) buf[1] & 0x1f) << 16);
374
        len = buf[4];
375
        cmdlen = 6;
376
        break;
377
    case 1:
378
    case 2:
379
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
380
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
381
        len = buf[8] | (buf[7] << 8);
382
        cmdlen = 10;
383
        break;
384
    case 4:
385
        lba = (uint64_t) buf[9] | ((uint64_t) buf[8] << 8) |
386
              ((uint64_t) buf[7] << 16) | ((uint64_t) buf[6] << 24) |
387
              ((uint64_t) buf[5] << 32) | ((uint64_t) buf[4] << 40) |
388
              ((uint64_t) buf[3] << 48) | ((uint64_t) buf[2] << 56);
389
        len = buf[13] | (buf[12] << 8) | (buf[11] << 16) | (buf[10] << 24);
390
        cmdlen = 16;
391
        break;
392
    case 5:
393
        lba = (uint64_t) buf[5] | ((uint64_t) buf[4] << 8) |
394
              ((uint64_t) buf[3] << 16) | ((uint64_t) buf[2] << 24);
395
        len = buf[9] | (buf[8] << 8) | (buf[7] << 16) | (buf[6] << 24);
396
        cmdlen = 12;
397
        break;
398
    default:
399
        BADF("Unsupported command length, command %x\n", command);
400
        goto fail;
401
    }
402
#ifdef DEBUG_SCSI
403
    {
404
        int i;
405
        for (i = 1; i < cmdlen; i++) {
406
            printf(" 0x%02x", buf[i]);
407
        }
408
        printf("\n");
409
    }
410
#endif
411
    if (lun || buf[1] >> 5) {
412
        /* Only LUN 0 supported.  */
413
        DPRINTF("Unimplemented LUN %d\n", lun ? lun : buf[1] >> 5);
414
        if (command != 0x03 && command != 0x12) /* REQUEST SENSE and INQUIRY */
415
            goto fail;
416
    }
417
    switch (command) {
418
    case 0x0:
419
        DPRINTF("Test Unit Ready\n");
420
        break;
421
    case 0x03:
422
        DPRINTF("Request Sense (len %d)\n", len);
423
        if (len < 4)
424
            goto fail;
425
        memset(outbuf, 0, 4);
426
        outbuf[0] = 0xf0;
427
        outbuf[1] = 0;
428
        outbuf[2] = s->sense;
429
        r->buf_len = 4;
430
        break;
431
    case 0x12:
432
        DPRINTF("Inquiry (len %d)\n", len);
433
        if (buf[1] & 0x2) {
434
            /* Command support data - optional, not implemented */
435
            BADF("optional INQUIRY command support request not implemented\n");
436
            goto fail;
437
        }
438
        else if (buf[1] & 0x1) {
439
            /* Vital product data */
440
            uint8_t page_code = buf[2];
441
            if (len < 4) {
442
                BADF("Error: Inquiry (EVPD[%02X]) buffer size %d is "
443
                     "less than 4\n", page_code, len);
444
                goto fail;
445
            }
446

    
447
            switch (page_code) {
448
                case 0x00:
449
                    {
450
                        /* Supported page codes, mandatory */
451
                        DPRINTF("Inquiry EVPD[Supported pages] "
452
                                "buffer size %d\n", len);
453

    
454
                        r->buf_len = 0;
455

    
456
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
457
                            outbuf[r->buf_len++] = 5;
458
                        } else {
459
                            outbuf[r->buf_len++] = 0;
460
                        }
461

    
462
                        outbuf[r->buf_len++] = 0x00; // this page
463
                        outbuf[r->buf_len++] = 0x00;
464
                        outbuf[r->buf_len++] = 3;    // number of pages
465
                        outbuf[r->buf_len++] = 0x00; // list of supported pages (this page)
466
                        outbuf[r->buf_len++] = 0x80; // unit serial number
467
                        outbuf[r->buf_len++] = 0x83; // device identification
468
                    }
469
                    break;
470
                case 0x80:
471
                    {
472
                        int l;
473

    
474
                        /* Device serial number, optional */
475
                        if (len < 4) {
476
                            BADF("Error: EVPD[Serial number] Inquiry buffer "
477
                                 "size %d too small, %d needed\n", len, 4);
478
                            goto fail;
479
                        }
480

    
481
                        DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len);
482
                        l = MIN(len, strlen(s->drive_serial_str));
483

    
484
                        r->buf_len = 0;
485

    
486
                        /* Supported page codes */
487
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
488
                            outbuf[r->buf_len++] = 5;
489
                        } else {
490
                            outbuf[r->buf_len++] = 0;
491
                        }
492

    
493
                        outbuf[r->buf_len++] = 0x80; // this page
494
                        outbuf[r->buf_len++] = 0x00;
495
                        outbuf[r->buf_len++] = l;
496
                        memcpy(&outbuf[r->buf_len], s->drive_serial_str, l);
497
                        r->buf_len += l;
498
                    }
499

    
500
                    break;
501
                case 0x83:
502
                    {
503
                        /* Device identification page, mandatory */
504
                        int max_len = 255 - 8;
505
                        int id_len = strlen(bdrv_get_device_name(s->bdrv));
506
                        if (id_len > max_len)
507
                            id_len = max_len;
508

    
509
                        DPRINTF("Inquiry EVPD[Device identification] "
510
                                "buffer size %d\n", len);
511
                        r->buf_len = 0;
512
                        if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
513
                            outbuf[r->buf_len++] = 5;
514
                        } else {
515
                            outbuf[r->buf_len++] = 0;
516
                        }
517

    
518
                        outbuf[r->buf_len++] = 0x83; // this page
519
                        outbuf[r->buf_len++] = 0x00;
520
                        outbuf[r->buf_len++] = 3 + id_len;
521

    
522
                        outbuf[r->buf_len++] = 0x2; // ASCII
523
                        outbuf[r->buf_len++] = 0;   // not officially assigned
524
                        outbuf[r->buf_len++] = 0;   // reserved
525
                        outbuf[r->buf_len++] = id_len; // length of data following
526

    
527
                        memcpy(&outbuf[r->buf_len],
528
                               bdrv_get_device_name(s->bdrv), id_len);
529
                        r->buf_len += id_len;
530
                    }
531
                    break;
532
                default:
533
                    BADF("Error: unsupported Inquiry (EVPD[%02X]) "
534
                         "buffer size %d\n", page_code, len);
535
                    goto fail;
536
            }
537
            /* done with EVPD */
538
            break;
539
        }
540
        else {
541
            /* Standard INQUIRY data */
542
            if (buf[2] != 0) {
543
                BADF("Error: Inquiry (STANDARD) page or code "
544
                     "is non-zero [%02X]\n", buf[2]);
545
                goto fail;
546
            }
547

    
548
            /* PAGE CODE == 0 */
549
            if (len < 5) {
550
                BADF("Error: Inquiry (STANDARD) buffer size %d "
551
                     "is less than 5\n", len);
552
                goto fail;
553
            }
554

    
555
            if (len < 36) {
556
                BADF("Error: Inquiry (STANDARD) buffer size %d "
557
                     "is less than 36 (TODO: only 5 required)\n", len);
558
            }
559
        }
560

    
561
        if(len > SCSI_MAX_INQUIRY_LEN)
562
            len = SCSI_MAX_INQUIRY_LEN;
563

    
564
        memset(outbuf, 0, len);
565

    
566
        if (lun || buf[1] >> 5) {
567
            outbuf[0] = 0x7f;        /* LUN not supported */
568
        } else if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
569
            outbuf[0] = 5;
570
            outbuf[1] = 0x80;
571
            memcpy(&outbuf[16], "QEMU CD-ROM    ", 16);
572
        } else {
573
            outbuf[0] = 0;
574
            memcpy(&outbuf[16], "QEMU HARDDISK  ", 16);
575
        }
576
        memcpy(&outbuf[8], "QEMU   ", 8);
577
        memcpy(&outbuf[32], QEMU_VERSION, 4);
578
        /* Identify device as SCSI-3 rev 1.
579
           Some later commands are also implemented. */
580
        outbuf[2] = 3;
581
        outbuf[3] = 2; /* Format 2 */
582
        outbuf[4] = len - 5; /* Additional Length = (Len - 1) - 4 */
583
        /* Sync data transfer and TCQ.  */
584
        outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0);
585
        r->buf_len = len;
586
        break;
587
    case 0x16:
588
        DPRINTF("Reserve(6)\n");
589
        if (buf[1] & 1)
590
            goto fail;
591
        break;
592
    case 0x17:
593
        DPRINTF("Release(6)\n");
594
        if (buf[1] & 1)
595
            goto fail;
596
        break;
597
    case 0x1a:
598
    case 0x5a:
599
        {
600
            uint8_t *p;
601
            int page;
602

    
603
            page = buf[2] & 0x3f;
604
            DPRINTF("Mode Sense (page %d, len %d)\n", page, len);
605
            p = outbuf;
606
            memset(p, 0, 4);
607
            outbuf[1] = 0; /* Default media type.  */
608
            outbuf[3] = 0; /* Block descriptor length.  */
609
            if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
610
                outbuf[2] = 0x80; /* Readonly.  */
611
            }
612
            p += 4;
613
            if (page == 4) {
614
                int cylinders, heads, secs;
615

    
616
                /* Rigid disk device geometry page. */
617
                p[0] = 4;
618
                p[1] = 0x16;
619
                /* if a geometry hint is available, use it */
620
                bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
621
                p[2] = (cylinders >> 16) & 0xff;
622
                p[3] = (cylinders >> 8) & 0xff;
623
                p[4] = cylinders & 0xff;
624
                p[5] = heads & 0xff;
625
                /* Write precomp start cylinder, disabled */
626
                p[6] = (cylinders >> 16) & 0xff;
627
                p[7] = (cylinders >> 8) & 0xff;
628
                p[8] = cylinders & 0xff;
629
                /* Reduced current start cylinder, disabled */
630
                p[9] = (cylinders >> 16) & 0xff;
631
                p[10] = (cylinders >> 8) & 0xff;
632
                p[11] = cylinders & 0xff;
633
                /* Device step rate [ns], 200ns */
634
                p[12] = 0;
635
                p[13] = 200;
636
                /* Landing zone cylinder */
637
                p[14] = 0xff;
638
                p[15] =  0xff;
639
                p[16] = 0xff;
640
                /* Medium rotation rate [rpm], 5400 rpm */
641
                p[20] = (5400 >> 8) & 0xff;
642
                p[21] = 5400 & 0xff;
643
                p += 0x16;
644
            } else if (page == 5) {
645
                int cylinders, heads, secs;
646

    
647
                /* Flexible disk device geometry page. */
648
                p[0] = 5;
649
                p[1] = 0x1e;
650
                /* Transfer rate [kbit/s], 5Mbit/s */
651
                p[2] = 5000 >> 8;
652
                p[3] = 5000 & 0xff;
653
                /* if a geometry hint is available, use it */
654
                bdrv_get_geometry_hint(s->bdrv, &cylinders, &heads, &secs);
655
                p[4] = heads & 0xff;
656
                p[5] = secs & 0xff;
657
                p[6] = s->cluster_size * 2;
658
                p[8] = (cylinders >> 8) & 0xff;
659
                p[9] = cylinders & 0xff;
660
                /* Write precomp start cylinder, disabled */
661
                p[10] = (cylinders >> 8) & 0xff;
662
                p[11] = cylinders & 0xff;
663
                /* Reduced current start cylinder, disabled */
664
                p[12] = (cylinders >> 8) & 0xff;
665
                p[13] = cylinders & 0xff;
666
                /* Device step rate [100us], 100us */
667
                p[14] = 0;
668
                p[15] = 1;
669
                /* Device step pulse width [us], 1us */
670
                p[16] = 1;
671
                /* Device head settle delay [100us], 100us */
672
                p[17] = 0;
673
                p[18] = 1;
674
                /* Motor on delay [0.1s], 0.1s */
675
                p[19] = 1;
676
                /* Motor off delay [0.1s], 0.1s */
677
                p[20] = 1;
678
                /* Medium rotation rate [rpm], 5400 rpm */
679
                p[28] = (5400 >> 8) & 0xff;
680
                p[29] = 5400 & 0xff;
681
                p += 0x1e;
682
            } else if ((page == 8 || page == 0x3f)) {
683
                /* Caching page.  */
684
                memset(p,0,20);
685
                p[0] = 8;
686
                p[1] = 0x12;
687
                p[2] = 4; /* WCE */
688
                p += 20;
689
            }
690
            if ((page == 0x3f || page == 0x2a)
691
                    && (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM)) {
692
                /* CD Capabilities and Mechanical Status page. */
693
                p[0] = 0x2a;
694
                p[1] = 0x14;
695
                p[2] = 3; // CD-R & CD-RW read
696
                p[3] = 0; // Writing not supported
697
                p[4] = 0x7f; /* Audio, composite, digital out,
698
                                         mode 2 form 1&2, multi session */
699
                p[5] = 0xff; /* CD DA, DA accurate, RW supported,
700
                                         RW corrected, C2 errors, ISRC,
701
                                         UPC, Bar code */
702
                p[6] = 0x2d | (bdrv_is_locked(s->bdrv)? 2 : 0);
703
                /* Locking supported, jumper present, eject, tray */
704
                p[7] = 0; /* no volume & mute control, no
705
                                      changer */
706
                p[8] = (50 * 176) >> 8; // 50x read speed
707
                p[9] = (50 * 176) & 0xff;
708
                p[10] = 0 >> 8; // No volume
709
                p[11] = 0 & 0xff;
710
                p[12] = 2048 >> 8; // 2M buffer
711
                p[13] = 2048 & 0xff;
712
                p[14] = (16 * 176) >> 8; // 16x read speed current
713
                p[15] = (16 * 176) & 0xff;
714
                p[18] = (16 * 176) >> 8; // 16x write speed
715
                p[19] = (16 * 176) & 0xff;
716
                p[20] = (16 * 176) >> 8; // 16x write speed current
717
                p[21] = (16 * 176) & 0xff;
718
                p += 22;
719
            }
720
            r->buf_len = p - outbuf;
721
            outbuf[0] = r->buf_len - 4;
722
            if (r->buf_len > len)
723
                r->buf_len = len;
724
        }
725
        break;
726
    case 0x1b:
727
        DPRINTF("Start Stop Unit\n");
728
        break;
729
    case 0x1e:
730
        DPRINTF("Prevent Allow Medium Removal (prevent = %d)\n", buf[4] & 3);
731
        bdrv_set_locked(s->bdrv, buf[4] & 1);
732
        break;
733
    case 0x25:
734
        DPRINTF("Read Capacity\n");
735
        /* The normal LEN field for this command is zero.  */
736
        memset(outbuf, 0, 8);
737
        bdrv_get_geometry(s->bdrv, &nb_sectors);
738
        nb_sectors /= s->cluster_size;
739
        /* Returned value is the address of the last sector.  */
740
        if (nb_sectors) {
741
            nb_sectors--;
742
            /* Remember the new size for read/write sanity checking. */
743
            s->max_lba = nb_sectors;
744
            /* Clip to 2TB, instead of returning capacity modulo 2TB. */
745
            if (nb_sectors > UINT32_MAX)
746
                nb_sectors = UINT32_MAX;
747
            outbuf[0] = (nb_sectors >> 24) & 0xff;
748
            outbuf[1] = (nb_sectors >> 16) & 0xff;
749
            outbuf[2] = (nb_sectors >> 8) & 0xff;
750
            outbuf[3] = nb_sectors & 0xff;
751
            outbuf[4] = 0;
752
            outbuf[5] = 0;
753
            outbuf[6] = s->cluster_size * 2;
754
            outbuf[7] = 0;
755
            r->buf_len = 8;
756
        } else {
757
            scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
758
            return 0;
759
        }
760
        break;
761
    case 0x08:
762
    case 0x28:
763
    case 0x88:
764
        DPRINTF("Read (sector %lld, count %d)\n", lba, len);
765
        if (lba > s->max_lba)
766
            goto illegal_lba;
767
        r->sector = lba * s->cluster_size;
768
        r->sector_count = len * s->cluster_size;
769
        break;
770
    case 0x0a:
771
    case 0x2a:
772
    case 0x8a:
773
        DPRINTF("Write (sector %lld, count %d)\n", lba, len);
774
        if (lba > s->max_lba)
775
            goto illegal_lba;
776
        r->sector = lba * s->cluster_size;
777
        r->sector_count = len * s->cluster_size;
778
        is_write = 1;
779
        break;
780
    case 0x35:
781
        DPRINTF("Synchronise cache (sector %d, count %d)\n", lba, len);
782
        bdrv_flush(s->bdrv);
783
        break;
784
    case 0x43:
785
        {
786
            int start_track, format, msf, toclen;
787

    
788
            msf = buf[1] & 2;
789
            format = buf[2] & 0xf;
790
            start_track = buf[6];
791
            bdrv_get_geometry(s->bdrv, &nb_sectors);
792
            DPRINTF("Read TOC (track %d format %d msf %d)\n", start_track, format, msf >> 1);
793
            nb_sectors /= s->cluster_size;
794
            switch(format) {
795
            case 0:
796
                toclen = cdrom_read_toc(nb_sectors, outbuf, msf, start_track);
797
                break;
798
            case 1:
799
                /* multi session : only a single session defined */
800
                toclen = 12;
801
                memset(outbuf, 0, 12);
802
                outbuf[1] = 0x0a;
803
                outbuf[2] = 0x01;
804
                outbuf[3] = 0x01;
805
                break;
806
            case 2:
807
                toclen = cdrom_read_toc_raw(nb_sectors, outbuf, msf, start_track);
808
                break;
809
            default:
810
                goto error_cmd;
811
            }
812
            if (toclen > 0) {
813
                if (len > toclen)
814
                  len = toclen;
815
                r->buf_len = len;
816
                break;
817
            }
818
        error_cmd:
819
            DPRINTF("Read TOC error\n");
820
            goto fail;
821
        }
822
    case 0x46:
823
        DPRINTF("Get Configuration (rt %d, maxlen %d)\n", buf[1] & 3, len);
824
        memset(outbuf, 0, 8);
825
        /* ??? This should probably return much more information.  For now
826
           just return the basic header indicating the CD-ROM profile.  */
827
        outbuf[7] = 8; // CD-ROM
828
        r->buf_len = 8;
829
        break;
830
    case 0x56:
831
        DPRINTF("Reserve(10)\n");
832
        if (buf[1] & 3)
833
            goto fail;
834
        break;
835
    case 0x57:
836
        DPRINTF("Release(10)\n");
837
        if (buf[1] & 3)
838
            goto fail;
839
        break;
840
    case 0x9e:
841
        /* Service Action In subcommands. */
842
        if ((buf[1] & 31) == 0x10) {
843
            DPRINTF("SAI READ CAPACITY(16)\n");
844
            memset(outbuf, 0, len);
845
            bdrv_get_geometry(s->bdrv, &nb_sectors);
846
            nb_sectors /= s->cluster_size;
847
            /* Returned value is the address of the last sector.  */
848
            if (nb_sectors) {
849
                nb_sectors--;
850
                /* Remember the new size for read/write sanity checking. */
851
                s->max_lba = nb_sectors;
852
                outbuf[0] = (nb_sectors >> 56) & 0xff;
853
                outbuf[1] = (nb_sectors >> 48) & 0xff;
854
                outbuf[2] = (nb_sectors >> 40) & 0xff;
855
                outbuf[3] = (nb_sectors >> 32) & 0xff;
856
                outbuf[4] = (nb_sectors >> 24) & 0xff;
857
                outbuf[5] = (nb_sectors >> 16) & 0xff;
858
                outbuf[6] = (nb_sectors >> 8) & 0xff;
859
                outbuf[7] = nb_sectors & 0xff;
860
                outbuf[8] = 0;
861
                outbuf[9] = 0;
862
                outbuf[10] = s->cluster_size * 2;
863
                outbuf[11] = 0;
864
                /* Protection, exponent and lowest lba field left blank. */
865
                r->buf_len = len;
866
            } else {
867
                scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
868
                return 0;
869
            }
870
            break;
871
        }
872
        DPRINTF("Unsupported Service Action In\n");
873
        goto fail;
874
    case 0xa0:
875
        DPRINTF("Report LUNs (len %d)\n", len);
876
        if (len < 16)
877
            goto fail;
878
        memset(outbuf, 0, 16);
879
        outbuf[3] = 8;
880
        r->buf_len = 16;
881
        break;
882
    case 0x2f:
883
        DPRINTF("Verify (sector %d, count %d)\n", lba, len);
884
        break;
885
    default:
886
        DPRINTF("Unknown SCSI command (%2.2x)\n", buf[0]);
887
    fail:
888
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_ILLEGAL_REQUEST);
889
        return 0;
890
    illegal_lba:
891
        scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
892
        return 0;
893
    }
894
    if (r->sector_count == 0 && r->buf_len == 0) {
895
        scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE);
896
    }
897
    len = r->sector_count * 512 + r->buf_len;
898
    if (is_write) {
899
        return -len;
900
    } else {
901
        if (!r->sector_count)
902
            r->sector_count = -1;
903
        return len;
904
    }
905
}
906

    
907
static void scsi_destroy(SCSIDevice *d)
908
{
909
    qemu_free(d->state);
910
    qemu_free(d);
911
}
912

    
913
SCSIDevice *scsi_disk_init(BlockDriverState *bdrv, int tcq,
914
                           scsi_completionfn completion, void *opaque)
915
{
916
    SCSIDevice *d;
917
    SCSIDeviceState *s;
918
    uint64_t nb_sectors;
919

    
920
    s = (SCSIDeviceState *)qemu_mallocz(sizeof(SCSIDeviceState));
921
    s->bdrv = bdrv;
922
    s->tcq = tcq;
923
    s->completion = completion;
924
    s->opaque = opaque;
925
    if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) {
926
        s->cluster_size = 4;
927
    } else {
928
        s->cluster_size = 1;
929
    }
930
    bdrv_get_geometry(s->bdrv, &nb_sectors);
931
    nb_sectors /= s->cluster_size;
932
    if (nb_sectors)
933
        nb_sectors--;
934
    s->max_lba = nb_sectors;
935
    strncpy(s->drive_serial_str, drive_get_serial(s->bdrv),
936
            sizeof(s->drive_serial_str));
937
    if (strlen(s->drive_serial_str) == 0)
938
        pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), "0");
939
    qemu_add_vm_change_state_handler(scsi_dma_restart_cb, s);
940
    d = (SCSIDevice *)qemu_mallocz(sizeof(SCSIDevice));
941
    d->state = s;
942
    d->destroy = scsi_destroy;
943
    d->send_command = scsi_send_command;
944
    d->read_data = scsi_read_data;
945
    d->write_data = scsi_write_data;
946
    d->cancel_io = scsi_cancel_io;
947
    d->get_buf = scsi_get_buf;
948

    
949
    return d;
950
}