Statistics
| Branch: | Revision:

root / hw / ide / core.c @ 0d09e41a

History | View | Annotate | Download (70 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/i386/pc.h>
27
#include <hw/pci/pci.h>
28
#include <hw/isa/isa.h>
29
#include "qemu/error-report.h"
30
#include "qemu/timer.h"
31
#include "sysemu/sysemu.h"
32
#include "sysemu/dma.h"
33
#include "hw/block/block.h"
34
#include "sysemu/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
    QEMUIOVector *qiov;
329
    BlockDriverAIOCB *aiocb;
330
    int i, j;
331
} TrimAIOCB;
332

    
333
static void trim_aio_cancel(BlockDriverAIOCB *acb)
334
{
335
    TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
336

    
337
    /* Exit the loop in case bdrv_aio_cancel calls ide_issue_trim_cb again.  */
338
    iocb->j = iocb->qiov->niov - 1;
339
    iocb->i = (iocb->qiov->iov[iocb->j].iov_len / 8) - 1;
340

    
341
    /* Tell ide_issue_trim_cb not to trigger the completion, too.  */
342
    qemu_bh_delete(iocb->bh);
343
    iocb->bh = NULL;
344

    
345
    if (iocb->aiocb) {
346
        bdrv_aio_cancel(iocb->aiocb);
347
    }
348
    qemu_aio_release(iocb);
349
}
350

    
351
static const AIOCBInfo trim_aiocb_info = {
352
    .aiocb_size         = sizeof(TrimAIOCB),
353
    .cancel             = trim_aio_cancel,
354
};
355

    
356
static void ide_trim_bh_cb(void *opaque)
357
{
358
    TrimAIOCB *iocb = opaque;
359

    
360
    iocb->common.cb(iocb->common.opaque, iocb->ret);
361

    
362
    qemu_bh_delete(iocb->bh);
363
    iocb->bh = NULL;
364
    qemu_aio_release(iocb);
365
}
366

    
367
static void ide_issue_trim_cb(void *opaque, int ret)
368
{
369
    TrimAIOCB *iocb = opaque;
370
    if (ret >= 0) {
371
        while (iocb->j < iocb->qiov->niov) {
372
            int j = iocb->j;
373
            while (++iocb->i < iocb->qiov->iov[j].iov_len / 8) {
374
                int i = iocb->i;
375
                uint64_t *buffer = iocb->qiov->iov[j].iov_base;
376

    
377
                /* 6-byte LBA + 2-byte range per entry */
378
                uint64_t entry = le64_to_cpu(buffer[i]);
379
                uint64_t sector = entry & 0x0000ffffffffffffULL;
380
                uint16_t count = entry >> 48;
381

    
382
                if (count == 0) {
383
                    continue;
384
                }
385

    
386
                /* Got an entry! Submit and exit.  */
387
                iocb->aiocb = bdrv_aio_discard(iocb->common.bs, sector, count,
388
                                               ide_issue_trim_cb, opaque);
389
                return;
390
            }
391

    
392
            iocb->j++;
393
            iocb->i = -1;
394
        }
395
    } else {
396
        iocb->ret = ret;
397
    }
398

    
399
    iocb->aiocb = NULL;
400
    if (iocb->bh) {
401
        qemu_bh_schedule(iocb->bh);
402
    }
403
}
404

    
405
BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
406
        int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
407
        BlockDriverCompletionFunc *cb, void *opaque)
408
{
409
    TrimAIOCB *iocb;
410

    
411
    iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque);
412
    iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
413
    iocb->ret = 0;
414
    iocb->qiov = qiov;
415
    iocb->i = -1;
416
    iocb->j = 0;
417
    ide_issue_trim_cb(iocb, 0);
418
    return &iocb->common;
419
}
420

    
421
static inline void ide_abort_command(IDEState *s)
422
{
423
    s->status = READY_STAT | ERR_STAT;
424
    s->error = ABRT_ERR;
425
}
426

    
427
/* prepare data transfer and tell what to do after */
428
void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
429
                        EndTransferFunc *end_transfer_func)
430
{
431
    s->end_transfer_func = end_transfer_func;
432
    s->data_ptr = buf;
433
    s->data_end = buf + size;
434
    if (!(s->status & ERR_STAT)) {
435
        s->status |= DRQ_STAT;
436
    }
437
    s->bus->dma->ops->start_transfer(s->bus->dma);
438
}
439

    
440
void ide_transfer_stop(IDEState *s)
441
{
442
    s->end_transfer_func = ide_transfer_stop;
443
    s->data_ptr = s->io_buffer;
444
    s->data_end = s->io_buffer;
445
    s->status &= ~DRQ_STAT;
446
}
447

    
448
int64_t ide_get_sector(IDEState *s)
449
{
450
    int64_t sector_num;
451
    if (s->select & 0x40) {
452
        /* lba */
453
        if (!s->lba48) {
454
            sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
455
                (s->lcyl << 8) | s->sector;
456
        } else {
457
            sector_num = ((int64_t)s->hob_hcyl << 40) |
458
                ((int64_t) s->hob_lcyl << 32) |
459
                ((int64_t) s->hob_sector << 24) |
460
                ((int64_t) s->hcyl << 16) |
461
                ((int64_t) s->lcyl << 8) | s->sector;
462
        }
463
    } else {
464
        sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
465
            (s->select & 0x0f) * s->sectors + (s->sector - 1);
466
    }
467
    return sector_num;
468
}
469

    
470
void ide_set_sector(IDEState *s, int64_t sector_num)
471
{
472
    unsigned int cyl, r;
473
    if (s->select & 0x40) {
474
        if (!s->lba48) {
475
            s->select = (s->select & 0xf0) | (sector_num >> 24);
476
            s->hcyl = (sector_num >> 16);
477
            s->lcyl = (sector_num >> 8);
478
            s->sector = (sector_num);
479
        } else {
480
            s->sector = sector_num;
481
            s->lcyl = sector_num >> 8;
482
            s->hcyl = sector_num >> 16;
483
            s->hob_sector = sector_num >> 24;
484
            s->hob_lcyl = sector_num >> 32;
485
            s->hob_hcyl = sector_num >> 40;
486
        }
487
    } else {
488
        cyl = sector_num / (s->heads * s->sectors);
489
        r = sector_num % (s->heads * s->sectors);
490
        s->hcyl = cyl >> 8;
491
        s->lcyl = cyl;
492
        s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
493
        s->sector = (r % s->sectors) + 1;
494
    }
495
}
496

    
497
static void ide_rw_error(IDEState *s) {
498
    ide_abort_command(s);
499
    ide_set_irq(s->bus);
500
}
501

    
502
static void ide_sector_read_cb(void *opaque, int ret)
503
{
504
    IDEState *s = opaque;
505
    int n;
506

    
507
    s->pio_aiocb = NULL;
508
    s->status &= ~BUSY_STAT;
509

    
510
    bdrv_acct_done(s->bs, &s->acct);
511
    if (ret != 0) {
512
        if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY |
513
                                BM_STATUS_RETRY_READ)) {
514
            return;
515
        }
516
    }
517

    
518
    n = s->nsector;
519
    if (n > s->req_nb_sectors) {
520
        n = s->req_nb_sectors;
521
    }
522

    
523
    /* Allow the guest to read the io_buffer */
524
    ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
525

    
526
    ide_set_irq(s->bus);
527

    
528
    ide_set_sector(s, ide_get_sector(s) + n);
529
    s->nsector -= n;
530
}
531

    
532
void ide_sector_read(IDEState *s)
533
{
534
    int64_t sector_num;
535
    int n;
536

    
537
    s->status = READY_STAT | SEEK_STAT;
538
    s->error = 0; /* not needed by IDE spec, but needed by Windows */
539
    sector_num = ide_get_sector(s);
540
    n = s->nsector;
541

    
542
    if (n == 0) {
543
        ide_transfer_stop(s);
544
        return;
545
    }
546

    
547
    s->status |= BUSY_STAT;
548

    
549
    if (n > s->req_nb_sectors) {
550
        n = s->req_nb_sectors;
551
    }
552

    
553
#if defined(DEBUG_IDE)
554
    printf("sector=%" PRId64 "\n", sector_num);
555
#endif
556

    
557
    s->iov.iov_base = s->io_buffer;
558
    s->iov.iov_len  = n * BDRV_SECTOR_SIZE;
559
    qemu_iovec_init_external(&s->qiov, &s->iov, 1);
560

    
561
    bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
562
    s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
563
                                  ide_sector_read_cb, s);
564
}
565

    
566
static void dma_buf_commit(IDEState *s)
567
{
568
    qemu_sglist_destroy(&s->sg);
569
}
570

    
571
void ide_set_inactive(IDEState *s)
572
{
573
    s->bus->dma->aiocb = NULL;
574
    s->bus->dma->ops->set_inactive(s->bus->dma);
575
}
576

    
577
void ide_dma_error(IDEState *s)
578
{
579
    ide_transfer_stop(s);
580
    s->error = ABRT_ERR;
581
    s->status = READY_STAT | ERR_STAT;
582
    ide_set_inactive(s);
583
    ide_set_irq(s->bus);
584
}
585

    
586
static int ide_handle_rw_error(IDEState *s, int error, int op)
587
{
588
    bool is_read = (op & BM_STATUS_RETRY_READ) != 0;
589
    BlockErrorAction action = bdrv_get_error_action(s->bs, is_read, error);
590

    
591
    if (action == BDRV_ACTION_STOP) {
592
        s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
593
        s->bus->error_status = op;
594
    } else if (action == BDRV_ACTION_REPORT) {
595
        if (op & BM_STATUS_DMA_RETRY) {
596
            dma_buf_commit(s);
597
            ide_dma_error(s);
598
        } else {
599
            ide_rw_error(s);
600
        }
601
    }
602
    bdrv_error_action(s->bs, action, is_read, error);
603
    return action != BDRV_ACTION_IGNORE;
604
}
605

    
606
void ide_dma_cb(void *opaque, int ret)
607
{
608
    IDEState *s = opaque;
609
    int n;
610
    int64_t sector_num;
611
    bool stay_active = false;
612

    
613
    if (ret < 0) {
614
        int op = BM_STATUS_DMA_RETRY;
615

    
616
        if (s->dma_cmd == IDE_DMA_READ)
617
            op |= BM_STATUS_RETRY_READ;
618
        else if (s->dma_cmd == IDE_DMA_TRIM)
619
            op |= BM_STATUS_RETRY_TRIM;
620

    
621
        if (ide_handle_rw_error(s, -ret, op)) {
622
            return;
623
        }
624
    }
625

    
626
    n = s->io_buffer_size >> 9;
627
    if (n > s->nsector) {
628
        /* The PRDs were longer than needed for this request. Shorten them so
629
         * we don't get a negative remainder. The Active bit must remain set
630
         * after the request completes. */
631
        n = s->nsector;
632
        stay_active = true;
633
    }
634

    
635
    sector_num = ide_get_sector(s);
636
    if (n > 0) {
637
        dma_buf_commit(s);
638
        sector_num += n;
639
        ide_set_sector(s, sector_num);
640
        s->nsector -= n;
641
    }
642

    
643
    /* end of transfer ? */
644
    if (s->nsector == 0) {
645
        s->status = READY_STAT | SEEK_STAT;
646
        ide_set_irq(s->bus);
647
        goto eot;
648
    }
649

    
650
    /* launch next transfer */
651
    n = s->nsector;
652
    s->io_buffer_index = 0;
653
    s->io_buffer_size = n * 512;
654
    if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
655
        /* The PRDs were too short. Reset the Active bit, but don't raise an
656
         * interrupt. */
657
        s->status = READY_STAT | SEEK_STAT;
658
        goto eot;
659
    }
660

    
661
#ifdef DEBUG_AIO
662
    printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
663
           sector_num, n, s->dma_cmd);
664
#endif
665

    
666
    switch (s->dma_cmd) {
667
    case IDE_DMA_READ:
668
        s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
669
                                           ide_dma_cb, s);
670
        break;
671
    case IDE_DMA_WRITE:
672
        s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
673
                                            ide_dma_cb, s);
674
        break;
675
    case IDE_DMA_TRIM:
676
        s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
677
                                         ide_issue_trim, ide_dma_cb, s,
678
                                         DMA_DIRECTION_TO_DEVICE);
679
        break;
680
    }
681
    return;
682

    
683
eot:
684
    if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
685
        bdrv_acct_done(s->bs, &s->acct);
686
    }
687
    ide_set_inactive(s);
688
    if (stay_active) {
689
        s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_DMAING);
690
    }
691
}
692

    
693
static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
694
{
695
    s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
696
    s->io_buffer_index = 0;
697
    s->io_buffer_size = 0;
698
    s->dma_cmd = dma_cmd;
699

    
700
    switch (dma_cmd) {
701
    case IDE_DMA_READ:
702
        bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
703
                        BDRV_ACCT_READ);
704
        break;
705
    case IDE_DMA_WRITE:
706
        bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
707
                        BDRV_ACCT_WRITE);
708
        break;
709
    default:
710
        break;
711
    }
712

    
713
    s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
714
}
715

    
716
static void ide_sector_write_timer_cb(void *opaque)
717
{
718
    IDEState *s = opaque;
719
    ide_set_irq(s->bus);
720
}
721

    
722
static void ide_sector_write_cb(void *opaque, int ret)
723
{
724
    IDEState *s = opaque;
725
    int n;
726

    
727
    bdrv_acct_done(s->bs, &s->acct);
728

    
729
    s->pio_aiocb = NULL;
730
    s->status &= ~BUSY_STAT;
731

    
732
    if (ret != 0) {
733
        if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY)) {
734
            return;
735
        }
736
    }
737

    
738
    n = s->nsector;
739
    if (n > s->req_nb_sectors) {
740
        n = s->req_nb_sectors;
741
    }
742
    s->nsector -= n;
743
    if (s->nsector == 0) {
744
        /* no more sectors to write */
745
        ide_transfer_stop(s);
746
    } else {
747
        int n1 = s->nsector;
748
        if (n1 > s->req_nb_sectors) {
749
            n1 = s->req_nb_sectors;
750
        }
751
        ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
752
                           ide_sector_write);
753
    }
754
    ide_set_sector(s, ide_get_sector(s) + n);
755

    
756
    if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
757
        /* It seems there is a bug in the Windows 2000 installer HDD
758
           IDE driver which fills the disk with empty logs when the
759
           IDE write IRQ comes too early. This hack tries to correct
760
           that at the expense of slower write performances. Use this
761
           option _only_ to install Windows 2000. You must disable it
762
           for normal use. */
763
        qemu_mod_timer(s->sector_write_timer,
764
                       qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
765
    } else {
766
        ide_set_irq(s->bus);
767
    }
768
}
769

    
770
void ide_sector_write(IDEState *s)
771
{
772
    int64_t sector_num;
773
    int n;
774

    
775
    s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
776
    sector_num = ide_get_sector(s);
777
#if defined(DEBUG_IDE)
778
    printf("sector=%" PRId64 "\n", sector_num);
779
#endif
780
    n = s->nsector;
781
    if (n > s->req_nb_sectors) {
782
        n = s->req_nb_sectors;
783
    }
784

    
785
    s->iov.iov_base = s->io_buffer;
786
    s->iov.iov_len  = n * BDRV_SECTOR_SIZE;
787
    qemu_iovec_init_external(&s->qiov, &s->iov, 1);
788

    
789
    bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
790
    s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
791
                                   ide_sector_write_cb, s);
792
}
793

    
794
static void ide_flush_cb(void *opaque, int ret)
795
{
796
    IDEState *s = opaque;
797

    
798
    if (ret < 0) {
799
        /* XXX: What sector number to set here? */
800
        if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
801
            return;
802
        }
803
    }
804

    
805
    bdrv_acct_done(s->bs, &s->acct);
806
    s->status = READY_STAT | SEEK_STAT;
807
    ide_set_irq(s->bus);
808
}
809

    
810
void ide_flush_cache(IDEState *s)
811
{
812
    if (s->bs == NULL) {
813
        ide_flush_cb(s, 0);
814
        return;
815
    }
816

    
817
    bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
818
    bdrv_aio_flush(s->bs, ide_flush_cb, s);
819
}
820

    
821
static void ide_cfata_metadata_inquiry(IDEState *s)
822
{
823
    uint16_t *p;
824
    uint32_t spd;
825

    
826
    p = (uint16_t *) s->io_buffer;
827
    memset(p, 0, 0x200);
828
    spd = ((s->mdata_size - 1) >> 9) + 1;
829

    
830
    put_le16(p + 0, 0x0001);                        /* Data format revision */
831
    put_le16(p + 1, 0x0000);                        /* Media property: silicon */
832
    put_le16(p + 2, s->media_changed);                /* Media status */
833
    put_le16(p + 3, s->mdata_size & 0xffff);        /* Capacity in bytes (low) */
834
    put_le16(p + 4, s->mdata_size >> 16);        /* Capacity in bytes (high) */
835
    put_le16(p + 5, spd & 0xffff);                /* Sectors per device (low) */
836
    put_le16(p + 6, spd >> 16);                        /* Sectors per device (high) */
837
}
838

    
839
static void ide_cfata_metadata_read(IDEState *s)
840
{
841
    uint16_t *p;
842

    
843
    if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
844
        s->status = ERR_STAT;
845
        s->error = ABRT_ERR;
846
        return;
847
    }
848

    
849
    p = (uint16_t *) s->io_buffer;
850
    memset(p, 0, 0x200);
851

    
852
    put_le16(p + 0, s->media_changed);                /* Media status */
853
    memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
854
                    MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
855
                                    s->nsector << 9), 0x200 - 2));
856
}
857

    
858
static void ide_cfata_metadata_write(IDEState *s)
859
{
860
    if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
861
        s->status = ERR_STAT;
862
        s->error = ABRT_ERR;
863
        return;
864
    }
865

    
866
    s->media_changed = 0;
867

    
868
    memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
869
                    s->io_buffer + 2,
870
                    MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
871
                                    s->nsector << 9), 0x200 - 2));
872
}
873

    
874
/* called when the inserted state of the media has changed */
875
static void ide_cd_change_cb(void *opaque, bool load)
876
{
877
    IDEState *s = opaque;
878
    uint64_t nb_sectors;
879

    
880
    s->tray_open = !load;
881
    bdrv_get_geometry(s->bs, &nb_sectors);
882
    s->nb_sectors = nb_sectors;
883

    
884
    /*
885
     * First indicate to the guest that a CD has been removed.  That's
886
     * done on the next command the guest sends us.
887
     *
888
     * Then we set UNIT_ATTENTION, by which the guest will
889
     * detect a new CD in the drive.  See ide_atapi_cmd() for details.
890
     */
891
    s->cdrom_changed = 1;
892
    s->events.new_media = true;
893
    s->events.eject_request = false;
894
    ide_set_irq(s->bus);
895
}
896

    
897
static void ide_cd_eject_request_cb(void *opaque, bool force)
898
{
899
    IDEState *s = opaque;
900

    
901
    s->events.eject_request = true;
902
    if (force) {
903
        s->tray_locked = false;
904
    }
905
    ide_set_irq(s->bus);
906
}
907

    
908
static void ide_cmd_lba48_transform(IDEState *s, int lba48)
909
{
910
    s->lba48 = lba48;
911

    
912
    /* handle the 'magic' 0 nsector count conversion here. to avoid
913
     * fiddling with the rest of the read logic, we just store the
914
     * full sector count in ->nsector and ignore ->hob_nsector from now
915
     */
916
    if (!s->lba48) {
917
        if (!s->nsector)
918
            s->nsector = 256;
919
    } else {
920
        if (!s->nsector && !s->hob_nsector)
921
            s->nsector = 65536;
922
        else {
923
            int lo = s->nsector;
924
            int hi = s->hob_nsector;
925

    
926
            s->nsector = (hi << 8) | lo;
927
        }
928
    }
929
}
930

    
931
static void ide_clear_hob(IDEBus *bus)
932
{
933
    /* any write clears HOB high bit of device control register */
934
    bus->ifs[0].select &= ~(1 << 7);
935
    bus->ifs[1].select &= ~(1 << 7);
936
}
937

    
938
void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
939
{
940
    IDEBus *bus = opaque;
941

    
942
#ifdef DEBUG_IDE
943
    printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
944
#endif
945

    
946
    addr &= 7;
947

    
948
    /* ignore writes to command block while busy with previous command */
949
    if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
950
        return;
951

    
952
    switch(addr) {
953
    case 0:
954
        break;
955
    case 1:
956
        ide_clear_hob(bus);
957
        /* NOTE: data is written to the two drives */
958
        bus->ifs[0].hob_feature = bus->ifs[0].feature;
959
        bus->ifs[1].hob_feature = bus->ifs[1].feature;
960
        bus->ifs[0].feature = val;
961
        bus->ifs[1].feature = val;
962
        break;
963
    case 2:
964
        ide_clear_hob(bus);
965
        bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
966
        bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
967
        bus->ifs[0].nsector = val;
968
        bus->ifs[1].nsector = val;
969
        break;
970
    case 3:
971
        ide_clear_hob(bus);
972
        bus->ifs[0].hob_sector = bus->ifs[0].sector;
973
        bus->ifs[1].hob_sector = bus->ifs[1].sector;
974
        bus->ifs[0].sector = val;
975
        bus->ifs[1].sector = val;
976
        break;
977
    case 4:
978
        ide_clear_hob(bus);
979
        bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
980
        bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
981
        bus->ifs[0].lcyl = val;
982
        bus->ifs[1].lcyl = val;
983
        break;
984
    case 5:
985
        ide_clear_hob(bus);
986
        bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
987
        bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
988
        bus->ifs[0].hcyl = val;
989
        bus->ifs[1].hcyl = val;
990
        break;
991
    case 6:
992
        /* FIXME: HOB readback uses bit 7 */
993
        bus->ifs[0].select = (val & ~0x10) | 0xa0;
994
        bus->ifs[1].select = (val | 0x10) | 0xa0;
995
        /* select drive */
996
        bus->unit = (val >> 4) & 1;
997
        break;
998
    default:
999
    case 7:
1000
        /* command */
1001
        ide_exec_cmd(bus, val);
1002
        break;
1003
    }
1004
}
1005

    
1006
#define HD_OK (1u << IDE_HD)
1007
#define CD_OK (1u << IDE_CD)
1008
#define CFA_OK (1u << IDE_CFATA)
1009
#define HD_CFA_OK (HD_OK | CFA_OK)
1010
#define ALL_OK (HD_OK | CD_OK | CFA_OK)
1011

    
1012
/* See ACS-2 T13/2015-D Table B.2 Command codes */
1013
static const uint8_t ide_cmd_table[0x100] = {
1014
    /* NOP not implemented, mandatory for CD */
1015
    [CFA_REQ_EXT_ERROR_CODE]            = CFA_OK,
1016
    [WIN_DSM]                           = ALL_OK,
1017
    [WIN_DEVICE_RESET]                  = CD_OK,
1018
    [WIN_RECAL]                         = HD_CFA_OK,
1019
    [WIN_READ]                          = ALL_OK,
1020
    [WIN_READ_ONCE]                     = ALL_OK,
1021
    [WIN_READ_EXT]                      = HD_CFA_OK,
1022
    [WIN_READDMA_EXT]                   = HD_CFA_OK,
1023
    [WIN_READ_NATIVE_MAX_EXT]           = HD_CFA_OK,
1024
    [WIN_MULTREAD_EXT]                  = HD_CFA_OK,
1025
    [WIN_WRITE]                         = HD_CFA_OK,
1026
    [WIN_WRITE_ONCE]                    = HD_CFA_OK,
1027
    [WIN_WRITE_EXT]                     = HD_CFA_OK,
1028
    [WIN_WRITEDMA_EXT]                  = HD_CFA_OK,
1029
    [CFA_WRITE_SECT_WO_ERASE]           = CFA_OK,
1030
    [WIN_MULTWRITE_EXT]                 = HD_CFA_OK,
1031
    [WIN_WRITE_VERIFY]                  = HD_CFA_OK,
1032
    [WIN_VERIFY]                        = HD_CFA_OK,
1033
    [WIN_VERIFY_ONCE]                   = HD_CFA_OK,
1034
    [WIN_VERIFY_EXT]                    = HD_CFA_OK,
1035
    [WIN_SEEK]                          = HD_CFA_OK,
1036
    [CFA_TRANSLATE_SECTOR]              = CFA_OK,
1037
    [WIN_DIAGNOSE]                      = ALL_OK,
1038
    [WIN_SPECIFY]                       = HD_CFA_OK,
1039
    [WIN_STANDBYNOW2]                   = ALL_OK,
1040
    [WIN_IDLEIMMEDIATE2]                = ALL_OK,
1041
    [WIN_STANDBY2]                      = ALL_OK,
1042
    [WIN_SETIDLE2]                      = ALL_OK,
1043
    [WIN_CHECKPOWERMODE2]               = ALL_OK,
1044
    [WIN_SLEEPNOW2]                     = ALL_OK,
1045
    [WIN_PACKETCMD]                     = CD_OK,
1046
    [WIN_PIDENTIFY]                     = CD_OK,
1047
    [WIN_SMART]                         = HD_CFA_OK,
1048
    [CFA_ACCESS_METADATA_STORAGE]       = CFA_OK,
1049
    [CFA_ERASE_SECTORS]                 = CFA_OK,
1050
    [WIN_MULTREAD]                      = HD_CFA_OK,
1051
    [WIN_MULTWRITE]                     = HD_CFA_OK,
1052
    [WIN_SETMULT]                       = HD_CFA_OK,
1053
    [WIN_READDMA]                       = HD_CFA_OK,
1054
    [WIN_READDMA_ONCE]                  = HD_CFA_OK,
1055
    [WIN_WRITEDMA]                      = HD_CFA_OK,
1056
    [WIN_WRITEDMA_ONCE]                 = HD_CFA_OK,
1057
    [CFA_WRITE_MULTI_WO_ERASE]          = CFA_OK,
1058
    [WIN_STANDBYNOW1]                   = ALL_OK,
1059
    [WIN_IDLEIMMEDIATE]                 = ALL_OK,
1060
    [WIN_STANDBY]                       = ALL_OK,
1061
    [WIN_SETIDLE1]                      = ALL_OK,
1062
    [WIN_CHECKPOWERMODE1]               = ALL_OK,
1063
    [WIN_SLEEPNOW1]                     = ALL_OK,
1064
    [WIN_FLUSH_CACHE]                   = ALL_OK,
1065
    [WIN_FLUSH_CACHE_EXT]               = HD_CFA_OK,
1066
    [WIN_IDENTIFY]                      = ALL_OK,
1067
    [WIN_SETFEATURES]                   = ALL_OK,
1068
    [IBM_SENSE_CONDITION]               = CFA_OK,
1069
    [CFA_WEAR_LEVEL]                    = HD_CFA_OK,
1070
    [WIN_READ_NATIVE_MAX]               = ALL_OK,
1071
};
1072

    
1073
static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
1074
{
1075
    return cmd < ARRAY_SIZE(ide_cmd_table)
1076
        && (ide_cmd_table[cmd] & (1u << s->drive_kind));
1077
}
1078

    
1079
void ide_exec_cmd(IDEBus *bus, uint32_t val)
1080
{
1081
    uint16_t *identify_data;
1082
    IDEState *s;
1083
    int n;
1084
    int lba48 = 0;
1085

    
1086
#if defined(DEBUG_IDE)
1087
    printf("ide: CMD=%02x\n", val);
1088
#endif
1089
    s = idebus_active_if(bus);
1090
    /* ignore commands to non existent slave */
1091
    if (s != bus->ifs && !s->bs)
1092
        return;
1093

    
1094
    /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1095
    if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1096
        return;
1097

    
1098
    if (!ide_cmd_permitted(s, val)) {
1099
        goto abort_cmd;
1100
    }
1101

    
1102
    switch(val) {
1103
    case WIN_DSM:
1104
        switch (s->feature) {
1105
        case DSM_TRIM:
1106
            if (!s->bs) {
1107
                goto abort_cmd;
1108
            }
1109
            ide_sector_start_dma(s, IDE_DMA_TRIM);
1110
            break;
1111
        default:
1112
            goto abort_cmd;
1113
        }
1114
        break;
1115
    case WIN_IDENTIFY:
1116
        if (s->bs && s->drive_kind != IDE_CD) {
1117
            if (s->drive_kind != IDE_CFATA)
1118
                ide_identify(s);
1119
            else
1120
                ide_cfata_identify(s);
1121
            s->status = READY_STAT | SEEK_STAT;
1122
            ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1123
        } else {
1124
            if (s->drive_kind == IDE_CD) {
1125
                ide_set_signature(s);
1126
            }
1127
            ide_abort_command(s);
1128
        }
1129
        ide_set_irq(s->bus);
1130
        break;
1131
    case WIN_SPECIFY:
1132
    case WIN_RECAL:
1133
        s->error = 0;
1134
        s->status = READY_STAT | SEEK_STAT;
1135
        ide_set_irq(s->bus);
1136
        break;
1137
    case WIN_SETMULT:
1138
        if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1139
            /* Disable Read and Write Multiple */
1140
            s->mult_sectors = 0;
1141
            s->status = READY_STAT | SEEK_STAT;
1142
        } else if ((s->nsector & 0xff) != 0 &&
1143
            ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1144
             (s->nsector & (s->nsector - 1)) != 0)) {
1145
            ide_abort_command(s);
1146
        } else {
1147
            s->mult_sectors = s->nsector & 0xff;
1148
            s->status = READY_STAT | SEEK_STAT;
1149
        }
1150
        ide_set_irq(s->bus);
1151
        break;
1152

    
1153
    case WIN_VERIFY_EXT:
1154
        lba48 = 1;
1155
        /* fall through */
1156
    case WIN_VERIFY:
1157
    case WIN_VERIFY_ONCE:
1158
        /* do sector number check ? */
1159
        ide_cmd_lba48_transform(s, lba48);
1160
        s->status = READY_STAT | SEEK_STAT;
1161
        ide_set_irq(s->bus);
1162
        break;
1163

    
1164
    case WIN_READ_EXT:
1165
        lba48 = 1;
1166
        /* fall through */
1167
    case WIN_READ:
1168
    case WIN_READ_ONCE:
1169
        if (s->drive_kind == IDE_CD) {
1170
            ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1171
            goto abort_cmd;
1172
        }
1173
        if (!s->bs) {
1174
            goto abort_cmd;
1175
        }
1176
        ide_cmd_lba48_transform(s, lba48);
1177
        s->req_nb_sectors = 1;
1178
        ide_sector_read(s);
1179
        break;
1180

    
1181
    case WIN_WRITE_EXT:
1182
        lba48 = 1;
1183
        /* fall through */
1184
    case WIN_WRITE:
1185
    case WIN_WRITE_ONCE:
1186
    case CFA_WRITE_SECT_WO_ERASE:
1187
    case WIN_WRITE_VERIFY:
1188
        if (!s->bs) {
1189
            goto abort_cmd;
1190
        }
1191
        ide_cmd_lba48_transform(s, lba48);
1192
        s->error = 0;
1193
        s->status = SEEK_STAT | READY_STAT;
1194
        s->req_nb_sectors = 1;
1195
        ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1196
        s->media_changed = 1;
1197
        break;
1198

    
1199
    case WIN_MULTREAD_EXT:
1200
        lba48 = 1;
1201
        /* fall through */
1202
    case WIN_MULTREAD:
1203
        if (!s->bs) {
1204
            goto abort_cmd;
1205
        }
1206
        if (!s->mult_sectors) {
1207
            goto abort_cmd;
1208
        }
1209
        ide_cmd_lba48_transform(s, lba48);
1210
        s->req_nb_sectors = s->mult_sectors;
1211
        ide_sector_read(s);
1212
        break;
1213

    
1214
    case WIN_MULTWRITE_EXT:
1215
        lba48 = 1;
1216
        /* fall through */
1217
    case WIN_MULTWRITE:
1218
    case CFA_WRITE_MULTI_WO_ERASE:
1219
        if (!s->bs) {
1220
            goto abort_cmd;
1221
        }
1222
        if (!s->mult_sectors) {
1223
            goto abort_cmd;
1224
        }
1225
        ide_cmd_lba48_transform(s, lba48);
1226
        s->error = 0;
1227
        s->status = SEEK_STAT | READY_STAT;
1228
        s->req_nb_sectors = s->mult_sectors;
1229
        n = s->nsector;
1230
        if (n > s->req_nb_sectors)
1231
            n = s->req_nb_sectors;
1232
        ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1233
        s->media_changed = 1;
1234
        break;
1235

    
1236
    case WIN_READDMA_EXT:
1237
        lba48 = 1;
1238
        /* fall through */
1239
    case WIN_READDMA:
1240
    case WIN_READDMA_ONCE:
1241
        if (!s->bs) {
1242
            goto abort_cmd;
1243
        }
1244
        ide_cmd_lba48_transform(s, lba48);
1245
        ide_sector_start_dma(s, IDE_DMA_READ);
1246
        break;
1247

    
1248
    case WIN_WRITEDMA_EXT:
1249
        lba48 = 1;
1250
        /* fall through */
1251
    case WIN_WRITEDMA:
1252
    case WIN_WRITEDMA_ONCE:
1253
        if (!s->bs) {
1254
            goto abort_cmd;
1255
        }
1256
        ide_cmd_lba48_transform(s, lba48);
1257
        ide_sector_start_dma(s, IDE_DMA_WRITE);
1258
        s->media_changed = 1;
1259
        break;
1260

    
1261
    case WIN_READ_NATIVE_MAX_EXT:
1262
        lba48 = 1;
1263
        /* fall through */
1264
    case WIN_READ_NATIVE_MAX:
1265
        ide_cmd_lba48_transform(s, lba48);
1266
        ide_set_sector(s, s->nb_sectors - 1);
1267
        s->status = READY_STAT | SEEK_STAT;
1268
        ide_set_irq(s->bus);
1269
        break;
1270

    
1271
    case WIN_CHECKPOWERMODE1:
1272
    case WIN_CHECKPOWERMODE2:
1273
        s->error = 0;
1274
        s->nsector = 0xff; /* device active or idle */
1275
        s->status = READY_STAT | SEEK_STAT;
1276
        ide_set_irq(s->bus);
1277
        break;
1278
    case WIN_SETFEATURES:
1279
        if (!s->bs)
1280
            goto abort_cmd;
1281
        /* XXX: valid for CDROM ? */
1282
        switch(s->feature) {
1283
        case 0x02: /* write cache enable */
1284
            bdrv_set_enable_write_cache(s->bs, true);
1285
            identify_data = (uint16_t *)s->identify_data;
1286
            put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
1287
            s->status = READY_STAT | SEEK_STAT;
1288
            ide_set_irq(s->bus);
1289
            break;
1290
        case 0x82: /* write cache disable */
1291
            bdrv_set_enable_write_cache(s->bs, false);
1292
            identify_data = (uint16_t *)s->identify_data;
1293
            put_le16(identify_data + 85, (1 << 14) | 1);
1294
            ide_flush_cache(s);
1295
            break;
1296
        case 0xcc: /* reverting to power-on defaults enable */
1297
        case 0x66: /* reverting to power-on defaults disable */
1298
        case 0xaa: /* read look-ahead enable */
1299
        case 0x55: /* read look-ahead disable */
1300
        case 0x05: /* set advanced power management mode */
1301
        case 0x85: /* disable advanced power management mode */
1302
        case 0x69: /* NOP */
1303
        case 0x67: /* NOP */
1304
        case 0x96: /* NOP */
1305
        case 0x9a: /* NOP */
1306
        case 0x42: /* enable Automatic Acoustic Mode */
1307
        case 0xc2: /* disable Automatic Acoustic Mode */
1308
            s->status = READY_STAT | SEEK_STAT;
1309
            ide_set_irq(s->bus);
1310
            break;
1311
        case 0x03: { /* set transfer mode */
1312
                uint8_t val = s->nsector & 0x07;
1313
                identify_data = (uint16_t *)s->identify_data;
1314

    
1315
                switch (s->nsector >> 3) {
1316
                case 0x00: /* pio default */
1317
                case 0x01: /* pio mode */
1318
                        put_le16(identify_data + 62,0x07);
1319
                        put_le16(identify_data + 63,0x07);
1320
                        put_le16(identify_data + 88,0x3f);
1321
                        break;
1322
                case 0x02: /* sigle word dma mode*/
1323
                        put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1324
                        put_le16(identify_data + 63,0x07);
1325
                        put_le16(identify_data + 88,0x3f);
1326
                        break;
1327
                case 0x04: /* mdma mode */
1328
                        put_le16(identify_data + 62,0x07);
1329
                        put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1330
                        put_le16(identify_data + 88,0x3f);
1331
                        break;
1332
                case 0x08: /* udma mode */
1333
                        put_le16(identify_data + 62,0x07);
1334
                        put_le16(identify_data + 63,0x07);
1335
                        put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1336
                        break;
1337
                default:
1338
                        goto abort_cmd;
1339
                }
1340
            s->status = READY_STAT | SEEK_STAT;
1341
            ide_set_irq(s->bus);
1342
            break;
1343
        }
1344
        default:
1345
            goto abort_cmd;
1346
        }
1347
        break;
1348
    case WIN_FLUSH_CACHE:
1349
    case WIN_FLUSH_CACHE_EXT:
1350
        ide_flush_cache(s);
1351
        break;
1352
    case WIN_STANDBY:
1353
    case WIN_STANDBY2:
1354
    case WIN_STANDBYNOW1:
1355
    case WIN_STANDBYNOW2:
1356
    case WIN_IDLEIMMEDIATE:
1357
    case WIN_IDLEIMMEDIATE2:
1358
    case WIN_SETIDLE1:
1359
    case WIN_SETIDLE2:
1360
    case WIN_SLEEPNOW1:
1361
    case WIN_SLEEPNOW2:
1362
        s->status = READY_STAT;
1363
        ide_set_irq(s->bus);
1364
        break;
1365
    case WIN_SEEK:
1366
        /* XXX: Check that seek is within bounds */
1367
        s->status = READY_STAT | SEEK_STAT;
1368
        ide_set_irq(s->bus);
1369
        break;
1370
        /* ATAPI commands */
1371
    case WIN_PIDENTIFY:
1372
        ide_atapi_identify(s);
1373
        s->status = READY_STAT | SEEK_STAT;
1374
        ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1375
        ide_set_irq(s->bus);
1376
        break;
1377
    case WIN_DIAGNOSE:
1378
        ide_set_signature(s);
1379
        if (s->drive_kind == IDE_CD)
1380
            s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1381
                            * devices to return a clear status register
1382
                            * with READY_STAT *not* set. */
1383
        else
1384
            s->status = READY_STAT | SEEK_STAT;
1385
        s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1386
                          * present.
1387
                          */
1388
        ide_set_irq(s->bus);
1389
        break;
1390
    case WIN_DEVICE_RESET:
1391
        ide_set_signature(s);
1392
        s->status = 0x00; /* NOTE: READY is _not_ set */
1393
        s->error = 0x01;
1394
        break;
1395
    case WIN_PACKETCMD:
1396
        /* overlapping commands not supported */
1397
        if (s->feature & 0x02)
1398
            goto abort_cmd;
1399
        s->status = READY_STAT | SEEK_STAT;
1400
        s->atapi_dma = s->feature & 1;
1401
        s->nsector = 1;
1402
        ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1403
                           ide_atapi_cmd);
1404
        break;
1405
    /* CF-ATA commands */
1406
    case CFA_REQ_EXT_ERROR_CODE:
1407
        s->error = 0x09;    /* miscellaneous error */
1408
        s->status = READY_STAT | SEEK_STAT;
1409
        ide_set_irq(s->bus);
1410
        break;
1411
    case CFA_ERASE_SECTORS:
1412
    case CFA_WEAR_LEVEL:
1413
#if 0
1414
    /* This one has the same ID as CFA_WEAR_LEVEL and is required for
1415
       Windows 8 to work with AHCI */
1416
    case WIN_SECURITY_FREEZE_LOCK:
1417
#endif
1418
        if (val == CFA_WEAR_LEVEL)
1419
            s->nsector = 0;
1420
        if (val == CFA_ERASE_SECTORS)
1421
            s->media_changed = 1;
1422
        s->error = 0x00;
1423
        s->status = READY_STAT | SEEK_STAT;
1424
        ide_set_irq(s->bus);
1425
        break;
1426
    case CFA_TRANSLATE_SECTOR:
1427
        s->error = 0x00;
1428
        s->status = READY_STAT | SEEK_STAT;
1429
        memset(s->io_buffer, 0, 0x200);
1430
        s->io_buffer[0x00] = s->hcyl;                        /* Cyl MSB */
1431
        s->io_buffer[0x01] = s->lcyl;                        /* Cyl LSB */
1432
        s->io_buffer[0x02] = s->select;                        /* Head */
1433
        s->io_buffer[0x03] = s->sector;                        /* Sector */
1434
        s->io_buffer[0x04] = ide_get_sector(s) >> 16;        /* LBA MSB */
1435
        s->io_buffer[0x05] = ide_get_sector(s) >> 8;        /* LBA */
1436
        s->io_buffer[0x06] = ide_get_sector(s) >> 0;        /* LBA LSB */
1437
        s->io_buffer[0x13] = 0x00;                                /* Erase flag */
1438
        s->io_buffer[0x18] = 0x00;                                /* Hot count */
1439
        s->io_buffer[0x19] = 0x00;                                /* Hot count */
1440
        s->io_buffer[0x1a] = 0x01;                                /* Hot count */
1441
        ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1442
        ide_set_irq(s->bus);
1443
        break;
1444
    case CFA_ACCESS_METADATA_STORAGE:
1445
        switch (s->feature) {
1446
        case 0x02:        /* Inquiry Metadata Storage */
1447
            ide_cfata_metadata_inquiry(s);
1448
            break;
1449
        case 0x03:        /* Read Metadata Storage */
1450
            ide_cfata_metadata_read(s);
1451
            break;
1452
        case 0x04:        /* Write Metadata Storage */
1453
            ide_cfata_metadata_write(s);
1454
            break;
1455
        default:
1456
            goto abort_cmd;
1457
        }
1458
        ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1459
        s->status = 0x00; /* NOTE: READY is _not_ set */
1460
        ide_set_irq(s->bus);
1461
        break;
1462
    case IBM_SENSE_CONDITION:
1463
        switch (s->feature) {
1464
        case 0x01:  /* sense temperature in device */
1465
            s->nsector = 0x50;      /* +20 C */
1466
            break;
1467
        default:
1468
            goto abort_cmd;
1469
        }
1470
        s->status = READY_STAT | SEEK_STAT;
1471
        ide_set_irq(s->bus);
1472
        break;
1473

    
1474
    case WIN_SMART:
1475
        if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1476
                goto abort_cmd;
1477
        if (!s->smart_enabled && s->feature != SMART_ENABLE)
1478
                goto abort_cmd;
1479
        switch (s->feature) {
1480
        case SMART_DISABLE:
1481
                s->smart_enabled = 0;
1482
                s->status = READY_STAT | SEEK_STAT;
1483
                ide_set_irq(s->bus);
1484
                break;
1485
        case SMART_ENABLE:
1486
                s->smart_enabled = 1;
1487
                s->status = READY_STAT | SEEK_STAT;
1488
                ide_set_irq(s->bus);
1489
                break;
1490
        case SMART_ATTR_AUTOSAVE:
1491
                switch (s->sector) {
1492
                case 0x00:
1493
                s->smart_autosave = 0;
1494
                break;
1495
                case 0xf1:
1496
                s->smart_autosave = 1;
1497
                break;
1498
                default:
1499
                goto abort_cmd;
1500
                }
1501
                s->status = READY_STAT | SEEK_STAT;
1502
                ide_set_irq(s->bus);
1503
                break;
1504
        case SMART_STATUS:
1505
                if (!s->smart_errors) {
1506
                s->hcyl = 0xc2;
1507
                s->lcyl = 0x4f;
1508
                } else {
1509
                s->hcyl = 0x2c;
1510
                s->lcyl = 0xf4;
1511
                }
1512
                s->status = READY_STAT | SEEK_STAT;
1513
                ide_set_irq(s->bus);
1514
                break;
1515
        case SMART_READ_THRESH:
1516
                memset(s->io_buffer, 0, 0x200);
1517
                s->io_buffer[0] = 0x01; /* smart struct version */
1518
                for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1519
                s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
1520
                s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
1521
                }
1522
                for (n=0; n<511; n++) /* checksum */
1523
                s->io_buffer[511] += s->io_buffer[n];
1524
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1525
                s->status = READY_STAT | SEEK_STAT;
1526
                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1527
                ide_set_irq(s->bus);
1528
                break;
1529
        case SMART_READ_DATA:
1530
                memset(s->io_buffer, 0, 0x200);
1531
                s->io_buffer[0] = 0x01; /* smart struct version */
1532
                for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1533
                    int i;
1534
                    for(i = 0; i < 11; i++) {
1535
                        s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1536
                    }
1537
                }
1538
                s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1539
                if (s->smart_selftest_count == 0) {
1540
                s->io_buffer[363] = 0;
1541
                } else {
1542
                s->io_buffer[363] =
1543
                        s->smart_selftest_data[3 + 
1544
                                           (s->smart_selftest_count - 1) *
1545
                                           24];
1546
                }
1547
                s->io_buffer[364] = 0x20; 
1548
                s->io_buffer[365] = 0x01; 
1549
                /* offline data collection capacity: execute + self-test*/
1550
                s->io_buffer[367] = (1<<4 | 1<<3 | 1); 
1551
                s->io_buffer[368] = 0x03; /* smart capability (1) */
1552
                s->io_buffer[369] = 0x00; /* smart capability (2) */
1553
                s->io_buffer[370] = 0x01; /* error logging supported */
1554
                s->io_buffer[372] = 0x02; /* minutes for poll short test */
1555
                s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1556
                s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1557

    
1558
                for (n=0; n<511; n++) 
1559
                s->io_buffer[511] += s->io_buffer[n];
1560
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1561
                s->status = READY_STAT | SEEK_STAT;
1562
                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1563
                ide_set_irq(s->bus);
1564
                break;
1565
        case SMART_READ_LOG:
1566
                switch (s->sector) {
1567
                case 0x01: /* summary smart error log */
1568
                memset(s->io_buffer, 0, 0x200);
1569
                s->io_buffer[0] = 0x01;
1570
                s->io_buffer[1] = 0x00; /* no error entries */
1571
                s->io_buffer[452] = s->smart_errors & 0xff;
1572
                s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1573

    
1574
                for (n=0; n<511; n++)
1575
                        s->io_buffer[511] += s->io_buffer[n];
1576
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1577
                break;
1578
                case 0x06: /* smart self test log */
1579
                memset(s->io_buffer, 0, 0x200);
1580
                s->io_buffer[0] = 0x01;
1581
                if (s->smart_selftest_count == 0) {
1582
                        s->io_buffer[508] = 0;
1583
                } else {
1584
                        s->io_buffer[508] = s->smart_selftest_count;
1585
                        for (n=2; n<506; n++) 
1586
                        s->io_buffer[n] = s->smart_selftest_data[n];
1587
                }
1588
                for (n=0; n<511; n++)
1589
                        s->io_buffer[511] += s->io_buffer[n];
1590
                s->io_buffer[511] = 0x100 - s->io_buffer[511];
1591
                break;
1592
                default:
1593
                goto abort_cmd;
1594
                }
1595
                s->status = READY_STAT | SEEK_STAT;
1596
                ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1597
                ide_set_irq(s->bus);
1598
                break;
1599
        case SMART_EXECUTE_OFFLINE:
1600
                switch (s->sector) {
1601
                case 0: /* off-line routine */
1602
                case 1: /* short self test */
1603
                case 2: /* extended self test */
1604
                s->smart_selftest_count++;
1605
                if(s->smart_selftest_count > 21)
1606
                        s->smart_selftest_count = 0;
1607
                n = 2 + (s->smart_selftest_count - 1) * 24;
1608
                s->smart_selftest_data[n] = s->sector;
1609
                s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1610
                s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1611
                s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1612
                s->status = READY_STAT | SEEK_STAT;
1613
                ide_set_irq(s->bus);
1614
                break;
1615
                default:
1616
                goto abort_cmd;
1617
                }
1618
                break;
1619
        default:
1620
                goto abort_cmd;
1621
        }
1622
        break;
1623
    default:
1624
        /* should not be reachable */
1625
    abort_cmd:
1626
        ide_abort_command(s);
1627
        ide_set_irq(s->bus);
1628
        break;
1629
    }
1630
}
1631

    
1632
uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1633
{
1634
    IDEBus *bus = opaque;
1635
    IDEState *s = idebus_active_if(bus);
1636
    uint32_t addr;
1637
    int ret, hob;
1638

    
1639
    addr = addr1 & 7;
1640
    /* FIXME: HOB readback uses bit 7, but it's always set right now */
1641
    //hob = s->select & (1 << 7);
1642
    hob = 0;
1643
    switch(addr) {
1644
    case 0:
1645
        ret = 0xff;
1646
        break;
1647
    case 1:
1648
        if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1649
            (s != bus->ifs && !s->bs))
1650
            ret = 0;
1651
        else if (!hob)
1652
            ret = s->error;
1653
        else
1654
            ret = s->hob_feature;
1655
        break;
1656
    case 2:
1657
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1658
            ret = 0;
1659
        else if (!hob)
1660
            ret = s->nsector & 0xff;
1661
        else
1662
            ret = s->hob_nsector;
1663
        break;
1664
    case 3:
1665
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1666
            ret = 0;
1667
        else if (!hob)
1668
            ret = s->sector;
1669
        else
1670
            ret = s->hob_sector;
1671
        break;
1672
    case 4:
1673
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1674
            ret = 0;
1675
        else if (!hob)
1676
            ret = s->lcyl;
1677
        else
1678
            ret = s->hob_lcyl;
1679
        break;
1680
    case 5:
1681
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1682
            ret = 0;
1683
        else if (!hob)
1684
            ret = s->hcyl;
1685
        else
1686
            ret = s->hob_hcyl;
1687
        break;
1688
    case 6:
1689
        if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1690
            ret = 0;
1691
        else
1692
            ret = s->select;
1693
        break;
1694
    default:
1695
    case 7:
1696
        if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1697
            (s != bus->ifs && !s->bs))
1698
            ret = 0;
1699
        else
1700
            ret = s->status;
1701
        qemu_irq_lower(bus->irq);
1702
        break;
1703
    }
1704
#ifdef DEBUG_IDE
1705
    printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1706
#endif
1707
    return ret;
1708
}
1709

    
1710
uint32_t ide_status_read(void *opaque, uint32_t addr)
1711
{
1712
    IDEBus *bus = opaque;
1713
    IDEState *s = idebus_active_if(bus);
1714
    int ret;
1715

    
1716
    if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1717
        (s != bus->ifs && !s->bs))
1718
        ret = 0;
1719
    else
1720
        ret = s->status;
1721
#ifdef DEBUG_IDE
1722
    printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1723
#endif
1724
    return ret;
1725
}
1726

    
1727
void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1728
{
1729
    IDEBus *bus = opaque;
1730
    IDEState *s;
1731
    int i;
1732

    
1733
#ifdef DEBUG_IDE
1734
    printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1735
#endif
1736
    /* common for both drives */
1737
    if (!(bus->cmd & IDE_CMD_RESET) &&
1738
        (val & IDE_CMD_RESET)) {
1739
        /* reset low to high */
1740
        for(i = 0;i < 2; i++) {
1741
            s = &bus->ifs[i];
1742
            s->status = BUSY_STAT | SEEK_STAT;
1743
            s->error = 0x01;
1744
        }
1745
    } else if ((bus->cmd & IDE_CMD_RESET) &&
1746
               !(val & IDE_CMD_RESET)) {
1747
        /* high to low */
1748
        for(i = 0;i < 2; i++) {
1749
            s = &bus->ifs[i];
1750
            if (s->drive_kind == IDE_CD)
1751
                s->status = 0x00; /* NOTE: READY is _not_ set */
1752
            else
1753
                s->status = READY_STAT | SEEK_STAT;
1754
            ide_set_signature(s);
1755
        }
1756
    }
1757

    
1758
    bus->cmd = val;
1759
}
1760

    
1761
/*
1762
 * Returns true if the running PIO transfer is a PIO out (i.e. data is
1763
 * transferred from the device to the guest), false if it's a PIO in
1764
 */
1765
static bool ide_is_pio_out(IDEState *s)
1766
{
1767
    if (s->end_transfer_func == ide_sector_write ||
1768
        s->end_transfer_func == ide_atapi_cmd) {
1769
        return false;
1770
    } else if (s->end_transfer_func == ide_sector_read ||
1771
               s->end_transfer_func == ide_transfer_stop ||
1772
               s->end_transfer_func == ide_atapi_cmd_reply_end ||
1773
               s->end_transfer_func == ide_dummy_transfer_stop) {
1774
        return true;
1775
    }
1776

    
1777
    abort();
1778
}
1779

    
1780
void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1781
{
1782
    IDEBus *bus = opaque;
1783
    IDEState *s = idebus_active_if(bus);
1784
    uint8_t *p;
1785

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

    
1792
    p = s->data_ptr;
1793
    *(uint16_t *)p = le16_to_cpu(val);
1794
    p += 2;
1795
    s->data_ptr = p;
1796
    if (p >= s->data_end)
1797
        s->end_transfer_func(s);
1798
}
1799

    
1800
uint32_t ide_data_readw(void *opaque, uint32_t addr)
1801
{
1802
    IDEBus *bus = opaque;
1803
    IDEState *s = idebus_active_if(bus);
1804
    uint8_t *p;
1805
    int ret;
1806

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

    
1813
    p = s->data_ptr;
1814
    ret = cpu_to_le16(*(uint16_t *)p);
1815
    p += 2;
1816
    s->data_ptr = p;
1817
    if (p >= s->data_end)
1818
        s->end_transfer_func(s);
1819
    return ret;
1820
}
1821

    
1822
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1823
{
1824
    IDEBus *bus = opaque;
1825
    IDEState *s = idebus_active_if(bus);
1826
    uint8_t *p;
1827

    
1828
    /* PIO data access allowed only when DRQ bit is set. The result of a write
1829
     * during PIO out is indeterminate, just ignore it. */
1830
    if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1831
        return;
1832
    }
1833

    
1834
    p = s->data_ptr;
1835
    *(uint32_t *)p = le32_to_cpu(val);
1836
    p += 4;
1837
    s->data_ptr = p;
1838
    if (p >= s->data_end)
1839
        s->end_transfer_func(s);
1840
}
1841

    
1842
uint32_t ide_data_readl(void *opaque, uint32_t addr)
1843
{
1844
    IDEBus *bus = opaque;
1845
    IDEState *s = idebus_active_if(bus);
1846
    uint8_t *p;
1847
    int ret;
1848

    
1849
    /* PIO data access allowed only when DRQ bit is set. The result of a read
1850
     * during PIO in is indeterminate, return 0 and don't move forward. */
1851
    if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1852
        return 0;
1853
    }
1854

    
1855
    p = s->data_ptr;
1856
    ret = cpu_to_le32(*(uint32_t *)p);
1857
    p += 4;
1858
    s->data_ptr = p;
1859
    if (p >= s->data_end)
1860
        s->end_transfer_func(s);
1861
    return ret;
1862
}
1863

    
1864
static void ide_dummy_transfer_stop(IDEState *s)
1865
{
1866
    s->data_ptr = s->io_buffer;
1867
    s->data_end = s->io_buffer;
1868
    s->io_buffer[0] = 0xff;
1869
    s->io_buffer[1] = 0xff;
1870
    s->io_buffer[2] = 0xff;
1871
    s->io_buffer[3] = 0xff;
1872
}
1873

    
1874
static void ide_reset(IDEState *s)
1875
{
1876
#ifdef DEBUG_IDE
1877
    printf("ide: reset\n");
1878
#endif
1879

    
1880
    if (s->pio_aiocb) {
1881
        bdrv_aio_cancel(s->pio_aiocb);
1882
        s->pio_aiocb = NULL;
1883
    }
1884

    
1885
    if (s->drive_kind == IDE_CFATA)
1886
        s->mult_sectors = 0;
1887
    else
1888
        s->mult_sectors = MAX_MULT_SECTORS;
1889
    /* ide regs */
1890
    s->feature = 0;
1891
    s->error = 0;
1892
    s->nsector = 0;
1893
    s->sector = 0;
1894
    s->lcyl = 0;
1895
    s->hcyl = 0;
1896

    
1897
    /* lba48 */
1898
    s->hob_feature = 0;
1899
    s->hob_sector = 0;
1900
    s->hob_nsector = 0;
1901
    s->hob_lcyl = 0;
1902
    s->hob_hcyl = 0;
1903

    
1904
    s->select = 0xa0;
1905
    s->status = READY_STAT | SEEK_STAT;
1906

    
1907
    s->lba48 = 0;
1908

    
1909
    /* ATAPI specific */
1910
    s->sense_key = 0;
1911
    s->asc = 0;
1912
    s->cdrom_changed = 0;
1913
    s->packet_transfer_size = 0;
1914
    s->elementary_transfer_size = 0;
1915
    s->io_buffer_index = 0;
1916
    s->cd_sector_size = 0;
1917
    s->atapi_dma = 0;
1918
    s->tray_locked = 0;
1919
    s->tray_open = 0;
1920
    /* ATA DMA state */
1921
    s->io_buffer_size = 0;
1922
    s->req_nb_sectors = 0;
1923

    
1924
    ide_set_signature(s);
1925
    /* init the transfer handler so that 0xffff is returned on data
1926
       accesses */
1927
    s->end_transfer_func = ide_dummy_transfer_stop;
1928
    ide_dummy_transfer_stop(s);
1929
    s->media_changed = 0;
1930
}
1931

    
1932
void ide_bus_reset(IDEBus *bus)
1933
{
1934
    bus->unit = 0;
1935
    bus->cmd = 0;
1936
    ide_reset(&bus->ifs[0]);
1937
    ide_reset(&bus->ifs[1]);
1938
    ide_clear_hob(bus);
1939

    
1940
    /* pending async DMA */
1941
    if (bus->dma->aiocb) {
1942
#ifdef DEBUG_AIO
1943
        printf("aio_cancel\n");
1944
#endif
1945
        bdrv_aio_cancel(bus->dma->aiocb);
1946
        bus->dma->aiocb = NULL;
1947
    }
1948

    
1949
    /* reset dma provider too */
1950
    bus->dma->ops->reset(bus->dma);
1951
}
1952

    
1953
static bool ide_cd_is_tray_open(void *opaque)
1954
{
1955
    return ((IDEState *)opaque)->tray_open;
1956
}
1957

    
1958
static bool ide_cd_is_medium_locked(void *opaque)
1959
{
1960
    return ((IDEState *)opaque)->tray_locked;
1961
}
1962

    
1963
static const BlockDevOps ide_cd_block_ops = {
1964
    .change_media_cb = ide_cd_change_cb,
1965
    .eject_request_cb = ide_cd_eject_request_cb,
1966
    .is_tray_open = ide_cd_is_tray_open,
1967
    .is_medium_locked = ide_cd_is_medium_locked,
1968
};
1969

    
1970
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
1971
                   const char *version, const char *serial, const char *model,
1972
                   uint64_t wwn,
1973
                   uint32_t cylinders, uint32_t heads, uint32_t secs,
1974
                   int chs_trans)
1975
{
1976
    uint64_t nb_sectors;
1977

    
1978
    s->bs = bs;
1979
    s->drive_kind = kind;
1980

    
1981
    bdrv_get_geometry(bs, &nb_sectors);
1982
    s->cylinders = cylinders;
1983
    s->heads = heads;
1984
    s->sectors = secs;
1985
    s->chs_trans = chs_trans;
1986
    s->nb_sectors = nb_sectors;
1987
    s->wwn = wwn;
1988
    /* The SMART values should be preserved across power cycles
1989
       but they aren't.  */
1990
    s->smart_enabled = 1;
1991
    s->smart_autosave = 1;
1992
    s->smart_errors = 0;
1993
    s->smart_selftest_count = 0;
1994
    if (kind == IDE_CD) {
1995
        bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
1996
        bdrv_set_buffer_alignment(bs, 2048);
1997
    } else {
1998
        if (!bdrv_is_inserted(s->bs)) {
1999
            error_report("Device needs media, but drive is empty");
2000
            return -1;
2001
        }
2002
        if (bdrv_is_read_only(bs)) {
2003
            error_report("Can't use a read-only drive");
2004
            return -1;
2005
        }
2006
    }
2007
    if (serial) {
2008
        pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
2009
    } else {
2010
        snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
2011
                 "QM%05d", s->drive_serial);
2012
    }
2013
    if (model) {
2014
        pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
2015
    } else {
2016
        switch (kind) {
2017
        case IDE_CD:
2018
            strcpy(s->drive_model_str, "QEMU DVD-ROM");
2019
            break;
2020
        case IDE_CFATA:
2021
            strcpy(s->drive_model_str, "QEMU MICRODRIVE");
2022
            break;
2023
        default:
2024
            strcpy(s->drive_model_str, "QEMU HARDDISK");
2025
            break;
2026
        }
2027
    }
2028

    
2029
    if (version) {
2030
        pstrcpy(s->version, sizeof(s->version), version);
2031
    } else {
2032
        pstrcpy(s->version, sizeof(s->version), qemu_get_version());
2033
    }
2034

    
2035
    ide_reset(s);
2036
    bdrv_iostatus_enable(bs);
2037
    return 0;
2038
}
2039

    
2040
static void ide_init1(IDEBus *bus, int unit)
2041
{
2042
    static int drive_serial = 1;
2043
    IDEState *s = &bus->ifs[unit];
2044

    
2045
    s->bus = bus;
2046
    s->unit = unit;
2047
    s->drive_serial = drive_serial++;
2048
    /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2049
    s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2050
    s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
2051
    memset(s->io_buffer, 0, s->io_buffer_total_len);
2052

    
2053
    s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2054
    memset(s->smart_selftest_data, 0, 512);
2055

    
2056
    s->sector_write_timer = qemu_new_timer_ns(vm_clock,
2057
                                           ide_sector_write_timer_cb, s);
2058
}
2059

    
2060
static void ide_nop_start(IDEDMA *dma, IDEState *s,
2061
                          BlockDriverCompletionFunc *cb)
2062
{
2063
}
2064

    
2065
static int ide_nop(IDEDMA *dma)
2066
{
2067
    return 0;
2068
}
2069

    
2070
static int ide_nop_int(IDEDMA *dma, int x)
2071
{
2072
    return 0;
2073
}
2074

    
2075
static void ide_nop_restart(void *opaque, int x, RunState y)
2076
{
2077
}
2078

    
2079
static const IDEDMAOps ide_dma_nop_ops = {
2080
    .start_dma      = ide_nop_start,
2081
    .start_transfer = ide_nop,
2082
    .prepare_buf    = ide_nop_int,
2083
    .rw_buf         = ide_nop_int,
2084
    .set_unit       = ide_nop_int,
2085
    .add_status     = ide_nop_int,
2086
    .set_inactive   = ide_nop,
2087
    .restart_cb     = ide_nop_restart,
2088
    .reset          = ide_nop,
2089
};
2090

    
2091
static IDEDMA ide_dma_nop = {
2092
    .ops = &ide_dma_nop_ops,
2093
    .aiocb = NULL,
2094
};
2095

    
2096
void ide_init2(IDEBus *bus, qemu_irq irq)
2097
{
2098
    int i;
2099

    
2100
    for(i = 0; i < 2; i++) {
2101
        ide_init1(bus, i);
2102
        ide_reset(&bus->ifs[i]);
2103
    }
2104
    bus->irq = irq;
2105
    bus->dma = &ide_dma_nop;
2106
}
2107

    
2108
/* TODO convert users to qdev and remove */
2109
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
2110
                                    DriveInfo *hd1, qemu_irq irq)
2111
{
2112
    int i, trans;
2113
    DriveInfo *dinfo;
2114
    uint32_t cyls, heads, secs;
2115

    
2116
    for(i = 0; i < 2; i++) {
2117
        dinfo = i == 0 ? hd0 : hd1;
2118
        ide_init1(bus, i);
2119
        if (dinfo) {
2120
            cyls  = dinfo->cyls;
2121
            heads = dinfo->heads;
2122
            secs  = dinfo->secs;
2123
            trans = dinfo->trans;
2124
            if (!cyls && !heads && !secs) {
2125
                hd_geometry_guess(dinfo->bdrv, &cyls, &heads, &secs, &trans);
2126
            } else if (trans == BIOS_ATA_TRANSLATION_AUTO) {
2127
                trans = hd_bios_chs_auto_trans(cyls, heads, secs);
2128
            }
2129
            if (cyls < 1 || cyls > 65535) {
2130
                error_report("cyls must be between 1 and 65535");
2131
                exit(1);
2132
            }
2133
            if (heads < 1 || heads > 16) {
2134
                error_report("heads must be between 1 and 16");
2135
                exit(1);
2136
            }
2137
            if (secs < 1 || secs > 255) {
2138
                error_report("secs must be between 1 and 255");
2139
                exit(1);
2140
            }
2141
            if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
2142
                               dinfo->media_cd ? IDE_CD : IDE_HD,
2143
                               NULL, dinfo->serial, NULL, 0,
2144
                               cyls, heads, secs, trans) < 0) {
2145
                error_report("Can't set up IDE drive %s", dinfo->id);
2146
                exit(1);
2147
            }
2148
            bdrv_attach_dev_nofail(dinfo->bdrv, &bus->ifs[i]);
2149
        } else {
2150
            ide_reset(&bus->ifs[i]);
2151
        }
2152
    }
2153
    bus->irq = irq;
2154
    bus->dma = &ide_dma_nop;
2155
}
2156

    
2157
static const MemoryRegionPortio ide_portio_list[] = {
2158
    { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2159
    { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
2160
    { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
2161
    PORTIO_END_OF_LIST(),
2162
};
2163

    
2164
static const MemoryRegionPortio ide_portio2_list[] = {
2165
    { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2166
    PORTIO_END_OF_LIST(),
2167
};
2168

    
2169
void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
2170
{
2171
    /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2172
       bridge has been setup properly to always register with ISA.  */
2173
    isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2174

    
2175
    if (iobase2) {
2176
        isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
2177
    }
2178
}
2179

    
2180
static bool is_identify_set(void *opaque, int version_id)
2181
{
2182
    IDEState *s = opaque;
2183

    
2184
    return s->identify_set != 0;
2185
}
2186

    
2187
static EndTransferFunc* transfer_end_table[] = {
2188
        ide_sector_read,
2189
        ide_sector_write,
2190
        ide_transfer_stop,
2191
        ide_atapi_cmd_reply_end,
2192
        ide_atapi_cmd,
2193
        ide_dummy_transfer_stop,
2194
};
2195

    
2196
static int transfer_end_table_idx(EndTransferFunc *fn)
2197
{
2198
    int i;
2199

    
2200
    for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2201
        if (transfer_end_table[i] == fn)
2202
            return i;
2203

    
2204
    return -1;
2205
}
2206

    
2207
static int ide_drive_post_load(void *opaque, int version_id)
2208
{
2209
    IDEState *s = opaque;
2210

    
2211
    if (s->identify_set) {
2212
        bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
2213
    }
2214
    return 0;
2215
}
2216

    
2217
static int ide_drive_pio_post_load(void *opaque, int version_id)
2218
{
2219
    IDEState *s = opaque;
2220

    
2221
    if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
2222
        return -EINVAL;
2223
    }
2224
    s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2225
    s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2226
    s->data_end = s->data_ptr + s->cur_io_buffer_len;
2227

    
2228
    return 0;
2229
}
2230

    
2231
static void ide_drive_pio_pre_save(void *opaque)
2232
{
2233
    IDEState *s = opaque;
2234
    int idx;
2235

    
2236
    s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2237
    s->cur_io_buffer_len = s->data_end - s->data_ptr;
2238

    
2239
    idx = transfer_end_table_idx(s->end_transfer_func);
2240
    if (idx == -1) {
2241
        fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2242
                        __func__);
2243
        s->end_transfer_fn_idx = 2;
2244
    } else {
2245
        s->end_transfer_fn_idx = idx;
2246
    }
2247
}
2248

    
2249
static bool ide_drive_pio_state_needed(void *opaque)
2250
{
2251
    IDEState *s = opaque;
2252

    
2253
    return ((s->status & DRQ_STAT) != 0)
2254
        || (s->bus->error_status & BM_STATUS_PIO_RETRY);
2255
}
2256

    
2257
static bool ide_tray_state_needed(void *opaque)
2258
{
2259
    IDEState *s = opaque;
2260

    
2261
    return s->tray_open || s->tray_locked;
2262
}
2263

    
2264
static bool ide_atapi_gesn_needed(void *opaque)
2265
{
2266
    IDEState *s = opaque;
2267

    
2268
    return s->events.new_media || s->events.eject_request;
2269
}
2270

    
2271
static bool ide_error_needed(void *opaque)
2272
{
2273
    IDEBus *bus = opaque;
2274

    
2275
    return (bus->error_status != 0);
2276
}
2277

    
2278
/* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
2279
static const VMStateDescription vmstate_ide_atapi_gesn_state = {
2280
    .name ="ide_drive/atapi/gesn_state",
2281
    .version_id = 1,
2282
    .minimum_version_id = 1,
2283
    .minimum_version_id_old = 1,
2284
    .fields = (VMStateField []) {
2285
        VMSTATE_BOOL(events.new_media, IDEState),
2286
        VMSTATE_BOOL(events.eject_request, IDEState),
2287
        VMSTATE_END_OF_LIST()
2288
    }
2289
};
2290

    
2291
static const VMStateDescription vmstate_ide_tray_state = {
2292
    .name = "ide_drive/tray_state",
2293
    .version_id = 1,
2294
    .minimum_version_id = 1,
2295
    .minimum_version_id_old = 1,
2296
    .fields = (VMStateField[]) {
2297
        VMSTATE_BOOL(tray_open, IDEState),
2298
        VMSTATE_BOOL(tray_locked, IDEState),
2299
        VMSTATE_END_OF_LIST()
2300
    }
2301
};
2302

    
2303
static const VMStateDescription vmstate_ide_drive_pio_state = {
2304
    .name = "ide_drive/pio_state",
2305
    .version_id = 1,
2306
    .minimum_version_id = 1,
2307
    .minimum_version_id_old = 1,
2308
    .pre_save = ide_drive_pio_pre_save,
2309
    .post_load = ide_drive_pio_post_load,
2310
    .fields      = (VMStateField []) {
2311
        VMSTATE_INT32(req_nb_sectors, IDEState),
2312
        VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2313
                             vmstate_info_uint8, uint8_t),
2314
        VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2315
        VMSTATE_INT32(cur_io_buffer_len, IDEState),
2316
        VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2317
        VMSTATE_INT32(elementary_transfer_size, IDEState),
2318
        VMSTATE_INT32(packet_transfer_size, IDEState),
2319
        VMSTATE_END_OF_LIST()
2320
    }
2321
};
2322

    
2323
const VMStateDescription vmstate_ide_drive = {
2324
    .name = "ide_drive",
2325
    .version_id = 3,
2326
    .minimum_version_id = 0,
2327
    .minimum_version_id_old = 0,
2328
    .post_load = ide_drive_post_load,
2329
    .fields      = (VMStateField []) {
2330
        VMSTATE_INT32(mult_sectors, IDEState),
2331
        VMSTATE_INT32(identify_set, IDEState),
2332
        VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2333
        VMSTATE_UINT8(feature, IDEState),
2334
        VMSTATE_UINT8(error, IDEState),
2335
        VMSTATE_UINT32(nsector, IDEState),
2336
        VMSTATE_UINT8(sector, IDEState),
2337
        VMSTATE_UINT8(lcyl, IDEState),
2338
        VMSTATE_UINT8(hcyl, IDEState),
2339
        VMSTATE_UINT8(hob_feature, IDEState),
2340
        VMSTATE_UINT8(hob_sector, IDEState),
2341
        VMSTATE_UINT8(hob_nsector, IDEState),
2342
        VMSTATE_UINT8(hob_lcyl, IDEState),
2343
        VMSTATE_UINT8(hob_hcyl, IDEState),
2344
        VMSTATE_UINT8(select, IDEState),
2345
        VMSTATE_UINT8(status, IDEState),
2346
        VMSTATE_UINT8(lba48, IDEState),
2347
        VMSTATE_UINT8(sense_key, IDEState),
2348
        VMSTATE_UINT8(asc, IDEState),
2349
        VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2350
        VMSTATE_END_OF_LIST()
2351
    },
2352
    .subsections = (VMStateSubsection []) {
2353
        {
2354
            .vmsd = &vmstate_ide_drive_pio_state,
2355
            .needed = ide_drive_pio_state_needed,
2356
        }, {
2357
            .vmsd = &vmstate_ide_tray_state,
2358
            .needed = ide_tray_state_needed,
2359
        }, {
2360
            .vmsd = &vmstate_ide_atapi_gesn_state,
2361
            .needed = ide_atapi_gesn_needed,
2362
        }, {
2363
            /* empty */
2364
        }
2365
    }
2366
};
2367

    
2368
static const VMStateDescription vmstate_ide_error_status = {
2369
    .name ="ide_bus/error",
2370
    .version_id = 1,
2371
    .minimum_version_id = 1,
2372
    .minimum_version_id_old = 1,
2373
    .fields = (VMStateField []) {
2374
        VMSTATE_INT32(error_status, IDEBus),
2375
        VMSTATE_END_OF_LIST()
2376
    }
2377
};
2378

    
2379
const VMStateDescription vmstate_ide_bus = {
2380
    .name = "ide_bus",
2381
    .version_id = 1,
2382
    .minimum_version_id = 1,
2383
    .minimum_version_id_old = 1,
2384
    .fields      = (VMStateField []) {
2385
        VMSTATE_UINT8(cmd, IDEBus),
2386
        VMSTATE_UINT8(unit, IDEBus),
2387
        VMSTATE_END_OF_LIST()
2388
    },
2389
    .subsections = (VMStateSubsection []) {
2390
        {
2391
            .vmsd = &vmstate_ide_error_status,
2392
            .needed = ide_error_needed,
2393
        }, {
2394
            /* empty */
2395
        }
2396
    }
2397
};
2398

    
2399
void ide_drive_get(DriveInfo **hd, int max_bus)
2400
{
2401
    int i;
2402

    
2403
    if (drive_get_max_bus(IF_IDE) >= max_bus) {
2404
        fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2405
        exit(1);
2406
    }
2407

    
2408
    for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2409
        hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2410
    }
2411
}