]> Git Repo - qemu.git/blob - hw/ide/core.c
block: drive_init(): Improve CHS setting error message
[qemu.git] / 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/pc.h>
27 #include <hw/pci.h>
28 #include "qemu-error.h"
29 #include "qemu-timer.h"
30 #include "sysemu.h"
31 #include "dma.h"
32 #include "blockdev.h"
33
34 #include <hw/ide/internal.h>
35
36 /* These values were based on a Seagate ST3500418AS but have been modified
37    to make more sense in QEMU */
38 static const int smart_attributes[][12] = {
39     /* id,  flags, hflags, val, wrst, raw (6 bytes), threshold */
40     /* raw read error rate*/
41     { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
42     /* spin up */
43     { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
44     /* start stop count */
45     { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
46     /* remapped sectors */
47     { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
48     /* power on hours */
49     { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
50     /* power cycle count */
51     { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52     /* airflow-temperature-celsius */
53     { 190,  0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
54     /* end of list */
55     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
56 };
57
58 static int ide_handle_rw_error(IDEState *s, int error, int op);
59
60 static void padstr(char *str, const char *src, int len)
61 {
62     int i, v;
63     for(i = 0; i < len; i++) {
64         if (*src)
65             v = *src++;
66         else
67             v = ' ';
68         str[i^1] = v;
69     }
70 }
71
72 static void put_le16(uint16_t *p, unsigned int v)
73 {
74     *p = cpu_to_le16(v);
75 }
76
77 static void ide_identify(IDEState *s)
78 {
79     uint16_t *p;
80     unsigned int oldsize;
81     IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
82
83     if (s->identify_set) {
84         memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
85         return;
86     }
87
88     memset(s->io_buffer, 0, 512);
89     p = (uint16_t *)s->io_buffer;
90     put_le16(p + 0, 0x0040);
91     put_le16(p + 1, s->cylinders);
92     put_le16(p + 3, s->heads);
93     put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
94     put_le16(p + 5, 512); /* XXX: retired, remove ? */
95     put_le16(p + 6, s->sectors);
96     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
97     put_le16(p + 20, 3); /* XXX: retired, remove ? */
98     put_le16(p + 21, 512); /* cache size in sectors */
99     put_le16(p + 22, 4); /* ecc bytes */
100     padstr((char *)(p + 23), s->version, 8); /* firmware version */
101     padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
102 #if MAX_MULT_SECTORS > 1
103     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
104 #endif
105     put_le16(p + 48, 1); /* dword I/O */
106     put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
107     put_le16(p + 51, 0x200); /* PIO transfer cycle */
108     put_le16(p + 52, 0x200); /* DMA transfer cycle */
109     put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
110     put_le16(p + 54, s->cylinders);
111     put_le16(p + 55, s->heads);
112     put_le16(p + 56, s->sectors);
113     oldsize = s->cylinders * s->heads * s->sectors;
114     put_le16(p + 57, oldsize);
115     put_le16(p + 58, oldsize >> 16);
116     if (s->mult_sectors)
117         put_le16(p + 59, 0x100 | s->mult_sectors);
118     put_le16(p + 60, s->nb_sectors);
119     put_le16(p + 61, s->nb_sectors >> 16);
120     put_le16(p + 62, 0x07); /* single word dma0-2 supported */
121     put_le16(p + 63, 0x07); /* mdma0-2 supported */
122     put_le16(p + 64, 0x03); /* pio3-4 supported */
123     put_le16(p + 65, 120);
124     put_le16(p + 66, 120);
125     put_le16(p + 67, 120);
126     put_le16(p + 68, 120);
127     if (dev && dev->conf.discard_granularity) {
128         put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
129     }
130
131     if (s->ncq_queues) {
132         put_le16(p + 75, s->ncq_queues - 1);
133         /* NCQ supported */
134         put_le16(p + 76, (1 << 8));
135     }
136
137     put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
138     put_le16(p + 81, 0x16); /* conforms to ata5 */
139     /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
140     put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
141     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
142     put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
143     /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
144     put_le16(p + 84, (1 << 14) | 0);
145     /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
146     if (bdrv_enable_write_cache(s->bs))
147          put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
148     else
149          put_le16(p + 85, (1 << 14) | 1);
150     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
151     put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
152     /* 14=set to 1, 1=smart self test, 0=smart error logging */
153     put_le16(p + 87, (1 << 14) | 0);
154     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
155     put_le16(p + 93, 1 | (1 << 14) | 0x2000);
156     put_le16(p + 100, s->nb_sectors);
157     put_le16(p + 101, s->nb_sectors >> 16);
158     put_le16(p + 102, s->nb_sectors >> 32);
159     put_le16(p + 103, s->nb_sectors >> 48);
160
161     if (dev && dev->conf.physical_block_size)
162         put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
163     if (dev && dev->conf.discard_granularity) {
164         put_le16(p + 169, 1); /* TRIM support */
165     }
166
167     memcpy(s->identify_data, p, sizeof(s->identify_data));
168     s->identify_set = 1;
169 }
170
171 static void ide_atapi_identify(IDEState *s)
172 {
173     uint16_t *p;
174
175     if (s->identify_set) {
176         memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
177         return;
178     }
179
180     memset(s->io_buffer, 0, 512);
181     p = (uint16_t *)s->io_buffer;
182     /* Removable CDROM, 50us response, 12 byte packets */
183     put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
184     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
185     put_le16(p + 20, 3); /* buffer type */
186     put_le16(p + 21, 512); /* cache size in sectors */
187     put_le16(p + 22, 4); /* ecc bytes */
188     padstr((char *)(p + 23), s->version, 8); /* firmware version */
189     padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
190     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
191 #ifdef USE_DMA_CDROM
192     put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
193     put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
194     put_le16(p + 62, 7);  /* single word dma0-2 supported */
195     put_le16(p + 63, 7);  /* mdma0-2 supported */
196 #else
197     put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
198     put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
199     put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
200 #endif
201     put_le16(p + 64, 3); /* pio3-4 supported */
202     put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
203     put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
204     put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
205     put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
206
207     put_le16(p + 71, 30); /* in ns */
208     put_le16(p + 72, 30); /* in ns */
209
210     if (s->ncq_queues) {
211         put_le16(p + 75, s->ncq_queues - 1);
212         /* NCQ supported */
213         put_le16(p + 76, (1 << 8));
214     }
215
216     put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
217 #ifdef USE_DMA_CDROM
218     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
219 #endif
220     memcpy(s->identify_data, p, sizeof(s->identify_data));
221     s->identify_set = 1;
222 }
223
224 static void ide_cfata_identify(IDEState *s)
225 {
226     uint16_t *p;
227     uint32_t cur_sec;
228
229     p = (uint16_t *) s->identify_data;
230     if (s->identify_set)
231         goto fill_buffer;
232
233     memset(p, 0, sizeof(s->identify_data));
234
235     cur_sec = s->cylinders * s->heads * s->sectors;
236
237     put_le16(p + 0, 0x848a);                    /* CF Storage Card signature */
238     put_le16(p + 1, s->cylinders);              /* Default cylinders */
239     put_le16(p + 3, s->heads);                  /* Default heads */
240     put_le16(p + 6, s->sectors);                /* Default sectors per track */
241     put_le16(p + 7, s->nb_sectors >> 16);       /* Sectors per card */
242     put_le16(p + 8, s->nb_sectors);             /* Sectors per card */
243     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
244     put_le16(p + 22, 0x0004);                   /* ECC bytes */
245     padstr((char *) (p + 23), s->version, 8);   /* Firmware Revision */
246     padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
247 #if MAX_MULT_SECTORS > 1
248     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
249 #else
250     put_le16(p + 47, 0x0000);
251 #endif
252     put_le16(p + 49, 0x0f00);                   /* Capabilities */
253     put_le16(p + 51, 0x0002);                   /* PIO cycle timing mode */
254     put_le16(p + 52, 0x0001);                   /* DMA cycle timing mode */
255     put_le16(p + 53, 0x0003);                   /* Translation params valid */
256     put_le16(p + 54, s->cylinders);             /* Current cylinders */
257     put_le16(p + 55, s->heads);                 /* Current heads */
258     put_le16(p + 56, s->sectors);               /* Current sectors */
259     put_le16(p + 57, cur_sec);                  /* Current capacity */
260     put_le16(p + 58, cur_sec >> 16);            /* Current capacity */
261     if (s->mult_sectors)                        /* Multiple sector setting */
262         put_le16(p + 59, 0x100 | s->mult_sectors);
263     put_le16(p + 60, s->nb_sectors);            /* Total LBA sectors */
264     put_le16(p + 61, s->nb_sectors >> 16);      /* Total LBA sectors */
265     put_le16(p + 63, 0x0203);                   /* Multiword DMA capability */
266     put_le16(p + 64, 0x0001);                   /* Flow Control PIO support */
267     put_le16(p + 65, 0x0096);                   /* Min. Multiword DMA cycle */
268     put_le16(p + 66, 0x0096);                   /* Rec. Multiword DMA cycle */
269     put_le16(p + 68, 0x00b4);                   /* Min. PIO cycle time */
270     put_le16(p + 82, 0x400c);                   /* Command Set supported */
271     put_le16(p + 83, 0x7068);                   /* Command Set supported */
272     put_le16(p + 84, 0x4000);                   /* Features supported */
273     put_le16(p + 85, 0x000c);                   /* Command Set enabled */
274     put_le16(p + 86, 0x7044);                   /* Command Set enabled */
275     put_le16(p + 87, 0x4000);                   /* Features enabled */
276     put_le16(p + 91, 0x4060);                   /* Current APM level */
277     put_le16(p + 129, 0x0002);                  /* Current features option */
278     put_le16(p + 130, 0x0005);                  /* Reassigned sectors */
279     put_le16(p + 131, 0x0001);                  /* Initial power mode */
280     put_le16(p + 132, 0x0000);                  /* User signature */
281     put_le16(p + 160, 0x8100);                  /* Power requirement */
282     put_le16(p + 161, 0x8001);                  /* CF command set */
283
284     s->identify_set = 1;
285
286 fill_buffer:
287     memcpy(s->io_buffer, p, sizeof(s->identify_data));
288 }
289
290 static void ide_set_signature(IDEState *s)
291 {
292     s->select &= 0xf0; /* clear head */
293     /* put signature */
294     s->nsector = 1;
295     s->sector = 1;
296     if (s->drive_kind == IDE_CD) {
297         s->lcyl = 0x14;
298         s->hcyl = 0xeb;
299     } else if (s->bs) {
300         s->lcyl = 0;
301         s->hcyl = 0;
302     } else {
303         s->lcyl = 0xff;
304         s->hcyl = 0xff;
305     }
306 }
307
308 typedef struct TrimAIOCB {
309     BlockDriverAIOCB common;
310     QEMUBH *bh;
311     int ret;
312 } TrimAIOCB;
313
314 static void trim_aio_cancel(BlockDriverAIOCB *acb)
315 {
316     TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
317
318     qemu_bh_delete(iocb->bh);
319     iocb->bh = NULL;
320     qemu_aio_release(iocb);
321 }
322
323 static AIOPool trim_aio_pool = {
324     .aiocb_size         = sizeof(TrimAIOCB),
325     .cancel             = trim_aio_cancel,
326 };
327
328 static void ide_trim_bh_cb(void *opaque)
329 {
330     TrimAIOCB *iocb = opaque;
331
332     iocb->common.cb(iocb->common.opaque, iocb->ret);
333
334     qemu_bh_delete(iocb->bh);
335     iocb->bh = NULL;
336
337     qemu_aio_release(iocb);
338 }
339
340 BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
341         int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
342         BlockDriverCompletionFunc *cb, void *opaque)
343 {
344     TrimAIOCB *iocb;
345     int i, j, ret;
346
347     iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
348     iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
349     iocb->ret = 0;
350
351     for (j = 0; j < qiov->niov; j++) {
352         uint64_t *buffer = qiov->iov[j].iov_base;
353
354         for (i = 0; i < qiov->iov[j].iov_len / 8; i++) {
355             /* 6-byte LBA + 2-byte range per entry */
356             uint64_t entry = le64_to_cpu(buffer[i]);
357             uint64_t sector = entry & 0x0000ffffffffffffULL;
358             uint16_t count = entry >> 48;
359
360             if (count == 0) {
361                 break;
362             }
363
364             ret = bdrv_discard(bs, sector, count);
365             if (!iocb->ret) {
366                 iocb->ret = ret;
367             }
368         }
369     }
370
371     qemu_bh_schedule(iocb->bh);
372
373     return &iocb->common;
374 }
375
376 static inline void ide_abort_command(IDEState *s)
377 {
378     s->status = READY_STAT | ERR_STAT;
379     s->error = ABRT_ERR;
380 }
381
382 /* prepare data transfer and tell what to do after */
383 void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
384                         EndTransferFunc *end_transfer_func)
385 {
386     s->end_transfer_func = end_transfer_func;
387     s->data_ptr = buf;
388     s->data_end = buf + size;
389     if (!(s->status & ERR_STAT)) {
390         s->status |= DRQ_STAT;
391     }
392     s->bus->dma->ops->start_transfer(s->bus->dma);
393 }
394
395 void ide_transfer_stop(IDEState *s)
396 {
397     s->end_transfer_func = ide_transfer_stop;
398     s->data_ptr = s->io_buffer;
399     s->data_end = s->io_buffer;
400     s->status &= ~DRQ_STAT;
401 }
402
403 int64_t ide_get_sector(IDEState *s)
404 {
405     int64_t sector_num;
406     if (s->select & 0x40) {
407         /* lba */
408         if (!s->lba48) {
409             sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
410                 (s->lcyl << 8) | s->sector;
411         } else {
412             sector_num = ((int64_t)s->hob_hcyl << 40) |
413                 ((int64_t) s->hob_lcyl << 32) |
414                 ((int64_t) s->hob_sector << 24) |
415                 ((int64_t) s->hcyl << 16) |
416                 ((int64_t) s->lcyl << 8) | s->sector;
417         }
418     } else {
419         sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
420             (s->select & 0x0f) * s->sectors + (s->sector - 1);
421     }
422     return sector_num;
423 }
424
425 void ide_set_sector(IDEState *s, int64_t sector_num)
426 {
427     unsigned int cyl, r;
428     if (s->select & 0x40) {
429         if (!s->lba48) {
430             s->select = (s->select & 0xf0) | (sector_num >> 24);
431             s->hcyl = (sector_num >> 16);
432             s->lcyl = (sector_num >> 8);
433             s->sector = (sector_num);
434         } else {
435             s->sector = sector_num;
436             s->lcyl = sector_num >> 8;
437             s->hcyl = sector_num >> 16;
438             s->hob_sector = sector_num >> 24;
439             s->hob_lcyl = sector_num >> 32;
440             s->hob_hcyl = sector_num >> 40;
441         }
442     } else {
443         cyl = sector_num / (s->heads * s->sectors);
444         r = sector_num % (s->heads * s->sectors);
445         s->hcyl = cyl >> 8;
446         s->lcyl = cyl;
447         s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
448         s->sector = (r % s->sectors) + 1;
449     }
450 }
451
452 static void ide_rw_error(IDEState *s) {
453     ide_abort_command(s);
454     ide_set_irq(s->bus);
455 }
456
457 void ide_sector_read(IDEState *s)
458 {
459     int64_t sector_num;
460     int ret, n;
461
462     s->status = READY_STAT | SEEK_STAT;
463     s->error = 0; /* not needed by IDE spec, but needed by Windows */
464     sector_num = ide_get_sector(s);
465     n = s->nsector;
466     if (n == 0) {
467         /* no more sector to read from disk */
468         ide_transfer_stop(s);
469     } else {
470 #if defined(DEBUG_IDE)
471         printf("read sector=%" PRId64 "\n", sector_num);
472 #endif
473         if (n > s->req_nb_sectors)
474             n = s->req_nb_sectors;
475         ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
476         if (ret != 0) {
477             if (ide_handle_rw_error(s, -ret,
478                 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
479             {
480                 return;
481             }
482         }
483         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
484         ide_set_irq(s->bus);
485         ide_set_sector(s, sector_num + n);
486         s->nsector -= n;
487     }
488 }
489
490 static void dma_buf_commit(IDEState *s, int is_write)
491 {
492     qemu_sglist_destroy(&s->sg);
493 }
494
495 void ide_set_inactive(IDEState *s)
496 {
497     s->bus->dma->aiocb = NULL;
498     s->bus->dma->ops->set_inactive(s->bus->dma);
499 }
500
501 void ide_dma_error(IDEState *s)
502 {
503     ide_transfer_stop(s);
504     s->error = ABRT_ERR;
505     s->status = READY_STAT | ERR_STAT;
506     ide_set_inactive(s);
507     ide_set_irq(s->bus);
508 }
509
510 static int ide_handle_rw_error(IDEState *s, int error, int op)
511 {
512     int is_read = (op & BM_STATUS_RETRY_READ);
513     BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
514
515     if (action == BLOCK_ERR_IGNORE) {
516         bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
517         return 0;
518     }
519
520     if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
521             || action == BLOCK_ERR_STOP_ANY) {
522         s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
523         s->bus->error_status = op;
524         bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
525         vm_stop(VMSTOP_DISKFULL);
526     } else {
527         if (op & BM_STATUS_DMA_RETRY) {
528             dma_buf_commit(s, 0);
529             ide_dma_error(s);
530         } else {
531             ide_rw_error(s);
532         }
533         bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
534     }
535
536     return 1;
537 }
538
539 void ide_dma_cb(void *opaque, int ret)
540 {
541     IDEState *s = opaque;
542     int n;
543     int64_t sector_num;
544
545 handle_rw_error:
546     if (ret < 0) {
547         int op = BM_STATUS_DMA_RETRY;
548
549         if (s->dma_cmd == IDE_DMA_READ)
550             op |= BM_STATUS_RETRY_READ;
551         else if (s->dma_cmd == IDE_DMA_TRIM)
552             op |= BM_STATUS_RETRY_TRIM;
553
554         if (ide_handle_rw_error(s, -ret, op)) {
555             return;
556         }
557     }
558
559     n = s->io_buffer_size >> 9;
560     sector_num = ide_get_sector(s);
561     if (n > 0) {
562         dma_buf_commit(s, ide_cmd_is_read(s));
563         sector_num += n;
564         ide_set_sector(s, sector_num);
565         s->nsector -= n;
566     }
567
568     /* end of transfer ? */
569     if (s->nsector == 0) {
570         s->status = READY_STAT | SEEK_STAT;
571         ide_set_irq(s->bus);
572         goto eot;
573     }
574
575     /* launch next transfer */
576     n = s->nsector;
577     s->io_buffer_index = 0;
578     s->io_buffer_size = n * 512;
579     if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
580         /* The PRDs were too short. Reset the Active bit, but don't raise an
581          * interrupt. */
582         goto eot;
583     }
584
585 #ifdef DEBUG_AIO
586     printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
587            sector_num, n, s->dma_cmd);
588 #endif
589
590     switch (s->dma_cmd) {
591     case IDE_DMA_READ:
592         s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
593                                            ide_dma_cb, s);
594         break;
595     case IDE_DMA_WRITE:
596         s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
597                                             ide_dma_cb, s);
598         break;
599     case IDE_DMA_TRIM:
600         s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
601                                          ide_issue_trim, ide_dma_cb, s, 1);
602         break;
603     }
604
605     if (!s->bus->dma->aiocb) {
606         ret = -1;
607         goto handle_rw_error;
608     }
609     return;
610
611 eot:
612    ide_set_inactive(s);
613 }
614
615 static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
616 {
617     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
618     s->io_buffer_index = 0;
619     s->io_buffer_size = 0;
620     s->dma_cmd = dma_cmd;
621     s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
622 }
623
624 static void ide_sector_write_timer_cb(void *opaque)
625 {
626     IDEState *s = opaque;
627     ide_set_irq(s->bus);
628 }
629
630 void ide_sector_write(IDEState *s)
631 {
632     int64_t sector_num;
633     int ret, n, n1;
634
635     s->status = READY_STAT | SEEK_STAT;
636     sector_num = ide_get_sector(s);
637 #if defined(DEBUG_IDE)
638     printf("write sector=%" PRId64 "\n", sector_num);
639 #endif
640     n = s->nsector;
641     if (n > s->req_nb_sectors)
642         n = s->req_nb_sectors;
643     ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
644
645     if (ret != 0) {
646         if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
647             return;
648     }
649
650     s->nsector -= n;
651     if (s->nsector == 0) {
652         /* no more sectors to write */
653         ide_transfer_stop(s);
654     } else {
655         n1 = s->nsector;
656         if (n1 > s->req_nb_sectors)
657             n1 = s->req_nb_sectors;
658         ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
659     }
660     ide_set_sector(s, sector_num + n);
661
662     if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
663         /* It seems there is a bug in the Windows 2000 installer HDD
664            IDE driver which fills the disk with empty logs when the
665            IDE write IRQ comes too early. This hack tries to correct
666            that at the expense of slower write performances. Use this
667            option _only_ to install Windows 2000. You must disable it
668            for normal use. */
669         qemu_mod_timer(s->sector_write_timer,
670                        qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
671     } else {
672         ide_set_irq(s->bus);
673     }
674 }
675
676 static void ide_flush_cb(void *opaque, int ret)
677 {
678     IDEState *s = opaque;
679
680     if (ret < 0) {
681         /* XXX: What sector number to set here? */
682         if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
683             return;
684         }
685     }
686
687     s->status = READY_STAT | SEEK_STAT;
688     ide_set_irq(s->bus);
689 }
690
691 void ide_flush_cache(IDEState *s)
692 {
693     BlockDriverAIOCB *acb;
694
695     if (s->bs == NULL) {
696         ide_flush_cb(s, 0);
697         return;
698     }
699
700     acb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
701     if (acb == NULL) {
702         ide_flush_cb(s, -EIO);
703     }
704 }
705
706 static void ide_cfata_metadata_inquiry(IDEState *s)
707 {
708     uint16_t *p;
709     uint32_t spd;
710
711     p = (uint16_t *) s->io_buffer;
712     memset(p, 0, 0x200);
713     spd = ((s->mdata_size - 1) >> 9) + 1;
714
715     put_le16(p + 0, 0x0001);                    /* Data format revision */
716     put_le16(p + 1, 0x0000);                    /* Media property: silicon */
717     put_le16(p + 2, s->media_changed);          /* Media status */
718     put_le16(p + 3, s->mdata_size & 0xffff);    /* Capacity in bytes (low) */
719     put_le16(p + 4, s->mdata_size >> 16);       /* Capacity in bytes (high) */
720     put_le16(p + 5, spd & 0xffff);              /* Sectors per device (low) */
721     put_le16(p + 6, spd >> 16);                 /* Sectors per device (high) */
722 }
723
724 static void ide_cfata_metadata_read(IDEState *s)
725 {
726     uint16_t *p;
727
728     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
729         s->status = ERR_STAT;
730         s->error = ABRT_ERR;
731         return;
732     }
733
734     p = (uint16_t *) s->io_buffer;
735     memset(p, 0, 0x200);
736
737     put_le16(p + 0, s->media_changed);          /* Media status */
738     memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
739                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
740                                     s->nsector << 9), 0x200 - 2));
741 }
742
743 static void ide_cfata_metadata_write(IDEState *s)
744 {
745     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
746         s->status = ERR_STAT;
747         s->error = ABRT_ERR;
748         return;
749     }
750
751     s->media_changed = 0;
752
753     memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
754                     s->io_buffer + 2,
755                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
756                                     s->nsector << 9), 0x200 - 2));
757 }
758
759 /* called when the inserted state of the media has changed */
760 static void cdrom_change_cb(void *opaque, int reason)
761 {
762     IDEState *s = opaque;
763     uint64_t nb_sectors;
764
765     if (!(reason & CHANGE_MEDIA)) {
766         return;
767     }
768
769     bdrv_get_geometry(s->bs, &nb_sectors);
770     s->nb_sectors = nb_sectors;
771
772     /*
773      * First indicate to the guest that a CD has been removed.  That's
774      * done on the next command the guest sends us.
775      *
776      * Then we set SENSE_UNIT_ATTENTION, by which the guest will
777      * detect a new CD in the drive.  See ide_atapi_cmd() for details.
778      */
779     s->cdrom_changed = 1;
780     s->events.new_media = true;
781     ide_set_irq(s->bus);
782 }
783
784 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
785 {
786     s->lba48 = lba48;
787
788     /* handle the 'magic' 0 nsector count conversion here. to avoid
789      * fiddling with the rest of the read logic, we just store the
790      * full sector count in ->nsector and ignore ->hob_nsector from now
791      */
792     if (!s->lba48) {
793         if (!s->nsector)
794             s->nsector = 256;
795     } else {
796         if (!s->nsector && !s->hob_nsector)
797             s->nsector = 65536;
798         else {
799             int lo = s->nsector;
800             int hi = s->hob_nsector;
801
802             s->nsector = (hi << 8) | lo;
803         }
804     }
805 }
806
807 static void ide_clear_hob(IDEBus *bus)
808 {
809     /* any write clears HOB high bit of device control register */
810     bus->ifs[0].select &= ~(1 << 7);
811     bus->ifs[1].select &= ~(1 << 7);
812 }
813
814 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
815 {
816     IDEBus *bus = opaque;
817
818 #ifdef DEBUG_IDE
819     printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
820 #endif
821
822     addr &= 7;
823
824     /* ignore writes to command block while busy with previous command */
825     if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
826         return;
827
828     switch(addr) {
829     case 0:
830         break;
831     case 1:
832         ide_clear_hob(bus);
833         /* NOTE: data is written to the two drives */
834         bus->ifs[0].hob_feature = bus->ifs[0].feature;
835         bus->ifs[1].hob_feature = bus->ifs[1].feature;
836         bus->ifs[0].feature = val;
837         bus->ifs[1].feature = val;
838         break;
839     case 2:
840         ide_clear_hob(bus);
841         bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
842         bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
843         bus->ifs[0].nsector = val;
844         bus->ifs[1].nsector = val;
845         break;
846     case 3:
847         ide_clear_hob(bus);
848         bus->ifs[0].hob_sector = bus->ifs[0].sector;
849         bus->ifs[1].hob_sector = bus->ifs[1].sector;
850         bus->ifs[0].sector = val;
851         bus->ifs[1].sector = val;
852         break;
853     case 4:
854         ide_clear_hob(bus);
855         bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
856         bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
857         bus->ifs[0].lcyl = val;
858         bus->ifs[1].lcyl = val;
859         break;
860     case 5:
861         ide_clear_hob(bus);
862         bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
863         bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
864         bus->ifs[0].hcyl = val;
865         bus->ifs[1].hcyl = val;
866         break;
867     case 6:
868         /* FIXME: HOB readback uses bit 7 */
869         bus->ifs[0].select = (val & ~0x10) | 0xa0;
870         bus->ifs[1].select = (val | 0x10) | 0xa0;
871         /* select drive */
872         bus->unit = (val >> 4) & 1;
873         break;
874     default:
875     case 7:
876         /* command */
877         ide_exec_cmd(bus, val);
878         break;
879     }
880 }
881
882
883 void ide_exec_cmd(IDEBus *bus, uint32_t val)
884 {
885     IDEState *s;
886     int n;
887     int lba48 = 0;
888
889 #if defined(DEBUG_IDE)
890     printf("ide: CMD=%02x\n", val);
891 #endif
892     s = idebus_active_if(bus);
893     /* ignore commands to non existant slave */
894     if (s != bus->ifs && !s->bs)
895         return;
896
897     /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
898     if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
899         return;
900
901     switch(val) {
902     case WIN_DSM:
903         switch (s->feature) {
904         case DSM_TRIM:
905             if (!s->bs) {
906                 goto abort_cmd;
907             }
908             ide_sector_start_dma(s, IDE_DMA_TRIM);
909             break;
910         default:
911             goto abort_cmd;
912         }
913         break;
914     case WIN_IDENTIFY:
915         if (s->bs && s->drive_kind != IDE_CD) {
916             if (s->drive_kind != IDE_CFATA)
917                 ide_identify(s);
918             else
919                 ide_cfata_identify(s);
920             s->status = READY_STAT | SEEK_STAT;
921             ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
922         } else {
923             if (s->drive_kind == IDE_CD) {
924                 ide_set_signature(s);
925             }
926             ide_abort_command(s);
927         }
928         ide_set_irq(s->bus);
929         break;
930     case WIN_SPECIFY:
931     case WIN_RECAL:
932         s->error = 0;
933         s->status = READY_STAT | SEEK_STAT;
934         ide_set_irq(s->bus);
935         break;
936     case WIN_SETMULT:
937         if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
938             /* Disable Read and Write Multiple */
939             s->mult_sectors = 0;
940             s->status = READY_STAT | SEEK_STAT;
941         } else if ((s->nsector & 0xff) != 0 &&
942             ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
943              (s->nsector & (s->nsector - 1)) != 0)) {
944             ide_abort_command(s);
945         } else {
946             s->mult_sectors = s->nsector & 0xff;
947             s->status = READY_STAT | SEEK_STAT;
948         }
949         ide_set_irq(s->bus);
950         break;
951     case WIN_VERIFY_EXT:
952         lba48 = 1;
953     case WIN_VERIFY:
954     case WIN_VERIFY_ONCE:
955         /* do sector number check ? */
956         ide_cmd_lba48_transform(s, lba48);
957         s->status = READY_STAT | SEEK_STAT;
958         ide_set_irq(s->bus);
959         break;
960         case WIN_READ_EXT:
961         lba48 = 1;
962     case WIN_READ:
963     case WIN_READ_ONCE:
964         if (!s->bs)
965             goto abort_cmd;
966         ide_cmd_lba48_transform(s, lba48);
967         s->req_nb_sectors = 1;
968         ide_sector_read(s);
969         break;
970         case WIN_WRITE_EXT:
971         lba48 = 1;
972     case WIN_WRITE:
973     case WIN_WRITE_ONCE:
974     case CFA_WRITE_SECT_WO_ERASE:
975     case WIN_WRITE_VERIFY:
976         ide_cmd_lba48_transform(s, lba48);
977         s->error = 0;
978         s->status = SEEK_STAT | READY_STAT;
979         s->req_nb_sectors = 1;
980         ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
981         s->media_changed = 1;
982         break;
983         case WIN_MULTREAD_EXT:
984         lba48 = 1;
985     case WIN_MULTREAD:
986         if (!s->mult_sectors)
987             goto abort_cmd;
988         ide_cmd_lba48_transform(s, lba48);
989         s->req_nb_sectors = s->mult_sectors;
990         ide_sector_read(s);
991         break;
992     case WIN_MULTWRITE_EXT:
993         lba48 = 1;
994     case WIN_MULTWRITE:
995     case CFA_WRITE_MULTI_WO_ERASE:
996         if (!s->mult_sectors)
997             goto abort_cmd;
998         ide_cmd_lba48_transform(s, lba48);
999         s->error = 0;
1000         s->status = SEEK_STAT | READY_STAT;
1001         s->req_nb_sectors = s->mult_sectors;
1002         n = s->nsector;
1003         if (n > s->req_nb_sectors)
1004             n = s->req_nb_sectors;
1005         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1006         s->media_changed = 1;
1007         break;
1008         case WIN_READDMA_EXT:
1009         lba48 = 1;
1010     case WIN_READDMA:
1011     case WIN_READDMA_ONCE:
1012         if (!s->bs)
1013             goto abort_cmd;
1014         ide_cmd_lba48_transform(s, lba48);
1015         ide_sector_start_dma(s, IDE_DMA_READ);
1016         break;
1017         case WIN_WRITEDMA_EXT:
1018         lba48 = 1;
1019     case WIN_WRITEDMA:
1020     case WIN_WRITEDMA_ONCE:
1021         if (!s->bs)
1022             goto abort_cmd;
1023         ide_cmd_lba48_transform(s, lba48);
1024         ide_sector_start_dma(s, IDE_DMA_WRITE);
1025         s->media_changed = 1;
1026         break;
1027     case WIN_READ_NATIVE_MAX_EXT:
1028         lba48 = 1;
1029     case WIN_READ_NATIVE_MAX:
1030         ide_cmd_lba48_transform(s, lba48);
1031         ide_set_sector(s, s->nb_sectors - 1);
1032         s->status = READY_STAT | SEEK_STAT;
1033         ide_set_irq(s->bus);
1034         break;
1035     case WIN_CHECKPOWERMODE1:
1036     case WIN_CHECKPOWERMODE2:
1037         s->error = 0;
1038         s->nsector = 0xff; /* device active or idle */
1039         s->status = READY_STAT | SEEK_STAT;
1040         ide_set_irq(s->bus);
1041         break;
1042     case WIN_SETFEATURES:
1043         if (!s->bs)
1044             goto abort_cmd;
1045         /* XXX: valid for CDROM ? */
1046         switch(s->feature) {
1047         case 0xcc: /* reverting to power-on defaults enable */
1048         case 0x66: /* reverting to power-on defaults disable */
1049         case 0x02: /* write cache enable */
1050         case 0x82: /* write cache disable */
1051         case 0xaa: /* read look-ahead enable */
1052         case 0x55: /* read look-ahead disable */
1053         case 0x05: /* set advanced power management mode */
1054         case 0x85: /* disable advanced power management mode */
1055         case 0x69: /* NOP */
1056         case 0x67: /* NOP */
1057         case 0x96: /* NOP */
1058         case 0x9a: /* NOP */
1059         case 0x42: /* enable Automatic Acoustic Mode */
1060         case 0xc2: /* disable Automatic Acoustic Mode */
1061             s->status = READY_STAT | SEEK_STAT;
1062             ide_set_irq(s->bus);
1063             break;
1064         case 0x03: { /* set transfer mode */
1065                 uint8_t val = s->nsector & 0x07;
1066             uint16_t *identify_data = (uint16_t *)s->identify_data;
1067
1068                 switch (s->nsector >> 3) {
1069                 case 0x00: /* pio default */
1070                 case 0x01: /* pio mode */
1071                         put_le16(identify_data + 62,0x07);
1072                         put_le16(identify_data + 63,0x07);
1073                         put_le16(identify_data + 88,0x3f);
1074                         break;
1075                 case 0x02: /* sigle word dma mode*/
1076                         put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1077                         put_le16(identify_data + 63,0x07);
1078                         put_le16(identify_data + 88,0x3f);
1079                         break;
1080                 case 0x04: /* mdma mode */
1081                         put_le16(identify_data + 62,0x07);
1082                         put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1083                         put_le16(identify_data + 88,0x3f);
1084                         break;
1085                 case 0x08: /* udma mode */
1086                         put_le16(identify_data + 62,0x07);
1087                         put_le16(identify_data + 63,0x07);
1088                         put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1089                         break;
1090                 default:
1091                         goto abort_cmd;
1092                 }
1093             s->status = READY_STAT | SEEK_STAT;
1094             ide_set_irq(s->bus);
1095             break;
1096         }
1097         default:
1098             goto abort_cmd;
1099         }
1100         break;
1101     case WIN_FLUSH_CACHE:
1102     case WIN_FLUSH_CACHE_EXT:
1103         ide_flush_cache(s);
1104         break;
1105     case WIN_STANDBY:
1106     case WIN_STANDBY2:
1107     case WIN_STANDBYNOW1:
1108     case WIN_STANDBYNOW2:
1109     case WIN_IDLEIMMEDIATE:
1110     case CFA_IDLEIMMEDIATE:
1111     case WIN_SETIDLE1:
1112     case WIN_SETIDLE2:
1113     case WIN_SLEEPNOW1:
1114     case WIN_SLEEPNOW2:
1115         s->status = READY_STAT;
1116         ide_set_irq(s->bus);
1117         break;
1118     case WIN_SEEK:
1119         if(s->drive_kind == IDE_CD)
1120             goto abort_cmd;
1121         /* XXX: Check that seek is within bounds */
1122         s->status = READY_STAT | SEEK_STAT;
1123         ide_set_irq(s->bus);
1124         break;
1125         /* ATAPI commands */
1126     case WIN_PIDENTIFY:
1127         if (s->drive_kind == IDE_CD) {
1128             ide_atapi_identify(s);
1129             s->status = READY_STAT | SEEK_STAT;
1130             ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1131         } else {
1132             ide_abort_command(s);
1133         }
1134         ide_set_irq(s->bus);
1135         break;
1136     case WIN_DIAGNOSE:
1137         ide_set_signature(s);
1138         if (s->drive_kind == IDE_CD)
1139             s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1140                             * devices to return a clear status register
1141                             * with READY_STAT *not* set. */
1142         else
1143             s->status = READY_STAT | SEEK_STAT;
1144         s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1145                           * present.
1146                           */
1147         ide_set_irq(s->bus);
1148         break;
1149     case WIN_SRST:
1150         if (s->drive_kind != IDE_CD)
1151             goto abort_cmd;
1152         ide_set_signature(s);
1153         s->status = 0x00; /* NOTE: READY is _not_ set */
1154         s->error = 0x01;
1155         break;
1156     case WIN_PACKETCMD:
1157         if (s->drive_kind != IDE_CD)
1158             goto abort_cmd;
1159         /* overlapping commands not supported */
1160         if (s->feature & 0x02)
1161             goto abort_cmd;
1162         s->status = READY_STAT | SEEK_STAT;
1163         s->atapi_dma = s->feature & 1;
1164         s->nsector = 1;
1165         ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1166                            ide_atapi_cmd);
1167         break;
1168     /* CF-ATA commands */
1169     case CFA_REQ_EXT_ERROR_CODE:
1170         if (s->drive_kind != IDE_CFATA)
1171             goto abort_cmd;
1172         s->error = 0x09;    /* miscellaneous error */
1173         s->status = READY_STAT | SEEK_STAT;
1174         ide_set_irq(s->bus);
1175         break;
1176     case CFA_ERASE_SECTORS:
1177     case CFA_WEAR_LEVEL:
1178         if (s->drive_kind != IDE_CFATA)
1179             goto abort_cmd;
1180         if (val == CFA_WEAR_LEVEL)
1181             s->nsector = 0;
1182         if (val == CFA_ERASE_SECTORS)
1183             s->media_changed = 1;
1184         s->error = 0x00;
1185         s->status = READY_STAT | SEEK_STAT;
1186         ide_set_irq(s->bus);
1187         break;
1188     case CFA_TRANSLATE_SECTOR:
1189         if (s->drive_kind != IDE_CFATA)
1190             goto abort_cmd;
1191         s->error = 0x00;
1192         s->status = READY_STAT | SEEK_STAT;
1193         memset(s->io_buffer, 0, 0x200);
1194         s->io_buffer[0x00] = s->hcyl;                   /* Cyl MSB */
1195         s->io_buffer[0x01] = s->lcyl;                   /* Cyl LSB */
1196         s->io_buffer[0x02] = s->select;                 /* Head */
1197         s->io_buffer[0x03] = s->sector;                 /* Sector */
1198         s->io_buffer[0x04] = ide_get_sector(s) >> 16;   /* LBA MSB */
1199         s->io_buffer[0x05] = ide_get_sector(s) >> 8;    /* LBA */
1200         s->io_buffer[0x06] = ide_get_sector(s) >> 0;    /* LBA LSB */
1201         s->io_buffer[0x13] = 0x00;                              /* Erase flag */
1202         s->io_buffer[0x18] = 0x00;                              /* Hot count */
1203         s->io_buffer[0x19] = 0x00;                              /* Hot count */
1204         s->io_buffer[0x1a] = 0x01;                              /* Hot count */
1205         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1206         ide_set_irq(s->bus);
1207         break;
1208     case CFA_ACCESS_METADATA_STORAGE:
1209         if (s->drive_kind != IDE_CFATA)
1210             goto abort_cmd;
1211         switch (s->feature) {
1212         case 0x02:      /* Inquiry Metadata Storage */
1213             ide_cfata_metadata_inquiry(s);
1214             break;
1215         case 0x03:      /* Read Metadata Storage */
1216             ide_cfata_metadata_read(s);
1217             break;
1218         case 0x04:      /* Write Metadata Storage */
1219             ide_cfata_metadata_write(s);
1220             break;
1221         default:
1222             goto abort_cmd;
1223         }
1224         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1225         s->status = 0x00; /* NOTE: READY is _not_ set */
1226         ide_set_irq(s->bus);
1227         break;
1228     case IBM_SENSE_CONDITION:
1229         if (s->drive_kind != IDE_CFATA)
1230             goto abort_cmd;
1231         switch (s->feature) {
1232         case 0x01:  /* sense temperature in device */
1233             s->nsector = 0x50;      /* +20 C */
1234             break;
1235         default:
1236             goto abort_cmd;
1237         }
1238         s->status = READY_STAT | SEEK_STAT;
1239         ide_set_irq(s->bus);
1240         break;
1241
1242         case WIN_SMART:
1243         if (s->drive_kind == IDE_CD)
1244                 goto abort_cmd;
1245         if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
1246                 goto abort_cmd;
1247         if (!s->smart_enabled && s->feature != SMART_ENABLE)
1248                 goto abort_cmd;
1249         switch (s->feature) {
1250         case SMART_DISABLE:
1251                 s->smart_enabled = 0;
1252                 s->status = READY_STAT | SEEK_STAT;
1253                 ide_set_irq(s->bus);
1254                 break;
1255         case SMART_ENABLE:
1256                 s->smart_enabled = 1;
1257                 s->status = READY_STAT | SEEK_STAT;
1258                 ide_set_irq(s->bus);
1259                 break;
1260         case SMART_ATTR_AUTOSAVE:
1261                 switch (s->sector) {
1262                 case 0x00:
1263                 s->smart_autosave = 0;
1264                 break;
1265                 case 0xf1:
1266                 s->smart_autosave = 1;
1267                 break;
1268                 default:
1269                 goto abort_cmd;
1270                 }
1271                 s->status = READY_STAT | SEEK_STAT;
1272                 ide_set_irq(s->bus);
1273                 break;
1274         case SMART_STATUS:
1275                 if (!s->smart_errors) {
1276                 s->hcyl = 0xc2;
1277                 s->lcyl = 0x4f;
1278                 } else {
1279                 s->hcyl = 0x2c;
1280                 s->lcyl = 0xf4;
1281                 }
1282                 s->status = READY_STAT | SEEK_STAT;
1283                 ide_set_irq(s->bus);
1284                 break;
1285         case SMART_READ_THRESH:
1286                 memset(s->io_buffer, 0, 0x200);
1287                 s->io_buffer[0] = 0x01; /* smart struct version */
1288                 for (n=0; n<30; n++) {
1289                 if (smart_attributes[n][0] == 0)
1290                         break;
1291                 s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
1292                 s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
1293                 }
1294                 for (n=0; n<511; n++) /* checksum */
1295                 s->io_buffer[511] += s->io_buffer[n];
1296                 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1297                 s->status = READY_STAT | SEEK_STAT;
1298                 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1299                 ide_set_irq(s->bus);
1300                 break;
1301         case SMART_READ_DATA:
1302                 memset(s->io_buffer, 0, 0x200);
1303                 s->io_buffer[0] = 0x01; /* smart struct version */
1304                 for (n=0; n<30; n++) {
1305                     if (smart_attributes[n][0] == 0) {
1306                         break;
1307                     }
1308                     int i;
1309                     for(i = 0; i < 11; i++) {
1310                         s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
1311                     }
1312                 }
1313                 s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
1314                 if (s->smart_selftest_count == 0) {
1315                 s->io_buffer[363] = 0;
1316                 } else {
1317                 s->io_buffer[363] =
1318                         s->smart_selftest_data[3 + 
1319                                            (s->smart_selftest_count - 1) *
1320                                            24];
1321                 }
1322                 s->io_buffer[364] = 0x20; 
1323                 s->io_buffer[365] = 0x01; 
1324                 /* offline data collection capacity: execute + self-test*/
1325                 s->io_buffer[367] = (1<<4 | 1<<3 | 1); 
1326                 s->io_buffer[368] = 0x03; /* smart capability (1) */
1327                 s->io_buffer[369] = 0x00; /* smart capability (2) */
1328                 s->io_buffer[370] = 0x01; /* error logging supported */
1329                 s->io_buffer[372] = 0x02; /* minutes for poll short test */
1330                 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1331                 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1332
1333                 for (n=0; n<511; n++) 
1334                 s->io_buffer[511] += s->io_buffer[n];
1335                 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1336                 s->status = READY_STAT | SEEK_STAT;
1337                 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1338                 ide_set_irq(s->bus);
1339                 break;
1340         case SMART_READ_LOG:
1341                 switch (s->sector) {
1342                 case 0x01: /* summary smart error log */
1343                 memset(s->io_buffer, 0, 0x200);
1344                 s->io_buffer[0] = 0x01;
1345                 s->io_buffer[1] = 0x00; /* no error entries */
1346                 s->io_buffer[452] = s->smart_errors & 0xff;
1347                 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1348
1349                 for (n=0; n<511; n++)
1350                         s->io_buffer[511] += s->io_buffer[n];
1351                 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1352                 break;
1353                 case 0x06: /* smart self test log */
1354                 memset(s->io_buffer, 0, 0x200);
1355                 s->io_buffer[0] = 0x01;
1356                 if (s->smart_selftest_count == 0) {
1357                         s->io_buffer[508] = 0;
1358                 } else {
1359                         s->io_buffer[508] = s->smart_selftest_count;
1360                         for (n=2; n<506; n++) 
1361                         s->io_buffer[n] = s->smart_selftest_data[n];
1362                 }
1363                 for (n=0; n<511; n++)
1364                         s->io_buffer[511] += s->io_buffer[n];
1365                 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1366                 break;
1367                 default:
1368                 goto abort_cmd;
1369                 }
1370                 s->status = READY_STAT | SEEK_STAT;
1371                 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1372                 ide_set_irq(s->bus);
1373                 break;
1374         case SMART_EXECUTE_OFFLINE:
1375                 switch (s->sector) {
1376                 case 0: /* off-line routine */
1377                 case 1: /* short self test */
1378                 case 2: /* extended self test */
1379                 s->smart_selftest_count++;
1380                 if(s->smart_selftest_count > 21)
1381                         s->smart_selftest_count = 0;
1382                 n = 2 + (s->smart_selftest_count - 1) * 24;
1383                 s->smart_selftest_data[n] = s->sector;
1384                 s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
1385                 s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
1386                 s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
1387                 s->status = READY_STAT | SEEK_STAT;
1388                 ide_set_irq(s->bus);
1389                 break;
1390                 default:
1391                 goto abort_cmd;
1392                 }
1393                 break;
1394         default:
1395                 goto abort_cmd;
1396         }
1397         break;
1398     default:
1399     abort_cmd:
1400         ide_abort_command(s);
1401         ide_set_irq(s->bus);
1402         break;
1403     }
1404 }
1405
1406 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1407 {
1408     IDEBus *bus = opaque;
1409     IDEState *s = idebus_active_if(bus);
1410     uint32_t addr;
1411     int ret, hob;
1412
1413     addr = addr1 & 7;
1414     /* FIXME: HOB readback uses bit 7, but it's always set right now */
1415     //hob = s->select & (1 << 7);
1416     hob = 0;
1417     switch(addr) {
1418     case 0:
1419         ret = 0xff;
1420         break;
1421     case 1:
1422         if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1423             (s != bus->ifs && !s->bs))
1424             ret = 0;
1425         else if (!hob)
1426             ret = s->error;
1427         else
1428             ret = s->hob_feature;
1429         break;
1430     case 2:
1431         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1432             ret = 0;
1433         else if (!hob)
1434             ret = s->nsector & 0xff;
1435         else
1436             ret = s->hob_nsector;
1437         break;
1438     case 3:
1439         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1440             ret = 0;
1441         else if (!hob)
1442             ret = s->sector;
1443         else
1444             ret = s->hob_sector;
1445         break;
1446     case 4:
1447         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1448             ret = 0;
1449         else if (!hob)
1450             ret = s->lcyl;
1451         else
1452             ret = s->hob_lcyl;
1453         break;
1454     case 5:
1455         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1456             ret = 0;
1457         else if (!hob)
1458             ret = s->hcyl;
1459         else
1460             ret = s->hob_hcyl;
1461         break;
1462     case 6:
1463         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1464             ret = 0;
1465         else
1466             ret = s->select;
1467         break;
1468     default:
1469     case 7:
1470         if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1471             (s != bus->ifs && !s->bs))
1472             ret = 0;
1473         else
1474             ret = s->status;
1475         qemu_irq_lower(bus->irq);
1476         break;
1477     }
1478 #ifdef DEBUG_IDE
1479     printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1480 #endif
1481     return ret;
1482 }
1483
1484 uint32_t ide_status_read(void *opaque, uint32_t addr)
1485 {
1486     IDEBus *bus = opaque;
1487     IDEState *s = idebus_active_if(bus);
1488     int ret;
1489
1490     if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1491         (s != bus->ifs && !s->bs))
1492         ret = 0;
1493     else
1494         ret = s->status;
1495 #ifdef DEBUG_IDE
1496     printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1497 #endif
1498     return ret;
1499 }
1500
1501 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1502 {
1503     IDEBus *bus = opaque;
1504     IDEState *s;
1505     int i;
1506
1507 #ifdef DEBUG_IDE
1508     printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1509 #endif
1510     /* common for both drives */
1511     if (!(bus->cmd & IDE_CMD_RESET) &&
1512         (val & IDE_CMD_RESET)) {
1513         /* reset low to high */
1514         for(i = 0;i < 2; i++) {
1515             s = &bus->ifs[i];
1516             s->status = BUSY_STAT | SEEK_STAT;
1517             s->error = 0x01;
1518         }
1519     } else if ((bus->cmd & IDE_CMD_RESET) &&
1520                !(val & IDE_CMD_RESET)) {
1521         /* high to low */
1522         for(i = 0;i < 2; i++) {
1523             s = &bus->ifs[i];
1524             if (s->drive_kind == IDE_CD)
1525                 s->status = 0x00; /* NOTE: READY is _not_ set */
1526             else
1527                 s->status = READY_STAT | SEEK_STAT;
1528             ide_set_signature(s);
1529         }
1530     }
1531
1532     bus->cmd = val;
1533 }
1534
1535 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1536 {
1537     IDEBus *bus = opaque;
1538     IDEState *s = idebus_active_if(bus);
1539     uint8_t *p;
1540
1541     /* PIO data access allowed only when DRQ bit is set */
1542     if (!(s->status & DRQ_STAT))
1543         return;
1544
1545     p = s->data_ptr;
1546     *(uint16_t *)p = le16_to_cpu(val);
1547     p += 2;
1548     s->data_ptr = p;
1549     if (p >= s->data_end)
1550         s->end_transfer_func(s);
1551 }
1552
1553 uint32_t ide_data_readw(void *opaque, uint32_t addr)
1554 {
1555     IDEBus *bus = opaque;
1556     IDEState *s = idebus_active_if(bus);
1557     uint8_t *p;
1558     int ret;
1559
1560     /* PIO data access allowed only when DRQ bit is set */
1561     if (!(s->status & DRQ_STAT))
1562         return 0;
1563
1564     p = s->data_ptr;
1565     ret = cpu_to_le16(*(uint16_t *)p);
1566     p += 2;
1567     s->data_ptr = p;
1568     if (p >= s->data_end)
1569         s->end_transfer_func(s);
1570     return ret;
1571 }
1572
1573 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1574 {
1575     IDEBus *bus = opaque;
1576     IDEState *s = idebus_active_if(bus);
1577     uint8_t *p;
1578
1579     /* PIO data access allowed only when DRQ bit is set */
1580     if (!(s->status & DRQ_STAT))
1581         return;
1582
1583     p = s->data_ptr;
1584     *(uint32_t *)p = le32_to_cpu(val);
1585     p += 4;
1586     s->data_ptr = p;
1587     if (p >= s->data_end)
1588         s->end_transfer_func(s);
1589 }
1590
1591 uint32_t ide_data_readl(void *opaque, uint32_t addr)
1592 {
1593     IDEBus *bus = opaque;
1594     IDEState *s = idebus_active_if(bus);
1595     uint8_t *p;
1596     int ret;
1597
1598     /* PIO data access allowed only when DRQ bit is set */
1599     if (!(s->status & DRQ_STAT))
1600         return 0;
1601
1602     p = s->data_ptr;
1603     ret = cpu_to_le32(*(uint32_t *)p);
1604     p += 4;
1605     s->data_ptr = p;
1606     if (p >= s->data_end)
1607         s->end_transfer_func(s);
1608     return ret;
1609 }
1610
1611 static void ide_dummy_transfer_stop(IDEState *s)
1612 {
1613     s->data_ptr = s->io_buffer;
1614     s->data_end = s->io_buffer;
1615     s->io_buffer[0] = 0xff;
1616     s->io_buffer[1] = 0xff;
1617     s->io_buffer[2] = 0xff;
1618     s->io_buffer[3] = 0xff;
1619 }
1620
1621 static void ide_reset(IDEState *s)
1622 {
1623 #ifdef DEBUG_IDE
1624     printf("ide: reset\n");
1625 #endif
1626     if (s->drive_kind == IDE_CFATA)
1627         s->mult_sectors = 0;
1628     else
1629         s->mult_sectors = MAX_MULT_SECTORS;
1630     /* ide regs */
1631     s->feature = 0;
1632     s->error = 0;
1633     s->nsector = 0;
1634     s->sector = 0;
1635     s->lcyl = 0;
1636     s->hcyl = 0;
1637
1638     /* lba48 */
1639     s->hob_feature = 0;
1640     s->hob_sector = 0;
1641     s->hob_nsector = 0;
1642     s->hob_lcyl = 0;
1643     s->hob_hcyl = 0;
1644
1645     s->select = 0xa0;
1646     s->status = READY_STAT | SEEK_STAT;
1647
1648     s->lba48 = 0;
1649
1650     /* ATAPI specific */
1651     s->sense_key = 0;
1652     s->asc = 0;
1653     s->cdrom_changed = 0;
1654     s->packet_transfer_size = 0;
1655     s->elementary_transfer_size = 0;
1656     s->io_buffer_index = 0;
1657     s->cd_sector_size = 0;
1658     s->atapi_dma = 0;
1659     /* ATA DMA state */
1660     s->io_buffer_size = 0;
1661     s->req_nb_sectors = 0;
1662
1663     ide_set_signature(s);
1664     /* init the transfer handler so that 0xffff is returned on data
1665        accesses */
1666     s->end_transfer_func = ide_dummy_transfer_stop;
1667     ide_dummy_transfer_stop(s);
1668     s->media_changed = 0;
1669 }
1670
1671 void ide_bus_reset(IDEBus *bus)
1672 {
1673     bus->unit = 0;
1674     bus->cmd = 0;
1675     ide_reset(&bus->ifs[0]);
1676     ide_reset(&bus->ifs[1]);
1677     ide_clear_hob(bus);
1678
1679     /* pending async DMA */
1680     if (bus->dma->aiocb) {
1681 #ifdef DEBUG_AIO
1682         printf("aio_cancel\n");
1683 #endif
1684         bdrv_aio_cancel(bus->dma->aiocb);
1685         bus->dma->aiocb = NULL;
1686     }
1687
1688     /* reset dma provider too */
1689     bus->dma->ops->reset(bus->dma);
1690 }
1691
1692 int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
1693                    const char *version, const char *serial)
1694 {
1695     int cylinders, heads, secs;
1696     uint64_t nb_sectors;
1697
1698     s->bs = bs;
1699     s->drive_kind = kind;
1700
1701     bdrv_get_geometry(bs, &nb_sectors);
1702     bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
1703     if (cylinders < 1 || cylinders > 16383) {
1704         error_report("cyls must be between 1 and 16383");
1705         return -1;
1706     }
1707     if (heads < 1 || heads > 16) {
1708         error_report("heads must be between 1 and 16");
1709         return -1;
1710     }
1711     if (secs < 1 || secs > 63) {
1712         error_report("secs must be between 1 and 63");
1713         return -1;
1714     }
1715     s->cylinders = cylinders;
1716     s->heads = heads;
1717     s->sectors = secs;
1718     s->nb_sectors = nb_sectors;
1719     /* The SMART values should be preserved across power cycles
1720        but they aren't.  */
1721     s->smart_enabled = 1;
1722     s->smart_autosave = 1;
1723     s->smart_errors = 0;
1724     s->smart_selftest_count = 0;
1725     if (kind == IDE_CD) {
1726         bdrv_set_change_cb(bs, cdrom_change_cb, s);
1727         bs->buffer_alignment = 2048;
1728     } else {
1729         if (!bdrv_is_inserted(s->bs)) {
1730             error_report("Device needs media, but drive is empty");
1731             return -1;
1732         }
1733         if (bdrv_is_read_only(bs)) {
1734             error_report("Can't use a read-only drive");
1735             return -1;
1736         }
1737     }
1738     if (serial) {
1739         strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
1740     } else {
1741         snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
1742                  "QM%05d", s->drive_serial);
1743     }
1744     if (version) {
1745         pstrcpy(s->version, sizeof(s->version), version);
1746     } else {
1747         pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
1748     }
1749
1750     ide_reset(s);
1751     bdrv_set_removable(bs, s->drive_kind == IDE_CD);
1752     return 0;
1753 }
1754
1755 static void ide_init1(IDEBus *bus, int unit)
1756 {
1757     static int drive_serial = 1;
1758     IDEState *s = &bus->ifs[unit];
1759
1760     s->bus = bus;
1761     s->unit = unit;
1762     s->drive_serial = drive_serial++;
1763     /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
1764     s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4);
1765     s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
1766     s->smart_selftest_data = qemu_blockalign(s->bs, 512);
1767     s->sector_write_timer = qemu_new_timer_ns(vm_clock,
1768                                            ide_sector_write_timer_cb, s);
1769 }
1770
1771 static void ide_nop_start(IDEDMA *dma, IDEState *s,
1772                           BlockDriverCompletionFunc *cb)
1773 {
1774 }
1775
1776 static int ide_nop(IDEDMA *dma)
1777 {
1778     return 0;
1779 }
1780
1781 static int ide_nop_int(IDEDMA *dma, int x)
1782 {
1783     return 0;
1784 }
1785
1786 static void ide_nop_restart(void *opaque, int x, int y)
1787 {
1788 }
1789
1790 static const IDEDMAOps ide_dma_nop_ops = {
1791     .start_dma      = ide_nop_start,
1792     .start_transfer = ide_nop,
1793     .prepare_buf    = ide_nop_int,
1794     .rw_buf         = ide_nop_int,
1795     .set_unit       = ide_nop_int,
1796     .add_status     = ide_nop_int,
1797     .set_inactive   = ide_nop,
1798     .restart_cb     = ide_nop_restart,
1799     .reset          = ide_nop,
1800 };
1801
1802 static IDEDMA ide_dma_nop = {
1803     .ops = &ide_dma_nop_ops,
1804     .aiocb = NULL,
1805 };
1806
1807 void ide_init2(IDEBus *bus, qemu_irq irq)
1808 {
1809     int i;
1810
1811     for(i = 0; i < 2; i++) {
1812         ide_init1(bus, i);
1813         ide_reset(&bus->ifs[i]);
1814     }
1815     bus->irq = irq;
1816     bus->dma = &ide_dma_nop;
1817 }
1818
1819 /* TODO convert users to qdev and remove */
1820 void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
1821                                     DriveInfo *hd1, qemu_irq irq)
1822 {
1823     int i;
1824     DriveInfo *dinfo;
1825
1826     for(i = 0; i < 2; i++) {
1827         dinfo = i == 0 ? hd0 : hd1;
1828         ide_init1(bus, i);
1829         if (dinfo) {
1830             if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
1831                                dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
1832                                *dinfo->serial ? dinfo->serial : NULL) < 0) {
1833                 error_report("Can't set up IDE drive %s", dinfo->id);
1834                 exit(1);
1835             }
1836         } else {
1837             ide_reset(&bus->ifs[i]);
1838         }
1839     }
1840     bus->irq = irq;
1841     bus->dma = &ide_dma_nop;
1842 }
1843
1844 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2)
1845 {
1846     register_ioport_write(iobase, 8, 1, ide_ioport_write, bus);
1847     register_ioport_read(iobase, 8, 1, ide_ioport_read, bus);
1848     if (iobase2) {
1849         register_ioport_read(iobase2, 1, 1, ide_status_read, bus);
1850         register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus);
1851     }
1852
1853     /* data ports */
1854     register_ioport_write(iobase, 2, 2, ide_data_writew, bus);
1855     register_ioport_read(iobase, 2, 2, ide_data_readw, bus);
1856     register_ioport_write(iobase, 4, 4, ide_data_writel, bus);
1857     register_ioport_read(iobase, 4, 4, ide_data_readl, bus);
1858 }
1859
1860 static bool is_identify_set(void *opaque, int version_id)
1861 {
1862     IDEState *s = opaque;
1863
1864     return s->identify_set != 0;
1865 }
1866
1867 static EndTransferFunc* transfer_end_table[] = {
1868         ide_sector_read,
1869         ide_sector_write,
1870         ide_transfer_stop,
1871         ide_atapi_cmd_reply_end,
1872         ide_atapi_cmd,
1873         ide_dummy_transfer_stop,
1874 };
1875
1876 static int transfer_end_table_idx(EndTransferFunc *fn)
1877 {
1878     int i;
1879
1880     for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
1881         if (transfer_end_table[i] == fn)
1882             return i;
1883
1884     return -1;
1885 }
1886
1887 static int ide_drive_post_load(void *opaque, int version_id)
1888 {
1889     IDEState *s = opaque;
1890
1891     if (version_id < 3) {
1892         if (s->sense_key == SENSE_UNIT_ATTENTION &&
1893             s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
1894             s->cdrom_changed = 1;
1895         }
1896     }
1897     return 0;
1898 }
1899
1900 static int ide_drive_pio_post_load(void *opaque, int version_id)
1901 {
1902     IDEState *s = opaque;
1903
1904     if (s->end_transfer_fn_idx > ARRAY_SIZE(transfer_end_table)) {
1905         return -EINVAL;
1906     }
1907     s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
1908     s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
1909     s->data_end = s->data_ptr + s->cur_io_buffer_len;
1910
1911     return 0;
1912 }
1913
1914 static void ide_drive_pio_pre_save(void *opaque)
1915 {
1916     IDEState *s = opaque;
1917     int idx;
1918
1919     s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
1920     s->cur_io_buffer_len = s->data_end - s->data_ptr;
1921
1922     idx = transfer_end_table_idx(s->end_transfer_func);
1923     if (idx == -1) {
1924         fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
1925                         __func__);
1926         s->end_transfer_fn_idx = 2;
1927     } else {
1928         s->end_transfer_fn_idx = idx;
1929     }
1930 }
1931
1932 static bool ide_drive_pio_state_needed(void *opaque)
1933 {
1934     IDEState *s = opaque;
1935
1936     return ((s->status & DRQ_STAT) != 0)
1937         || (s->bus->error_status & BM_STATUS_PIO_RETRY);
1938 }
1939
1940 static bool ide_atapi_gesn_needed(void *opaque)
1941 {
1942     IDEState *s = opaque;
1943
1944     return s->events.new_media || s->events.eject_request;
1945 }
1946
1947 static bool ide_error_needed(void *opaque)
1948 {
1949     IDEBus *bus = opaque;
1950
1951     return (bus->error_status != 0);
1952 }
1953
1954 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
1955 const VMStateDescription vmstate_ide_atapi_gesn_state = {
1956     .name ="ide_drive/atapi/gesn_state",
1957     .version_id = 1,
1958     .minimum_version_id = 1,
1959     .minimum_version_id_old = 1,
1960     .fields = (VMStateField []) {
1961         VMSTATE_BOOL(events.new_media, IDEState),
1962         VMSTATE_BOOL(events.eject_request, IDEState),
1963         VMSTATE_END_OF_LIST()
1964     }
1965 };
1966
1967 const VMStateDescription vmstate_ide_drive_pio_state = {
1968     .name = "ide_drive/pio_state",
1969     .version_id = 1,
1970     .minimum_version_id = 1,
1971     .minimum_version_id_old = 1,
1972     .pre_save = ide_drive_pio_pre_save,
1973     .post_load = ide_drive_pio_post_load,
1974     .fields      = (VMStateField []) {
1975         VMSTATE_INT32(req_nb_sectors, IDEState),
1976         VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
1977                              vmstate_info_uint8, uint8_t),
1978         VMSTATE_INT32(cur_io_buffer_offset, IDEState),
1979         VMSTATE_INT32(cur_io_buffer_len, IDEState),
1980         VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
1981         VMSTATE_INT32(elementary_transfer_size, IDEState),
1982         VMSTATE_INT32(packet_transfer_size, IDEState),
1983         VMSTATE_END_OF_LIST()
1984     }
1985 };
1986
1987 const VMStateDescription vmstate_ide_drive = {
1988     .name = "ide_drive",
1989     .version_id = 3,
1990     .minimum_version_id = 0,
1991     .minimum_version_id_old = 0,
1992     .post_load = ide_drive_post_load,
1993     .fields      = (VMStateField []) {
1994         VMSTATE_INT32(mult_sectors, IDEState),
1995         VMSTATE_INT32(identify_set, IDEState),
1996         VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
1997         VMSTATE_UINT8(feature, IDEState),
1998         VMSTATE_UINT8(error, IDEState),
1999         VMSTATE_UINT32(nsector, IDEState),
2000         VMSTATE_UINT8(sector, IDEState),
2001         VMSTATE_UINT8(lcyl, IDEState),
2002         VMSTATE_UINT8(hcyl, IDEState),
2003         VMSTATE_UINT8(hob_feature, IDEState),
2004         VMSTATE_UINT8(hob_sector, IDEState),
2005         VMSTATE_UINT8(hob_nsector, IDEState),
2006         VMSTATE_UINT8(hob_lcyl, IDEState),
2007         VMSTATE_UINT8(hob_hcyl, IDEState),
2008         VMSTATE_UINT8(select, IDEState),
2009         VMSTATE_UINT8(status, IDEState),
2010         VMSTATE_UINT8(lba48, IDEState),
2011         VMSTATE_UINT8(sense_key, IDEState),
2012         VMSTATE_UINT8(asc, IDEState),
2013         VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2014         VMSTATE_END_OF_LIST()
2015     },
2016     .subsections = (VMStateSubsection []) {
2017         {
2018             .vmsd = &vmstate_ide_drive_pio_state,
2019             .needed = ide_drive_pio_state_needed,
2020         }, {
2021             .vmsd = &vmstate_ide_atapi_gesn_state,
2022             .needed = ide_atapi_gesn_needed,
2023         }, {
2024             /* empty */
2025         }
2026     }
2027 };
2028
2029 const VMStateDescription vmstate_ide_error_status = {
2030     .name ="ide_bus/error",
2031     .version_id = 1,
2032     .minimum_version_id = 1,
2033     .minimum_version_id_old = 1,
2034     .fields = (VMStateField []) {
2035         VMSTATE_INT32(error_status, IDEBus),
2036         VMSTATE_END_OF_LIST()
2037     }
2038 };
2039
2040 const VMStateDescription vmstate_ide_bus = {
2041     .name = "ide_bus",
2042     .version_id = 1,
2043     .minimum_version_id = 1,
2044     .minimum_version_id_old = 1,
2045     .fields      = (VMStateField []) {
2046         VMSTATE_UINT8(cmd, IDEBus),
2047         VMSTATE_UINT8(unit, IDEBus),
2048         VMSTATE_END_OF_LIST()
2049     },
2050     .subsections = (VMStateSubsection []) {
2051         {
2052             .vmsd = &vmstate_ide_error_status,
2053             .needed = ide_error_needed,
2054         }, {
2055             /* empty */
2056         }
2057     }
2058 };
2059
2060 void ide_drive_get(DriveInfo **hd, int max_bus)
2061 {
2062     int i;
2063
2064     if (drive_get_max_bus(IF_IDE) >= max_bus) {
2065         fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2066         exit(1);
2067     }
2068
2069     for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2070         hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2071     }
2072 }
This page took 0.136504 seconds and 4 git commands to generate.