Add qemu 2.4.0
[kvmfornfv.git] / qemu / hw / ide / core.c
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/block-backend.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_size(IDEState *s)
79 {
80     uint16_t *p = (uint16_t *)s->identify_data;
81     put_le16(p + 60, s->nb_sectors);
82     put_le16(p + 61, s->nb_sectors >> 16);
83     put_le16(p + 100, s->nb_sectors);
84     put_le16(p + 101, s->nb_sectors >> 16);
85     put_le16(p + 102, s->nb_sectors >> 32);
86     put_le16(p + 103, s->nb_sectors >> 48);
87 }
88
89 static void ide_identify(IDEState *s)
90 {
91     uint16_t *p;
92     unsigned int oldsize;
93     IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
94
95     p = (uint16_t *)s->identify_data;
96     if (s->identify_set) {
97         goto fill_buffer;
98     }
99     memset(p, 0, sizeof(s->identify_data));
100
101     put_le16(p + 0, 0x0040);
102     put_le16(p + 1, s->cylinders);
103     put_le16(p + 3, s->heads);
104     put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
105     put_le16(p + 5, 512); /* XXX: retired, remove ? */
106     put_le16(p + 6, s->sectors);
107     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
108     put_le16(p + 20, 3); /* XXX: retired, remove ? */
109     put_le16(p + 21, 512); /* cache size in sectors */
110     put_le16(p + 22, 4); /* ecc bytes */
111     padstr((char *)(p + 23), s->version, 8); /* firmware version */
112     padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
113 #if MAX_MULT_SECTORS > 1
114     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
115 #endif
116     put_le16(p + 48, 1); /* dword I/O */
117     put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
118     put_le16(p + 51, 0x200); /* PIO transfer cycle */
119     put_le16(p + 52, 0x200); /* DMA transfer cycle */
120     put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
121     put_le16(p + 54, s->cylinders);
122     put_le16(p + 55, s->heads);
123     put_le16(p + 56, s->sectors);
124     oldsize = s->cylinders * s->heads * s->sectors;
125     put_le16(p + 57, oldsize);
126     put_le16(p + 58, oldsize >> 16);
127     if (s->mult_sectors)
128         put_le16(p + 59, 0x100 | s->mult_sectors);
129     /* *(p + 60) := nb_sectors       -- see ide_identify_size */
130     /* *(p + 61) := nb_sectors >> 16 -- see ide_identify_size */
131     put_le16(p + 62, 0x07); /* single word dma0-2 supported */
132     put_le16(p + 63, 0x07); /* mdma0-2 supported */
133     put_le16(p + 64, 0x03); /* pio3-4 supported */
134     put_le16(p + 65, 120);
135     put_le16(p + 66, 120);
136     put_le16(p + 67, 120);
137     put_le16(p + 68, 120);
138     if (dev && dev->conf.discard_granularity) {
139         put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
140     }
141
142     if (s->ncq_queues) {
143         put_le16(p + 75, s->ncq_queues - 1);
144         /* NCQ supported */
145         put_le16(p + 76, (1 << 8));
146     }
147
148     put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
149     put_le16(p + 81, 0x16); /* conforms to ata5 */
150     /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
151     put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
152     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
153     put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
154     /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
155     if (s->wwn) {
156         put_le16(p + 84, (1 << 14) | (1 << 8) | 0);
157     } else {
158         put_le16(p + 84, (1 << 14) | 0);
159     }
160     /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
161     if (blk_enable_write_cache(s->blk)) {
162         put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
163     } else {
164         put_le16(p + 85, (1 << 14) | 1);
165     }
166     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
167     put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
168     /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
169     if (s->wwn) {
170         put_le16(p + 87, (1 << 14) | (1 << 8) | 0);
171     } else {
172         put_le16(p + 87, (1 << 14) | 0);
173     }
174     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
175     put_le16(p + 93, 1 | (1 << 14) | 0x2000);
176     /* *(p + 100) := nb_sectors       -- see ide_identify_size */
177     /* *(p + 101) := nb_sectors >> 16 -- see ide_identify_size */
178     /* *(p + 102) := nb_sectors >> 32 -- see ide_identify_size */
179     /* *(p + 103) := nb_sectors >> 48 -- see ide_identify_size */
180
181     if (dev && dev->conf.physical_block_size)
182         put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
183     if (s->wwn) {
184         /* LE 16-bit words 111-108 contain 64-bit World Wide Name */
185         put_le16(p + 108, s->wwn >> 48);
186         put_le16(p + 109, s->wwn >> 32);
187         put_le16(p + 110, s->wwn >> 16);
188         put_le16(p + 111, s->wwn);
189     }
190     if (dev && dev->conf.discard_granularity) {
191         put_le16(p + 169, 1); /* TRIM support */
192     }
193
194     ide_identify_size(s);
195     s->identify_set = 1;
196
197 fill_buffer:
198     memcpy(s->io_buffer, p, sizeof(s->identify_data));
199 }
200
201 static void ide_atapi_identify(IDEState *s)
202 {
203     uint16_t *p;
204
205     p = (uint16_t *)s->identify_data;
206     if (s->identify_set) {
207         goto fill_buffer;
208     }
209     memset(p, 0, sizeof(s->identify_data));
210
211     /* Removable CDROM, 50us response, 12 byte packets */
212     put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
213     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
214     put_le16(p + 20, 3); /* buffer type */
215     put_le16(p + 21, 512); /* cache size in sectors */
216     put_le16(p + 22, 4); /* ecc bytes */
217     padstr((char *)(p + 23), s->version, 8); /* firmware version */
218     padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
219     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
220 #ifdef USE_DMA_CDROM
221     put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
222     put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
223     put_le16(p + 62, 7);  /* single word dma0-2 supported */
224     put_le16(p + 63, 7);  /* mdma0-2 supported */
225 #else
226     put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
227     put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
228     put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
229 #endif
230     put_le16(p + 64, 3); /* pio3-4 supported */
231     put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
232     put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
233     put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
234     put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
235
236     put_le16(p + 71, 30); /* in ns */
237     put_le16(p + 72, 30); /* in ns */
238
239     if (s->ncq_queues) {
240         put_le16(p + 75, s->ncq_queues - 1);
241         /* NCQ supported */
242         put_le16(p + 76, (1 << 8));
243     }
244
245     put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
246     if (s->wwn) {
247         put_le16(p + 84, (1 << 8)); /* supports WWN for words 108-111 */
248         put_le16(p + 87, (1 << 8)); /* WWN enabled */
249     }
250
251 #ifdef USE_DMA_CDROM
252     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
253 #endif
254
255     if (s->wwn) {
256         /* LE 16-bit words 111-108 contain 64-bit World Wide Name */
257         put_le16(p + 108, s->wwn >> 48);
258         put_le16(p + 109, s->wwn >> 32);
259         put_le16(p + 110, s->wwn >> 16);
260         put_le16(p + 111, s->wwn);
261     }
262
263     s->identify_set = 1;
264
265 fill_buffer:
266     memcpy(s->io_buffer, p, sizeof(s->identify_data));
267 }
268
269 static void ide_cfata_identify_size(IDEState *s)
270 {
271     uint16_t *p = (uint16_t *)s->identify_data;
272     put_le16(p + 7, s->nb_sectors >> 16);  /* Sectors per card */
273     put_le16(p + 8, s->nb_sectors);        /* Sectors per card */
274     put_le16(p + 60, s->nb_sectors);       /* Total LBA sectors */
275     put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
276 }
277
278 static void ide_cfata_identify(IDEState *s)
279 {
280     uint16_t *p;
281     uint32_t cur_sec;
282
283     p = (uint16_t *)s->identify_data;
284     if (s->identify_set) {
285         goto fill_buffer;
286     }
287     memset(p, 0, sizeof(s->identify_data));
288
289     cur_sec = s->cylinders * s->heads * s->sectors;
290
291     put_le16(p + 0, 0x848a);                    /* CF Storage Card signature */
292     put_le16(p + 1, s->cylinders);              /* Default cylinders */
293     put_le16(p + 3, s->heads);                  /* Default heads */
294     put_le16(p + 6, s->sectors);                /* Default sectors per track */
295     /* *(p + 7) := nb_sectors >> 16 -- see ide_cfata_identify_size */
296     /* *(p + 8) := nb_sectors       -- see ide_cfata_identify_size */
297     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
298     put_le16(p + 22, 0x0004);                   /* ECC bytes */
299     padstr((char *) (p + 23), s->version, 8);   /* Firmware Revision */
300     padstr((char *) (p + 27), s->drive_model_str, 40);/* Model number */
301 #if MAX_MULT_SECTORS > 1
302     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
303 #else
304     put_le16(p + 47, 0x0000);
305 #endif
306     put_le16(p + 49, 0x0f00);                   /* Capabilities */
307     put_le16(p + 51, 0x0002);                   /* PIO cycle timing mode */
308     put_le16(p + 52, 0x0001);                   /* DMA cycle timing mode */
309     put_le16(p + 53, 0x0003);                   /* Translation params valid */
310     put_le16(p + 54, s->cylinders);             /* Current cylinders */
311     put_le16(p + 55, s->heads);                 /* Current heads */
312     put_le16(p + 56, s->sectors);               /* Current sectors */
313     put_le16(p + 57, cur_sec);                  /* Current capacity */
314     put_le16(p + 58, cur_sec >> 16);            /* Current capacity */
315     if (s->mult_sectors)                        /* Multiple sector setting */
316         put_le16(p + 59, 0x100 | s->mult_sectors);
317     /* *(p + 60) := nb_sectors       -- see ide_cfata_identify_size */
318     /* *(p + 61) := nb_sectors >> 16 -- see ide_cfata_identify_size */
319     put_le16(p + 63, 0x0203);                   /* Multiword DMA capability */
320     put_le16(p + 64, 0x0001);                   /* Flow Control PIO support */
321     put_le16(p + 65, 0x0096);                   /* Min. Multiword DMA cycle */
322     put_le16(p + 66, 0x0096);                   /* Rec. Multiword DMA cycle */
323     put_le16(p + 68, 0x00b4);                   /* Min. PIO cycle time */
324     put_le16(p + 82, 0x400c);                   /* Command Set supported */
325     put_le16(p + 83, 0x7068);                   /* Command Set supported */
326     put_le16(p + 84, 0x4000);                   /* Features supported */
327     put_le16(p + 85, 0x000c);                   /* Command Set enabled */
328     put_le16(p + 86, 0x7044);                   /* Command Set enabled */
329     put_le16(p + 87, 0x4000);                   /* Features enabled */
330     put_le16(p + 91, 0x4060);                   /* Current APM level */
331     put_le16(p + 129, 0x0002);                  /* Current features option */
332     put_le16(p + 130, 0x0005);                  /* Reassigned sectors */
333     put_le16(p + 131, 0x0001);                  /* Initial power mode */
334     put_le16(p + 132, 0x0000);                  /* User signature */
335     put_le16(p + 160, 0x8100);                  /* Power requirement */
336     put_le16(p + 161, 0x8001);                  /* CF command set */
337
338     ide_cfata_identify_size(s);
339     s->identify_set = 1;
340
341 fill_buffer:
342     memcpy(s->io_buffer, p, sizeof(s->identify_data));
343 }
344
345 static void ide_set_signature(IDEState *s)
346 {
347     s->select &= 0xf0; /* clear head */
348     /* put signature */
349     s->nsector = 1;
350     s->sector = 1;
351     if (s->drive_kind == IDE_CD) {
352         s->lcyl = 0x14;
353         s->hcyl = 0xeb;
354     } else if (s->blk) {
355         s->lcyl = 0;
356         s->hcyl = 0;
357     } else {
358         s->lcyl = 0xff;
359         s->hcyl = 0xff;
360     }
361 }
362
363 typedef struct TrimAIOCB {
364     BlockAIOCB common;
365     BlockBackend *blk;
366     QEMUBH *bh;
367     int ret;
368     QEMUIOVector *qiov;
369     BlockAIOCB *aiocb;
370     int i, j;
371 } TrimAIOCB;
372
373 static void trim_aio_cancel(BlockAIOCB *acb)
374 {
375     TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
376
377     /* Exit the loop so ide_issue_trim_cb will not continue  */
378     iocb->j = iocb->qiov->niov - 1;
379     iocb->i = (iocb->qiov->iov[iocb->j].iov_len / 8) - 1;
380
381     iocb->ret = -ECANCELED;
382
383     if (iocb->aiocb) {
384         blk_aio_cancel_async(iocb->aiocb);
385         iocb->aiocb = NULL;
386     }
387 }
388
389 static const AIOCBInfo trim_aiocb_info = {
390     .aiocb_size         = sizeof(TrimAIOCB),
391     .cancel_async       = trim_aio_cancel,
392 };
393
394 static void ide_trim_bh_cb(void *opaque)
395 {
396     TrimAIOCB *iocb = opaque;
397
398     iocb->common.cb(iocb->common.opaque, iocb->ret);
399
400     qemu_bh_delete(iocb->bh);
401     iocb->bh = NULL;
402     qemu_aio_unref(iocb);
403 }
404
405 static void ide_issue_trim_cb(void *opaque, int ret)
406 {
407     TrimAIOCB *iocb = opaque;
408     if (ret >= 0) {
409         while (iocb->j < iocb->qiov->niov) {
410             int j = iocb->j;
411             while (++iocb->i < iocb->qiov->iov[j].iov_len / 8) {
412                 int i = iocb->i;
413                 uint64_t *buffer = iocb->qiov->iov[j].iov_base;
414
415                 /* 6-byte LBA + 2-byte range per entry */
416                 uint64_t entry = le64_to_cpu(buffer[i]);
417                 uint64_t sector = entry & 0x0000ffffffffffffULL;
418                 uint16_t count = entry >> 48;
419
420                 if (count == 0) {
421                     continue;
422                 }
423
424                 /* Got an entry! Submit and exit.  */
425                 iocb->aiocb = blk_aio_discard(iocb->blk, sector, count,
426                                               ide_issue_trim_cb, opaque);
427                 return;
428             }
429
430             iocb->j++;
431             iocb->i = -1;
432         }
433     } else {
434         iocb->ret = ret;
435     }
436
437     iocb->aiocb = NULL;
438     if (iocb->bh) {
439         qemu_bh_schedule(iocb->bh);
440     }
441 }
442
443 BlockAIOCB *ide_issue_trim(BlockBackend *blk,
444         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
445         BlockCompletionFunc *cb, void *opaque)
446 {
447     TrimAIOCB *iocb;
448
449     iocb = blk_aio_get(&trim_aiocb_info, blk, cb, opaque);
450     iocb->blk = blk;
451     iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
452     iocb->ret = 0;
453     iocb->qiov = qiov;
454     iocb->i = -1;
455     iocb->j = 0;
456     ide_issue_trim_cb(iocb, 0);
457     return &iocb->common;
458 }
459
460 static inline void ide_abort_command(IDEState *s)
461 {
462     ide_transfer_stop(s);
463     s->status = READY_STAT | ERR_STAT;
464     s->error = ABRT_ERR;
465 }
466
467 /* prepare data transfer and tell what to do after */
468 void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
469                         EndTransferFunc *end_transfer_func)
470 {
471     s->end_transfer_func = end_transfer_func;
472     s->data_ptr = buf;
473     s->data_end = buf + size;
474     if (!(s->status & ERR_STAT)) {
475         s->status |= DRQ_STAT;
476     }
477     if (s->bus->dma->ops->start_transfer) {
478         s->bus->dma->ops->start_transfer(s->bus->dma);
479     }
480 }
481
482 static void ide_cmd_done(IDEState *s)
483 {
484     if (s->bus->dma->ops->cmd_done) {
485         s->bus->dma->ops->cmd_done(s->bus->dma);
486     }
487 }
488
489 void ide_transfer_stop(IDEState *s)
490 {
491     s->end_transfer_func = ide_transfer_stop;
492     s->data_ptr = s->io_buffer;
493     s->data_end = s->io_buffer;
494     s->status &= ~DRQ_STAT;
495     ide_cmd_done(s);
496 }
497
498 int64_t ide_get_sector(IDEState *s)
499 {
500     int64_t sector_num;
501     if (s->select & 0x40) {
502         /* lba */
503         if (!s->lba48) {
504             sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
505                 (s->lcyl << 8) | s->sector;
506         } else {
507             sector_num = ((int64_t)s->hob_hcyl << 40) |
508                 ((int64_t) s->hob_lcyl << 32) |
509                 ((int64_t) s->hob_sector << 24) |
510                 ((int64_t) s->hcyl << 16) |
511                 ((int64_t) s->lcyl << 8) | s->sector;
512         }
513     } else {
514         sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
515             (s->select & 0x0f) * s->sectors + (s->sector - 1);
516     }
517     return sector_num;
518 }
519
520 void ide_set_sector(IDEState *s, int64_t sector_num)
521 {
522     unsigned int cyl, r;
523     if (s->select & 0x40) {
524         if (!s->lba48) {
525             s->select = (s->select & 0xf0) | (sector_num >> 24);
526             s->hcyl = (sector_num >> 16);
527             s->lcyl = (sector_num >> 8);
528             s->sector = (sector_num);
529         } else {
530             s->sector = sector_num;
531             s->lcyl = sector_num >> 8;
532             s->hcyl = sector_num >> 16;
533             s->hob_sector = sector_num >> 24;
534             s->hob_lcyl = sector_num >> 32;
535             s->hob_hcyl = sector_num >> 40;
536         }
537     } else {
538         cyl = sector_num / (s->heads * s->sectors);
539         r = sector_num % (s->heads * s->sectors);
540         s->hcyl = cyl >> 8;
541         s->lcyl = cyl;
542         s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
543         s->sector = (r % s->sectors) + 1;
544     }
545 }
546
547 static void ide_rw_error(IDEState *s) {
548     ide_abort_command(s);
549     ide_set_irq(s->bus);
550 }
551
552 static bool ide_sect_range_ok(IDEState *s,
553                               uint64_t sector, uint64_t nb_sectors)
554 {
555     uint64_t total_sectors;
556
557     blk_get_geometry(s->blk, &total_sectors);
558     if (sector > total_sectors || nb_sectors > total_sectors - sector) {
559         return false;
560     }
561     return true;
562 }
563
564 static void ide_sector_read(IDEState *s);
565
566 static void ide_sector_read_cb(void *opaque, int ret)
567 {
568     IDEState *s = opaque;
569     int n;
570
571     s->pio_aiocb = NULL;
572     s->status &= ~BUSY_STAT;
573
574     if (ret == -ECANCELED) {
575         return;
576     }
577     block_acct_done(blk_get_stats(s->blk), &s->acct);
578     if (ret != 0) {
579         if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
580                                 IDE_RETRY_READ)) {
581             return;
582         }
583     }
584
585     n = s->nsector;
586     if (n > s->req_nb_sectors) {
587         n = s->req_nb_sectors;
588     }
589
590     ide_set_sector(s, ide_get_sector(s) + n);
591     s->nsector -= n;
592     /* Allow the guest to read the io_buffer */
593     ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
594     s->io_buffer_offset += 512 * n;
595     ide_set_irq(s->bus);
596 }
597
598 static void ide_sector_read(IDEState *s)
599 {
600     int64_t sector_num;
601     int n;
602
603     s->status = READY_STAT | SEEK_STAT;
604     s->error = 0; /* not needed by IDE spec, but needed by Windows */
605     sector_num = ide_get_sector(s);
606     n = s->nsector;
607
608     if (n == 0) {
609         ide_transfer_stop(s);
610         return;
611     }
612
613     s->status |= BUSY_STAT;
614
615     if (n > s->req_nb_sectors) {
616         n = s->req_nb_sectors;
617     }
618
619 #if defined(DEBUG_IDE)
620     printf("sector=%" PRId64 "\n", sector_num);
621 #endif
622
623     if (!ide_sect_range_ok(s, sector_num, n)) {
624         ide_rw_error(s);
625         return;
626     }
627
628     s->iov.iov_base = s->io_buffer;
629     s->iov.iov_len  = n * BDRV_SECTOR_SIZE;
630     qemu_iovec_init_external(&s->qiov, &s->iov, 1);
631
632     block_acct_start(blk_get_stats(s->blk), &s->acct,
633                      n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
634     s->pio_aiocb = blk_aio_readv(s->blk, sector_num, &s->qiov, n,
635                                  ide_sector_read_cb, s);
636 }
637
638 static void dma_buf_commit(IDEState *s, uint32_t tx_bytes)
639 {
640     if (s->bus->dma->ops->commit_buf) {
641         s->bus->dma->ops->commit_buf(s->bus->dma, tx_bytes);
642     }
643     qemu_sglist_destroy(&s->sg);
644 }
645
646 void ide_set_inactive(IDEState *s, bool more)
647 {
648     s->bus->dma->aiocb = NULL;
649     s->bus->retry_unit = -1;
650     s->bus->retry_sector_num = 0;
651     s->bus->retry_nsector = 0;
652     if (s->bus->dma->ops->set_inactive) {
653         s->bus->dma->ops->set_inactive(s->bus->dma, more);
654     }
655     ide_cmd_done(s);
656 }
657
658 void ide_dma_error(IDEState *s)
659 {
660     dma_buf_commit(s, 0);
661     ide_abort_command(s);
662     ide_set_inactive(s, false);
663     ide_set_irq(s->bus);
664 }
665
666 static int ide_handle_rw_error(IDEState *s, int error, int op)
667 {
668     bool is_read = (op & IDE_RETRY_READ) != 0;
669     BlockErrorAction action = blk_get_error_action(s->blk, is_read, error);
670
671     if (action == BLOCK_ERROR_ACTION_STOP) {
672         assert(s->bus->retry_unit == s->unit);
673         s->bus->error_status = op;
674     } else if (action == BLOCK_ERROR_ACTION_REPORT) {
675         if (op & IDE_RETRY_DMA) {
676             ide_dma_error(s);
677         } else {
678             ide_rw_error(s);
679         }
680     }
681     blk_error_action(s->blk, action, is_read, error);
682     return action != BLOCK_ERROR_ACTION_IGNORE;
683 }
684
685 static void ide_dma_cb(void *opaque, int ret)
686 {
687     IDEState *s = opaque;
688     int n;
689     int64_t sector_num;
690     bool stay_active = false;
691
692     if (ret == -ECANCELED) {
693         return;
694     }
695     if (ret < 0) {
696         int op = IDE_RETRY_DMA;
697
698         if (s->dma_cmd == IDE_DMA_READ)
699             op |= IDE_RETRY_READ;
700         else if (s->dma_cmd == IDE_DMA_TRIM)
701             op |= IDE_RETRY_TRIM;
702
703         if (ide_handle_rw_error(s, -ret, op)) {
704             return;
705         }
706     }
707
708     n = s->io_buffer_size >> 9;
709     if (n > s->nsector) {
710         /* The PRDs were longer than needed for this request. Shorten them so
711          * we don't get a negative remainder. The Active bit must remain set
712          * after the request completes. */
713         n = s->nsector;
714         stay_active = true;
715     }
716
717     sector_num = ide_get_sector(s);
718     if (n > 0) {
719         assert(n * 512 == s->sg.size);
720         dma_buf_commit(s, s->sg.size);
721         sector_num += n;
722         ide_set_sector(s, sector_num);
723         s->nsector -= n;
724     }
725
726     /* end of transfer ? */
727     if (s->nsector == 0) {
728         s->status = READY_STAT | SEEK_STAT;
729         ide_set_irq(s->bus);
730         goto eot;
731     }
732
733     /* launch next transfer */
734     n = s->nsector;
735     s->io_buffer_index = 0;
736     s->io_buffer_size = n * 512;
737     if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->io_buffer_size) < 512) {
738         /* The PRDs were too short. Reset the Active bit, but don't raise an
739          * interrupt. */
740         s->status = READY_STAT | SEEK_STAT;
741         dma_buf_commit(s, 0);
742         goto eot;
743     }
744
745 #ifdef DEBUG_AIO
746     printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
747            sector_num, n, s->dma_cmd);
748 #endif
749
750     if ((s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) &&
751         !ide_sect_range_ok(s, sector_num, n)) {
752         ide_dma_error(s);
753         return;
754     }
755
756     switch (s->dma_cmd) {
757     case IDE_DMA_READ:
758         s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, sector_num,
759                                           ide_dma_cb, s);
760         break;
761     case IDE_DMA_WRITE:
762         s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, sector_num,
763                                            ide_dma_cb, s);
764         break;
765     case IDE_DMA_TRIM:
766         s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, sector_num,
767                                         ide_issue_trim, ide_dma_cb, s,
768                                         DMA_DIRECTION_TO_DEVICE);
769         break;
770     }
771     return;
772
773 eot:
774     if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
775         block_acct_done(blk_get_stats(s->blk), &s->acct);
776     }
777     ide_set_inactive(s, stay_active);
778 }
779
780 static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
781 {
782     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
783     s->io_buffer_size = 0;
784     s->dma_cmd = dma_cmd;
785
786     switch (dma_cmd) {
787     case IDE_DMA_READ:
788         block_acct_start(blk_get_stats(s->blk), &s->acct,
789                          s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
790         break;
791     case IDE_DMA_WRITE:
792         block_acct_start(blk_get_stats(s->blk), &s->acct,
793                          s->nsector * BDRV_SECTOR_SIZE, BLOCK_ACCT_WRITE);
794         break;
795     default:
796         break;
797     }
798
799     ide_start_dma(s, ide_dma_cb);
800 }
801
802 void ide_start_dma(IDEState *s, BlockCompletionFunc *cb)
803 {
804     s->io_buffer_index = 0;
805     s->bus->retry_unit = s->unit;
806     s->bus->retry_sector_num = ide_get_sector(s);
807     s->bus->retry_nsector = s->nsector;
808     if (s->bus->dma->ops->start_dma) {
809         s->bus->dma->ops->start_dma(s->bus->dma, s, cb);
810     }
811 }
812
813 static void ide_sector_write(IDEState *s);
814
815 static void ide_sector_write_timer_cb(void *opaque)
816 {
817     IDEState *s = opaque;
818     ide_set_irq(s->bus);
819 }
820
821 static void ide_sector_write_cb(void *opaque, int ret)
822 {
823     IDEState *s = opaque;
824     int n;
825
826     if (ret == -ECANCELED) {
827         return;
828     }
829     block_acct_done(blk_get_stats(s->blk), &s->acct);
830
831     s->pio_aiocb = NULL;
832     s->status &= ~BUSY_STAT;
833
834     if (ret != 0) {
835         if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO)) {
836             return;
837         }
838     }
839
840     n = s->nsector;
841     if (n > s->req_nb_sectors) {
842         n = s->req_nb_sectors;
843     }
844     s->nsector -= n;
845     s->io_buffer_offset += 512 * n;
846
847     ide_set_sector(s, ide_get_sector(s) + n);
848     if (s->nsector == 0) {
849         /* no more sectors to write */
850         ide_transfer_stop(s);
851     } else {
852         int n1 = s->nsector;
853         if (n1 > s->req_nb_sectors) {
854             n1 = s->req_nb_sectors;
855         }
856         ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
857                            ide_sector_write);
858     }
859
860     if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
861         /* It seems there is a bug in the Windows 2000 installer HDD
862            IDE driver which fills the disk with empty logs when the
863            IDE write IRQ comes too early. This hack tries to correct
864            that at the expense of slower write performances. Use this
865            option _only_ to install Windows 2000. You must disable it
866            for normal use. */
867         timer_mod(s->sector_write_timer,
868                        qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (get_ticks_per_sec() / 1000));
869     } else {
870         ide_set_irq(s->bus);
871     }
872 }
873
874 static void ide_sector_write(IDEState *s)
875 {
876     int64_t sector_num;
877     int n;
878
879     s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
880     sector_num = ide_get_sector(s);
881 #if defined(DEBUG_IDE)
882     printf("sector=%" PRId64 "\n", sector_num);
883 #endif
884     n = s->nsector;
885     if (n > s->req_nb_sectors) {
886         n = s->req_nb_sectors;
887     }
888
889     if (!ide_sect_range_ok(s, sector_num, n)) {
890         ide_rw_error(s);
891         return;
892     }
893
894     s->iov.iov_base = s->io_buffer;
895     s->iov.iov_len  = n * BDRV_SECTOR_SIZE;
896     qemu_iovec_init_external(&s->qiov, &s->iov, 1);
897
898     block_acct_start(blk_get_stats(s->blk), &s->acct,
899                      n * BDRV_SECTOR_SIZE, BLOCK_ACCT_READ);
900     s->pio_aiocb = blk_aio_writev(s->blk, sector_num, &s->qiov, n,
901                                   ide_sector_write_cb, s);
902 }
903
904 static void ide_flush_cb(void *opaque, int ret)
905 {
906     IDEState *s = opaque;
907
908     s->pio_aiocb = NULL;
909
910     if (ret == -ECANCELED) {
911         return;
912     }
913     if (ret < 0) {
914         /* XXX: What sector number to set here? */
915         if (ide_handle_rw_error(s, -ret, IDE_RETRY_FLUSH)) {
916             return;
917         }
918     }
919
920     if (s->blk) {
921         block_acct_done(blk_get_stats(s->blk), &s->acct);
922     }
923     s->status = READY_STAT | SEEK_STAT;
924     ide_cmd_done(s);
925     ide_set_irq(s->bus);
926 }
927
928 static void ide_flush_cache(IDEState *s)
929 {
930     if (s->blk == NULL) {
931         ide_flush_cb(s, 0);
932         return;
933     }
934
935     s->status |= BUSY_STAT;
936     block_acct_start(blk_get_stats(s->blk), &s->acct, 0, BLOCK_ACCT_FLUSH);
937     s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s);
938 }
939
940 static void ide_cfata_metadata_inquiry(IDEState *s)
941 {
942     uint16_t *p;
943     uint32_t spd;
944
945     p = (uint16_t *) s->io_buffer;
946     memset(p, 0, 0x200);
947     spd = ((s->mdata_size - 1) >> 9) + 1;
948
949     put_le16(p + 0, 0x0001);                    /* Data format revision */
950     put_le16(p + 1, 0x0000);                    /* Media property: silicon */
951     put_le16(p + 2, s->media_changed);          /* Media status */
952     put_le16(p + 3, s->mdata_size & 0xffff);    /* Capacity in bytes (low) */
953     put_le16(p + 4, s->mdata_size >> 16);       /* Capacity in bytes (high) */
954     put_le16(p + 5, spd & 0xffff);              /* Sectors per device (low) */
955     put_le16(p + 6, spd >> 16);                 /* Sectors per device (high) */
956 }
957
958 static void ide_cfata_metadata_read(IDEState *s)
959 {
960     uint16_t *p;
961
962     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
963         s->status = ERR_STAT;
964         s->error = ABRT_ERR;
965         return;
966     }
967
968     p = (uint16_t *) s->io_buffer;
969     memset(p, 0, 0x200);
970
971     put_le16(p + 0, s->media_changed);          /* Media status */
972     memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
973                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
974                                     s->nsector << 9), 0x200 - 2));
975 }
976
977 static void ide_cfata_metadata_write(IDEState *s)
978 {
979     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
980         s->status = ERR_STAT;
981         s->error = ABRT_ERR;
982         return;
983     }
984
985     s->media_changed = 0;
986
987     memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
988                     s->io_buffer + 2,
989                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
990                                     s->nsector << 9), 0x200 - 2));
991 }
992
993 /* called when the inserted state of the media has changed */
994 static void ide_cd_change_cb(void *opaque, bool load)
995 {
996     IDEState *s = opaque;
997     uint64_t nb_sectors;
998
999     s->tray_open = !load;
1000     blk_get_geometry(s->blk, &nb_sectors);
1001     s->nb_sectors = nb_sectors;
1002
1003     /*
1004      * First indicate to the guest that a CD has been removed.  That's
1005      * done on the next command the guest sends us.
1006      *
1007      * Then we set UNIT_ATTENTION, by which the guest will
1008      * detect a new CD in the drive.  See ide_atapi_cmd() for details.
1009      */
1010     s->cdrom_changed = 1;
1011     s->events.new_media = true;
1012     s->events.eject_request = false;
1013     ide_set_irq(s->bus);
1014 }
1015
1016 static void ide_cd_eject_request_cb(void *opaque, bool force)
1017 {
1018     IDEState *s = opaque;
1019
1020     s->events.eject_request = true;
1021     if (force) {
1022         s->tray_locked = false;
1023     }
1024     ide_set_irq(s->bus);
1025 }
1026
1027 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
1028 {
1029     s->lba48 = lba48;
1030
1031     /* handle the 'magic' 0 nsector count conversion here. to avoid
1032      * fiddling with the rest of the read logic, we just store the
1033      * full sector count in ->nsector and ignore ->hob_nsector from now
1034      */
1035     if (!s->lba48) {
1036         if (!s->nsector)
1037             s->nsector = 256;
1038     } else {
1039         if (!s->nsector && !s->hob_nsector)
1040             s->nsector = 65536;
1041         else {
1042             int lo = s->nsector;
1043             int hi = s->hob_nsector;
1044
1045             s->nsector = (hi << 8) | lo;
1046         }
1047     }
1048 }
1049
1050 static void ide_clear_hob(IDEBus *bus)
1051 {
1052     /* any write clears HOB high bit of device control register */
1053     bus->ifs[0].select &= ~(1 << 7);
1054     bus->ifs[1].select &= ~(1 << 7);
1055 }
1056
1057 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1058 {
1059     IDEBus *bus = opaque;
1060
1061 #ifdef DEBUG_IDE
1062     printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
1063 #endif
1064
1065     addr &= 7;
1066
1067     /* ignore writes to command block while busy with previous command */
1068     if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
1069         return;
1070
1071     switch(addr) {
1072     case 0:
1073         break;
1074     case 1:
1075         ide_clear_hob(bus);
1076         /* NOTE: data is written to the two drives */
1077         bus->ifs[0].hob_feature = bus->ifs[0].feature;
1078         bus->ifs[1].hob_feature = bus->ifs[1].feature;
1079         bus->ifs[0].feature = val;
1080         bus->ifs[1].feature = val;
1081         break;
1082     case 2:
1083         ide_clear_hob(bus);
1084         bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
1085         bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
1086         bus->ifs[0].nsector = val;
1087         bus->ifs[1].nsector = val;
1088         break;
1089     case 3:
1090         ide_clear_hob(bus);
1091         bus->ifs[0].hob_sector = bus->ifs[0].sector;
1092         bus->ifs[1].hob_sector = bus->ifs[1].sector;
1093         bus->ifs[0].sector = val;
1094         bus->ifs[1].sector = val;
1095         break;
1096     case 4:
1097         ide_clear_hob(bus);
1098         bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
1099         bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
1100         bus->ifs[0].lcyl = val;
1101         bus->ifs[1].lcyl = val;
1102         break;
1103     case 5:
1104         ide_clear_hob(bus);
1105         bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
1106         bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
1107         bus->ifs[0].hcyl = val;
1108         bus->ifs[1].hcyl = val;
1109         break;
1110     case 6:
1111         /* FIXME: HOB readback uses bit 7 */
1112         bus->ifs[0].select = (val & ~0x10) | 0xa0;
1113         bus->ifs[1].select = (val | 0x10) | 0xa0;
1114         /* select drive */
1115         bus->unit = (val >> 4) & 1;
1116         break;
1117     default:
1118     case 7:
1119         /* command */
1120         ide_exec_cmd(bus, val);
1121         break;
1122     }
1123 }
1124
1125 static bool cmd_nop(IDEState *s, uint8_t cmd)
1126 {
1127     return true;
1128 }
1129
1130 static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
1131 {
1132     switch (s->feature) {
1133     case DSM_TRIM:
1134         if (s->blk) {
1135             ide_sector_start_dma(s, IDE_DMA_TRIM);
1136             return false;
1137         }
1138         break;
1139     }
1140
1141     ide_abort_command(s);
1142     return true;
1143 }
1144
1145 static bool cmd_identify(IDEState *s, uint8_t cmd)
1146 {
1147     if (s->blk && s->drive_kind != IDE_CD) {
1148         if (s->drive_kind != IDE_CFATA) {
1149             ide_identify(s);
1150         } else {
1151             ide_cfata_identify(s);
1152         }
1153         s->status = READY_STAT | SEEK_STAT;
1154         ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1155         ide_set_irq(s->bus);
1156         return false;
1157     } else {
1158         if (s->drive_kind == IDE_CD) {
1159             ide_set_signature(s);
1160         }
1161         ide_abort_command(s);
1162     }
1163
1164     return true;
1165 }
1166
1167 static bool cmd_verify(IDEState *s, uint8_t cmd)
1168 {
1169     bool lba48 = (cmd == WIN_VERIFY_EXT);
1170
1171     /* do sector number check ? */
1172     ide_cmd_lba48_transform(s, lba48);
1173
1174     return true;
1175 }
1176
1177 static bool cmd_set_multiple_mode(IDEState *s, uint8_t cmd)
1178 {
1179     if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1180         /* Disable Read and Write Multiple */
1181         s->mult_sectors = 0;
1182     } else if ((s->nsector & 0xff) != 0 &&
1183         ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1184          (s->nsector & (s->nsector - 1)) != 0)) {
1185         ide_abort_command(s);
1186     } else {
1187         s->mult_sectors = s->nsector & 0xff;
1188     }
1189
1190     return true;
1191 }
1192
1193 static bool cmd_read_multiple(IDEState *s, uint8_t cmd)
1194 {
1195     bool lba48 = (cmd == WIN_MULTREAD_EXT);
1196
1197     if (!s->blk || !s->mult_sectors) {
1198         ide_abort_command(s);
1199         return true;
1200     }
1201
1202     ide_cmd_lba48_transform(s, lba48);
1203     s->req_nb_sectors = s->mult_sectors;
1204     ide_sector_read(s);
1205     return false;
1206 }
1207
1208 static bool cmd_write_multiple(IDEState *s, uint8_t cmd)
1209 {
1210     bool lba48 = (cmd == WIN_MULTWRITE_EXT);
1211     int n;
1212
1213     if (!s->blk || !s->mult_sectors) {
1214         ide_abort_command(s);
1215         return true;
1216     }
1217
1218     ide_cmd_lba48_transform(s, lba48);
1219
1220     s->req_nb_sectors = s->mult_sectors;
1221     n = MIN(s->nsector, s->req_nb_sectors);
1222
1223     s->status = SEEK_STAT | READY_STAT;
1224     ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1225
1226     s->media_changed = 1;
1227
1228     return false;
1229 }
1230
1231 static bool cmd_read_pio(IDEState *s, uint8_t cmd)
1232 {
1233     bool lba48 = (cmd == WIN_READ_EXT);
1234
1235     if (s->drive_kind == IDE_CD) {
1236         ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1237         ide_abort_command(s);
1238         return true;
1239     }
1240
1241     if (!s->blk) {
1242         ide_abort_command(s);
1243         return true;
1244     }
1245
1246     ide_cmd_lba48_transform(s, lba48);
1247     s->req_nb_sectors = 1;
1248     ide_sector_read(s);
1249
1250     return false;
1251 }
1252
1253 static bool cmd_write_pio(IDEState *s, uint8_t cmd)
1254 {
1255     bool lba48 = (cmd == WIN_WRITE_EXT);
1256
1257     if (!s->blk) {
1258         ide_abort_command(s);
1259         return true;
1260     }
1261
1262     ide_cmd_lba48_transform(s, lba48);
1263
1264     s->req_nb_sectors = 1;
1265     s->status = SEEK_STAT | READY_STAT;
1266     ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1267
1268     s->media_changed = 1;
1269
1270     return false;
1271 }
1272
1273 static bool cmd_read_dma(IDEState *s, uint8_t cmd)
1274 {
1275     bool lba48 = (cmd == WIN_READDMA_EXT);
1276
1277     if (!s->blk) {
1278         ide_abort_command(s);
1279         return true;
1280     }
1281
1282     ide_cmd_lba48_transform(s, lba48);
1283     ide_sector_start_dma(s, IDE_DMA_READ);
1284
1285     return false;
1286 }
1287
1288 static bool cmd_write_dma(IDEState *s, uint8_t cmd)
1289 {
1290     bool lba48 = (cmd == WIN_WRITEDMA_EXT);
1291
1292     if (!s->blk) {
1293         ide_abort_command(s);
1294         return true;
1295     }
1296
1297     ide_cmd_lba48_transform(s, lba48);
1298     ide_sector_start_dma(s, IDE_DMA_WRITE);
1299
1300     s->media_changed = 1;
1301
1302     return false;
1303 }
1304
1305 static bool cmd_flush_cache(IDEState *s, uint8_t cmd)
1306 {
1307     ide_flush_cache(s);
1308     return false;
1309 }
1310
1311 static bool cmd_seek(IDEState *s, uint8_t cmd)
1312 {
1313     /* XXX: Check that seek is within bounds */
1314     return true;
1315 }
1316
1317 static bool cmd_read_native_max(IDEState *s, uint8_t cmd)
1318 {
1319     bool lba48 = (cmd == WIN_READ_NATIVE_MAX_EXT);
1320
1321     /* Refuse if no sectors are addressable (e.g. medium not inserted) */
1322     if (s->nb_sectors == 0) {
1323         ide_abort_command(s);
1324         return true;
1325     }
1326
1327     ide_cmd_lba48_transform(s, lba48);
1328     ide_set_sector(s, s->nb_sectors - 1);
1329
1330     return true;
1331 }
1332
1333 static bool cmd_check_power_mode(IDEState *s, uint8_t cmd)
1334 {
1335     s->nsector = 0xff; /* device active or idle */
1336     return true;
1337 }
1338
1339 static bool cmd_set_features(IDEState *s, uint8_t cmd)
1340 {
1341     uint16_t *identify_data;
1342
1343     if (!s->blk) {
1344         ide_abort_command(s);
1345         return true;
1346     }
1347
1348     /* XXX: valid for CDROM ? */
1349     switch (s->feature) {
1350     case 0x02: /* write cache enable */
1351         blk_set_enable_write_cache(s->blk, true);
1352         identify_data = (uint16_t *)s->identify_data;
1353         put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
1354         return true;
1355     case 0x82: /* write cache disable */
1356         blk_set_enable_write_cache(s->blk, false);
1357         identify_data = (uint16_t *)s->identify_data;
1358         put_le16(identify_data + 85, (1 << 14) | 1);
1359         ide_flush_cache(s);
1360         return false;
1361     case 0xcc: /* reverting to power-on defaults enable */
1362     case 0x66: /* reverting to power-on defaults disable */
1363     case 0xaa: /* read look-ahead enable */
1364     case 0x55: /* read look-ahead disable */
1365     case 0x05: /* set advanced power management mode */
1366     case 0x85: /* disable advanced power management mode */
1367     case 0x69: /* NOP */
1368     case 0x67: /* NOP */
1369     case 0x96: /* NOP */
1370     case 0x9a: /* NOP */
1371     case 0x42: /* enable Automatic Acoustic Mode */
1372     case 0xc2: /* disable Automatic Acoustic Mode */
1373         return true;
1374     case 0x03: /* set transfer mode */
1375         {
1376             uint8_t val = s->nsector & 0x07;
1377             identify_data = (uint16_t *)s->identify_data;
1378
1379             switch (s->nsector >> 3) {
1380             case 0x00: /* pio default */
1381             case 0x01: /* pio mode */
1382                 put_le16(identify_data + 62, 0x07);
1383                 put_le16(identify_data + 63, 0x07);
1384                 put_le16(identify_data + 88, 0x3f);
1385                 break;
1386             case 0x02: /* sigle word dma mode*/
1387                 put_le16(identify_data + 62, 0x07 | (1 << (val + 8)));
1388                 put_le16(identify_data + 63, 0x07);
1389                 put_le16(identify_data + 88, 0x3f);
1390                 break;
1391             case 0x04: /* mdma mode */
1392                 put_le16(identify_data + 62, 0x07);
1393                 put_le16(identify_data + 63, 0x07 | (1 << (val + 8)));
1394                 put_le16(identify_data + 88, 0x3f);
1395                 break;
1396             case 0x08: /* udma mode */
1397                 put_le16(identify_data + 62, 0x07);
1398                 put_le16(identify_data + 63, 0x07);
1399                 put_le16(identify_data + 88, 0x3f | (1 << (val + 8)));
1400                 break;
1401             default:
1402                 goto abort_cmd;
1403             }
1404             return true;
1405         }
1406     }
1407
1408 abort_cmd:
1409     ide_abort_command(s);
1410     return true;
1411 }
1412
1413
1414 /*** ATAPI commands ***/
1415
1416 static bool cmd_identify_packet(IDEState *s, uint8_t cmd)
1417 {
1418     ide_atapi_identify(s);
1419     s->status = READY_STAT | SEEK_STAT;
1420     ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1421     ide_set_irq(s->bus);
1422     return false;
1423 }
1424
1425 static bool cmd_exec_dev_diagnostic(IDEState *s, uint8_t cmd)
1426 {
1427     ide_set_signature(s);
1428
1429     if (s->drive_kind == IDE_CD) {
1430         s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1431                         * devices to return a clear status register
1432                         * with READY_STAT *not* set. */
1433         s->error = 0x01;
1434     } else {
1435         s->status = READY_STAT | SEEK_STAT;
1436         /* The bits of the error register are not as usual for this command!
1437          * They are part of the regular output (this is why ERR_STAT isn't set)
1438          * Device 0 passed, Device 1 passed or not present. */
1439         s->error = 0x01;
1440         ide_set_irq(s->bus);
1441     }
1442
1443     return false;
1444 }
1445
1446 static bool cmd_device_reset(IDEState *s, uint8_t cmd)
1447 {
1448     ide_set_signature(s);
1449     s->status = 0x00; /* NOTE: READY is _not_ set */
1450     s->error = 0x01;
1451
1452     return false;
1453 }
1454
1455 static bool cmd_packet(IDEState *s, uint8_t cmd)
1456 {
1457     /* overlapping commands not supported */
1458     if (s->feature & 0x02) {
1459         ide_abort_command(s);
1460         return true;
1461     }
1462
1463     s->status = READY_STAT | SEEK_STAT;
1464     s->atapi_dma = s->feature & 1;
1465     s->nsector = 1;
1466     ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1467                        ide_atapi_cmd);
1468     return false;
1469 }
1470
1471
1472 /*** CF-ATA commands ***/
1473
1474 static bool cmd_cfa_req_ext_error_code(IDEState *s, uint8_t cmd)
1475 {
1476     s->error = 0x09;    /* miscellaneous error */
1477     s->status = READY_STAT | SEEK_STAT;
1478     ide_set_irq(s->bus);
1479
1480     return false;
1481 }
1482
1483 static bool cmd_cfa_erase_sectors(IDEState *s, uint8_t cmd)
1484 {
1485     /* WIN_SECURITY_FREEZE_LOCK has the same ID as CFA_WEAR_LEVEL and is
1486      * required for Windows 8 to work with AHCI */
1487
1488     if (cmd == CFA_WEAR_LEVEL) {
1489         s->nsector = 0;
1490     }
1491
1492     if (cmd == CFA_ERASE_SECTORS) {
1493         s->media_changed = 1;
1494     }
1495
1496     return true;
1497 }
1498
1499 static bool cmd_cfa_translate_sector(IDEState *s, uint8_t cmd)
1500 {
1501     s->status = READY_STAT | SEEK_STAT;
1502
1503     memset(s->io_buffer, 0, 0x200);
1504     s->io_buffer[0x00] = s->hcyl;                   /* Cyl MSB */
1505     s->io_buffer[0x01] = s->lcyl;                   /* Cyl LSB */
1506     s->io_buffer[0x02] = s->select;                 /* Head */
1507     s->io_buffer[0x03] = s->sector;                 /* Sector */
1508     s->io_buffer[0x04] = ide_get_sector(s) >> 16;   /* LBA MSB */
1509     s->io_buffer[0x05] = ide_get_sector(s) >> 8;    /* LBA */
1510     s->io_buffer[0x06] = ide_get_sector(s) >> 0;    /* LBA LSB */
1511     s->io_buffer[0x13] = 0x00;                      /* Erase flag */
1512     s->io_buffer[0x18] = 0x00;                      /* Hot count */
1513     s->io_buffer[0x19] = 0x00;                      /* Hot count */
1514     s->io_buffer[0x1a] = 0x01;                      /* Hot count */
1515
1516     ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1517     ide_set_irq(s->bus);
1518
1519     return false;
1520 }
1521
1522 static bool cmd_cfa_access_metadata_storage(IDEState *s, uint8_t cmd)
1523 {
1524     switch (s->feature) {
1525     case 0x02:  /* Inquiry Metadata Storage */
1526         ide_cfata_metadata_inquiry(s);
1527         break;
1528     case 0x03:  /* Read Metadata Storage */
1529         ide_cfata_metadata_read(s);
1530         break;
1531     case 0x04:  /* Write Metadata Storage */
1532         ide_cfata_metadata_write(s);
1533         break;
1534     default:
1535         ide_abort_command(s);
1536         return true;
1537     }
1538
1539     ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1540     s->status = 0x00; /* NOTE: READY is _not_ set */
1541     ide_set_irq(s->bus);
1542
1543     return false;
1544 }
1545
1546 static bool cmd_ibm_sense_condition(IDEState *s, uint8_t cmd)
1547 {
1548     switch (s->feature) {
1549     case 0x01:  /* sense temperature in device */
1550         s->nsector = 0x50;      /* +20 C */
1551         break;
1552     default:
1553         ide_abort_command(s);
1554         return true;
1555     }
1556
1557     return true;
1558 }
1559
1560
1561 /*** SMART commands ***/
1562
1563 static bool cmd_smart(IDEState *s, uint8_t cmd)
1564 {
1565     int n;
1566
1567     if (s->hcyl != 0xc2 || s->lcyl != 0x4f) {
1568         goto abort_cmd;
1569     }
1570
1571     if (!s->smart_enabled && s->feature != SMART_ENABLE) {
1572         goto abort_cmd;
1573     }
1574
1575     switch (s->feature) {
1576     case SMART_DISABLE:
1577         s->smart_enabled = 0;
1578         return true;
1579
1580     case SMART_ENABLE:
1581         s->smart_enabled = 1;
1582         return true;
1583
1584     case SMART_ATTR_AUTOSAVE:
1585         switch (s->sector) {
1586         case 0x00:
1587             s->smart_autosave = 0;
1588             break;
1589         case 0xf1:
1590             s->smart_autosave = 1;
1591             break;
1592         default:
1593             goto abort_cmd;
1594         }
1595         return true;
1596
1597     case SMART_STATUS:
1598         if (!s->smart_errors) {
1599             s->hcyl = 0xc2;
1600             s->lcyl = 0x4f;
1601         } else {
1602             s->hcyl = 0x2c;
1603             s->lcyl = 0xf4;
1604         }
1605         return true;
1606
1607     case SMART_READ_THRESH:
1608         memset(s->io_buffer, 0, 0x200);
1609         s->io_buffer[0] = 0x01; /* smart struct version */
1610
1611         for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1612             s->io_buffer[2 + 0 + (n * 12)] = smart_attributes[n][0];
1613             s->io_buffer[2 + 1 + (n * 12)] = smart_attributes[n][11];
1614         }
1615
1616         /* checksum */
1617         for (n = 0; n < 511; n++) {
1618             s->io_buffer[511] += s->io_buffer[n];
1619         }
1620         s->io_buffer[511] = 0x100 - s->io_buffer[511];
1621
1622         s->status = READY_STAT | SEEK_STAT;
1623         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1624         ide_set_irq(s->bus);
1625         return false;
1626
1627     case SMART_READ_DATA:
1628         memset(s->io_buffer, 0, 0x200);
1629         s->io_buffer[0] = 0x01; /* smart struct version */
1630
1631         for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1632             int i;
1633             for (i = 0; i < 11; i++) {
1634                 s->io_buffer[2 + i + (n * 12)] = smart_attributes[n][i];
1635             }
1636         }
1637
1638         s->io_buffer[362] = 0x02 | (s->smart_autosave ? 0x80 : 0x00);
1639         if (s->smart_selftest_count == 0) {
1640             s->io_buffer[363] = 0;
1641         } else {
1642             s->io_buffer[363] =
1643                 s->smart_selftest_data[3 +
1644                            (s->smart_selftest_count - 1) *
1645                            24];
1646         }
1647         s->io_buffer[364] = 0x20;
1648         s->io_buffer[365] = 0x01;
1649         /* offline data collection capacity: execute + self-test*/
1650         s->io_buffer[367] = (1 << 4 | 1 << 3 | 1);
1651         s->io_buffer[368] = 0x03; /* smart capability (1) */
1652         s->io_buffer[369] = 0x00; /* smart capability (2) */
1653         s->io_buffer[370] = 0x01; /* error logging supported */
1654         s->io_buffer[372] = 0x02; /* minutes for poll short test */
1655         s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1656         s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1657
1658         for (n = 0; n < 511; n++) {
1659             s->io_buffer[511] += s->io_buffer[n];
1660         }
1661         s->io_buffer[511] = 0x100 - s->io_buffer[511];
1662
1663         s->status = READY_STAT | SEEK_STAT;
1664         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1665         ide_set_irq(s->bus);
1666         return false;
1667
1668     case SMART_READ_LOG:
1669         switch (s->sector) {
1670         case 0x01: /* summary smart error log */
1671             memset(s->io_buffer, 0, 0x200);
1672             s->io_buffer[0] = 0x01;
1673             s->io_buffer[1] = 0x00; /* no error entries */
1674             s->io_buffer[452] = s->smart_errors & 0xff;
1675             s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1676
1677             for (n = 0; n < 511; n++) {
1678                 s->io_buffer[511] += s->io_buffer[n];
1679             }
1680             s->io_buffer[511] = 0x100 - s->io_buffer[511];
1681             break;
1682         case 0x06: /* smart self test log */
1683             memset(s->io_buffer, 0, 0x200);
1684             s->io_buffer[0] = 0x01;
1685             if (s->smart_selftest_count == 0) {
1686                 s->io_buffer[508] = 0;
1687             } else {
1688                 s->io_buffer[508] = s->smart_selftest_count;
1689                 for (n = 2; n < 506; n++)  {
1690                     s->io_buffer[n] = s->smart_selftest_data[n];
1691                 }
1692             }
1693
1694             for (n = 0; n < 511; n++) {
1695                 s->io_buffer[511] += s->io_buffer[n];
1696             }
1697             s->io_buffer[511] = 0x100 - s->io_buffer[511];
1698             break;
1699         default:
1700             goto abort_cmd;
1701         }
1702         s->status = READY_STAT | SEEK_STAT;
1703         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1704         ide_set_irq(s->bus);
1705         return false;
1706
1707     case SMART_EXECUTE_OFFLINE:
1708         switch (s->sector) {
1709         case 0: /* off-line routine */
1710         case 1: /* short self test */
1711         case 2: /* extended self test */
1712             s->smart_selftest_count++;
1713             if (s->smart_selftest_count > 21) {
1714                 s->smart_selftest_count = 1;
1715             }
1716             n = 2 + (s->smart_selftest_count - 1) * 24;
1717             s->smart_selftest_data[n] = s->sector;
1718             s->smart_selftest_data[n + 1] = 0x00; /* OK and finished */
1719             s->smart_selftest_data[n + 2] = 0x34; /* hour count lsb */
1720             s->smart_selftest_data[n + 3] = 0x12; /* hour count msb */
1721             break;
1722         default:
1723             goto abort_cmd;
1724         }
1725         return true;
1726     }
1727
1728 abort_cmd:
1729     ide_abort_command(s);
1730     return true;
1731 }
1732
1733 #define HD_OK (1u << IDE_HD)
1734 #define CD_OK (1u << IDE_CD)
1735 #define CFA_OK (1u << IDE_CFATA)
1736 #define HD_CFA_OK (HD_OK | CFA_OK)
1737 #define ALL_OK (HD_OK | CD_OK | CFA_OK)
1738
1739 /* Set the Disk Seek Completed status bit during completion */
1740 #define SET_DSC (1u << 8)
1741
1742 /* See ACS-2 T13/2015-D Table B.2 Command codes */
1743 static const struct {
1744     /* Returns true if the completion code should be run */
1745     bool (*handler)(IDEState *s, uint8_t cmd);
1746     int flags;
1747 } ide_cmd_table[0x100] = {
1748     /* NOP not implemented, mandatory for CD */
1749     [CFA_REQ_EXT_ERROR_CODE]      = { cmd_cfa_req_ext_error_code, CFA_OK },
1750     [WIN_DSM]                     = { cmd_data_set_management, ALL_OK },
1751     [WIN_DEVICE_RESET]            = { cmd_device_reset, CD_OK },
1752     [WIN_RECAL]                   = { cmd_nop, HD_CFA_OK | SET_DSC},
1753     [WIN_READ]                    = { cmd_read_pio, ALL_OK },
1754     [WIN_READ_ONCE]               = { cmd_read_pio, ALL_OK },
1755     [WIN_READ_EXT]                = { cmd_read_pio, HD_CFA_OK },
1756     [WIN_READDMA_EXT]             = { cmd_read_dma, HD_CFA_OK },
1757     [WIN_READ_NATIVE_MAX_EXT]     = { cmd_read_native_max, HD_CFA_OK | SET_DSC },
1758     [WIN_MULTREAD_EXT]            = { cmd_read_multiple, HD_CFA_OK },
1759     [WIN_WRITE]                   = { cmd_write_pio, HD_CFA_OK },
1760     [WIN_WRITE_ONCE]              = { cmd_write_pio, HD_CFA_OK },
1761     [WIN_WRITE_EXT]               = { cmd_write_pio, HD_CFA_OK },
1762     [WIN_WRITEDMA_EXT]            = { cmd_write_dma, HD_CFA_OK },
1763     [CFA_WRITE_SECT_WO_ERASE]     = { cmd_write_pio, CFA_OK },
1764     [WIN_MULTWRITE_EXT]           = { cmd_write_multiple, HD_CFA_OK },
1765     [WIN_WRITE_VERIFY]            = { cmd_write_pio, HD_CFA_OK },
1766     [WIN_VERIFY]                  = { cmd_verify, HD_CFA_OK | SET_DSC },
1767     [WIN_VERIFY_ONCE]             = { cmd_verify, HD_CFA_OK | SET_DSC },
1768     [WIN_VERIFY_EXT]              = { cmd_verify, HD_CFA_OK | SET_DSC },
1769     [WIN_SEEK]                    = { cmd_seek, HD_CFA_OK | SET_DSC },
1770     [CFA_TRANSLATE_SECTOR]        = { cmd_cfa_translate_sector, CFA_OK },
1771     [WIN_DIAGNOSE]                = { cmd_exec_dev_diagnostic, ALL_OK },
1772     [WIN_SPECIFY]                 = { cmd_nop, HD_CFA_OK | SET_DSC },
1773     [WIN_STANDBYNOW2]             = { cmd_nop, ALL_OK },
1774     [WIN_IDLEIMMEDIATE2]          = { cmd_nop, ALL_OK },
1775     [WIN_STANDBY2]                = { cmd_nop, ALL_OK },
1776     [WIN_SETIDLE2]                = { cmd_nop, ALL_OK },
1777     [WIN_CHECKPOWERMODE2]         = { cmd_check_power_mode, ALL_OK | SET_DSC },
1778     [WIN_SLEEPNOW2]               = { cmd_nop, ALL_OK },
1779     [WIN_PACKETCMD]               = { cmd_packet, CD_OK },
1780     [WIN_PIDENTIFY]               = { cmd_identify_packet, CD_OK },
1781     [WIN_SMART]                   = { cmd_smart, HD_CFA_OK | SET_DSC },
1782     [CFA_ACCESS_METADATA_STORAGE] = { cmd_cfa_access_metadata_storage, CFA_OK },
1783     [CFA_ERASE_SECTORS]           = { cmd_cfa_erase_sectors, CFA_OK | SET_DSC },
1784     [WIN_MULTREAD]                = { cmd_read_multiple, HD_CFA_OK },
1785     [WIN_MULTWRITE]               = { cmd_write_multiple, HD_CFA_OK },
1786     [WIN_SETMULT]                 = { cmd_set_multiple_mode, HD_CFA_OK | SET_DSC },
1787     [WIN_READDMA]                 = { cmd_read_dma, HD_CFA_OK },
1788     [WIN_READDMA_ONCE]            = { cmd_read_dma, HD_CFA_OK },
1789     [WIN_WRITEDMA]                = { cmd_write_dma, HD_CFA_OK },
1790     [WIN_WRITEDMA_ONCE]           = { cmd_write_dma, HD_CFA_OK },
1791     [CFA_WRITE_MULTI_WO_ERASE]    = { cmd_write_multiple, CFA_OK },
1792     [WIN_STANDBYNOW1]             = { cmd_nop, ALL_OK },
1793     [WIN_IDLEIMMEDIATE]           = { cmd_nop, ALL_OK },
1794     [WIN_STANDBY]                 = { cmd_nop, ALL_OK },
1795     [WIN_SETIDLE1]                = { cmd_nop, ALL_OK },
1796     [WIN_CHECKPOWERMODE1]         = { cmd_check_power_mode, ALL_OK | SET_DSC },
1797     [WIN_SLEEPNOW1]               = { cmd_nop, ALL_OK },
1798     [WIN_FLUSH_CACHE]             = { cmd_flush_cache, ALL_OK },
1799     [WIN_FLUSH_CACHE_EXT]         = { cmd_flush_cache, HD_CFA_OK },
1800     [WIN_IDENTIFY]                = { cmd_identify, ALL_OK },
1801     [WIN_SETFEATURES]             = { cmd_set_features, ALL_OK | SET_DSC },
1802     [IBM_SENSE_CONDITION]         = { cmd_ibm_sense_condition, CFA_OK | SET_DSC },
1803     [CFA_WEAR_LEVEL]              = { cmd_cfa_erase_sectors, HD_CFA_OK | SET_DSC },
1804     [WIN_READ_NATIVE_MAX]         = { cmd_read_native_max, ALL_OK | SET_DSC },
1805 };
1806
1807 static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
1808 {
1809     return cmd < ARRAY_SIZE(ide_cmd_table)
1810         && (ide_cmd_table[cmd].flags & (1u << s->drive_kind));
1811 }
1812
1813 void ide_exec_cmd(IDEBus *bus, uint32_t val)
1814 {
1815     IDEState *s;
1816     bool complete;
1817
1818 #if defined(DEBUG_IDE)
1819     printf("ide: CMD=%02x\n", val);
1820 #endif
1821     s = idebus_active_if(bus);
1822     /* ignore commands to non existent slave */
1823     if (s != bus->ifs && !s->blk) {
1824         return;
1825     }
1826
1827     /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1828     if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1829         return;
1830
1831     if (!ide_cmd_permitted(s, val)) {
1832         ide_abort_command(s);
1833         ide_set_irq(s->bus);
1834         return;
1835     }
1836
1837     s->status = READY_STAT | BUSY_STAT;
1838     s->error = 0;
1839     s->io_buffer_offset = 0;
1840
1841     complete = ide_cmd_table[val].handler(s, val);
1842     if (complete) {
1843         s->status &= ~BUSY_STAT;
1844         assert(!!s->error == !!(s->status & ERR_STAT));
1845
1846         if ((ide_cmd_table[val].flags & SET_DSC) && !s->error) {
1847             s->status |= SEEK_STAT;
1848         }
1849
1850         ide_cmd_done(s);
1851         ide_set_irq(s->bus);
1852     }
1853 }
1854
1855 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1856 {
1857     IDEBus *bus = opaque;
1858     IDEState *s = idebus_active_if(bus);
1859     uint32_t addr;
1860     int ret, hob;
1861
1862     addr = addr1 & 7;
1863     /* FIXME: HOB readback uses bit 7, but it's always set right now */
1864     //hob = s->select & (1 << 7);
1865     hob = 0;
1866     switch(addr) {
1867     case 0:
1868         ret = 0xff;
1869         break;
1870     case 1:
1871         if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
1872             (s != bus->ifs && !s->blk)) {
1873             ret = 0;
1874         } else if (!hob) {
1875             ret = s->error;
1876         } else {
1877             ret = s->hob_feature;
1878         }
1879         break;
1880     case 2:
1881         if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
1882             ret = 0;
1883         } else if (!hob) {
1884             ret = s->nsector & 0xff;
1885         } else {
1886             ret = s->hob_nsector;
1887         }
1888         break;
1889     case 3:
1890         if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
1891             ret = 0;
1892         } else if (!hob) {
1893             ret = s->sector;
1894         } else {
1895             ret = s->hob_sector;
1896         }
1897         break;
1898     case 4:
1899         if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
1900             ret = 0;
1901         } else if (!hob) {
1902             ret = s->lcyl;
1903         } else {
1904             ret = s->hob_lcyl;
1905         }
1906         break;
1907     case 5:
1908         if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
1909             ret = 0;
1910         } else if (!hob) {
1911             ret = s->hcyl;
1912         } else {
1913             ret = s->hob_hcyl;
1914         }
1915         break;
1916     case 6:
1917         if (!bus->ifs[0].blk && !bus->ifs[1].blk) {
1918             ret = 0;
1919         } else {
1920             ret = s->select;
1921         }
1922         break;
1923     default:
1924     case 7:
1925         if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
1926             (s != bus->ifs && !s->blk)) {
1927             ret = 0;
1928         } else {
1929             ret = s->status;
1930         }
1931         qemu_irq_lower(bus->irq);
1932         break;
1933     }
1934 #ifdef DEBUG_IDE
1935     printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1936 #endif
1937     return ret;
1938 }
1939
1940 uint32_t ide_status_read(void *opaque, uint32_t addr)
1941 {
1942     IDEBus *bus = opaque;
1943     IDEState *s = idebus_active_if(bus);
1944     int ret;
1945
1946     if ((!bus->ifs[0].blk && !bus->ifs[1].blk) ||
1947         (s != bus->ifs && !s->blk)) {
1948         ret = 0;
1949     } else {
1950         ret = s->status;
1951     }
1952 #ifdef DEBUG_IDE
1953     printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1954 #endif
1955     return ret;
1956 }
1957
1958 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1959 {
1960     IDEBus *bus = opaque;
1961     IDEState *s;
1962     int i;
1963
1964 #ifdef DEBUG_IDE
1965     printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1966 #endif
1967     /* common for both drives */
1968     if (!(bus->cmd & IDE_CMD_RESET) &&
1969         (val & IDE_CMD_RESET)) {
1970         /* reset low to high */
1971         for(i = 0;i < 2; i++) {
1972             s = &bus->ifs[i];
1973             s->status = BUSY_STAT | SEEK_STAT;
1974             s->error = 0x01;
1975         }
1976     } else if ((bus->cmd & IDE_CMD_RESET) &&
1977                !(val & IDE_CMD_RESET)) {
1978         /* high to low */
1979         for(i = 0;i < 2; i++) {
1980             s = &bus->ifs[i];
1981             if (s->drive_kind == IDE_CD)
1982                 s->status = 0x00; /* NOTE: READY is _not_ set */
1983             else
1984                 s->status = READY_STAT | SEEK_STAT;
1985             ide_set_signature(s);
1986         }
1987     }
1988
1989     bus->cmd = val;
1990 }
1991
1992 /*
1993  * Returns true if the running PIO transfer is a PIO out (i.e. data is
1994  * transferred from the device to the guest), false if it's a PIO in
1995  */
1996 static bool ide_is_pio_out(IDEState *s)
1997 {
1998     if (s->end_transfer_func == ide_sector_write ||
1999         s->end_transfer_func == ide_atapi_cmd) {
2000         return false;
2001     } else if (s->end_transfer_func == ide_sector_read ||
2002                s->end_transfer_func == ide_transfer_stop ||
2003                s->end_transfer_func == ide_atapi_cmd_reply_end ||
2004                s->end_transfer_func == ide_dummy_transfer_stop) {
2005         return true;
2006     }
2007
2008     abort();
2009 }
2010
2011 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
2012 {
2013     IDEBus *bus = opaque;
2014     IDEState *s = idebus_active_if(bus);
2015     uint8_t *p;
2016
2017     /* PIO data access allowed only when DRQ bit is set. The result of a write
2018      * during PIO out is indeterminate, just ignore it. */
2019     if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
2020         return;
2021     }
2022
2023     p = s->data_ptr;
2024     if (p + 2 > s->data_end) {
2025         return;
2026     }
2027
2028     *(uint16_t *)p = le16_to_cpu(val);
2029     p += 2;
2030     s->data_ptr = p;
2031     if (p >= s->data_end) {
2032         s->status &= ~DRQ_STAT;
2033         s->end_transfer_func(s);
2034     }
2035 }
2036
2037 uint32_t ide_data_readw(void *opaque, uint32_t addr)
2038 {
2039     IDEBus *bus = opaque;
2040     IDEState *s = idebus_active_if(bus);
2041     uint8_t *p;
2042     int ret;
2043
2044     /* PIO data access allowed only when DRQ bit is set. The result of a read
2045      * during PIO in is indeterminate, return 0 and don't move forward. */
2046     if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
2047         return 0;
2048     }
2049
2050     p = s->data_ptr;
2051     if (p + 2 > s->data_end) {
2052         return 0;
2053     }
2054
2055     ret = cpu_to_le16(*(uint16_t *)p);
2056     p += 2;
2057     s->data_ptr = p;
2058     if (p >= s->data_end) {
2059         s->status &= ~DRQ_STAT;
2060         s->end_transfer_func(s);
2061     }
2062     return ret;
2063 }
2064
2065 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
2066 {
2067     IDEBus *bus = opaque;
2068     IDEState *s = idebus_active_if(bus);
2069     uint8_t *p;
2070
2071     /* PIO data access allowed only when DRQ bit is set. The result of a write
2072      * during PIO out is indeterminate, just ignore it. */
2073     if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
2074         return;
2075     }
2076
2077     p = s->data_ptr;
2078     if (p + 4 > s->data_end) {
2079         return;
2080     }
2081
2082     *(uint32_t *)p = le32_to_cpu(val);
2083     p += 4;
2084     s->data_ptr = p;
2085     if (p >= s->data_end) {
2086         s->status &= ~DRQ_STAT;
2087         s->end_transfer_func(s);
2088     }
2089 }
2090
2091 uint32_t ide_data_readl(void *opaque, uint32_t addr)
2092 {
2093     IDEBus *bus = opaque;
2094     IDEState *s = idebus_active_if(bus);
2095     uint8_t *p;
2096     int ret;
2097
2098     /* PIO data access allowed only when DRQ bit is set. The result of a read
2099      * during PIO in is indeterminate, return 0 and don't move forward. */
2100     if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
2101         return 0;
2102     }
2103
2104     p = s->data_ptr;
2105     if (p + 4 > s->data_end) {
2106         return 0;
2107     }
2108
2109     ret = cpu_to_le32(*(uint32_t *)p);
2110     p += 4;
2111     s->data_ptr = p;
2112     if (p >= s->data_end) {
2113         s->status &= ~DRQ_STAT;
2114         s->end_transfer_func(s);
2115     }
2116     return ret;
2117 }
2118
2119 static void ide_dummy_transfer_stop(IDEState *s)
2120 {
2121     s->data_ptr = s->io_buffer;
2122     s->data_end = s->io_buffer;
2123     s->io_buffer[0] = 0xff;
2124     s->io_buffer[1] = 0xff;
2125     s->io_buffer[2] = 0xff;
2126     s->io_buffer[3] = 0xff;
2127 }
2128
2129 static void ide_reset(IDEState *s)
2130 {
2131 #ifdef DEBUG_IDE
2132     printf("ide: reset\n");
2133 #endif
2134
2135     if (s->pio_aiocb) {
2136         blk_aio_cancel(s->pio_aiocb);
2137         s->pio_aiocb = NULL;
2138     }
2139
2140     if (s->drive_kind == IDE_CFATA)
2141         s->mult_sectors = 0;
2142     else
2143         s->mult_sectors = MAX_MULT_SECTORS;
2144     /* ide regs */
2145     s->feature = 0;
2146     s->error = 0;
2147     s->nsector = 0;
2148     s->sector = 0;
2149     s->lcyl = 0;
2150     s->hcyl = 0;
2151
2152     /* lba48 */
2153     s->hob_feature = 0;
2154     s->hob_sector = 0;
2155     s->hob_nsector = 0;
2156     s->hob_lcyl = 0;
2157     s->hob_hcyl = 0;
2158
2159     s->select = 0xa0;
2160     s->status = READY_STAT | SEEK_STAT;
2161
2162     s->lba48 = 0;
2163
2164     /* ATAPI specific */
2165     s->sense_key = 0;
2166     s->asc = 0;
2167     s->cdrom_changed = 0;
2168     s->packet_transfer_size = 0;
2169     s->elementary_transfer_size = 0;
2170     s->io_buffer_index = 0;
2171     s->cd_sector_size = 0;
2172     s->atapi_dma = 0;
2173     s->tray_locked = 0;
2174     s->tray_open = 0;
2175     /* ATA DMA state */
2176     s->io_buffer_size = 0;
2177     s->req_nb_sectors = 0;
2178
2179     ide_set_signature(s);
2180     /* init the transfer handler so that 0xffff is returned on data
2181        accesses */
2182     s->end_transfer_func = ide_dummy_transfer_stop;
2183     ide_dummy_transfer_stop(s);
2184     s->media_changed = 0;
2185 }
2186
2187 void ide_bus_reset(IDEBus *bus)
2188 {
2189     bus->unit = 0;
2190     bus->cmd = 0;
2191     ide_reset(&bus->ifs[0]);
2192     ide_reset(&bus->ifs[1]);
2193     ide_clear_hob(bus);
2194
2195     /* pending async DMA */
2196     if (bus->dma->aiocb) {
2197 #ifdef DEBUG_AIO
2198         printf("aio_cancel\n");
2199 #endif
2200         blk_aio_cancel(bus->dma->aiocb);
2201         bus->dma->aiocb = NULL;
2202     }
2203
2204     /* reset dma provider too */
2205     if (bus->dma->ops->reset) {
2206         bus->dma->ops->reset(bus->dma);
2207     }
2208 }
2209
2210 static bool ide_cd_is_tray_open(void *opaque)
2211 {
2212     return ((IDEState *)opaque)->tray_open;
2213 }
2214
2215 static bool ide_cd_is_medium_locked(void *opaque)
2216 {
2217     return ((IDEState *)opaque)->tray_locked;
2218 }
2219
2220 static void ide_resize_cb(void *opaque)
2221 {
2222     IDEState *s = opaque;
2223     uint64_t nb_sectors;
2224
2225     if (!s->identify_set) {
2226         return;
2227     }
2228
2229     blk_get_geometry(s->blk, &nb_sectors);
2230     s->nb_sectors = nb_sectors;
2231
2232     /* Update the identify data buffer. */
2233     if (s->drive_kind == IDE_CFATA) {
2234         ide_cfata_identify_size(s);
2235     } else {
2236         /* IDE_CD uses a different set of callbacks entirely. */
2237         assert(s->drive_kind != IDE_CD);
2238         ide_identify_size(s);
2239     }
2240 }
2241
2242 static const BlockDevOps ide_cd_block_ops = {
2243     .change_media_cb = ide_cd_change_cb,
2244     .eject_request_cb = ide_cd_eject_request_cb,
2245     .is_tray_open = ide_cd_is_tray_open,
2246     .is_medium_locked = ide_cd_is_medium_locked,
2247 };
2248
2249 static const BlockDevOps ide_hd_block_ops = {
2250     .resize_cb = ide_resize_cb,
2251 };
2252
2253 int ide_init_drive(IDEState *s, BlockBackend *blk, IDEDriveKind kind,
2254                    const char *version, const char *serial, const char *model,
2255                    uint64_t wwn,
2256                    uint32_t cylinders, uint32_t heads, uint32_t secs,
2257                    int chs_trans)
2258 {
2259     uint64_t nb_sectors;
2260
2261     s->blk = blk;
2262     s->drive_kind = kind;
2263
2264     blk_get_geometry(blk, &nb_sectors);
2265     s->cylinders = cylinders;
2266     s->heads = heads;
2267     s->sectors = secs;
2268     s->chs_trans = chs_trans;
2269     s->nb_sectors = nb_sectors;
2270     s->wwn = wwn;
2271     /* The SMART values should be preserved across power cycles
2272        but they aren't.  */
2273     s->smart_enabled = 1;
2274     s->smart_autosave = 1;
2275     s->smart_errors = 0;
2276     s->smart_selftest_count = 0;
2277     if (kind == IDE_CD) {
2278         blk_set_dev_ops(blk, &ide_cd_block_ops, s);
2279         blk_set_guest_block_size(blk, 2048);
2280     } else {
2281         if (!blk_is_inserted(s->blk)) {
2282             error_report("Device needs media, but drive is empty");
2283             return -1;
2284         }
2285         if (blk_is_read_only(blk)) {
2286             error_report("Can't use a read-only drive");
2287             return -1;
2288         }
2289         blk_set_dev_ops(blk, &ide_hd_block_ops, s);
2290     }
2291     if (serial) {
2292         pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
2293     } else {
2294         snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
2295                  "QM%05d", s->drive_serial);
2296     }
2297     if (model) {
2298         pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
2299     } else {
2300         switch (kind) {
2301         case IDE_CD:
2302             strcpy(s->drive_model_str, "QEMU DVD-ROM");
2303             break;
2304         case IDE_CFATA:
2305             strcpy(s->drive_model_str, "QEMU MICRODRIVE");
2306             break;
2307         default:
2308             strcpy(s->drive_model_str, "QEMU HARDDISK");
2309             break;
2310         }
2311     }
2312
2313     if (version) {
2314         pstrcpy(s->version, sizeof(s->version), version);
2315     } else {
2316         pstrcpy(s->version, sizeof(s->version), qemu_get_version());
2317     }
2318
2319     ide_reset(s);
2320     blk_iostatus_enable(blk);
2321     return 0;
2322 }
2323
2324 static void ide_init1(IDEBus *bus, int unit)
2325 {
2326     static int drive_serial = 1;
2327     IDEState *s = &bus->ifs[unit];
2328
2329     s->bus = bus;
2330     s->unit = unit;
2331     s->drive_serial = drive_serial++;
2332     /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2333     s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2334     s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
2335     memset(s->io_buffer, 0, s->io_buffer_total_len);
2336
2337     s->smart_selftest_data = blk_blockalign(s->blk, 512);
2338     memset(s->smart_selftest_data, 0, 512);
2339
2340     s->sector_write_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
2341                                            ide_sector_write_timer_cb, s);
2342 }
2343
2344 static int ide_nop_int(IDEDMA *dma, int x)
2345 {
2346     return 0;
2347 }
2348
2349 static void ide_nop(IDEDMA *dma)
2350 {
2351 }
2352
2353 static int32_t ide_nop_int32(IDEDMA *dma, int32_t l)
2354 {
2355     return 0;
2356 }
2357
2358 static const IDEDMAOps ide_dma_nop_ops = {
2359     .prepare_buf    = ide_nop_int32,
2360     .restart_dma    = ide_nop,
2361     .rw_buf         = ide_nop_int,
2362 };
2363
2364 static void ide_restart_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
2365 {
2366     s->unit = s->bus->retry_unit;
2367     ide_set_sector(s, s->bus->retry_sector_num);
2368     s->nsector = s->bus->retry_nsector;
2369     s->bus->dma->ops->restart_dma(s->bus->dma);
2370     s->io_buffer_size = 0;
2371     s->dma_cmd = dma_cmd;
2372     ide_start_dma(s, ide_dma_cb);
2373 }
2374
2375 static void ide_restart_bh(void *opaque)
2376 {
2377     IDEBus *bus = opaque;
2378     IDEState *s;
2379     bool is_read;
2380     int error_status;
2381
2382     qemu_bh_delete(bus->bh);
2383     bus->bh = NULL;
2384
2385     error_status = bus->error_status;
2386     if (bus->error_status == 0) {
2387         return;
2388     }
2389
2390     s = idebus_active_if(bus);
2391     is_read = (bus->error_status & IDE_RETRY_READ) != 0;
2392
2393     /* The error status must be cleared before resubmitting the request: The
2394      * request may fail again, and this case can only be distinguished if the
2395      * called function can set a new error status. */
2396     bus->error_status = 0;
2397
2398     /* The HBA has generically asked to be kicked on retry */
2399     if (error_status & IDE_RETRY_HBA) {
2400         if (s->bus->dma->ops->restart) {
2401             s->bus->dma->ops->restart(s->bus->dma);
2402         }
2403     }
2404
2405     if (error_status & IDE_RETRY_DMA) {
2406         if (error_status & IDE_RETRY_TRIM) {
2407             ide_restart_dma(s, IDE_DMA_TRIM);
2408         } else {
2409             ide_restart_dma(s, is_read ? IDE_DMA_READ : IDE_DMA_WRITE);
2410         }
2411     } else if (error_status & IDE_RETRY_PIO) {
2412         if (is_read) {
2413             ide_sector_read(s);
2414         } else {
2415             ide_sector_write(s);
2416         }
2417     } else if (error_status & IDE_RETRY_FLUSH) {
2418         ide_flush_cache(s);
2419     } else {
2420         /*
2421          * We've not got any bits to tell us about ATAPI - but
2422          * we do have the end_transfer_func that tells us what
2423          * we're trying to do.
2424          */
2425         if (s->end_transfer_func == ide_atapi_cmd) {
2426             ide_atapi_dma_restart(s);
2427         }
2428     }
2429 }
2430
2431 static void ide_restart_cb(void *opaque, int running, RunState state)
2432 {
2433     IDEBus *bus = opaque;
2434
2435     if (!running)
2436         return;
2437
2438     if (!bus->bh) {
2439         bus->bh = qemu_bh_new(ide_restart_bh, bus);
2440         qemu_bh_schedule(bus->bh);
2441     }
2442 }
2443
2444 void ide_register_restart_cb(IDEBus *bus)
2445 {
2446     if (bus->dma->ops->restart_dma) {
2447         qemu_add_vm_change_state_handler(ide_restart_cb, bus);
2448     }
2449 }
2450
2451 static IDEDMA ide_dma_nop = {
2452     .ops = &ide_dma_nop_ops,
2453     .aiocb = NULL,
2454 };
2455
2456 void ide_init2(IDEBus *bus, qemu_irq irq)
2457 {
2458     int i;
2459
2460     for(i = 0; i < 2; i++) {
2461         ide_init1(bus, i);
2462         ide_reset(&bus->ifs[i]);
2463     }
2464     bus->irq = irq;
2465     bus->dma = &ide_dma_nop;
2466 }
2467
2468 static const MemoryRegionPortio ide_portio_list[] = {
2469     { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2470     { 0, 1, 2, .read = ide_data_readw, .write = ide_data_writew },
2471     { 0, 1, 4, .read = ide_data_readl, .write = ide_data_writel },
2472     PORTIO_END_OF_LIST(),
2473 };
2474
2475 static const MemoryRegionPortio ide_portio2_list[] = {
2476     { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2477     PORTIO_END_OF_LIST(),
2478 };
2479
2480 void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
2481 {
2482     /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2483        bridge has been setup properly to always register with ISA.  */
2484     isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2485
2486     if (iobase2) {
2487         isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
2488     }
2489 }
2490
2491 static bool is_identify_set(void *opaque, int version_id)
2492 {
2493     IDEState *s = opaque;
2494
2495     return s->identify_set != 0;
2496 }
2497
2498 static EndTransferFunc* transfer_end_table[] = {
2499         ide_sector_read,
2500         ide_sector_write,
2501         ide_transfer_stop,
2502         ide_atapi_cmd_reply_end,
2503         ide_atapi_cmd,
2504         ide_dummy_transfer_stop,
2505 };
2506
2507 static int transfer_end_table_idx(EndTransferFunc *fn)
2508 {
2509     int i;
2510
2511     for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2512         if (transfer_end_table[i] == fn)
2513             return i;
2514
2515     return -1;
2516 }
2517
2518 static int ide_drive_post_load(void *opaque, int version_id)
2519 {
2520     IDEState *s = opaque;
2521
2522     if (s->blk && s->identify_set) {
2523         blk_set_enable_write_cache(s->blk, !!(s->identify_data[85] & (1 << 5)));
2524     }
2525     return 0;
2526 }
2527
2528 static int ide_drive_pio_post_load(void *opaque, int version_id)
2529 {
2530     IDEState *s = opaque;
2531
2532     if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
2533         return -EINVAL;
2534     }
2535     s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2536     s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2537     s->data_end = s->data_ptr + s->cur_io_buffer_len;
2538     s->atapi_dma = s->feature & 1; /* as per cmd_packet */
2539
2540     return 0;
2541 }
2542
2543 static void ide_drive_pio_pre_save(void *opaque)
2544 {
2545     IDEState *s = opaque;
2546     int idx;
2547
2548     s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2549     s->cur_io_buffer_len = s->data_end - s->data_ptr;
2550
2551     idx = transfer_end_table_idx(s->end_transfer_func);
2552     if (idx == -1) {
2553         fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2554                         __func__);
2555         s->end_transfer_fn_idx = 2;
2556     } else {
2557         s->end_transfer_fn_idx = idx;
2558     }
2559 }
2560
2561 static bool ide_drive_pio_state_needed(void *opaque)
2562 {
2563     IDEState *s = opaque;
2564
2565     return ((s->status & DRQ_STAT) != 0)
2566         || (s->bus->error_status & IDE_RETRY_PIO);
2567 }
2568
2569 static bool ide_tray_state_needed(void *opaque)
2570 {
2571     IDEState *s = opaque;
2572
2573     return s->tray_open || s->tray_locked;
2574 }
2575
2576 static bool ide_atapi_gesn_needed(void *opaque)
2577 {
2578     IDEState *s = opaque;
2579
2580     return s->events.new_media || s->events.eject_request;
2581 }
2582
2583 static bool ide_error_needed(void *opaque)
2584 {
2585     IDEBus *bus = opaque;
2586
2587     return (bus->error_status != 0);
2588 }
2589
2590 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
2591 static const VMStateDescription vmstate_ide_atapi_gesn_state = {
2592     .name ="ide_drive/atapi/gesn_state",
2593     .version_id = 1,
2594     .minimum_version_id = 1,
2595     .needed = ide_atapi_gesn_needed,
2596     .fields = (VMStateField[]) {
2597         VMSTATE_BOOL(events.new_media, IDEState),
2598         VMSTATE_BOOL(events.eject_request, IDEState),
2599         VMSTATE_END_OF_LIST()
2600     }
2601 };
2602
2603 static const VMStateDescription vmstate_ide_tray_state = {
2604     .name = "ide_drive/tray_state",
2605     .version_id = 1,
2606     .minimum_version_id = 1,
2607     .needed = ide_tray_state_needed,
2608     .fields = (VMStateField[]) {
2609         VMSTATE_BOOL(tray_open, IDEState),
2610         VMSTATE_BOOL(tray_locked, IDEState),
2611         VMSTATE_END_OF_LIST()
2612     }
2613 };
2614
2615 static const VMStateDescription vmstate_ide_drive_pio_state = {
2616     .name = "ide_drive/pio_state",
2617     .version_id = 1,
2618     .minimum_version_id = 1,
2619     .pre_save = ide_drive_pio_pre_save,
2620     .post_load = ide_drive_pio_post_load,
2621     .needed = ide_drive_pio_state_needed,
2622     .fields = (VMStateField[]) {
2623         VMSTATE_INT32(req_nb_sectors, IDEState),
2624         VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2625                              vmstate_info_uint8, uint8_t),
2626         VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2627         VMSTATE_INT32(cur_io_buffer_len, IDEState),
2628         VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2629         VMSTATE_INT32(elementary_transfer_size, IDEState),
2630         VMSTATE_INT32(packet_transfer_size, IDEState),
2631         VMSTATE_END_OF_LIST()
2632     }
2633 };
2634
2635 const VMStateDescription vmstate_ide_drive = {
2636     .name = "ide_drive",
2637     .version_id = 3,
2638     .minimum_version_id = 0,
2639     .post_load = ide_drive_post_load,
2640     .fields = (VMStateField[]) {
2641         VMSTATE_INT32(mult_sectors, IDEState),
2642         VMSTATE_INT32(identify_set, IDEState),
2643         VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2644         VMSTATE_UINT8(feature, IDEState),
2645         VMSTATE_UINT8(error, IDEState),
2646         VMSTATE_UINT32(nsector, IDEState),
2647         VMSTATE_UINT8(sector, IDEState),
2648         VMSTATE_UINT8(lcyl, IDEState),
2649         VMSTATE_UINT8(hcyl, IDEState),
2650         VMSTATE_UINT8(hob_feature, IDEState),
2651         VMSTATE_UINT8(hob_sector, IDEState),
2652         VMSTATE_UINT8(hob_nsector, IDEState),
2653         VMSTATE_UINT8(hob_lcyl, IDEState),
2654         VMSTATE_UINT8(hob_hcyl, IDEState),
2655         VMSTATE_UINT8(select, IDEState),
2656         VMSTATE_UINT8(status, IDEState),
2657         VMSTATE_UINT8(lba48, IDEState),
2658         VMSTATE_UINT8(sense_key, IDEState),
2659         VMSTATE_UINT8(asc, IDEState),
2660         VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2661         VMSTATE_END_OF_LIST()
2662     },
2663     .subsections = (const VMStateDescription*[]) {
2664         &vmstate_ide_drive_pio_state,
2665         &vmstate_ide_tray_state,
2666         &vmstate_ide_atapi_gesn_state,
2667         NULL
2668     }
2669 };
2670
2671 static const VMStateDescription vmstate_ide_error_status = {
2672     .name ="ide_bus/error",
2673     .version_id = 2,
2674     .minimum_version_id = 1,
2675     .needed = ide_error_needed,
2676     .fields = (VMStateField[]) {
2677         VMSTATE_INT32(error_status, IDEBus),
2678         VMSTATE_INT64_V(retry_sector_num, IDEBus, 2),
2679         VMSTATE_UINT32_V(retry_nsector, IDEBus, 2),
2680         VMSTATE_UINT8_V(retry_unit, IDEBus, 2),
2681         VMSTATE_END_OF_LIST()
2682     }
2683 };
2684
2685 const VMStateDescription vmstate_ide_bus = {
2686     .name = "ide_bus",
2687     .version_id = 1,
2688     .minimum_version_id = 1,
2689     .fields = (VMStateField[]) {
2690         VMSTATE_UINT8(cmd, IDEBus),
2691         VMSTATE_UINT8(unit, IDEBus),
2692         VMSTATE_END_OF_LIST()
2693     },
2694     .subsections = (const VMStateDescription*[]) {
2695         &vmstate_ide_error_status,
2696         NULL
2697     }
2698 };
2699
2700 void ide_drive_get(DriveInfo **hd, int n)
2701 {
2702     int i;
2703     int highest_bus = drive_get_max_bus(IF_IDE) + 1;
2704     int max_devs = drive_get_max_devs(IF_IDE);
2705     int n_buses = max_devs ? (n / max_devs) : n;
2706
2707     /*
2708      * Note: The number of actual buses available is not known.
2709      * We compute this based on the size of the DriveInfo* array, n.
2710      * If it is less than max_devs * <num_real_buses>,
2711      * We will stop looking for drives prematurely instead of overfilling
2712      * the array.
2713      */
2714
2715     if (highest_bus > n_buses) {
2716         error_report("Too many IDE buses defined (%d > %d)",
2717                      highest_bus, n_buses);
2718         exit(1);
2719     }
2720
2721     for (i = 0; i < n; i++) {
2722         hd[i] = drive_get_by_index(IF_IDE, i);
2723     }
2724 }