Statistics
| Branch: | Revision:

root / hw / ide / core.c @ 72bcca73

History | View | Annotate | Download (68.9 kB)

1
/*
2
 * QEMU IDE disk and CD/DVD-ROM Emulator
3
 *
4
 * Copyright (c) 2003 Fabrice Bellard
5
 * Copyright (c) 2006 Openedhand Ltd.
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8
 * of this software and associated documentation files (the "Software"), to deal
9
 * in the Software without restriction, including without limitation the rights
10
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
 * copies of the Software, and to permit persons to whom the Software is
12
 * furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included in
15
 * all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
 * THE SOFTWARE.
24
 */
25
#include <hw/hw.h>
26
#include <hw/pc.h>
27
#include <hw/pci.h>
28
#include <hw/isa.h>
29
#include "qemu-error.h"
30
#include "qemu-timer.h"
31
#include "sysemu.h"
32
#include "dma.h"
33
#include "hw/block-common.h"
34
#include "blockdev.h"
35

    
36
#include <hw/ide/internal.h>
37

    
38
/* These values were based on a Seagate ST3500418AS but have been modified
39
   to make more sense in QEMU */
40
static const int smart_attributes[][12] = {
41
    /* id,  flags, hflags, val, wrst, raw (6 bytes), threshold */
42
    /* raw read error rate*/
43
    { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
44
    /* spin up */
45
    { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
46
    /* start stop count */
47
    { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
48
    /* remapped sectors */
49
    { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
50
    /* power on hours */
51
    { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52
    /* power cycle count */
53
    { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
54
    /* airflow-temperature-celsius */
55
    { 190,  0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
56
};
57

    
58
static int ide_handle_rw_error(IDEState *s, int error, int op);
59
static void ide_dummy_transfer_stop(IDEState *s);
60

    
61
static void padstr(char *str, const char *src, int len)
62
{
63
    int i, v;
64
    for(i = 0; i < len; i++) {
65
        if (*src)
66
            v = *src++;
67
        else
68
            v = ' ';
69
        str[i^1] = v;
70
    }
71
}
72

    
73
static void put_le16(uint16_t *p, unsigned int v)
74
{
75
    *p = cpu_to_le16(v);
76
}
77

    
78
static void ide_identify(IDEState *s)
79
{
80
    uint16_t *p;
81
    unsigned int oldsize;
82
    IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
83

    
84
    if (s->identify_set) {
85
        memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
86
        return;
87
    }
88

    
89
    memset(s->io_buffer, 0, 512);
90
    p = (uint16_t *)s->io_buffer;
91
    put_le16(p + 0, 0x0040);
92
    put_le16(p + 1, s->cylinders);
93
    put_le16(p + 3, s->heads);
94
    put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
95
    put_le16(p + 5, 512); /* XXX: retired, remove ? */
96
    put_le16(p + 6, s->sectors);
97
    padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
98
    put_le16(p + 20, 3); /* XXX: retired, remove ? */
99
    put_le16(p + 21, 512); /* cache size in sectors */
100
    put_le16(p + 22, 4); /* ecc bytes */
101
    padstr((char *)(p + 23), s->version, 8); /* firmware version */
102
    padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
103
#if MAX_MULT_SECTORS > 1
104
    put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
105
#endif
106
    put_le16(p + 48, 1); /* dword I/O */
107
    put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
108
    put_le16(p + 51, 0x200); /* PIO transfer cycle */
109
    put_le16(p + 52, 0x200); /* DMA transfer cycle */
110
    put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
111
    put_le16(p + 54, s->cylinders);
112
    put_le16(p + 55, s->heads);
113
    put_le16(p + 56, s->sectors);
114
    oldsize = s->cylinders * s->heads * s->sectors;
115
    put_le16(p + 57, oldsize);
116
    put_le16(p + 58, oldsize >> 16);
117
    if (s->mult_sectors)
118
        put_le16(p + 59, 0x100 | s->mult_sectors);
119
    put_le16(p + 60, s->nb_sectors);
120
    put_le16(p + 61, s->nb_sectors >> 16);
121
    put_le16(p + 62, 0x07); /* single word dma0-2 supported */
122
    put_le16(p + 63, 0x07); /* mdma0-2 supported */
123
    put_le16(p + 64, 0x03); /* pio3-4 supported */
124
    put_le16(p + 65, 120);
125
    put_le16(p + 66, 120);
126
    put_le16(p + 67, 120);
127
    put_le16(p + 68, 120);
128
    if (dev && dev->conf.discard_granularity) {
129
        put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
130
    }
131

    
132
    if (s->ncq_queues) {
133
        put_le16(p + 75, s->ncq_queues - 1);
134
        /* NCQ supported */
135
        put_le16(p + 76, (1 << 8));
136
    }
137

    
138
    put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
139
    put_le16(p + 81, 0x16); /* conforms to ata5 */
140
    /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
141
    put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
142
    /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
143
    put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
144
    /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
145
    if (s->wwn) {
146
        put_le16(p + 84, (1 << 14) | (1 << 8) | 0);
147
    } else {
148
        put_le16(p + 84, (1 << 14) | 0);
149
    }
150
    /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
151
    if (bdrv_enable_write_cache(s->bs))
152
         put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
153
    else
154
         put_le16(p + 85, (1 << 14) | 1);
155
    /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
156
    put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
157
    /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
158
    if (s->wwn) {
159
        put_le16(p + 87, (1 << 14) | (1 << 8) | 0);
160
    } else {
161
        put_le16(p + 87, (1 << 14) | 0);
162
    }
163
    put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
164
    put_le16(p + 93, 1 | (1 << 14) | 0x2000);
165
    put_le16(p + 100, s->nb_sectors);
166
    put_le16(p + 101, s->nb_sectors >> 16);
167
    put_le16(p + 102, s->nb_sectors >> 32);
168
    put_le16(p + 103, s->nb_sectors >> 48);
169

    
170
    if (dev && dev->conf.physical_block_size)
171
        put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
172
    if (s->wwn) {
173
        /* LE 16-bit words 111-108 contain 64-bit World Wide Name */
174
        put_le16(p + 108, s->wwn >> 48);
175
        put_le16(p + 109, s->wwn >> 32);
176
        put_le16(p + 110, s->wwn >> 16);
177
        put_le16(p + 111, s->wwn);
178
    }
179
    if (dev && dev->conf.discard_granularity) {
180
        put_le16(p + 169, 1); /* TRIM support */
181
    }
182

    
183
    memcpy(s->identify_data, p, sizeof(s->identify_data));
184
    s->identify_set = 1;
185
}
186

    
187
static void ide_atapi_identify(IDEState *s)
188
{
189
    uint16_t *p;
190

    
191
    if (s->identify_set) {
192
        memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
193
        return;
194
    }
195

    
196
    memset(s->io_buffer, 0, 512);
197
    p = (uint16_t *)s->io_buffer;
198
    /* Removable CDROM, 50us response, 12 byte packets */
199
    put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
200
    padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
201
    put_le16(p + 20, 3); /* buffer type */
202
    put_le16(p + 21, 512); /* cache size in sectors */
203
    put_le16(p + 22, 4); /* ecc bytes */
204
    padstr((char *)(p + 23), s->version, 8); /* firmware version */
205
    padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
206
    put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
207
#ifdef USE_DMA_CDROM
208
    put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
209
    put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
210
    put_le16(p + 62, 7);  /* single word dma0-2 supported */
211
    put_le16(p + 63, 7);  /* mdma0-2 supported */
212
#else
213
    put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
214
    put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
215
    put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
216
#endif
217
    put_le16(p + 64, 3); /* pio3-4 supported */
218
    put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
219
    put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
220
    put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
221
    put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
222

    
223
    put_le16(p + 71, 30); /* in ns */
224
    put_le16(p + 72, 30); /* in ns */
225

    
226
    if (s->ncq_queues) {
227
        put_le16(p + 75, s->ncq_queues - 1);
228
        /* NCQ supported */
229
        put_le16(p + 76, (1 << 8));
230
    }
231

    
232
    put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
233
#ifdef USE_DMA_CDROM
234
    put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
235
#endif
236
    memcpy(s->identify_data, p, sizeof(s->identify_data));
237
    s->identify_set = 1;
238
}
239

    
240
static void ide_cfata_identify(IDEState *s)
241
{
242
    uint16_t *p;
243
    uint32_t cur_sec;
244

    
245
    p = (uint16_t *) s->identify_data;
246
    if (s->identify_set)
247
        goto fill_buffer;
248

    
249
    memset(p, 0, sizeof(s->identify_data));
250

    
251
    cur_sec = s->cylinders * s->heads * s->sectors;
252

    
253
    put_le16(p + 0, 0x848a);                        /* CF Storage Card signature */
254
    put_le16(p + 1, s->cylinders);                /* Default cylinders */
255
    put_le16(p + 3, s->heads);                        /* Default heads */
256
    put_le16(p + 6, s->sectors);                /* Default sectors per track */
257
    put_le16(p + 7, s->nb_sectors >> 16);        /* Sectors per card */
258
    put_le16(p + 8, s->nb_sectors);                /* Sectors per card */
259
    padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
260
    put_le16(p + 22, 0x0004);                        /* ECC bytes */
261
    padstr((char *) (p + 23), s->version, 8);        /* Firmware Revision */
262
    padstr((char *) (p + 27), s->drive_model_str, 40);/* Model number */
263
#if MAX_MULT_SECTORS > 1
264
    put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
265
#else
266
    put_le16(p + 47, 0x0000);
267
#endif
268
    put_le16(p + 49, 0x0f00);                        /* Capabilities */
269
    put_le16(p + 51, 0x0002);                        /* PIO cycle timing mode */
270
    put_le16(p + 52, 0x0001);                        /* DMA cycle timing mode */
271
    put_le16(p + 53, 0x0003);                        /* Translation params valid */
272
    put_le16(p + 54, s->cylinders);                /* Current cylinders */
273
    put_le16(p + 55, s->heads);                        /* Current heads */
274
    put_le16(p + 56, s->sectors);                /* Current sectors */
275
    put_le16(p + 57, cur_sec);                        /* Current capacity */
276
    put_le16(p + 58, cur_sec >> 16);                /* Current capacity */
277
    if (s->mult_sectors)                        /* Multiple sector setting */
278
        put_le16(p + 59, 0x100 | s->mult_sectors);
279
    put_le16(p + 60, s->nb_sectors);                /* Total LBA sectors */
280
    put_le16(p + 61, s->nb_sectors >> 16);        /* Total LBA sectors */
281
    put_le16(p + 63, 0x0203);                        /* Multiword DMA capability */
282
    put_le16(p + 64, 0x0001);                        /* Flow Control PIO support */
283
    put_le16(p + 65, 0x0096);                        /* Min. Multiword DMA cycle */
284
    put_le16(p + 66, 0x0096);                        /* Rec. Multiword DMA cycle */
285
    put_le16(p + 68, 0x00b4);                        /* Min. PIO cycle time */
286
    put_le16(p + 82, 0x400c);                        /* Command Set supported */
287
    put_le16(p + 83, 0x7068);                        /* Command Set supported */
288
    put_le16(p + 84, 0x4000);                        /* Features supported */
289
    put_le16(p + 85, 0x000c);                        /* Command Set enabled */
290
    put_le16(p + 86, 0x7044);                        /* Command Set enabled */
291
    put_le16(p + 87, 0x4000);                        /* Features enabled */
292
    put_le16(p + 91, 0x4060);                        /* Current APM level */
293
    put_le16(p + 129, 0x0002);                        /* Current features option */
294
    put_le16(p + 130, 0x0005);                        /* Reassigned sectors */
295
    put_le16(p + 131, 0x0001);                        /* Initial power mode */
296
    put_le16(p + 132, 0x0000);                        /* User signature */
297
    put_le16(p + 160, 0x8100);                        /* Power requirement */
298
    put_le16(p + 161, 0x8001);                        /* CF command set */
299

    
300
    s->identify_set = 1;
301

    
302
fill_buffer:
303
    memcpy(s->io_buffer, p, sizeof(s->identify_data));
304
}
305

    
306
static void ide_set_signature(IDEState *s)
307
{
308
    s->select &= 0xf0; /* clear head */
309
    /* put signature */
310
    s->nsector = 1;
311
    s->sector = 1;
312
    if (s->drive_kind == IDE_CD) {
313
        s->lcyl = 0x14;
314
        s->hcyl = 0xeb;
315
    } else if (s->bs) {
316
        s->lcyl = 0;
317
        s->hcyl = 0;
318
    } else {
319
        s->lcyl = 0xff;
320
        s->hcyl = 0xff;
321
    }
322
}
323

    
324
typedef struct TrimAIOCB {
325
    BlockDriverAIOCB common;
326
    QEMUBH *bh;
327
    int ret;
328
} TrimAIOCB;
329

    
330
static void trim_aio_cancel(BlockDriverAIOCB *acb)
331
{
332
    TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
333

    
334
    qemu_bh_delete(iocb->bh);
335
    iocb->bh = NULL;
336
    qemu_aio_release(iocb);
337
}
338

    
339
static const AIOCBInfo trim_aiocb_info = {
340
    .aiocb_size         = sizeof(TrimAIOCB),
341
    .cancel             = trim_aio_cancel,
342
};
343

    
344
static void ide_trim_bh_cb(void *opaque)
345
{
346
    TrimAIOCB *iocb = opaque;
347

    
348
    iocb->common.cb(iocb->common.opaque, iocb->ret);
349

    
350
    qemu_bh_delete(iocb->bh);
351
    iocb->bh = NULL;
352

    
353
    qemu_aio_release(iocb);
354
}
355

    
356
BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
357
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
358
        BlockDriverCompletionFunc *cb, void *opaque)
359
{
360
    TrimAIOCB *iocb;
361
    int i, j, ret;
362

    
363
    iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque);
364
    iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
365
    iocb->ret = 0;
366

    
367
    for (j = 0; j < qiov->niov; j++) {
368
        uint64_t *buffer = qiov->iov[j].iov_base;
369

    
370
        for (i = 0; i < qiov->iov[j].iov_len / 8; i++) {
371
            /* 6-byte LBA + 2-byte range per entry */
372
            uint64_t entry = le64_to_cpu(buffer[i]);
373
            uint64_t sector = entry & 0x0000ffffffffffffULL;
374
            uint16_t count = entry >> 48;
375

    
376
            if (count == 0) {
377
                break;
378
            }
379

    
380
            ret = bdrv_discard(bs, sector, count);
381
            if (!iocb->ret) {
382
                iocb->ret = ret;
383
            }
384
        }
385
    }
386

    
387
    qemu_bh_schedule(iocb->bh);
388

    
389
    return &iocb->common;
390
}
391

    
392
static inline void ide_abort_command(IDEState *s)
393
{
394
    s->status = READY_STAT | ERR_STAT;
395
    s->error = ABRT_ERR;
396
}
397

    
398
/* prepare data transfer and tell what to do after */
399
void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
400
                        EndTransferFunc *end_transfer_func)
401
{
402
    s->end_transfer_func = end_transfer_func;
403
    s->data_ptr = buf;
404
    s->data_end = buf + size;
405
    if (!(s->status & ERR_STAT)) {
406
        s->status |= DRQ_STAT;
407
    }
408
    s->bus->dma->ops->start_transfer(s->bus->dma);
409
}
410

    
411
void ide_transfer_stop(IDEState *s)
412
{
413
    s->end_transfer_func = ide_transfer_stop;
414
    s->data_ptr = s->io_buffer;
415
    s->data_end = s->io_buffer;
416
    s->status &= ~DRQ_STAT;
417
}
418

    
419
int64_t ide_get_sector(IDEState *s)
420
{
421
    int64_t sector_num;
422
    if (s->select & 0x40) {
423
        /* lba */
424
        if (!s->lba48) {
425
            sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
426
                (s->lcyl << 8) | s->sector;
427
        } else {
428
            sector_num = ((int64_t)s->hob_hcyl << 40) |
429
                ((int64_t) s->hob_lcyl << 32) |
430
                ((int64_t) s->hob_sector << 24) |
431
                ((int64_t) s->hcyl << 16) |
432
                ((int64_t) s->lcyl << 8) | s->sector;
433
        }
434
    } else {
435
        sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
436
            (s->select & 0x0f) * s->sectors + (s->sector - 1);
437
    }
438
    return sector_num;
439
}
440

    
441
void ide_set_sector(IDEState *s, int64_t sector_num)
442
{
443
    unsigned int cyl, r;
444
    if (s->select & 0x40) {
445
        if (!s->lba48) {
446
            s->select = (s->select & 0xf0) | (sector_num >> 24);
447
            s->hcyl = (sector_num >> 16);
448
            s->lcyl = (sector_num >> 8);
449
            s->sector = (sector_num);
450
        } else {
451
            s->sector = sector_num;
452
            s->lcyl = sector_num >> 8;
453
            s->hcyl = sector_num >> 16;
454
            s->hob_sector = sector_num >> 24;
455
            s->hob_lcyl = sector_num >> 32;
456
            s->hob_hcyl = sector_num >> 40;
457
        }
458
    } else {
459
        cyl = sector_num / (s->heads * s->sectors);
460
        r = sector_num % (s->heads * s->sectors);
461
        s->hcyl = cyl >> 8;
462
        s->lcyl = cyl;
463
        s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
464
        s->sector = (r % s->sectors) + 1;
465
    }
466
}
467

    
468
static void ide_rw_error(IDEState *s) {
469
    ide_abort_command(s);
470
    ide_set_irq(s->bus);
471
}
472

    
473
static void ide_sector_read_cb(void *opaque, int ret)
474
{
475
    IDEState *s = opaque;
476
    int n;
477

    
478
    s->pio_aiocb = NULL;
479
    s->status &= ~BUSY_STAT;
480

    
481
    bdrv_acct_done(s->bs, &s->acct);
482
    if (ret != 0) {
483
        if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY |
484
                                BM_STATUS_RETRY_READ)) {
485
            return;
486
        }
487
    }
488

    
489
    n = s->nsector;
490
    if (n > s->req_nb_sectors) {
491
        n = s->req_nb_sectors;
492
    }
493

    
494
    /* Allow the guest to read the io_buffer */
495
    ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
496

    
497
    ide_set_irq(s->bus);
498

    
499
    ide_set_sector(s, ide_get_sector(s) + n);
500
    s->nsector -= n;
501
}
502

    
503
void ide_sector_read(IDEState *s)
504
{
505
    int64_t sector_num;
506
    int n;
507

    
508
    s->status = READY_STAT | SEEK_STAT;
509
    s->error = 0; /* not needed by IDE spec, but needed by Windows */
510
    sector_num = ide_get_sector(s);
511
    n = s->nsector;
512

    
513
    if (n == 0) {
514
        ide_transfer_stop(s);
515
        return;
516
    }
517

    
518
    s->status |= BUSY_STAT;
519

    
520
    if (n > s->req_nb_sectors) {
521
        n = s->req_nb_sectors;
522
    }
523

    
524
#if defined(DEBUG_IDE)
525
    printf("sector=%" PRId64 "\n", sector_num);
526
#endif
527

    
528
    s->iov.iov_base = s->io_buffer;
529
    s->iov.iov_len  = n * BDRV_SECTOR_SIZE;
530
    qemu_iovec_init_external(&s->qiov, &s->iov, 1);
531

    
532
    bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
533
    s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
534
                                  ide_sector_read_cb, s);
535
}
536

    
537
static void dma_buf_commit(IDEState *s)
538
{
539
    qemu_sglist_destroy(&s->sg);
540
}
541

    
542
void ide_set_inactive(IDEState *s)
543
{
544
    s->bus->dma->aiocb = NULL;
545
    s->bus->dma->ops->set_inactive(s->bus->dma);
546
}
547

    
548
void ide_dma_error(IDEState *s)
549
{
550
    ide_transfer_stop(s);
551
    s->error = ABRT_ERR;
552
    s->status = READY_STAT | ERR_STAT;
553
    ide_set_inactive(s);
554
    ide_set_irq(s->bus);
555
}
556

    
557
static int ide_handle_rw_error(IDEState *s, int error, int op)
558
{
559
    bool is_read = (op & BM_STATUS_RETRY_READ) != 0;
560
    BlockErrorAction action = bdrv_get_error_action(s->bs, is_read, error);
561

    
562
    if (action == BDRV_ACTION_STOP) {
563
        s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
564
        s->bus->error_status = op;
565
    } else if (action == BDRV_ACTION_REPORT) {
566
        if (op & BM_STATUS_DMA_RETRY) {
567
            dma_buf_commit(s);
568
            ide_dma_error(s);
569
        } else {
570
            ide_rw_error(s);
571
        }
572
    }
573
    bdrv_error_action(s->bs, action, is_read, error);
574
    return action != BDRV_ACTION_IGNORE;
575
}
576

    
577
void ide_dma_cb(void *opaque, int ret)
578
{
579
    IDEState *s = opaque;
580
    int n;
581
    int64_t sector_num;
582
    bool stay_active = false;
583

    
584
    if (ret < 0) {
585
        int op = BM_STATUS_DMA_RETRY;
586

    
587
        if (s->dma_cmd == IDE_DMA_READ)
588
            op |= BM_STATUS_RETRY_READ;
589
        else if (s->dma_cmd == IDE_DMA_TRIM)
590
            op |= BM_STATUS_RETRY_TRIM;
591

    
592
        if (ide_handle_rw_error(s, -ret, op)) {
593
            return;
594
        }
595
    }
596

    
597
    n = s->io_buffer_size >> 9;
598
    if (n > s->nsector) {
599
        /* The PRDs were longer than needed for this request. Shorten them so
600
         * we don't get a negative remainder. The Active bit must remain set
601
         * after the request completes. */
602
        n = s->nsector;
603
        stay_active = true;
604
    }
605

    
606
    sector_num = ide_get_sector(s);
607
    if (n > 0) {
608
        dma_buf_commit(s);
609
        sector_num += n;
610
        ide_set_sector(s, sector_num);
611
        s->nsector -= n;
612
    }
613

    
614
    /* end of transfer ? */
615
    if (s->nsector == 0) {
616
        s->status = READY_STAT | SEEK_STAT;
617
        ide_set_irq(s->bus);
618
        goto eot;
619
    }
620

    
621
    /* launch next transfer */
622
    n = s->nsector;
623
    s->io_buffer_index = 0;
624
    s->io_buffer_size = n * 512;
625
    if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
626
        /* The PRDs were too short. Reset the Active bit, but don't raise an
627
         * interrupt. */
628
        s->status = READY_STAT | SEEK_STAT;
629
        goto eot;
630
    }
631

    
632
#ifdef DEBUG_AIO
633
    printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
634
           sector_num, n, s->dma_cmd);
635
#endif
636

    
637
    switch (s->dma_cmd) {
638
    case IDE_DMA_READ:
639
        s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
640
                                           ide_dma_cb, s);
641
        break;
642
    case IDE_DMA_WRITE:
643
        s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
644
                                            ide_dma_cb, s);
645
        break;
646
    case IDE_DMA_TRIM:
647
        s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
648
                                         ide_issue_trim, ide_dma_cb, s,
649
                                         DMA_DIRECTION_TO_DEVICE);
650
        break;
651
    }
652
    return;
653

    
654
eot:
655
    if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
656
        bdrv_acct_done(s->bs, &s->acct);
657
    }
658
    ide_set_inactive(s);
659
    if (stay_active) {
660
        s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_DMAING);
661
    }
662
}
663

    
664
static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
665
{
666
    s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
667
    s->io_buffer_index = 0;
668
    s->io_buffer_size = 0;
669
    s->dma_cmd = dma_cmd;
670

    
671
    switch (dma_cmd) {
672
    case IDE_DMA_READ:
673
        bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
674
                        BDRV_ACCT_READ);
675
        break;
676
    case IDE_DMA_WRITE:
677
        bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
678
                        BDRV_ACCT_WRITE);
679
        break;
680
    default:
681
        break;
682
    }
683

    
684
    s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
685
}
686

    
687
static void ide_sector_write_timer_cb(void *opaque)
688
{
689
    IDEState *s = opaque;
690
    ide_set_irq(s->bus);
691
}
692

    
693
static void ide_sector_write_cb(void *opaque, int ret)
694
{
695
    IDEState *s = opaque;
696
    int n;
697

    
698
    bdrv_acct_done(s->bs, &s->acct);
699

    
700
    s->pio_aiocb = NULL;
701
    s->status &= ~BUSY_STAT;
702

    
703
    if (ret != 0) {
704
        if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY)) {
705
            return;
706
        }
707
    }
708

    
709
    n = s->nsector;
710
    if (n > s->req_nb_sectors) {
711
        n = s->req_nb_sectors;
712
    }
713
    s->nsector -= n;
714
    if (s->nsector == 0) {
715
        /* no more sectors to write */
716
        ide_transfer_stop(s);
717
    } else {
718
        int n1 = s->nsector;
719
        if (n1 > s->req_nb_sectors) {
720
            n1 = s->req_nb_sectors;
721
        }
722
        ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
723
                           ide_sector_write);
724
    }
725
    ide_set_sector(s, ide_get_sector(s) + n);
726

    
727
    if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
728
        /* It seems there is a bug in the Windows 2000 installer HDD
729
           IDE driver which fills the disk with empty logs when the
730
           IDE write IRQ comes too early. This hack tries to correct
731
           that at the expense of slower write performances. Use this
732
           option _only_ to install Windows 2000. You must disable it
733
           for normal use. */
734
        qemu_mod_timer(s->sector_write_timer,
735
                       qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
736
    } else {
737
        ide_set_irq(s->bus);
738
    }
739
}
740

    
741
void ide_sector_write(IDEState *s)
742
{
743
    int64_t sector_num;
744
    int n;
745

    
746
    s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
747
    sector_num = ide_get_sector(s);
748
#if defined(DEBUG_IDE)
749
    printf("sector=%" PRId64 "\n", sector_num);
750
#endif
751
    n = s->nsector;
752
    if (n > s->req_nb_sectors) {
753
        n = s->req_nb_sectors;
754
    }
755

    
756
    s->iov.iov_base = s->io_buffer;
757
    s->iov.iov_len  = n * BDRV_SECTOR_SIZE;
758
    qemu_iovec_init_external(&s->qiov, &s->iov, 1);
759

    
760
    bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
761
    s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
762
                                   ide_sector_write_cb, s);
763
}
764

    
765
static void ide_flush_cb(void *opaque, int ret)
766
{
767
    IDEState *s = opaque;
768

    
769
    if (ret < 0) {
770
        /* XXX: What sector number to set here? */
771
        if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
772
            return;
773
        }
774
    }
775

    
776
    bdrv_acct_done(s->bs, &s->acct);
777
    s->status = READY_STAT | SEEK_STAT;
778
    ide_set_irq(s->bus);
779
}
780

    
781
void ide_flush_cache(IDEState *s)
782
{
783
    if (s->bs == NULL) {
784
        ide_flush_cb(s, 0);
785
        return;
786
    }
787

    
788
    bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
789
    bdrv_aio_flush(s->bs, ide_flush_cb, s);
790
}
791

    
792
static void ide_cfata_metadata_inquiry(IDEState *s)
793
{
794
    uint16_t *p;
795
    uint32_t spd;
796

    
797
    p = (uint16_t *) s->io_buffer;
798
    memset(p, 0, 0x200);
799
    spd = ((s->mdata_size - 1) >> 9) + 1;
800

    
801
    put_le16(p + 0, 0x0001);                        /* Data format revision */
802
    put_le16(p + 1, 0x0000);                        /* Media property: silicon */
803
    put_le16(p + 2, s->media_changed);                /* Media status */
804
    put_le16(p + 3, s->mdata_size & 0xffff);        /* Capacity in bytes (low) */
805
    put_le16(p + 4, s->mdata_size >> 16);        /* Capacity in bytes (high) */
806
    put_le16(p + 5, spd & 0xffff);                /* Sectors per device (low) */
807
    put_le16(p + 6, spd >> 16);                        /* Sectors per device (high) */
808
}
809

    
810
static void ide_cfata_metadata_read(IDEState *s)
811
{
812
    uint16_t *p;
813

    
814
    if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
815
        s->status = ERR_STAT;
816
        s->error = ABRT_ERR;
817
        return;
818
    }
819

    
820
    p = (uint16_t *) s->io_buffer;
821
    memset(p, 0, 0x200);
822

    
823
    put_le16(p + 0, s->media_changed);                /* Media status */
824
    memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
825
                    MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
826
                                    s->nsector << 9), 0x200 - 2));
827
}
828

    
829
static void ide_cfata_metadata_write(IDEState *s)
830
{
831
    if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
832
        s->status = ERR_STAT;
833
        s->error = ABRT_ERR;
834
        return;
835
    }
836

    
837
    s->media_changed = 0;
838

    
839
    memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
840
                    s->io_buffer + 2,
841
                    MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
842
                                    s->nsector << 9), 0x200 - 2));
843
}
844

    
845
/* called when the inserted state of the media has changed */
846
static void ide_cd_change_cb(void *opaque, bool load)
847
{
848
    IDEState *s = opaque;
849
    uint64_t nb_sectors;
850

    
851
    s->tray_open = !load;
852
    bdrv_get_geometry(s->bs, &nb_sectors);
853
    s->nb_sectors = nb_sectors;
854

    
855
    /*
856
     * First indicate to the guest that a CD has been removed.  That's
857
     * done on the next command the guest sends us.
858
     *
859
     * Then we set UNIT_ATTENTION, by which the guest will
860
     * detect a new CD in the drive.  See ide_atapi_cmd() for details.
861
     */
862
    s->cdrom_changed = 1;
863
    s->events.new_media = true;
864
    s->events.eject_request = false;
865
    ide_set_irq(s->bus);
866
}
867

    
868
static void ide_cd_eject_request_cb(void *opaque, bool force)
869
{
870
    IDEState *s = opaque;
871

    
872
    s->events.eject_request = true;
873
    if (force) {
874
        s->tray_locked = false;
875
    }
876
    ide_set_irq(s->bus);
877
}
878

    
879
static void ide_cmd_lba48_transform(IDEState *s, int lba48)
880
{
881
    s->lba48 = lba48;
882

    
883
    /* handle the 'magic' 0 nsector count conversion here. to avoid
884
     * fiddling with the rest of the read logic, we just store the
885
     * full sector count in ->nsector and ignore ->hob_nsector from now
886
     */
887
    if (!s->lba48) {
888
        if (!s->nsector)
889
            s->nsector = 256;
890
    } else {
891
        if (!s->nsector && !s->hob_nsector)
892
            s->nsector = 65536;
893
        else {
894
            int lo = s->nsector;
895
            int hi = s->hob_nsector;
896

    
897
            s->nsector = (hi << 8) | lo;
898
        }
899
    }
900
}
901

    
902
static void ide_clear_hob(IDEBus *bus)
903
{
904
    /* any write clears HOB high bit of device control register */
905
    bus->ifs[0].select &= ~(1 << 7);
906
    bus->ifs[1].select &= ~(1 << 7);
907
}
908

    
909
void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
910
{
911
    IDEBus *bus = opaque;
912

    
913
#ifdef DEBUG_IDE
914
    printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
915
#endif
916

    
917
    addr &= 7;
918

    
919
    /* ignore writes to command block while busy with previous command */
920
    if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
921
        return;
922

    
923
    switch(addr) {
924
    case 0:
925
        break;
926
    case 1:
927
        ide_clear_hob(bus);
928
        /* NOTE: data is written to the two drives */
929
        bus->ifs[0].hob_feature = bus->ifs[0].feature;
930
        bus->ifs[1].hob_feature = bus->ifs[1].feature;
931
        bus->ifs[0].feature = val;
932
        bus->ifs[1].feature = val;
933
        break;
934
    case 2:
935
        ide_clear_hob(bus);
936
        bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
937
        bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
938
        bus->ifs[0].nsector = val;
939
        bus->ifs[1].nsector = val;
940
        break;
941
    case 3:
942
        ide_clear_hob(bus);
943
        bus->ifs[0].hob_sector = bus->ifs[0].sector;
944
        bus->ifs[1].hob_sector = bus->ifs[1].sector;
945
        bus->ifs[0].sector = val;
946
        bus->ifs[1].sector = val;
947
        break;
948
    case 4:
949
        ide_clear_hob(bus);
950
        bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
951
        bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
952
        bus->ifs[0].lcyl = val;
953
        bus->ifs[1].lcyl = val;
954
        break;
955
    case 5:
956
        ide_clear_hob(bus);
957
        bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
958
        bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
959
        bus->ifs[0].hcyl = val;
960
        bus->ifs[1].hcyl = val;
961
        break;
962
    case 6:
963
        /* FIXME: HOB readback uses bit 7 */
964
        bus->ifs[0].select = (val & ~0x10) | 0xa0;
965
        bus->ifs[1].select = (val | 0x10) | 0xa0;
966
        /* select drive */
967
        bus->unit = (val >> 4) & 1;
968
        break;
969
    default:
970
    case 7:
971
        /* command */
972
        ide_exec_cmd(bus, val);
973
        break;
974
    }
975
}
976

    
977
#define HD_OK (1u << IDE_HD)
978
#define CD_OK (1u << IDE_CD)
979
#define CFA_OK (1u << IDE_CFATA)
980
#define HD_CFA_OK (HD_OK | CFA_OK)
981
#define ALL_OK (HD_OK | CD_OK | CFA_OK)
982

    
983
/* See ACS-2 T13/2015-D Table B.2 Command codes */
984
static const uint8_t ide_cmd_table[0x100] = {
985
    /* NOP not implemented, mandatory for CD */
986
    [CFA_REQ_EXT_ERROR_CODE]            = CFA_OK,
987
    [WIN_DSM]                           = ALL_OK,
988
    [WIN_DEVICE_RESET]                  = CD_OK,
989
    [WIN_RECAL]                         = HD_CFA_OK,
990
    [WIN_READ]                          = ALL_OK,
991
    [WIN_READ_ONCE]                     = ALL_OK,
992
    [WIN_READ_EXT]                      = HD_CFA_OK,
993
    [WIN_READDMA_EXT]                   = HD_CFA_OK,
994
    [WIN_READ_NATIVE_MAX_EXT]           = HD_CFA_OK,
995
    [WIN_MULTREAD_EXT]                  = HD_CFA_OK,
996
    [WIN_WRITE]                         = HD_CFA_OK,
997
    [WIN_WRITE_ONCE]                    = HD_CFA_OK,
998
    [WIN_WRITE_EXT]                     = HD_CFA_OK,
999
    [WIN_WRITEDMA_EXT]                  = HD_CFA_OK,
1000
    [CFA_WRITE_SECT_WO_ERASE]           = CFA_OK,
1001
    [WIN_MULTWRITE_EXT]                 = HD_CFA_OK,
1002
    [WIN_WRITE_VERIFY]                  = HD_CFA_OK,
1003
    [WIN_VERIFY]                        = HD_CFA_OK,
1004
    [WIN_VERIFY_ONCE]                   = HD_CFA_OK,
1005
    [WIN_VERIFY_EXT]                    = HD_CFA_OK,
1006
    [WIN_SEEK]                          = HD_CFA_OK,
1007
    [CFA_TRANSLATE_SECTOR]              = CFA_OK,
1008
    [WIN_DIAGNOSE]                      = ALL_OK,
1009
    [WIN_SPECIFY]                       = HD_CFA_OK,
1010
    [WIN_STANDBYNOW2]                   = ALL_OK,
1011
    [WIN_IDLEIMMEDIATE2]                = ALL_OK,
1012
    [WIN_STANDBY2]                      = ALL_OK,
1013
    [WIN_SETIDLE2]                      = ALL_OK,
1014
    [WIN_CHECKPOWERMODE2]               = ALL_OK,
1015
    [WIN_SLEEPNOW2]                     = ALL_OK,
1016
    [WIN_PACKETCMD]                     = CD_OK,
1017
    [WIN_PIDENTIFY]                     = CD_OK,
1018
    [WIN_SMART]                         = HD_CFA_OK,
1019
    [CFA_ACCESS_METADATA_STORAGE]       = CFA_OK,
1020
    [CFA_ERASE_SECTORS]                 = CFA_OK,
1021
    [WIN_MULTREAD]                      = HD_CFA_OK,
1022
    [WIN_MULTWRITE]                     = HD_CFA_OK,
1023
    [WIN_SETMULT]                       = HD_CFA_OK,
1024
    [WIN_READDMA]                       = HD_CFA_OK,
1025
    [WIN_READDMA_ONCE]                  = HD_CFA_OK,
1026
    [WIN_WRITEDMA]                      = HD_CFA_OK,
1027
    [WIN_WRITEDMA_ONCE]                 = HD_CFA_OK,
1028
    [CFA_WRITE_MULTI_WO_ERASE]          = CFA_OK,
1029
    [WIN_STANDBYNOW1]                   = ALL_OK,
1030
    [WIN_IDLEIMMEDIATE]                 = ALL_OK,
1031
    [WIN_STANDBY]                       = ALL_OK,
1032
    [WIN_SETIDLE1]                      = ALL_OK,
1033
    [WIN_CHECKPOWERMODE1]               = ALL_OK,
1034
    [WIN_SLEEPNOW1]                     = ALL_OK,
1035
    [WIN_FLUSH_CACHE]                   = ALL_OK,
1036
    [WIN_FLUSH_CACHE_EXT]               = HD_CFA_OK,
1037
    [WIN_IDENTIFY]                      = ALL_OK,
1038
    [WIN_SETFEATURES]                   = ALL_OK,
1039
    [IBM_SENSE_CONDITION]               = CFA_OK,
1040
    [CFA_WEAR_LEVEL]                    = HD_CFA_OK,
1041
    [WIN_READ_NATIVE_MAX]               = ALL_OK,
1042
};
1043

    
1044
static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
1045
{
1046
    return cmd < ARRAY_SIZE(ide_cmd_table)
1047
        && (ide_cmd_table[cmd] & (1u << s->drive_kind));
1048
}
1049

    
1050
void ide_exec_cmd(IDEBus *bus, uint32_t val)
1051
{
1052
    uint16_t *identify_data;
1053
    IDEState *s;
1054
    int n;
1055
    int lba48 = 0;
1056

    
1057
#if defined(DEBUG_IDE)
1058
    printf("ide: CMD=%02x\n", val);
1059
#endif
1060
    s = idebus_active_if(bus);
1061
    /* ignore commands to non existent slave */
1062
    if (s != bus->ifs && !s->bs)
1063
        return;
1064

    
1065
    /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1066
    if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1067
        return;
1068

    
1069
    if (!ide_cmd_permitted(s, val)) {
1070
        goto abort_cmd;
1071
    }
1072

    
1073
    switch(val) {
1074
    case WIN_DSM:
1075
        switch (s->feature) {
1076
        case DSM_TRIM:
1077
            if (!s->bs) {
1078
                goto abort_cmd;
1079
            }
1080
            ide_sector_start_dma(s, IDE_DMA_TRIM);
1081
            break;
1082
        default:
1083
            goto abort_cmd;
1084
        }
1085
        break;
1086
    case WIN_IDENTIFY:
1087
        if (s->bs && s->drive_kind != IDE_CD) {
1088
            if (s->drive_kind != IDE_CFATA)
1089
                ide_identify(s);
1090
            else
1091
                ide_cfata_identify(s);
1092
            s->status = READY_STAT | SEEK_STAT;
1093
            ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1094
        } else {
1095
            if (s->drive_kind == IDE_CD) {
1096
                ide_set_signature(s);
1097
            }
1098
            ide_abort_command(s);
1099
        }
1100
        ide_set_irq(s->bus);
1101
        break;
1102
    case WIN_SPECIFY:
1103
    case WIN_RECAL:
1104
        s->error = 0;
1105
        s->status = READY_STAT | SEEK_STAT;
1106
        ide_set_irq(s->bus);
1107
        break;
1108
    case WIN_SETMULT:
1109
        if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1110
            /* Disable Read and Write Multiple */
1111
            s->mult_sectors = 0;
1112
            s->status = READY_STAT | SEEK_STAT;
1113
        } else if ((s->nsector & 0xff) != 0 &&
1114
            ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1115
             (s->nsector & (s->nsector - 1)) != 0)) {
1116
            ide_abort_command(s);
1117
        } else {
1118
            s->mult_sectors = s->nsector & 0xff;
1119
            s->status = READY_STAT | SEEK_STAT;
1120
        }
1121
        ide_set_irq(s->bus);
1122
        break;
1123
    case WIN_VERIFY_EXT:
1124
        lba48 = 1;
1125
    case WIN_VERIFY:
1126
    case WIN_VERIFY_ONCE:
1127
        /* do sector number check ? */
1128
        ide_cmd_lba48_transform(s, lba48);
1129
        s->status = READY_STAT | SEEK_STAT;
1130
        ide_set_irq(s->bus);
1131
        break;
1132
    case WIN_READ_EXT:
1133
        lba48 = 1;
1134
    case WIN_READ:
1135
    case WIN_READ_ONCE:
1136
        if (s->drive_kind == IDE_CD) {
1137
            ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1138
            goto abort_cmd;
1139
        }
1140
        if (!s->bs) {
1141
            goto abort_cmd;
1142
        }
1143
        ide_cmd_lba48_transform(s, lba48);
1144
        s->req_nb_sectors = 1;
1145
        ide_sector_read(s);
1146
        break;
1147
    case WIN_WRITE_EXT:
1148
        lba48 = 1;
1149
    case WIN_WRITE:
1150
    case WIN_WRITE_ONCE:
1151
    case CFA_WRITE_SECT_WO_ERASE:
1152
    case WIN_WRITE_VERIFY:
1153
        if (!s->bs) {
1154
            goto abort_cmd;
1155
        }
1156
        ide_cmd_lba48_transform(s, lba48);
1157
        s->error = 0;
1158
        s->status = SEEK_STAT | READY_STAT;
1159
        s->req_nb_sectors = 1;
1160
        ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1161
        s->media_changed = 1;
1162
        break;
1163
    case WIN_MULTREAD_EXT:
1164
        lba48 = 1;
1165
    case WIN_MULTREAD:
1166
        if (!s->bs) {
1167
            goto abort_cmd;
1168
        }
1169
        if (!s->mult_sectors) {
1170
            goto abort_cmd;
1171
        }
1172
        ide_cmd_lba48_transform(s, lba48);
1173
        s->req_nb_sectors = s->mult_sectors;
1174
        ide_sector_read(s);
1175
        break;
1176
    case WIN_MULTWRITE_EXT:
1177
        lba48 = 1;
1178
    case WIN_MULTWRITE:
1179
    case CFA_WRITE_MULTI_WO_ERASE:
1180
        if (!s->bs) {
1181
            goto abort_cmd;
1182
        }
1183
        if (!s->mult_sectors) {
1184
            goto abort_cmd;
1185
        }
1186
        ide_cmd_lba48_transform(s, lba48);
1187
        s->error = 0;
1188
        s->status = SEEK_STAT | READY_STAT;
1189
        s->req_nb_sectors = s->mult_sectors;
1190
        n = s->nsector;
1191
        if (n > s->req_nb_sectors)
1192
            n = s->req_nb_sectors;
1193
        ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1194
        s->media_changed = 1;
1195
        break;
1196
    case WIN_READDMA_EXT:
1197
        lba48 = 1;
1198
    case WIN_READDMA:
1199
    case WIN_READDMA_ONCE:
1200
        if (!s->bs) {
1201
            goto abort_cmd;
1202
        }
1203
        ide_cmd_lba48_transform(s, lba48);
1204
        ide_sector_start_dma(s, IDE_DMA_READ);
1205
        break;
1206
    case WIN_WRITEDMA_EXT:
1207
        lba48 = 1;
1208
    case WIN_WRITEDMA:
1209
    case WIN_WRITEDMA_ONCE:
1210
        if (!s->bs) {
1211
            goto abort_cmd;
1212
        }
1213
        ide_cmd_lba48_transform(s, lba48);
1214
        ide_sector_start_dma(s, IDE_DMA_WRITE);
1215
        s->media_changed = 1;
1216
        break;
1217
    case WIN_READ_NATIVE_MAX_EXT:
1218
        lba48 = 1;
1219
    case WIN_READ_NATIVE_MAX:
1220
        ide_cmd_lba48_transform(s, lba48);
1221
        ide_set_sector(s, s->nb_sectors - 1);
1222
        s->status = READY_STAT | SEEK_STAT;
1223
        ide_set_irq(s->bus);
1224
        break;
1225
    case WIN_CHECKPOWERMODE1:
1226
    case WIN_CHECKPOWERMODE2:
1227
        s->error = 0;
1228
        s->nsector = 0xff; /* device active or idle */
1229
        s->status = READY_STAT | SEEK_STAT;
1230
        ide_set_irq(s->bus);
1231
        break;
1232
    case WIN_SETFEATURES:
1233
        if (!s->bs)
1234
            goto abort_cmd;
1235
        /* XXX: valid for CDROM ? */
1236
        switch(s->feature) {
1237
        case 0x02: /* write cache enable */
1238
            bdrv_set_enable_write_cache(s->bs, true);
1239
            identify_data = (uint16_t *)s->identify_data;
1240
            put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
1241
            s->status = READY_STAT | SEEK_STAT;
1242
            ide_set_irq(s->bus);
1243
            break;
1244
        case 0x82: /* write cache disable */
1245
            bdrv_set_enable_write_cache(s->bs, false);
1246
            identify_data = (uint16_t *)s->identify_data;
1247
            put_le16(identify_data + 85, (1 << 14) | 1);
1248
            ide_flush_cache(s);
1249
            break;
1250
        case 0xcc: /* reverting to power-on defaults enable */
1251
        case 0x66: /* reverting to power-on defaults disable */
1252
        case 0xaa: /* read look-ahead enable */
1253
        case 0x55: /* read look-ahead disable */
1254
        case 0x05: /* set advanced power management mode */
1255
        case 0x85: /* disable advanced power management mode */
1256
        case 0x69: /* NOP */
1257
        case 0x67: /* NOP */
1258
        case 0x96: /* NOP */
1259
        case 0x9a: /* NOP */
1260
        case 0x42: /* enable Automatic Acoustic Mode */
1261
        case 0xc2: /* disable Automatic Acoustic Mode */
1262
            s->status = READY_STAT | SEEK_STAT;
1263
            ide_set_irq(s->bus);
1264
            break;
1265
        case 0x03: { /* set transfer mode */
1266
                uint8_t val = s->nsector & 0x07;
1267
                identify_data = (uint16_t *)s->identify_data;
1268

    
1269
                switch (s->nsector >> 3) {
1270
                case 0x00: /* pio default */
1271
                case 0x01: /* pio mode */
1272
                        put_le16(identify_data + 62,0x07);
1273
                        put_le16(identify_data + 63,0x07);
1274
                        put_le16(identify_data + 88,0x3f);
1275
                        break;
1276
                case 0x02: /* sigle word dma mode*/
1277
                        put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1278
                        put_le16(identify_data + 63,0x07);
1279
                        put_le16(identify_data + 88,0x3f);
1280
                        break;
1281
                case 0x04: /* mdma mode */
1282
                        put_le16(identify_data + 62,0x07);
1283
                        put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1284
                        put_le16(identify_data + 88,0x3f);
1285
                        break;
1286
                case 0x08: /* udma mode */
1287
                        put_le16(identify_data + 62,0x07);
1288
                        put_le16(identify_data + 63,0x07);
1289
                        put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1290
                        break;
1291
                default:
1292
                        goto abort_cmd;
1293
                }
1294
            s->status = READY_STAT | SEEK_STAT;
1295
            ide_set_irq(s->bus);
1296
            break;
1297
        }
1298
        default:
1299
            goto abort_cmd;
1300
        }
1301
        break;
1302
    case WIN_FLUSH_CACHE:
1303
    case WIN_FLUSH_CACHE_EXT:
1304
        ide_flush_cache(s);
1305
        break;
1306
    case WIN_STANDBY:
1307
    case WIN_STANDBY2:
1308
    case WIN_STANDBYNOW1:
1309
    case WIN_STANDBYNOW2:
1310
    case WIN_IDLEIMMEDIATE:
1311
    case WIN_IDLEIMMEDIATE2:
1312
    case WIN_SETIDLE1:
1313
    case WIN_SETIDLE2:
1314
    case WIN_SLEEPNOW1:
1315
    case WIN_SLEEPNOW2:
1316
        s->status = READY_STAT;
1317
        ide_set_irq(s->bus);
1318
        break;
1319
    case WIN_SEEK:
1320
        /* XXX: Check that seek is within bounds */
1321
        s->status = READY_STAT | SEEK_STAT;
1322
        ide_set_irq(s->bus);
1323
        break;
1324
        /* ATAPI commands */
1325
    case WIN_PIDENTIFY:
1326
        ide_atapi_identify(s);
1327
        s->status = READY_STAT | SEEK_STAT;
1328
        ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1329
        ide_set_irq(s->bus);
1330
        break;
1331
    case WIN_DIAGNOSE:
1332
        ide_set_signature(s);
1333
        if (s->drive_kind == IDE_CD)
1334
            s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1335
                            * devices to return a clear status register
1336
                            * with READY_STAT *not* set. */
1337
        else
1338
            s->status = READY_STAT | SEEK_STAT;
1339
        s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1340
                          * present.
1341
                          */
1342
        ide_set_irq(s->bus);
1343
        break;
1344
    case WIN_DEVICE_RESET:
1345
        ide_set_signature(s);
1346
        s->status = 0x00; /* NOTE: READY is _not_ set */
1347
        s->error = 0x01;
1348
        break;
1349
    case WIN_PACKETCMD:
1350
        /* overlapping commands not supported */
1351
        if (s->feature & 0x02)
1352
            goto abort_cmd;
1353
        s->status = READY_STAT | SEEK_STAT;
1354
        s->atapi_dma = s->feature & 1;
1355
        s->nsector = 1;
1356
        ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1357
                           ide_atapi_cmd);
1358
        break;
1359
    /* CF-ATA commands */
1360
    case CFA_REQ_EXT_ERROR_CODE:
1361
        s->error = 0x09;    /* miscellaneous error */
1362
        s->status = READY_STAT | SEEK_STAT;
1363
        ide_set_irq(s->bus);
1364
        break;
1365
    case CFA_ERASE_SECTORS:
1366
    case CFA_WEAR_LEVEL:
1367
#if 0
1368
    /* This one has the same ID as CFA_WEAR_LEVEL and is required for
1369
       Windows 8 to work with AHCI */
1370
    case WIN_SECURITY_FREEZE_LOCK:
1371
#endif
1372
        if (val == CFA_WEAR_LEVEL)
1373
            s->nsector = 0;
1374
        if (val == CFA_ERASE_SECTORS)
1375
            s->media_changed = 1;
1376
        s->error = 0x00;
1377
        s->status = READY_STAT | SEEK_STAT;
1378
        ide_set_irq(s->bus);
1379
        break;
1380
    case CFA_TRANSLATE_SECTOR:
1381
        s->error = 0x00;
1382
        s->status = READY_STAT | SEEK_STAT;
1383
        memset(s->io_buffer, 0, 0x200);
1384
        s->io_buffer[0x00] = s->hcyl;                        /* Cyl MSB */
1385
        s->io_buffer[0x01] = s->lcyl;                        /* Cyl LSB */
1386
        s->io_buffer[0x02] = s->select;                        /* Head */
1387
        s->io_buffer[0x03] = s->sector;                        /* Sector */
1388
        s->io_buffer[0x04] = ide_get_sector(s) >> 16;        /* LBA MSB */
1389
        s->io_buffer[0x05] = ide_get_sector(s) >> 8;        /* LBA */
1390
        s->io_buffer[0x06] = ide_get_sector(s) >> 0;        /* LBA LSB */
1391
        s->io_buffer[0x13] = 0x00;                                /* Erase flag */
1392
        s->io_buffer[0x18] = 0x00;                                /* Hot count */
1393
        s->io_buffer[0x19] = 0x00;                                /* Hot count */
1394
        s->io_buffer[0x1a] = 0x01;                                /* Hot count */
1395
        ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1396
        ide_set_irq(s->bus);
1397
        break;
1398
    case CFA_ACCESS_METADATA_STORAGE:
1399
        switch (s->feature) {
1400
        case 0x02:        /* Inquiry Metadata Storage */
1401
            ide_cfata_metadata_inquiry(s);
1402
            break;
1403
        case 0x03:        /* Read Metadata Storage */
1404
            ide_cfata_metadata_read(s);
1405
            break;
1406
        case 0x04:        /* Write Metadata Storage */
1407
            ide_cfata_metadata_write(s);
1408
            break;
1409
        default:
1410
            goto abort_cmd;
1411
        }
1412
        ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1413
        s->status = 0x00; /* NOTE: READY is _not_ set */
1414
        ide_set_irq(s->bus);
1415
        break;
1416
    case IBM_SENSE_CONDITION:
1417
        switch (s->feature) {
1418
        case 0x01:  /* sense temperature in device */
1419
            s->nsector = 0x50;      /* +20 C */
1420
            break;
1421
        default:
1422
            goto abort_cmd;
1423
        }
1424
        s->status = READY_STAT | SEEK_STAT;
1425
        ide_set_irq(s->bus);
1426
        break;
1427

    
1428
    case WIN_SMART:
1429
        if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1430
                goto abort_cmd;
1431
        if (!s->smart_enabled && s->feature != SMART_ENABLE)
1432
                goto abort_cmd;
1433
        switch (s->feature) {
1434
        case SMART_DISABLE:
1435
                s->smart_enabled = 0;
1436
                s->status = READY_STAT | SEEK_STAT;
1437
                ide_set_irq(s->bus);
1438
                break;
1439
        case SMART_ENABLE:
1440
                s->smart_enabled = 1;
1441
                s->status = READY_STAT | SEEK_STAT;
1442
                ide_set_irq(s->bus);
1443
                break;
1444
        case SMART_ATTR_AUTOSAVE:
1445
                switch (s->sector) {
1446
                case 0x00:
1447
                s->smart_autosave = 0;
1448
                break;
1449
                case 0xf1:
1450
                s->smart_autosave = 1;
1451
                break;
1452
                default:
1453
                goto abort_cmd;
1454
                }
1455
                s->status = READY_STAT | SEEK_STAT;
1456
                ide_set_irq(s->bus);
1457
                break;
1458
        case SMART_STATUS:
1459
                if (!s->smart_errors) {
1460
                s->hcyl = 0xc2;
1461
                s->lcyl = 0x4f;
1462
                } else {
1463
                s->hcyl = 0x2c;
1464
                s->lcyl = 0xf4;
1465
                }
1466
                s->status = READY_STAT | SEEK_STAT;
1467
                ide_set_irq(s->bus);
1468
                break;
1469
        case SMART_READ_THRESH:
1470
                memset(s->io_buffer, 0, 0x200);
1471
                s->io_buffer[0] = 0x01; /* smart struct version */
1472
                for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1473
                s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
1474
                s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
1475
                }
1476
                for (n=0; n<511; n++) /* checksum */
1477
                s->io_buffer[511] += s->io_buffer[n];
1478
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1479
                s->status = READY_STAT | SEEK_STAT;
1480
                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1481
                ide_set_irq(s->bus);
1482
                break;
1483
        case SMART_READ_DATA:
1484
                memset(s->io_buffer, 0, 0x200);
1485
                s->io_buffer[0] = 0x01; /* smart struct version */
1486
                for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1487
                    int i;
1488
                    for(i = 0; i < 11; i++) {
1489
                        s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1490
                    }
1491
                }
1492
                s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1493
                if (s->smart_selftest_count == 0) {
1494
                s->io_buffer[363] = 0;
1495
                } else {
1496
                s->io_buffer[363] =
1497
                        s->smart_selftest_data[3 + 
1498
                                           (s->smart_selftest_count - 1) *
1499
                                           24];
1500
                }
1501
                s->io_buffer[364] = 0x20; 
1502
                s->io_buffer[365] = 0x01; 
1503
                /* offline data collection capacity: execute + self-test*/
1504
                s->io_buffer[367] = (1<<4 | 1<<3 | 1); 
1505
                s->io_buffer[368] = 0x03; /* smart capability (1) */
1506
                s->io_buffer[369] = 0x00; /* smart capability (2) */
1507
                s->io_buffer[370] = 0x01; /* error logging supported */
1508
                s->io_buffer[372] = 0x02; /* minutes for poll short test */
1509
                s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1510
                s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1511

    
1512
                for (n=0; n<511; n++) 
1513
                s->io_buffer[511] += s->io_buffer[n];
1514
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1515
                s->status = READY_STAT | SEEK_STAT;
1516
                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1517
                ide_set_irq(s->bus);
1518
                break;
1519
        case SMART_READ_LOG:
1520
                switch (s->sector) {
1521
                case 0x01: /* summary smart error log */
1522
                memset(s->io_buffer, 0, 0x200);
1523
                s->io_buffer[0] = 0x01;
1524
                s->io_buffer[1] = 0x00; /* no error entries */
1525
                s->io_buffer[452] = s->smart_errors & 0xff;
1526
                s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1527

    
1528
                for (n=0; n<511; n++)
1529
                        s->io_buffer[511] += s->io_buffer[n];
1530
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1531
                break;
1532
                case 0x06: /* smart self test log */
1533
                memset(s->io_buffer, 0, 0x200);
1534
                s->io_buffer[0] = 0x01;
1535
                if (s->smart_selftest_count == 0) {
1536
                        s->io_buffer[508] = 0;
1537
                } else {
1538
                        s->io_buffer[508] = s->smart_selftest_count;
1539
                        for (n=2; n<506; n++) 
1540
                        s->io_buffer[n] = s->smart_selftest_data[n];
1541
                }
1542
                for (n=0; n<511; n++)
1543
                        s->io_buffer[511] += s->io_buffer[n];
1544
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1545
                break;
1546
                default:
1547
                goto abort_cmd;
1548
                }
1549
                s->status = READY_STAT | SEEK_STAT;
1550
                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1551
                ide_set_irq(s->bus);
1552
                break;
1553
        case SMART_EXECUTE_OFFLINE:
1554
                switch (s->sector) {
1555
                case 0: /* off-line routine */
1556
                case 1: /* short self test */
1557
                case 2: /* extended self test */
1558
                s->smart_selftest_count++;
1559
                if(s->smart_selftest_count > 21)
1560
                        s->smart_selftest_count = 0;
1561
                n = 2 + (s->smart_selftest_count - 1) * 24;
1562
                s->smart_selftest_data[n] = s->sector;
1563
                s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1564
                s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1565
                s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1566
                s->status = READY_STAT | SEEK_STAT;
1567
                ide_set_irq(s->bus);
1568
                break;
1569
                default:
1570
                goto abort_cmd;
1571
                }
1572
                break;
1573
        default:
1574
                goto abort_cmd;
1575
        }
1576
        break;
1577
    default:
1578
        /* should not be reachable */
1579
    abort_cmd:
1580
        ide_abort_command(s);
1581
        ide_set_irq(s->bus);
1582
        break;
1583
    }
1584
}
1585

    
1586
uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1587
{
1588
    IDEBus *bus = opaque;
1589
    IDEState *s = idebus_active_if(bus);
1590
    uint32_t addr;
1591
    int ret, hob;
1592

    
1593
    addr = addr1 & 7;
1594
    /* FIXME: HOB readback uses bit 7, but it's always set right now */
1595
    //hob = s->select & (1 << 7);
1596
    hob = 0;
1597
    switch(addr) {
1598
    case 0:
1599
        ret = 0xff;
1600
        break;
1601
    case 1:
1602
        if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1603
            (s != bus->ifs && !s->bs))
1604
            ret = 0;
1605
        else if (!hob)
1606
            ret = s->error;
1607
        else
1608
            ret = s->hob_feature;
1609
        break;
1610
    case 2:
1611
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1612
            ret = 0;
1613
        else if (!hob)
1614
            ret = s->nsector & 0xff;
1615
        else
1616
            ret = s->hob_nsector;
1617
        break;
1618
    case 3:
1619
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1620
            ret = 0;
1621
        else if (!hob)
1622
            ret = s->sector;
1623
        else
1624
            ret = s->hob_sector;
1625
        break;
1626
    case 4:
1627
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1628
            ret = 0;
1629
        else if (!hob)
1630
            ret = s->lcyl;
1631
        else
1632
            ret = s->hob_lcyl;
1633
        break;
1634
    case 5:
1635
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1636
            ret = 0;
1637
        else if (!hob)
1638
            ret = s->hcyl;
1639
        else
1640
            ret = s->hob_hcyl;
1641
        break;
1642
    case 6:
1643
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1644
            ret = 0;
1645
        else
1646
            ret = s->select;
1647
        break;
1648
    default:
1649
    case 7:
1650
        if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1651
            (s != bus->ifs && !s->bs))
1652
            ret = 0;
1653
        else
1654
            ret = s->status;
1655
        qemu_irq_lower(bus->irq);
1656
        break;
1657
    }
1658
#ifdef DEBUG_IDE
1659
    printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1660
#endif
1661
    return ret;
1662
}
1663

    
1664
uint32_t ide_status_read(void *opaque, uint32_t addr)
1665
{
1666
    IDEBus *bus = opaque;
1667
    IDEState *s = idebus_active_if(bus);
1668
    int ret;
1669

    
1670
    if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1671
        (s != bus->ifs && !s->bs))
1672
        ret = 0;
1673
    else
1674
        ret = s->status;
1675
#ifdef DEBUG_IDE
1676
    printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1677
#endif
1678
    return ret;
1679
}
1680

    
1681
void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1682
{
1683
    IDEBus *bus = opaque;
1684
    IDEState *s;
1685
    int i;
1686

    
1687
#ifdef DEBUG_IDE
1688
    printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1689
#endif
1690
    /* common for both drives */
1691
    if (!(bus->cmd & IDE_CMD_RESET) &&
1692
        (val & IDE_CMD_RESET)) {
1693
        /* reset low to high */
1694
        for(i = 0;i < 2; i++) {
1695
            s = &bus->ifs[i];
1696
            s->status = BUSY_STAT | SEEK_STAT;
1697
            s->error = 0x01;
1698
        }
1699
    } else if ((bus->cmd & IDE_CMD_RESET) &&
1700
               !(val & IDE_CMD_RESET)) {
1701
        /* high to low */
1702
        for(i = 0;i < 2; i++) {
1703
            s = &bus->ifs[i];
1704
            if (s->drive_kind == IDE_CD)
1705
                s->status = 0x00; /* NOTE: READY is _not_ set */
1706
            else
1707
                s->status = READY_STAT | SEEK_STAT;
1708
            ide_set_signature(s);
1709
        }
1710
    }
1711

    
1712
    bus->cmd = val;
1713
}
1714

    
1715
/*
1716
 * Returns true if the running PIO transfer is a PIO out (i.e. data is
1717
 * transferred from the device to the guest), false if it's a PIO in
1718
 */
1719
static bool ide_is_pio_out(IDEState *s)
1720
{
1721
    if (s->end_transfer_func == ide_sector_write ||
1722
        s->end_transfer_func == ide_atapi_cmd) {
1723
        return false;
1724
    } else if (s->end_transfer_func == ide_sector_read ||
1725
               s->end_transfer_func == ide_transfer_stop ||
1726
               s->end_transfer_func == ide_atapi_cmd_reply_end ||
1727
               s->end_transfer_func == ide_dummy_transfer_stop) {
1728
        return true;
1729
    }
1730

    
1731
    abort();
1732
}
1733

    
1734
void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1735
{
1736
    IDEBus *bus = opaque;
1737
    IDEState *s = idebus_active_if(bus);
1738
    uint8_t *p;
1739

    
1740
    /* PIO data access allowed only when DRQ bit is set. The result of a write
1741
     * during PIO out is indeterminate, just ignore it. */
1742
    if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1743
        return;
1744
    }
1745

    
1746
    p = s->data_ptr;
1747
    *(uint16_t *)p = le16_to_cpu(val);
1748
    p += 2;
1749
    s->data_ptr = p;
1750
    if (p >= s->data_end)
1751
        s->end_transfer_func(s);
1752
}
1753

    
1754
uint32_t ide_data_readw(void *opaque, uint32_t addr)
1755
{
1756
    IDEBus *bus = opaque;
1757
    IDEState *s = idebus_active_if(bus);
1758
    uint8_t *p;
1759
    int ret;
1760

    
1761
    /* PIO data access allowed only when DRQ bit is set. The result of a read
1762
     * during PIO in is indeterminate, return 0 and don't move forward. */
1763
    if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1764
        return 0;
1765
    }
1766

    
1767
    p = s->data_ptr;
1768
    ret = cpu_to_le16(*(uint16_t *)p);
1769
    p += 2;
1770
    s->data_ptr = p;
1771
    if (p >= s->data_end)
1772
        s->end_transfer_func(s);
1773
    return ret;
1774
}
1775

    
1776
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1777
{
1778
    IDEBus *bus = opaque;
1779
    IDEState *s = idebus_active_if(bus);
1780
    uint8_t *p;
1781

    
1782
    /* PIO data access allowed only when DRQ bit is set. The result of a write
1783
     * during PIO out is indeterminate, just ignore it. */
1784
    if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1785
        return;
1786
    }
1787

    
1788
    p = s->data_ptr;
1789
    *(uint32_t *)p = le32_to_cpu(val);
1790
    p += 4;
1791
    s->data_ptr = p;
1792
    if (p >= s->data_end)
1793
        s->end_transfer_func(s);
1794
}
1795

    
1796
uint32_t ide_data_readl(void *opaque, uint32_t addr)
1797
{
1798
    IDEBus *bus = opaque;
1799
    IDEState *s = idebus_active_if(bus);
1800
    uint8_t *p;
1801
    int ret;
1802

    
1803
    /* PIO data access allowed only when DRQ bit is set. The result of a read
1804
     * during PIO in is indeterminate, return 0 and don't move forward. */
1805
    if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1806
        return 0;
1807
    }
1808

    
1809
    p = s->data_ptr;
1810
    ret = cpu_to_le32(*(uint32_t *)p);
1811
    p += 4;
1812
    s->data_ptr = p;
1813
    if (p >= s->data_end)
1814
        s->end_transfer_func(s);
1815
    return ret;
1816
}
1817

    
1818
static void ide_dummy_transfer_stop(IDEState *s)
1819
{
1820
    s->data_ptr = s->io_buffer;
1821
    s->data_end = s->io_buffer;
1822
    s->io_buffer[0] = 0xff;
1823
    s->io_buffer[1] = 0xff;
1824
    s->io_buffer[2] = 0xff;
1825
    s->io_buffer[3] = 0xff;
1826
}
1827

    
1828
static void ide_reset(IDEState *s)
1829
{
1830
#ifdef DEBUG_IDE
1831
    printf("ide: reset\n");
1832
#endif
1833

    
1834
    if (s->pio_aiocb) {
1835
        bdrv_aio_cancel(s->pio_aiocb);
1836
        s->pio_aiocb = NULL;
1837
    }
1838

    
1839
    if (s->drive_kind == IDE_CFATA)
1840
        s->mult_sectors = 0;
1841
    else
1842
        s->mult_sectors = MAX_MULT_SECTORS;
1843
    /* ide regs */
1844
    s->feature = 0;
1845
    s->error = 0;
1846
    s->nsector = 0;
1847
    s->sector = 0;
1848
    s->lcyl = 0;
1849
    s->hcyl = 0;
1850

    
1851
    /* lba48 */
1852
    s->hob_feature = 0;
1853
    s->hob_sector = 0;
1854
    s->hob_nsector = 0;
1855
    s->hob_lcyl = 0;
1856
    s->hob_hcyl = 0;
1857

    
1858
    s->select = 0xa0;
1859
    s->status = READY_STAT | SEEK_STAT;
1860

    
1861
    s->lba48 = 0;
1862

    
1863
    /* ATAPI specific */
1864
    s->sense_key = 0;
1865
    s->asc = 0;
1866
    s->cdrom_changed = 0;
1867
    s->packet_transfer_size = 0;
1868
    s->elementary_transfer_size = 0;
1869
    s->io_buffer_index = 0;
1870
    s->cd_sector_size = 0;
1871
    s->atapi_dma = 0;
1872
    /* ATA DMA state */
1873
    s->io_buffer_size = 0;
1874
    s->req_nb_sectors = 0;
1875

    
1876
    ide_set_signature(s);
1877
    /* init the transfer handler so that 0xffff is returned on data
1878
       accesses */
1879
    s->end_transfer_func = ide_dummy_transfer_stop;
1880
    ide_dummy_transfer_stop(s);
1881
    s->media_changed = 0;
1882
}
1883

    
1884
void ide_bus_reset(IDEBus *bus)
1885
{
1886
    bus->unit = 0;
1887
    bus->cmd = 0;
1888
    ide_reset(&bus->ifs[0]);
1889
    ide_reset(&bus->ifs[1]);
1890
    ide_clear_hob(bus);
1891

    
1892
    /* pending async DMA */
1893
    if (bus->dma->aiocb) {
1894
#ifdef DEBUG_AIO
1895
        printf("aio_cancel\n");
1896
#endif
1897
        bdrv_aio_cancel(bus->dma->aiocb);
1898
        bus->dma->aiocb = NULL;
1899
    }
1900

    
1901
    /* reset dma provider too */
1902
    bus->dma->ops->reset(bus->dma);
1903
}
1904

    
1905
static bool ide_cd_is_tray_open(void *opaque)
1906
{
1907
    return ((IDEState *)opaque)->tray_open;
1908
}
1909

    
1910
static bool ide_cd_is_medium_locked(void *opaque)
1911
{
1912
    return ((IDEState *)opaque)->tray_locked;
1913
}
1914

    
1915
static const BlockDevOps ide_cd_block_ops = {
1916
    .change_media_cb = ide_cd_change_cb,
1917
    .eject_request_cb = ide_cd_eject_request_cb,
1918
    .is_tray_open = ide_cd_is_tray_open,
1919
    .is_medium_locked = ide_cd_is_medium_locked,
1920
};
1921

    
1922
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
1923
                   const char *version, const char *serial, const char *model,
1924
                   uint64_t wwn,
1925
                   uint32_t cylinders, uint32_t heads, uint32_t secs,
1926
                   int chs_trans)
1927
{
1928
    uint64_t nb_sectors;
1929

    
1930
    s->bs = bs;
1931
    s->drive_kind = kind;
1932

    
1933
    bdrv_get_geometry(bs, &nb_sectors);
1934
    s->cylinders = cylinders;
1935
    s->heads = heads;
1936
    s->sectors = secs;
1937
    s->chs_trans = chs_trans;
1938
    s->nb_sectors = nb_sectors;
1939
    s->wwn = wwn;
1940
    /* The SMART values should be preserved across power cycles
1941
       but they aren't.  */
1942
    s->smart_enabled = 1;
1943
    s->smart_autosave = 1;
1944
    s->smart_errors = 0;
1945
    s->smart_selftest_count = 0;
1946
    if (kind == IDE_CD) {
1947
        bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
1948
        bdrv_set_buffer_alignment(bs, 2048);
1949
    } else {
1950
        if (!bdrv_is_inserted(s->bs)) {
1951
            error_report("Device needs media, but drive is empty");
1952
            return -1;
1953
        }
1954
        if (bdrv_is_read_only(bs)) {
1955
            error_report("Can't use a read-only drive");
1956
            return -1;
1957
        }
1958
    }
1959
    if (serial) {
1960
        pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
1961
    } else {
1962
        snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1963
                 "QM%05d", s->drive_serial);
1964
    }
1965
    if (model) {
1966
        pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
1967
    } else {
1968
        switch (kind) {
1969
        case IDE_CD:
1970
            strcpy(s->drive_model_str, "QEMU DVD-ROM");
1971
            break;
1972
        case IDE_CFATA:
1973
            strcpy(s->drive_model_str, "QEMU MICRODRIVE");
1974
            break;
1975
        default:
1976
            strcpy(s->drive_model_str, "QEMU HARDDISK");
1977
            break;
1978
        }
1979
    }
1980

    
1981
    if (version) {
1982
        pstrcpy(s->version, sizeof(s->version), version);
1983
    } else {
1984
        pstrcpy(s->version, sizeof(s->version), qemu_get_version());
1985
    }
1986

    
1987
    ide_reset(s);
1988
    bdrv_iostatus_enable(bs);
1989
    return 0;
1990
}
1991

    
1992
static void ide_init1(IDEBus *bus, int unit)
1993
{
1994
    static int drive_serial = 1;
1995
    IDEState *s = &bus->ifs[unit];
1996

    
1997
    s->bus = bus;
1998
    s->unit = unit;
1999
    s->drive_serial = drive_serial++;
2000
    /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2001
    s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2002
    s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
2003
    memset(s->io_buffer, 0, s->io_buffer_total_len);
2004

    
2005
    s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2006
    memset(s->smart_selftest_data, 0, 512);
2007

    
2008
    s->sector_write_timer = qemu_new_timer_ns(vm_clock,
2009
                                           ide_sector_write_timer_cb, s);
2010
}
2011

    
2012
static void ide_nop_start(IDEDMA *dma, IDEState *s,
2013
                          BlockDriverCompletionFunc *cb)
2014
{
2015
}
2016

    
2017
static int ide_nop(IDEDMA *dma)
2018
{
2019
    return 0;
2020
}
2021

    
2022
static int ide_nop_int(IDEDMA *dma, int x)
2023
{
2024
    return 0;
2025
}
2026

    
2027
static void ide_nop_restart(void *opaque, int x, RunState y)
2028
{
2029
}
2030

    
2031
static const IDEDMAOps ide_dma_nop_ops = {
2032
    .start_dma      = ide_nop_start,
2033
    .start_transfer = ide_nop,
2034
    .prepare_buf    = ide_nop_int,
2035
    .rw_buf         = ide_nop_int,
2036
    .set_unit       = ide_nop_int,
2037
    .add_status     = ide_nop_int,
2038
    .set_inactive   = ide_nop,
2039
    .restart_cb     = ide_nop_restart,
2040
    .reset          = ide_nop,
2041
};
2042

    
2043
static IDEDMA ide_dma_nop = {
2044
    .ops = &ide_dma_nop_ops,
2045
    .aiocb = NULL,
2046
};
2047

    
2048
void ide_init2(IDEBus *bus, qemu_irq irq)
2049
{
2050
    int i;
2051

    
2052
    for(i = 0; i < 2; i++) {
2053
        ide_init1(bus, i);
2054
        ide_reset(&bus->ifs[i]);
2055
    }
2056
    bus->irq = irq;
2057
    bus->dma = &ide_dma_nop;
2058
}
2059

    
2060
/* TODO convert users to qdev and remove */
2061
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
2062
                                    DriveInfo *hd1, qemu_irq irq)
2063
{
2064
    int i, trans;
2065
    DriveInfo *dinfo;
2066
    uint32_t cyls, heads, secs;
2067

    
2068
    for(i = 0; i < 2; i++) {
2069
        dinfo = i == 0 ? hd0 : hd1;
2070
        ide_init1(bus, i);
2071
        if (dinfo) {
2072
            cyls  = dinfo->cyls;
2073
            heads = dinfo->heads;
2074
            secs  = dinfo->secs;
2075
            trans = dinfo->trans;
2076
            if (!cyls && !heads && !secs) {
2077
                hd_geometry_guess(dinfo->bdrv, &cyls, &heads, &secs, &trans);
2078
            } else if (trans == BIOS_ATA_TRANSLATION_AUTO) {
2079
                trans = hd_bios_chs_auto_trans(cyls, heads, secs);
2080
            }
2081
            if (cyls < 1 || cyls > 65535) {
2082
                error_report("cyls must be between 1 and 65535");
2083
                exit(1);
2084
            }
2085
            if (heads < 1 || heads > 16) {
2086
                error_report("heads must be between 1 and 16");
2087
                exit(1);
2088
            }
2089
            if (secs < 1 || secs > 255) {
2090
                error_report("secs must be between 1 and 255");
2091
                exit(1);
2092
            }
2093
            if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
2094
                               dinfo->media_cd ? IDE_CD : IDE_HD,
2095
                               NULL, dinfo->serial, NULL, 0,
2096
                               cyls, heads, secs, trans) < 0) {
2097
                error_report("Can't set up IDE drive %s", dinfo->id);
2098
                exit(1);
2099
            }
2100
            bdrv_attach_dev_nofail(dinfo->bdrv, &bus->ifs[i]);
2101
        } else {
2102
            ide_reset(&bus->ifs[i]);
2103
        }
2104
    }
2105
    bus->irq = irq;
2106
    bus->dma = &ide_dma_nop;
2107
}
2108

    
2109
static const MemoryRegionPortio ide_portio_list[] = {
2110
    { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2111
    { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
2112
    { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
2113
    PORTIO_END_OF_LIST(),
2114
};
2115

    
2116
static const MemoryRegionPortio ide_portio2_list[] = {
2117
    { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2118
    PORTIO_END_OF_LIST(),
2119
};
2120

    
2121
void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
2122
{
2123
    /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2124
       bridge has been setup properly to always register with ISA.  */
2125
    isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2126

    
2127
    if (iobase2) {
2128
        isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
2129
    }
2130
}
2131

    
2132
static bool is_identify_set(void *opaque, int version_id)
2133
{
2134
    IDEState *s = opaque;
2135

    
2136
    return s->identify_set != 0;
2137
}
2138

    
2139
static EndTransferFunc* transfer_end_table[] = {
2140
        ide_sector_read,
2141
        ide_sector_write,
2142
        ide_transfer_stop,
2143
        ide_atapi_cmd_reply_end,
2144
        ide_atapi_cmd,
2145
        ide_dummy_transfer_stop,
2146
};
2147

    
2148
static int transfer_end_table_idx(EndTransferFunc *fn)
2149
{
2150
    int i;
2151

    
2152
    for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2153
        if (transfer_end_table[i] == fn)
2154
            return i;
2155

    
2156
    return -1;
2157
}
2158

    
2159
static int ide_drive_post_load(void *opaque, int version_id)
2160
{
2161
    IDEState *s = opaque;
2162

    
2163
    if (version_id < 3) {
2164
        if (s->sense_key == UNIT_ATTENTION &&
2165
            s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
2166
            s->cdrom_changed = 1;
2167
        }
2168
    }
2169
    if (s->identify_set) {
2170
        bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
2171
    }
2172
    return 0;
2173
}
2174

    
2175
static int ide_drive_pio_post_load(void *opaque, int version_id)
2176
{
2177
    IDEState *s = opaque;
2178

    
2179
    if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
2180
        return -EINVAL;
2181
    }
2182
    s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2183
    s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2184
    s->data_end = s->data_ptr + s->cur_io_buffer_len;
2185

    
2186
    return 0;
2187
}
2188

    
2189
static void ide_drive_pio_pre_save(void *opaque)
2190
{
2191
    IDEState *s = opaque;
2192
    int idx;
2193

    
2194
    s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2195
    s->cur_io_buffer_len = s->data_end - s->data_ptr;
2196

    
2197
    idx = transfer_end_table_idx(s->end_transfer_func);
2198
    if (idx == -1) {
2199
        fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2200
                        __func__);
2201
        s->end_transfer_fn_idx = 2;
2202
    } else {
2203
        s->end_transfer_fn_idx = idx;
2204
    }
2205
}
2206

    
2207
static bool ide_drive_pio_state_needed(void *opaque)
2208
{
2209
    IDEState *s = opaque;
2210

    
2211
    return ((s->status & DRQ_STAT) != 0)
2212
        || (s->bus->error_status & BM_STATUS_PIO_RETRY);
2213
}
2214

    
2215
static bool ide_tray_state_needed(void *opaque)
2216
{
2217
    IDEState *s = opaque;
2218

    
2219
    return s->tray_open || s->tray_locked;
2220
}
2221

    
2222
static bool ide_atapi_gesn_needed(void *opaque)
2223
{
2224
    IDEState *s = opaque;
2225

    
2226
    return s->events.new_media || s->events.eject_request;
2227
}
2228

    
2229
static bool ide_error_needed(void *opaque)
2230
{
2231
    IDEBus *bus = opaque;
2232

    
2233
    return (bus->error_status != 0);
2234
}
2235

    
2236
/* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
2237
static const VMStateDescription vmstate_ide_atapi_gesn_state = {
2238
    .name ="ide_drive/atapi/gesn_state",
2239
    .version_id = 1,
2240
    .minimum_version_id = 1,
2241
    .minimum_version_id_old = 1,
2242
    .fields = (VMStateField []) {
2243
        VMSTATE_BOOL(events.new_media, IDEState),
2244
        VMSTATE_BOOL(events.eject_request, IDEState),
2245
        VMSTATE_END_OF_LIST()
2246
    }
2247
};
2248

    
2249
static const VMStateDescription vmstate_ide_tray_state = {
2250
    .name = "ide_drive/tray_state",
2251
    .version_id = 1,
2252
    .minimum_version_id = 1,
2253
    .minimum_version_id_old = 1,
2254
    .fields = (VMStateField[]) {
2255
        VMSTATE_BOOL(tray_open, IDEState),
2256
        VMSTATE_BOOL(tray_locked, IDEState),
2257
        VMSTATE_END_OF_LIST()
2258
    }
2259
};
2260

    
2261
static const VMStateDescription vmstate_ide_drive_pio_state = {
2262
    .name = "ide_drive/pio_state",
2263
    .version_id = 1,
2264
    .minimum_version_id = 1,
2265
    .minimum_version_id_old = 1,
2266
    .pre_save = ide_drive_pio_pre_save,
2267
    .post_load = ide_drive_pio_post_load,
2268
    .fields      = (VMStateField []) {
2269
        VMSTATE_INT32(req_nb_sectors, IDEState),
2270
        VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2271
                             vmstate_info_uint8, uint8_t),
2272
        VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2273
        VMSTATE_INT32(cur_io_buffer_len, IDEState),
2274
        VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2275
        VMSTATE_INT32(elementary_transfer_size, IDEState),
2276
        VMSTATE_INT32(packet_transfer_size, IDEState),
2277
        VMSTATE_END_OF_LIST()
2278
    }
2279
};
2280

    
2281
const VMStateDescription vmstate_ide_drive = {
2282
    .name = "ide_drive",
2283
    .version_id = 3,
2284
    .minimum_version_id = 0,
2285
    .minimum_version_id_old = 0,
2286
    .post_load = ide_drive_post_load,
2287
    .fields      = (VMStateField []) {
2288
        VMSTATE_INT32(mult_sectors, IDEState),
2289
        VMSTATE_INT32(identify_set, IDEState),
2290
        VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2291
        VMSTATE_UINT8(feature, IDEState),
2292
        VMSTATE_UINT8(error, IDEState),
2293
        VMSTATE_UINT32(nsector, IDEState),
2294
        VMSTATE_UINT8(sector, IDEState),
2295
        VMSTATE_UINT8(lcyl, IDEState),
2296
        VMSTATE_UINT8(hcyl, IDEState),
2297
        VMSTATE_UINT8(hob_feature, IDEState),
2298
        VMSTATE_UINT8(hob_sector, IDEState),
2299
        VMSTATE_UINT8(hob_nsector, IDEState),
2300
        VMSTATE_UINT8(hob_lcyl, IDEState),
2301
        VMSTATE_UINT8(hob_hcyl, IDEState),
2302
        VMSTATE_UINT8(select, IDEState),
2303
        VMSTATE_UINT8(status, IDEState),
2304
        VMSTATE_UINT8(lba48, IDEState),
2305
        VMSTATE_UINT8(sense_key, IDEState),
2306
        VMSTATE_UINT8(asc, IDEState),
2307
        VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2308
        VMSTATE_END_OF_LIST()
2309
    },
2310
    .subsections = (VMStateSubsection []) {
2311
        {
2312
            .vmsd = &vmstate_ide_drive_pio_state,
2313
            .needed = ide_drive_pio_state_needed,
2314
        }, {
2315
            .vmsd = &vmstate_ide_tray_state,
2316
            .needed = ide_tray_state_needed,
2317
        }, {
2318
            .vmsd = &vmstate_ide_atapi_gesn_state,
2319
            .needed = ide_atapi_gesn_needed,
2320
        }, {
2321
            /* empty */
2322
        }
2323
    }
2324
};
2325

    
2326
static const VMStateDescription vmstate_ide_error_status = {
2327
    .name ="ide_bus/error",
2328
    .version_id = 1,
2329
    .minimum_version_id = 1,
2330
    .minimum_version_id_old = 1,
2331
    .fields = (VMStateField []) {
2332
        VMSTATE_INT32(error_status, IDEBus),
2333
        VMSTATE_END_OF_LIST()
2334
    }
2335
};
2336

    
2337
const VMStateDescription vmstate_ide_bus = {
2338
    .name = "ide_bus",
2339
    .version_id = 1,
2340
    .minimum_version_id = 1,
2341
    .minimum_version_id_old = 1,
2342
    .fields      = (VMStateField []) {
2343
        VMSTATE_UINT8(cmd, IDEBus),
2344
        VMSTATE_UINT8(unit, IDEBus),
2345
        VMSTATE_END_OF_LIST()
2346
    },
2347
    .subsections = (VMStateSubsection []) {
2348
        {
2349
            .vmsd = &vmstate_ide_error_status,
2350
            .needed = ide_error_needed,
2351
        }, {
2352
            /* empty */
2353
        }
2354
    }
2355
};
2356

    
2357
void ide_drive_get(DriveInfo **hd, int max_bus)
2358
{
2359
    int i;
2360

    
2361
    if (drive_get_max_bus(IF_IDE) >= max_bus) {
2362
        fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2363
        exit(1);
2364
    }
2365

    
2366
    for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2367
        hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2368
    }
2369
}