xref: /openbmc/qemu/hw/ide/core.c (revision d54f10bba7635b5ad8b750afd2bb2f0f8eb68b45)
1 /*
2  * QEMU IDE disk and CD/DVD-ROM Emulator
3  *
4  * Copyright (c) 2003 Fabrice Bellard
5  * Copyright (c) 2006 Openedhand Ltd.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  */
25 #include <hw/hw.h>
26 #include <hw/pc.h>
27 #include <hw/pci.h>
28 #include <hw/scsi.h>
29 #include "qemu-error.h"
30 #include "qemu-timer.h"
31 #include "sysemu.h"
32 #include "dma.h"
33 #include "blockdev.h"
34 
35 #include <hw/ide/internal.h>
36 
37 /* These values were based on a Seagate ST3500418AS but have been modified
38    to make more sense in QEMU */
39 static const int smart_attributes[][12] = {
40     /* id,  flags, hflags, val, wrst, raw (6 bytes), threshold */
41     /* raw read error rate*/
42     { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
43     /* spin up */
44     { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
45     /* start stop count */
46     { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
47     /* remapped sectors */
48     { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
49     /* power on hours */
50     { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
51     /* power cycle count */
52     { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
53     /* airflow-temperature-celsius */
54     { 190,  0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
55     /* end of list */
56     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
57 };
58 
59 /* XXX: DVDs that could fit on a CD will be reported as a CD */
60 static inline int media_present(IDEState *s)
61 {
62     return (s->nb_sectors > 0);
63 }
64 
65 static inline int media_is_dvd(IDEState *s)
66 {
67     return (media_present(s) && s->nb_sectors > CD_MAX_SECTORS);
68 }
69 
70 static inline int media_is_cd(IDEState *s)
71 {
72     return (media_present(s) && s->nb_sectors <= CD_MAX_SECTORS);
73 }
74 
75 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret);
76 static int ide_handle_rw_error(IDEState *s, int error, int op);
77 
78 static void padstr(char *str, const char *src, int len)
79 {
80     int i, v;
81     for(i = 0; i < len; i++) {
82         if (*src)
83             v = *src++;
84         else
85             v = ' ';
86         str[i^1] = v;
87     }
88 }
89 
90 static void padstr8(uint8_t *buf, int buf_size, const char *src)
91 {
92     int i;
93     for(i = 0; i < buf_size; i++) {
94         if (*src)
95             buf[i] = *src++;
96         else
97             buf[i] = ' ';
98     }
99 }
100 
101 static void put_le16(uint16_t *p, unsigned int v)
102 {
103     *p = cpu_to_le16(v);
104 }
105 
106 static void ide_identify(IDEState *s)
107 {
108     uint16_t *p;
109     unsigned int oldsize;
110     IDEDevice *dev;
111 
112     if (s->identify_set) {
113 	memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
114 	return;
115     }
116 
117     memset(s->io_buffer, 0, 512);
118     p = (uint16_t *)s->io_buffer;
119     put_le16(p + 0, 0x0040);
120     put_le16(p + 1, s->cylinders);
121     put_le16(p + 3, s->heads);
122     put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
123     put_le16(p + 5, 512); /* XXX: retired, remove ? */
124     put_le16(p + 6, s->sectors);
125     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
126     put_le16(p + 20, 3); /* XXX: retired, remove ? */
127     put_le16(p + 21, 512); /* cache size in sectors */
128     put_le16(p + 22, 4); /* ecc bytes */
129     padstr((char *)(p + 23), s->version, 8); /* firmware version */
130     padstr((char *)(p + 27), "QEMU HARDDISK", 40); /* model */
131 #if MAX_MULT_SECTORS > 1
132     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
133 #endif
134     put_le16(p + 48, 1); /* dword I/O */
135     put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
136     put_le16(p + 51, 0x200); /* PIO transfer cycle */
137     put_le16(p + 52, 0x200); /* DMA transfer cycle */
138     put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
139     put_le16(p + 54, s->cylinders);
140     put_le16(p + 55, s->heads);
141     put_le16(p + 56, s->sectors);
142     oldsize = s->cylinders * s->heads * s->sectors;
143     put_le16(p + 57, oldsize);
144     put_le16(p + 58, oldsize >> 16);
145     if (s->mult_sectors)
146         put_le16(p + 59, 0x100 | s->mult_sectors);
147     put_le16(p + 60, s->nb_sectors);
148     put_le16(p + 61, s->nb_sectors >> 16);
149     put_le16(p + 62, 0x07); /* single word dma0-2 supported */
150     put_le16(p + 63, 0x07); /* mdma0-2 supported */
151     put_le16(p + 64, 0x03); /* pio3-4 supported */
152     put_le16(p + 65, 120);
153     put_le16(p + 66, 120);
154     put_le16(p + 67, 120);
155     put_le16(p + 68, 120);
156 
157     if (s->ncq_queues) {
158         put_le16(p + 75, s->ncq_queues - 1);
159         /* NCQ supported */
160         put_le16(p + 76, (1 << 8));
161     }
162 
163     put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
164     put_le16(p + 81, 0x16); /* conforms to ata5 */
165     /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
166     put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
167     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
168     put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
169     /* 14=set to 1, 1=SMART self test, 0=SMART error logging */
170     put_le16(p + 84, (1 << 14) | 0);
171     /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
172     if (bdrv_enable_write_cache(s->bs))
173          put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
174     else
175          put_le16(p + 85, (1 << 14) | 1);
176     /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
177     put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
178     /* 14=set to 1, 1=smart self test, 0=smart error logging */
179     put_le16(p + 87, (1 << 14) | 0);
180     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
181     put_le16(p + 93, 1 | (1 << 14) | 0x2000);
182     put_le16(p + 100, s->nb_sectors);
183     put_le16(p + 101, s->nb_sectors >> 16);
184     put_le16(p + 102, s->nb_sectors >> 32);
185     put_le16(p + 103, s->nb_sectors >> 48);
186     dev = s->unit ? s->bus->slave : s->bus->master;
187     if (dev && dev->conf.physical_block_size)
188         put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
189 
190     memcpy(s->identify_data, p, sizeof(s->identify_data));
191     s->identify_set = 1;
192 }
193 
194 static void ide_atapi_identify(IDEState *s)
195 {
196     uint16_t *p;
197 
198     if (s->identify_set) {
199 	memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
200 	return;
201     }
202 
203     memset(s->io_buffer, 0, 512);
204     p = (uint16_t *)s->io_buffer;
205     /* Removable CDROM, 50us response, 12 byte packets */
206     put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
207     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
208     put_le16(p + 20, 3); /* buffer type */
209     put_le16(p + 21, 512); /* cache size in sectors */
210     put_le16(p + 22, 4); /* ecc bytes */
211     padstr((char *)(p + 23), s->version, 8); /* firmware version */
212     padstr((char *)(p + 27), "QEMU DVD-ROM", 40); /* model */
213     put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
214 #ifdef USE_DMA_CDROM
215     put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
216     put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
217     put_le16(p + 62, 7);  /* single word dma0-2 supported */
218     put_le16(p + 63, 7);  /* mdma0-2 supported */
219 #else
220     put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
221     put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
222     put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
223 #endif
224     put_le16(p + 64, 3); /* pio3-4 supported */
225     put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
226     put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
227     put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
228     put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
229 
230     put_le16(p + 71, 30); /* in ns */
231     put_le16(p + 72, 30); /* in ns */
232 
233     if (s->ncq_queues) {
234         put_le16(p + 75, s->ncq_queues - 1);
235         /* NCQ supported */
236         put_le16(p + 76, (1 << 8));
237     }
238 
239     put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
240 #ifdef USE_DMA_CDROM
241     put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
242 #endif
243     memcpy(s->identify_data, p, sizeof(s->identify_data));
244     s->identify_set = 1;
245 }
246 
247 static void ide_cfata_identify(IDEState *s)
248 {
249     uint16_t *p;
250     uint32_t cur_sec;
251 
252     p = (uint16_t *) s->identify_data;
253     if (s->identify_set)
254         goto fill_buffer;
255 
256     memset(p, 0, sizeof(s->identify_data));
257 
258     cur_sec = s->cylinders * s->heads * s->sectors;
259 
260     put_le16(p + 0, 0x848a);			/* CF Storage Card signature */
261     put_le16(p + 1, s->cylinders);		/* Default cylinders */
262     put_le16(p + 3, s->heads);			/* Default heads */
263     put_le16(p + 6, s->sectors);		/* Default sectors per track */
264     put_le16(p + 7, s->nb_sectors >> 16);	/* Sectors per card */
265     put_le16(p + 8, s->nb_sectors);		/* Sectors per card */
266     padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
267     put_le16(p + 22, 0x0004);			/* ECC bytes */
268     padstr((char *) (p + 23), s->version, 8);	/* Firmware Revision */
269     padstr((char *) (p + 27), "QEMU MICRODRIVE", 40);/* Model number */
270 #if MAX_MULT_SECTORS > 1
271     put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
272 #else
273     put_le16(p + 47, 0x0000);
274 #endif
275     put_le16(p + 49, 0x0f00);			/* Capabilities */
276     put_le16(p + 51, 0x0002);			/* PIO cycle timing mode */
277     put_le16(p + 52, 0x0001);			/* DMA cycle timing mode */
278     put_le16(p + 53, 0x0003);			/* Translation params valid */
279     put_le16(p + 54, s->cylinders);		/* Current cylinders */
280     put_le16(p + 55, s->heads);			/* Current heads */
281     put_le16(p + 56, s->sectors);		/* Current sectors */
282     put_le16(p + 57, cur_sec);			/* Current capacity */
283     put_le16(p + 58, cur_sec >> 16);		/* Current capacity */
284     if (s->mult_sectors)			/* Multiple sector setting */
285         put_le16(p + 59, 0x100 | s->mult_sectors);
286     put_le16(p + 60, s->nb_sectors);		/* Total LBA sectors */
287     put_le16(p + 61, s->nb_sectors >> 16);	/* Total LBA sectors */
288     put_le16(p + 63, 0x0203);			/* Multiword DMA capability */
289     put_le16(p + 64, 0x0001);			/* Flow Control PIO support */
290     put_le16(p + 65, 0x0096);			/* Min. Multiword DMA cycle */
291     put_le16(p + 66, 0x0096);			/* Rec. Multiword DMA cycle */
292     put_le16(p + 68, 0x00b4);			/* Min. PIO cycle time */
293     put_le16(p + 82, 0x400c);			/* Command Set supported */
294     put_le16(p + 83, 0x7068);			/* Command Set supported */
295     put_le16(p + 84, 0x4000);			/* Features supported */
296     put_le16(p + 85, 0x000c);			/* Command Set enabled */
297     put_le16(p + 86, 0x7044);			/* Command Set enabled */
298     put_le16(p + 87, 0x4000);			/* Features enabled */
299     put_le16(p + 91, 0x4060);			/* Current APM level */
300     put_le16(p + 129, 0x0002);			/* Current features option */
301     put_le16(p + 130, 0x0005);			/* Reassigned sectors */
302     put_le16(p + 131, 0x0001);			/* Initial power mode */
303     put_le16(p + 132, 0x0000);			/* User signature */
304     put_le16(p + 160, 0x8100);			/* Power requirement */
305     put_le16(p + 161, 0x8001);			/* CF command set */
306 
307     s->identify_set = 1;
308 
309 fill_buffer:
310     memcpy(s->io_buffer, p, sizeof(s->identify_data));
311 }
312 
313 static void ide_set_signature(IDEState *s)
314 {
315     s->select &= 0xf0; /* clear head */
316     /* put signature */
317     s->nsector = 1;
318     s->sector = 1;
319     if (s->drive_kind == IDE_CD) {
320         s->lcyl = 0x14;
321         s->hcyl = 0xeb;
322     } else if (s->bs) {
323         s->lcyl = 0;
324         s->hcyl = 0;
325     } else {
326         s->lcyl = 0xff;
327         s->hcyl = 0xff;
328     }
329 }
330 
331 static inline void ide_abort_command(IDEState *s)
332 {
333     s->status = READY_STAT | ERR_STAT;
334     s->error = ABRT_ERR;
335 }
336 
337 /* prepare data transfer and tell what to do after */
338 static void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
339                                EndTransferFunc *end_transfer_func)
340 {
341     s->end_transfer_func = end_transfer_func;
342     s->data_ptr = buf;
343     s->data_end = buf + size;
344     if (!(s->status & ERR_STAT)) {
345         s->status |= DRQ_STAT;
346     }
347     s->bus->dma->ops->start_transfer(s->bus->dma);
348 }
349 
350 static void ide_transfer_stop(IDEState *s)
351 {
352     s->end_transfer_func = ide_transfer_stop;
353     s->data_ptr = s->io_buffer;
354     s->data_end = s->io_buffer;
355     s->status &= ~DRQ_STAT;
356 }
357 
358 int64_t ide_get_sector(IDEState *s)
359 {
360     int64_t sector_num;
361     if (s->select & 0x40) {
362         /* lba */
363 	if (!s->lba48) {
364 	    sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
365 		(s->lcyl << 8) | s->sector;
366 	} else {
367 	    sector_num = ((int64_t)s->hob_hcyl << 40) |
368 		((int64_t) s->hob_lcyl << 32) |
369 		((int64_t) s->hob_sector << 24) |
370 		((int64_t) s->hcyl << 16) |
371 		((int64_t) s->lcyl << 8) | s->sector;
372 	}
373     } else {
374         sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
375             (s->select & 0x0f) * s->sectors + (s->sector - 1);
376     }
377     return sector_num;
378 }
379 
380 void ide_set_sector(IDEState *s, int64_t sector_num)
381 {
382     unsigned int cyl, r;
383     if (s->select & 0x40) {
384 	if (!s->lba48) {
385             s->select = (s->select & 0xf0) | (sector_num >> 24);
386             s->hcyl = (sector_num >> 16);
387             s->lcyl = (sector_num >> 8);
388             s->sector = (sector_num);
389 	} else {
390 	    s->sector = sector_num;
391 	    s->lcyl = sector_num >> 8;
392 	    s->hcyl = sector_num >> 16;
393 	    s->hob_sector = sector_num >> 24;
394 	    s->hob_lcyl = sector_num >> 32;
395 	    s->hob_hcyl = sector_num >> 40;
396 	}
397     } else {
398         cyl = sector_num / (s->heads * s->sectors);
399         r = sector_num % (s->heads * s->sectors);
400         s->hcyl = cyl >> 8;
401         s->lcyl = cyl;
402         s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
403         s->sector = (r % s->sectors) + 1;
404     }
405 }
406 
407 static void ide_rw_error(IDEState *s) {
408     ide_abort_command(s);
409     ide_set_irq(s->bus);
410 }
411 
412 void ide_sector_read(IDEState *s)
413 {
414     int64_t sector_num;
415     int ret, n;
416 
417     s->status = READY_STAT | SEEK_STAT;
418     s->error = 0; /* not needed by IDE spec, but needed by Windows */
419     sector_num = ide_get_sector(s);
420     n = s->nsector;
421     if (n == 0) {
422         /* no more sector to read from disk */
423         ide_transfer_stop(s);
424     } else {
425 #if defined(DEBUG_IDE)
426         printf("read sector=%" PRId64 "\n", sector_num);
427 #endif
428         if (n > s->req_nb_sectors)
429             n = s->req_nb_sectors;
430         ret = bdrv_read(s->bs, sector_num, s->io_buffer, n);
431         if (ret != 0) {
432             if (ide_handle_rw_error(s, -ret,
433                 BM_STATUS_PIO_RETRY | BM_STATUS_RETRY_READ))
434             {
435                 return;
436             }
437         }
438         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
439         ide_set_irq(s->bus);
440         ide_set_sector(s, sector_num + n);
441         s->nsector -= n;
442     }
443 }
444 
445 static void dma_buf_commit(IDEState *s, int is_write)
446 {
447     qemu_sglist_destroy(&s->sg);
448 }
449 
450 static void ide_set_inactive(IDEState *s)
451 {
452     s->bus->dma->aiocb = NULL;
453     s->bus->dma->ops->set_inactive(s->bus->dma);
454 }
455 
456 void ide_dma_error(IDEState *s)
457 {
458     ide_transfer_stop(s);
459     s->error = ABRT_ERR;
460     s->status = READY_STAT | ERR_STAT;
461     ide_set_inactive(s);
462     s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT);
463     ide_set_irq(s->bus);
464 }
465 
466 static int ide_handle_rw_error(IDEState *s, int error, int op)
467 {
468     int is_read = (op & BM_STATUS_RETRY_READ);
469     BlockErrorAction action = bdrv_get_on_error(s->bs, is_read);
470 
471     if (action == BLOCK_ERR_IGNORE) {
472         bdrv_mon_event(s->bs, BDRV_ACTION_IGNORE, is_read);
473         return 0;
474     }
475 
476     if ((error == ENOSPC && action == BLOCK_ERR_STOP_ENOSPC)
477             || action == BLOCK_ERR_STOP_ANY) {
478         s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
479         s->bus->dma->ops->add_status(s->bus->dma, op);
480         bdrv_mon_event(s->bs, BDRV_ACTION_STOP, is_read);
481         vm_stop(VMSTOP_DISKFULL);
482     } else {
483         if (op & BM_STATUS_DMA_RETRY) {
484             dma_buf_commit(s, 0);
485             ide_dma_error(s);
486         } else {
487             ide_rw_error(s);
488         }
489         bdrv_mon_event(s->bs, BDRV_ACTION_REPORT, is_read);
490     }
491 
492     return 1;
493 }
494 
495 void ide_dma_cb(void *opaque, int ret)
496 {
497     IDEState *s = opaque;
498     int n;
499     int64_t sector_num;
500 
501 handle_rw_error:
502     if (ret < 0) {
503         int op = BM_STATUS_DMA_RETRY;
504 
505         if (s->is_read)
506             op |= BM_STATUS_RETRY_READ;
507         if (ide_handle_rw_error(s, -ret, op)) {
508             return;
509         }
510     }
511 
512     n = s->io_buffer_size >> 9;
513     sector_num = ide_get_sector(s);
514     if (n > 0) {
515         dma_buf_commit(s, s->is_read);
516         sector_num += n;
517         ide_set_sector(s, sector_num);
518         s->nsector -= n;
519     }
520 
521     /* end of transfer ? */
522     if (s->nsector == 0) {
523         s->status = READY_STAT | SEEK_STAT;
524         ide_set_irq(s->bus);
525         goto eot;
526     }
527 
528     /* launch next transfer */
529     n = s->nsector;
530     s->io_buffer_index = 0;
531     s->io_buffer_size = n * 512;
532     if (s->bus->dma->ops->prepare_buf(s->bus->dma, s->is_read) == 0)
533         goto eot;
534 
535 #ifdef DEBUG_AIO
536     printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, is_read=%d\n",
537            sector_num, n, s->is_read);
538 #endif
539 
540     if (s->is_read) {
541         s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
542                                            ide_dma_cb, s);
543     } else {
544         s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
545                                             ide_dma_cb, s);
546     }
547 
548     if (!s->bus->dma->aiocb) {
549         ret = -1;
550         goto handle_rw_error;
551     }
552     return;
553 
554 eot:
555    s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT);
556    ide_set_inactive(s);
557 }
558 
559 static void ide_sector_start_dma(IDEState *s, int is_read)
560 {
561     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
562     s->io_buffer_index = 0;
563     s->io_buffer_size = 0;
564     s->is_read = is_read;
565     s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
566 }
567 
568 static void ide_sector_write_timer_cb(void *opaque)
569 {
570     IDEState *s = opaque;
571     ide_set_irq(s->bus);
572 }
573 
574 void ide_sector_write(IDEState *s)
575 {
576     int64_t sector_num;
577     int ret, n, n1;
578 
579     s->status = READY_STAT | SEEK_STAT;
580     sector_num = ide_get_sector(s);
581 #if defined(DEBUG_IDE)
582     printf("write sector=%" PRId64 "\n", sector_num);
583 #endif
584     n = s->nsector;
585     if (n > s->req_nb_sectors)
586         n = s->req_nb_sectors;
587     ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
588 
589     if (ret != 0) {
590         if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY))
591             return;
592     }
593 
594     s->nsector -= n;
595     if (s->nsector == 0) {
596         /* no more sectors to write */
597         ide_transfer_stop(s);
598     } else {
599         n1 = s->nsector;
600         if (n1 > s->req_nb_sectors)
601             n1 = s->req_nb_sectors;
602         ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
603     }
604     ide_set_sector(s, sector_num + n);
605 
606     if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
607         /* It seems there is a bug in the Windows 2000 installer HDD
608            IDE driver which fills the disk with empty logs when the
609            IDE write IRQ comes too early. This hack tries to correct
610            that at the expense of slower write performances. Use this
611            option _only_ to install Windows 2000. You must disable it
612            for normal use. */
613         qemu_mod_timer(s->sector_write_timer,
614                        qemu_get_clock_ns(vm_clock) + (get_ticks_per_sec() / 1000));
615     } else {
616         ide_set_irq(s->bus);
617     }
618 }
619 
620 void ide_atapi_cmd_ok(IDEState *s)
621 {
622     s->error = 0;
623     s->status = READY_STAT | SEEK_STAT;
624     s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
625     ide_set_irq(s->bus);
626 }
627 
628 void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
629 {
630 #ifdef DEBUG_IDE_ATAPI
631     printf("atapi_cmd_error: sense=0x%x asc=0x%x\n", sense_key, asc);
632 #endif
633     s->error = sense_key << 4;
634     s->status = READY_STAT | ERR_STAT;
635     s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
636     s->sense_key = sense_key;
637     s->asc = asc;
638     ide_set_irq(s->bus);
639 }
640 
641 static void ide_atapi_cmd_check_status(IDEState *s)
642 {
643 #ifdef DEBUG_IDE_ATAPI
644     printf("atapi_cmd_check_status\n");
645 #endif
646     s->error = MC_ERR | (SENSE_UNIT_ATTENTION << 4);
647     s->status = ERR_STAT;
648     s->nsector = 0;
649     ide_set_irq(s->bus);
650 }
651 
652 static void ide_flush_cb(void *opaque, int ret)
653 {
654     IDEState *s = opaque;
655 
656     if (ret < 0) {
657         /* XXX: What sector number to set here? */
658         if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
659             return;
660         }
661     }
662 
663     s->status = READY_STAT | SEEK_STAT;
664     ide_set_irq(s->bus);
665 }
666 
667 void ide_flush_cache(IDEState *s)
668 {
669     BlockDriverAIOCB *acb;
670 
671     if (s->bs == NULL) {
672         ide_flush_cb(s, 0);
673         return;
674     }
675 
676     acb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
677     if (acb == NULL) {
678         ide_flush_cb(s, -EIO);
679     }
680 }
681 
682 static inline void cpu_to_ube16(uint8_t *buf, int val)
683 {
684     buf[0] = val >> 8;
685     buf[1] = val & 0xff;
686 }
687 
688 static inline void cpu_to_ube32(uint8_t *buf, unsigned int val)
689 {
690     buf[0] = val >> 24;
691     buf[1] = val >> 16;
692     buf[2] = val >> 8;
693     buf[3] = val & 0xff;
694 }
695 
696 static inline int ube16_to_cpu(const uint8_t *buf)
697 {
698     return (buf[0] << 8) | buf[1];
699 }
700 
701 static inline int ube32_to_cpu(const uint8_t *buf)
702 {
703     return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
704 }
705 
706 static void lba_to_msf(uint8_t *buf, int lba)
707 {
708     lba += 150;
709     buf[0] = (lba / 75) / 60;
710     buf[1] = (lba / 75) % 60;
711     buf[2] = lba % 75;
712 }
713 
714 static void cd_data_to_raw(uint8_t *buf, int lba)
715 {
716     /* sync bytes */
717     buf[0] = 0x00;
718     memset(buf + 1, 0xff, 10);
719     buf[11] = 0x00;
720     buf += 12;
721     /* MSF */
722     lba_to_msf(buf, lba);
723     buf[3] = 0x01; /* mode 1 data */
724     buf += 4;
725     /* data */
726     buf += 2048;
727     /* XXX: ECC not computed */
728     memset(buf, 0, 288);
729 }
730 
731 static int cd_read_sector(BlockDriverState *bs, int lba, uint8_t *buf,
732                            int sector_size)
733 {
734     int ret;
735 
736     switch(sector_size) {
737     case 2048:
738         ret = bdrv_read(bs, (int64_t)lba << 2, buf, 4);
739         break;
740     case 2352:
741         ret = bdrv_read(bs, (int64_t)lba << 2, buf + 16, 4);
742         if (ret < 0)
743             return ret;
744         cd_data_to_raw(buf, lba);
745         break;
746     default:
747         ret = -EIO;
748         break;
749     }
750     return ret;
751 }
752 
753 void ide_atapi_io_error(IDEState *s, int ret)
754 {
755     /* XXX: handle more errors */
756     if (ret == -ENOMEDIUM) {
757         ide_atapi_cmd_error(s, SENSE_NOT_READY,
758                             ASC_MEDIUM_NOT_PRESENT);
759     } else {
760         ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
761                             ASC_LOGICAL_BLOCK_OOR);
762     }
763 }
764 
765 /* The whole ATAPI transfer logic is handled in this function */
766 static void ide_atapi_cmd_reply_end(IDEState *s)
767 {
768     int byte_count_limit, size, ret;
769 #ifdef DEBUG_IDE_ATAPI
770     printf("reply: tx_size=%d elem_tx_size=%d index=%d\n",
771            s->packet_transfer_size,
772            s->elementary_transfer_size,
773            s->io_buffer_index);
774 #endif
775     if (s->packet_transfer_size <= 0) {
776         /* end of transfer */
777         ide_transfer_stop(s);
778         s->status = READY_STAT | SEEK_STAT;
779         s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
780         ide_set_irq(s->bus);
781 #ifdef DEBUG_IDE_ATAPI
782         printf("status=0x%x\n", s->status);
783 #endif
784     } else {
785         /* see if a new sector must be read */
786         if (s->lba != -1 && s->io_buffer_index >= s->cd_sector_size) {
787             ret = cd_read_sector(s->bs, s->lba, s->io_buffer, s->cd_sector_size);
788             if (ret < 0) {
789                 ide_transfer_stop(s);
790                 ide_atapi_io_error(s, ret);
791                 return;
792             }
793             s->lba++;
794             s->io_buffer_index = 0;
795         }
796         if (s->elementary_transfer_size > 0) {
797             /* there are some data left to transmit in this elementary
798                transfer */
799             size = s->cd_sector_size - s->io_buffer_index;
800             if (size > s->elementary_transfer_size)
801                 size = s->elementary_transfer_size;
802             s->packet_transfer_size -= size;
803             s->elementary_transfer_size -= size;
804             s->io_buffer_index += size;
805             ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
806                                size, ide_atapi_cmd_reply_end);
807         } else {
808             /* a new transfer is needed */
809             s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO;
810             byte_count_limit = s->lcyl | (s->hcyl << 8);
811 #ifdef DEBUG_IDE_ATAPI
812             printf("byte_count_limit=%d\n", byte_count_limit);
813 #endif
814             if (byte_count_limit == 0xffff)
815                 byte_count_limit--;
816             size = s->packet_transfer_size;
817             if (size > byte_count_limit) {
818                 /* byte count limit must be even if this case */
819                 if (byte_count_limit & 1)
820                     byte_count_limit--;
821                 size = byte_count_limit;
822             }
823             s->lcyl = size;
824             s->hcyl = size >> 8;
825             s->elementary_transfer_size = size;
826             /* we cannot transmit more than one sector at a time */
827             if (s->lba != -1) {
828                 if (size > (s->cd_sector_size - s->io_buffer_index))
829                     size = (s->cd_sector_size - s->io_buffer_index);
830             }
831             s->packet_transfer_size -= size;
832             s->elementary_transfer_size -= size;
833             s->io_buffer_index += size;
834             ide_transfer_start(s, s->io_buffer + s->io_buffer_index - size,
835                                size, ide_atapi_cmd_reply_end);
836             ide_set_irq(s->bus);
837 #ifdef DEBUG_IDE_ATAPI
838             printf("status=0x%x\n", s->status);
839 #endif
840         }
841     }
842 }
843 
844 /* send a reply of 'size' bytes in s->io_buffer to an ATAPI command */
845 static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
846 {
847     if (size > max_size)
848         size = max_size;
849     s->lba = -1; /* no sector read */
850     s->packet_transfer_size = size;
851     s->io_buffer_size = size;    /* dma: send the reply data as one chunk */
852     s->elementary_transfer_size = 0;
853     s->io_buffer_index = 0;
854 
855     if (s->atapi_dma) {
856     	s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
857         s->bus->dma->ops->start_dma(s->bus->dma, s,
858                                    ide_atapi_cmd_read_dma_cb);
859     } else {
860     	s->status = READY_STAT | SEEK_STAT;
861     	ide_atapi_cmd_reply_end(s);
862     }
863 }
864 
865 /* start a CD-CDROM read command */
866 static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors,
867                                    int sector_size)
868 {
869     s->lba = lba;
870     s->packet_transfer_size = nb_sectors * sector_size;
871     s->elementary_transfer_size = 0;
872     s->io_buffer_index = sector_size;
873     s->cd_sector_size = sector_size;
874 
875     s->status = READY_STAT | SEEK_STAT;
876     ide_atapi_cmd_reply_end(s);
877 }
878 
879 /* ATAPI DMA support */
880 
881 /* XXX: handle read errors */
882 static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
883 {
884     IDEState *s = opaque;
885     int data_offset, n;
886 
887     if (ret < 0) {
888         ide_atapi_io_error(s, ret);
889         goto eot;
890     }
891 
892     if (s->io_buffer_size > 0) {
893 	/*
894 	 * For a cdrom read sector command (s->lba != -1),
895 	 * adjust the lba for the next s->io_buffer_size chunk
896 	 * and dma the current chunk.
897 	 * For a command != read (s->lba == -1), just transfer
898 	 * the reply data.
899 	 */
900 	if (s->lba != -1) {
901 	    if (s->cd_sector_size == 2352) {
902 		n = 1;
903 		cd_data_to_raw(s->io_buffer, s->lba);
904 	    } else {
905 		n = s->io_buffer_size >> 11;
906 	    }
907 	    s->lba += n;
908 	}
909         s->packet_transfer_size -= s->io_buffer_size;
910         if (s->bus->dma->ops->rw_buf(s->bus->dma, 1) == 0)
911             goto eot;
912     }
913 
914     if (s->packet_transfer_size <= 0) {
915         s->status = READY_STAT | SEEK_STAT;
916         s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
917         ide_set_irq(s->bus);
918     eot:
919         s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_INT);
920         ide_set_inactive(s);
921         return;
922     }
923 
924     s->io_buffer_index = 0;
925     if (s->cd_sector_size == 2352) {
926         n = 1;
927         s->io_buffer_size = s->cd_sector_size;
928         data_offset = 16;
929     } else {
930         n = s->packet_transfer_size >> 11;
931         if (n > (IDE_DMA_BUF_SECTORS / 4))
932             n = (IDE_DMA_BUF_SECTORS / 4);
933         s->io_buffer_size = n * 2048;
934         data_offset = 0;
935     }
936 #ifdef DEBUG_AIO
937     printf("aio_read_cd: lba=%u n=%d\n", s->lba, n);
938 #endif
939     s->bus->dma->iov.iov_base = (void *)(s->io_buffer + data_offset);
940     s->bus->dma->iov.iov_len = n * 4 * 512;
941     qemu_iovec_init_external(&s->bus->dma->qiov, &s->bus->dma->iov, 1);
942     s->bus->dma->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2,
943                                        &s->bus->dma->qiov, n * 4,
944                                        ide_atapi_cmd_read_dma_cb, s);
945     if (!s->bus->dma->aiocb) {
946         /* Note: media not present is the most likely case */
947         ide_atapi_cmd_error(s, SENSE_NOT_READY,
948                             ASC_MEDIUM_NOT_PRESENT);
949         goto eot;
950     }
951 }
952 
953 /* start a CD-CDROM read command with DMA */
954 /* XXX: test if DMA is available */
955 static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
956                                    int sector_size)
957 {
958     s->lba = lba;
959     s->packet_transfer_size = nb_sectors * sector_size;
960     s->io_buffer_index = 0;
961     s->io_buffer_size = 0;
962     s->cd_sector_size = sector_size;
963 
964     /* XXX: check if BUSY_STAT should be set */
965     s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
966     s->bus->dma->ops->start_dma(s->bus->dma, s,
967                                ide_atapi_cmd_read_dma_cb);
968 }
969 
970 static void ide_atapi_cmd_read(IDEState *s, int lba, int nb_sectors,
971                                int sector_size)
972 {
973 #ifdef DEBUG_IDE_ATAPI
974     printf("read %s: LBA=%d nb_sectors=%d\n", s->atapi_dma ? "dma" : "pio",
975 	lba, nb_sectors);
976 #endif
977     if (s->atapi_dma) {
978         ide_atapi_cmd_read_dma(s, lba, nb_sectors, sector_size);
979     } else {
980         ide_atapi_cmd_read_pio(s, lba, nb_sectors, sector_size);
981     }
982 }
983 
984 static inline uint8_t ide_atapi_set_profile(uint8_t *buf, uint8_t *index,
985                                             uint16_t profile)
986 {
987     uint8_t *buf_profile = buf + 12; /* start of profiles */
988 
989     buf_profile += ((*index) * 4); /* start of indexed profile */
990     cpu_to_ube16 (buf_profile, profile);
991     buf_profile[2] = ((buf_profile[0] == buf[6]) && (buf_profile[1] == buf[7]));
992 
993     /* each profile adds 4 bytes to the response */
994     (*index)++;
995     buf[11] += 4; /* Additional Length */
996 
997     return 4;
998 }
999 
1000 static int ide_dvd_read_structure(IDEState *s, int format,
1001                                   const uint8_t *packet, uint8_t *buf)
1002 {
1003     switch (format) {
1004         case 0x0: /* Physical format information */
1005             {
1006                 int layer = packet[6];
1007                 uint64_t total_sectors;
1008 
1009                 if (layer != 0)
1010                     return -ASC_INV_FIELD_IN_CMD_PACKET;
1011 
1012                 bdrv_get_geometry(s->bs, &total_sectors);
1013                 total_sectors >>= 2;
1014                 if (total_sectors == 0)
1015                     return -ASC_MEDIUM_NOT_PRESENT;
1016 
1017                 buf[4] = 1;   /* DVD-ROM, part version 1 */
1018                 buf[5] = 0xf; /* 120mm disc, minimum rate unspecified */
1019                 buf[6] = 1;   /* one layer, read-only (per MMC-2 spec) */
1020                 buf[7] = 0;   /* default densities */
1021 
1022                 /* FIXME: 0x30000 per spec? */
1023                 cpu_to_ube32(buf + 8, 0); /* start sector */
1024                 cpu_to_ube32(buf + 12, total_sectors - 1); /* end sector */
1025                 cpu_to_ube32(buf + 16, total_sectors - 1); /* l0 end sector */
1026 
1027                 /* Size of buffer, not including 2 byte size field */
1028                 cpu_to_be16wu((uint16_t *)buf, 2048 + 2);
1029 
1030                 /* 2k data + 4 byte header */
1031                 return (2048 + 4);
1032             }
1033 
1034         case 0x01: /* DVD copyright information */
1035             buf[4] = 0; /* no copyright data */
1036             buf[5] = 0; /* no region restrictions */
1037 
1038             /* Size of buffer, not including 2 byte size field */
1039             cpu_to_be16wu((uint16_t *)buf, 4 + 2);
1040 
1041             /* 4 byte header + 4 byte data */
1042             return (4 + 4);
1043 
1044         case 0x03: /* BCA information - invalid field for no BCA info */
1045             return -ASC_INV_FIELD_IN_CMD_PACKET;
1046 
1047         case 0x04: /* DVD disc manufacturing information */
1048             /* Size of buffer, not including 2 byte size field */
1049             cpu_to_be16wu((uint16_t *)buf, 2048 + 2);
1050 
1051             /* 2k data + 4 byte header */
1052             return (2048 + 4);
1053 
1054         case 0xff:
1055             /*
1056              * This lists all the command capabilities above.  Add new ones
1057              * in order and update the length and buffer return values.
1058              */
1059 
1060             buf[4] = 0x00; /* Physical format */
1061             buf[5] = 0x40; /* Not writable, is readable */
1062             cpu_to_be16wu((uint16_t *)(buf + 6), 2048 + 4);
1063 
1064             buf[8] = 0x01; /* Copyright info */
1065             buf[9] = 0x40; /* Not writable, is readable */
1066             cpu_to_be16wu((uint16_t *)(buf + 10), 4 + 4);
1067 
1068             buf[12] = 0x03; /* BCA info */
1069             buf[13] = 0x40; /* Not writable, is readable */
1070             cpu_to_be16wu((uint16_t *)(buf + 14), 188 + 4);
1071 
1072             buf[16] = 0x04; /* Manufacturing info */
1073             buf[17] = 0x40; /* Not writable, is readable */
1074             cpu_to_be16wu((uint16_t *)(buf + 18), 2048 + 4);
1075 
1076             /* Size of buffer, not including 2 byte size field */
1077             cpu_to_be16wu((uint16_t *)buf, 16 + 2);
1078 
1079             /* data written + 4 byte header */
1080             return (16 + 4);
1081 
1082         default: /* TODO: formats beyond DVD-ROM requires */
1083             return -ASC_INV_FIELD_IN_CMD_PACKET;
1084     }
1085 }
1086 
1087 static void ide_atapi_cmd(IDEState *s)
1088 {
1089     const uint8_t *packet;
1090     uint8_t *buf;
1091     int max_len;
1092 
1093     packet = s->io_buffer;
1094     buf = s->io_buffer;
1095 #ifdef DEBUG_IDE_ATAPI
1096     {
1097         int i;
1098         printf("ATAPI limit=0x%x packet:", s->lcyl | (s->hcyl << 8));
1099         for(i = 0; i < ATAPI_PACKET_SIZE; i++) {
1100             printf(" %02x", packet[i]);
1101         }
1102         printf("\n");
1103     }
1104 #endif
1105     /* If there's a UNIT_ATTENTION condition pending, only
1106        REQUEST_SENSE and INQUIRY commands are allowed to complete. */
1107     if (s->sense_key == SENSE_UNIT_ATTENTION &&
1108 	s->io_buffer[0] != GPCMD_REQUEST_SENSE &&
1109 	s->io_buffer[0] != GPCMD_INQUIRY) {
1110 	ide_atapi_cmd_check_status(s);
1111 	return;
1112     }
1113     switch(s->io_buffer[0]) {
1114     case GPCMD_TEST_UNIT_READY:
1115         if (bdrv_is_inserted(s->bs) && !s->cdrom_changed) {
1116             ide_atapi_cmd_ok(s);
1117         } else {
1118             s->cdrom_changed = 0;
1119             ide_atapi_cmd_error(s, SENSE_NOT_READY,
1120                                 ASC_MEDIUM_NOT_PRESENT);
1121         }
1122         break;
1123     case GPCMD_MODE_SENSE_6:
1124     case GPCMD_MODE_SENSE_10:
1125         {
1126             int action, code;
1127             if (packet[0] == GPCMD_MODE_SENSE_10)
1128                 max_len = ube16_to_cpu(packet + 7);
1129             else
1130                 max_len = packet[4];
1131             action = packet[2] >> 6;
1132             code = packet[2] & 0x3f;
1133             switch(action) {
1134             case 0: /* current values */
1135                 switch(code) {
1136                 case GPMODE_R_W_ERROR_PAGE: /* error recovery */
1137                     cpu_to_ube16(&buf[0], 16 + 6);
1138                     buf[2] = 0x70;
1139                     buf[3] = 0;
1140                     buf[4] = 0;
1141                     buf[5] = 0;
1142                     buf[6] = 0;
1143                     buf[7] = 0;
1144 
1145                     buf[8] = 0x01;
1146                     buf[9] = 0x06;
1147                     buf[10] = 0x00;
1148                     buf[11] = 0x05;
1149                     buf[12] = 0x00;
1150                     buf[13] = 0x00;
1151                     buf[14] = 0x00;
1152                     buf[15] = 0x00;
1153                     ide_atapi_cmd_reply(s, 16, max_len);
1154                     break;
1155                 case GPMODE_AUDIO_CTL_PAGE:
1156                     cpu_to_ube16(&buf[0], 24 + 6);
1157                     buf[2] = 0x70;
1158                     buf[3] = 0;
1159                     buf[4] = 0;
1160                     buf[5] = 0;
1161                     buf[6] = 0;
1162                     buf[7] = 0;
1163 
1164                     /* Fill with CDROM audio volume */
1165                     buf[17] = 0;
1166                     buf[19] = 0;
1167                     buf[21] = 0;
1168                     buf[23] = 0;
1169 
1170                     ide_atapi_cmd_reply(s, 24, max_len);
1171                     break;
1172                 case GPMODE_CAPABILITIES_PAGE:
1173                     cpu_to_ube16(&buf[0], 28 + 6);
1174                     buf[2] = 0x70;
1175                     buf[3] = 0;
1176                     buf[4] = 0;
1177                     buf[5] = 0;
1178                     buf[6] = 0;
1179                     buf[7] = 0;
1180 
1181                     buf[8] = 0x2a;
1182                     buf[9] = 0x12;
1183                     buf[10] = 0x00;
1184                     buf[11] = 0x00;
1185 
1186                     /* Claim PLAY_AUDIO capability (0x01) since some Linux
1187                        code checks for this to automount media. */
1188                     buf[12] = 0x71;
1189                     buf[13] = 3 << 5;
1190                     buf[14] = (1 << 0) | (1 << 3) | (1 << 5);
1191                     if (bdrv_is_locked(s->bs))
1192                         buf[6] |= 1 << 1;
1193                     buf[15] = 0x00;
1194                     cpu_to_ube16(&buf[16], 706);
1195                     buf[18] = 0;
1196                     buf[19] = 2;
1197                     cpu_to_ube16(&buf[20], 512);
1198                     cpu_to_ube16(&buf[22], 706);
1199                     buf[24] = 0;
1200                     buf[25] = 0;
1201                     buf[26] = 0;
1202                     buf[27] = 0;
1203                     ide_atapi_cmd_reply(s, 28, max_len);
1204                     break;
1205                 default:
1206                     goto error_cmd;
1207                 }
1208                 break;
1209             case 1: /* changeable values */
1210                 goto error_cmd;
1211             case 2: /* default values */
1212                 goto error_cmd;
1213             default:
1214             case 3: /* saved values */
1215                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1216                                     ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1217                 break;
1218             }
1219         }
1220         break;
1221     case GPCMD_REQUEST_SENSE:
1222         max_len = packet[4];
1223         memset(buf, 0, 18);
1224         buf[0] = 0x70 | (1 << 7);
1225         buf[2] = s->sense_key;
1226         buf[7] = 10;
1227         buf[12] = s->asc;
1228         if (s->sense_key == SENSE_UNIT_ATTENTION)
1229             s->sense_key = SENSE_NONE;
1230         ide_atapi_cmd_reply(s, 18, max_len);
1231         break;
1232     case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
1233         if (bdrv_is_inserted(s->bs)) {
1234             bdrv_set_locked(s->bs, packet[4] & 1);
1235             ide_atapi_cmd_ok(s);
1236         } else {
1237             ide_atapi_cmd_error(s, SENSE_NOT_READY,
1238                                 ASC_MEDIUM_NOT_PRESENT);
1239         }
1240         break;
1241     case GPCMD_READ_10:
1242     case GPCMD_READ_12:
1243         {
1244             int nb_sectors, lba;
1245 
1246             if (packet[0] == GPCMD_READ_10)
1247                 nb_sectors = ube16_to_cpu(packet + 7);
1248             else
1249                 nb_sectors = ube32_to_cpu(packet + 6);
1250             lba = ube32_to_cpu(packet + 2);
1251             if (nb_sectors == 0) {
1252                 ide_atapi_cmd_ok(s);
1253                 break;
1254             }
1255             ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
1256         }
1257         break;
1258     case GPCMD_READ_CD:
1259         {
1260             int nb_sectors, lba, transfer_request;
1261 
1262             nb_sectors = (packet[6] << 16) | (packet[7] << 8) | packet[8];
1263             lba = ube32_to_cpu(packet + 2);
1264             if (nb_sectors == 0) {
1265                 ide_atapi_cmd_ok(s);
1266                 break;
1267             }
1268             transfer_request = packet[9];
1269             switch(transfer_request & 0xf8) {
1270             case 0x00:
1271                 /* nothing */
1272                 ide_atapi_cmd_ok(s);
1273                 break;
1274             case 0x10:
1275                 /* normal read */
1276                 ide_atapi_cmd_read(s, lba, nb_sectors, 2048);
1277                 break;
1278             case 0xf8:
1279                 /* read all data */
1280                 ide_atapi_cmd_read(s, lba, nb_sectors, 2352);
1281                 break;
1282             default:
1283                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1284                                     ASC_INV_FIELD_IN_CMD_PACKET);
1285                 break;
1286             }
1287         }
1288         break;
1289     case GPCMD_SEEK:
1290         {
1291             unsigned int lba;
1292             uint64_t total_sectors;
1293 
1294             bdrv_get_geometry(s->bs, &total_sectors);
1295             total_sectors >>= 2;
1296             if (total_sectors == 0) {
1297                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1298                                     ASC_MEDIUM_NOT_PRESENT);
1299                 break;
1300             }
1301             lba = ube32_to_cpu(packet + 2);
1302             if (lba >= total_sectors) {
1303                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1304                                     ASC_LOGICAL_BLOCK_OOR);
1305                 break;
1306             }
1307             ide_atapi_cmd_ok(s);
1308         }
1309         break;
1310     case GPCMD_START_STOP_UNIT:
1311         {
1312             int start, eject, err = 0;
1313             start = packet[4] & 1;
1314             eject = (packet[4] >> 1) & 1;
1315 
1316             if (eject) {
1317                 err = bdrv_eject(s->bs, !start);
1318             }
1319 
1320             switch (err) {
1321             case 0:
1322                 ide_atapi_cmd_ok(s);
1323                 break;
1324             case -EBUSY:
1325                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1326                                     ASC_MEDIA_REMOVAL_PREVENTED);
1327                 break;
1328             default:
1329                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1330                                     ASC_MEDIUM_NOT_PRESENT);
1331                 break;
1332             }
1333         }
1334         break;
1335     case GPCMD_MECHANISM_STATUS:
1336         {
1337             max_len = ube16_to_cpu(packet + 8);
1338             cpu_to_ube16(buf, 0);
1339             /* no current LBA */
1340             buf[2] = 0;
1341             buf[3] = 0;
1342             buf[4] = 0;
1343             buf[5] = 1;
1344             cpu_to_ube16(buf + 6, 0);
1345             ide_atapi_cmd_reply(s, 8, max_len);
1346         }
1347         break;
1348     case GPCMD_READ_TOC_PMA_ATIP:
1349         {
1350             int format, msf, start_track, len;
1351             uint64_t total_sectors;
1352 
1353             bdrv_get_geometry(s->bs, &total_sectors);
1354             total_sectors >>= 2;
1355             if (total_sectors == 0) {
1356                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1357                                     ASC_MEDIUM_NOT_PRESENT);
1358                 break;
1359             }
1360             max_len = ube16_to_cpu(packet + 7);
1361             format = packet[9] >> 6;
1362             msf = (packet[1] >> 1) & 1;
1363             start_track = packet[6];
1364             switch(format) {
1365             case 0:
1366                 len = cdrom_read_toc(total_sectors, buf, msf, start_track);
1367                 if (len < 0)
1368                     goto error_cmd;
1369                 ide_atapi_cmd_reply(s, len, max_len);
1370                 break;
1371             case 1:
1372                 /* multi session : only a single session defined */
1373                 memset(buf, 0, 12);
1374                 buf[1] = 0x0a;
1375                 buf[2] = 0x01;
1376                 buf[3] = 0x01;
1377                 ide_atapi_cmd_reply(s, 12, max_len);
1378                 break;
1379             case 2:
1380                 len = cdrom_read_toc_raw(total_sectors, buf, msf, start_track);
1381                 if (len < 0)
1382                     goto error_cmd;
1383                 ide_atapi_cmd_reply(s, len, max_len);
1384                 break;
1385             default:
1386             error_cmd:
1387                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1388                                     ASC_INV_FIELD_IN_CMD_PACKET);
1389                 break;
1390             }
1391         }
1392         break;
1393     case GPCMD_READ_CDVD_CAPACITY:
1394         {
1395             uint64_t total_sectors;
1396 
1397             bdrv_get_geometry(s->bs, &total_sectors);
1398             total_sectors >>= 2;
1399             if (total_sectors == 0) {
1400                 ide_atapi_cmd_error(s, SENSE_NOT_READY,
1401                                     ASC_MEDIUM_NOT_PRESENT);
1402                 break;
1403             }
1404             /* NOTE: it is really the number of sectors minus 1 */
1405             cpu_to_ube32(buf, total_sectors - 1);
1406             cpu_to_ube32(buf + 4, 2048);
1407             ide_atapi_cmd_reply(s, 8, 8);
1408         }
1409         break;
1410     case GPCMD_READ_DVD_STRUCTURE:
1411         {
1412             int media = packet[1];
1413             int format = packet[7];
1414             int ret;
1415 
1416             max_len = ube16_to_cpu(packet + 8);
1417 
1418             if (format < 0xff) {
1419                 if (media_is_cd(s)) {
1420                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1421                                         ASC_INCOMPATIBLE_FORMAT);
1422                     break;
1423                 } else if (!media_present(s)) {
1424                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1425                                         ASC_INV_FIELD_IN_CMD_PACKET);
1426                     break;
1427                 }
1428             }
1429 
1430             memset(buf, 0, max_len > IDE_DMA_BUF_SECTORS * 512 + 4 ?
1431                    IDE_DMA_BUF_SECTORS * 512 + 4 : max_len);
1432 
1433             switch (format) {
1434                 case 0x00 ... 0x7f:
1435                 case 0xff:
1436                     if (media == 0) {
1437                         ret = ide_dvd_read_structure(s, format, packet, buf);
1438 
1439                         if (ret < 0)
1440                             ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, -ret);
1441                         else
1442                             ide_atapi_cmd_reply(s, ret, max_len);
1443 
1444                         break;
1445                     }
1446                     /* TODO: BD support, fall through for now */
1447 
1448                 /* Generic disk structures */
1449                 case 0x80: /* TODO: AACS volume identifier */
1450                 case 0x81: /* TODO: AACS media serial number */
1451                 case 0x82: /* TODO: AACS media identifier */
1452                 case 0x83: /* TODO: AACS media key block */
1453                 case 0x90: /* TODO: List of recognized format layers */
1454                 case 0xc0: /* TODO: Write protection status */
1455                 default:
1456                     ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1457                                         ASC_INV_FIELD_IN_CMD_PACKET);
1458                     break;
1459             }
1460         }
1461         break;
1462     case GPCMD_SET_SPEED:
1463         ide_atapi_cmd_ok(s);
1464         break;
1465     case GPCMD_INQUIRY:
1466         max_len = packet[4];
1467         buf[0] = 0x05; /* CD-ROM */
1468         buf[1] = 0x80; /* removable */
1469         buf[2] = 0x00; /* ISO */
1470         buf[3] = 0x21; /* ATAPI-2 (XXX: put ATAPI-4 ?) */
1471         buf[4] = 31; /* additional length */
1472         buf[5] = 0; /* reserved */
1473         buf[6] = 0; /* reserved */
1474         buf[7] = 0; /* reserved */
1475         padstr8(buf + 8, 8, "QEMU");
1476         padstr8(buf + 16, 16, "QEMU DVD-ROM");
1477         padstr8(buf + 32, 4, s->version);
1478         ide_atapi_cmd_reply(s, 36, max_len);
1479         break;
1480     case GPCMD_GET_CONFIGURATION:
1481         {
1482             uint32_t len;
1483             uint8_t index = 0;
1484 
1485             /* only feature 0 is supported */
1486             if (packet[2] != 0 || packet[3] != 0) {
1487                 ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1488                                     ASC_INV_FIELD_IN_CMD_PACKET);
1489                 break;
1490             }
1491 
1492             /* XXX: could result in alignment problems in some architectures */
1493             max_len = ube16_to_cpu(packet + 7);
1494 
1495             /*
1496              * XXX: avoid overflow for io_buffer if max_len is bigger than
1497              *      the size of that buffer (dimensioned to max number of
1498              *      sectors to transfer at once)
1499              *
1500              *      Only a problem if the feature/profiles grow.
1501              */
1502             if (max_len > 512) /* XXX: assume 1 sector */
1503                 max_len = 512;
1504 
1505             memset(buf, 0, max_len);
1506             /*
1507              * the number of sectors from the media tells us which profile
1508              * to use as current.  0 means there is no media
1509              */
1510             if (media_is_dvd(s))
1511                 cpu_to_ube16(buf + 6, MMC_PROFILE_DVD_ROM);
1512             else if (media_is_cd(s))
1513                 cpu_to_ube16(buf + 6, MMC_PROFILE_CD_ROM);
1514 
1515             buf[10] = 0x02 | 0x01; /* persistent and current */
1516             len = 12; /* headers: 8 + 4 */
1517             len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_DVD_ROM);
1518             len += ide_atapi_set_profile(buf, &index, MMC_PROFILE_CD_ROM);
1519             cpu_to_ube32(buf, len - 4); /* data length */
1520 
1521             ide_atapi_cmd_reply(s, len, max_len);
1522             break;
1523         }
1524     case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
1525         max_len = ube16_to_cpu(packet + 7);
1526 
1527         if (packet[1] & 0x01) { /* polling */
1528             /* We don't support any event class (yet). */
1529             cpu_to_ube16(buf, 0x00); /* No event descriptor returned */
1530             buf[2] = 0x80;           /* No Event Available (NEA) */
1531             buf[3] = 0x00;           /* Empty supported event classes */
1532             ide_atapi_cmd_reply(s, 4, max_len);
1533         } else { /* asynchronous mode */
1534             /* Only polling is supported, asynchronous mode is not. */
1535             ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1536                                 ASC_INV_FIELD_IN_CMD_PACKET);
1537         }
1538         break;
1539     default:
1540         ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST,
1541                             ASC_ILLEGAL_OPCODE);
1542         break;
1543     }
1544 }
1545 
1546 static void ide_cfata_metadata_inquiry(IDEState *s)
1547 {
1548     uint16_t *p;
1549     uint32_t spd;
1550 
1551     p = (uint16_t *) s->io_buffer;
1552     memset(p, 0, 0x200);
1553     spd = ((s->mdata_size - 1) >> 9) + 1;
1554 
1555     put_le16(p + 0, 0x0001);			/* Data format revision */
1556     put_le16(p + 1, 0x0000);			/* Media property: silicon */
1557     put_le16(p + 2, s->media_changed);		/* Media status */
1558     put_le16(p + 3, s->mdata_size & 0xffff);	/* Capacity in bytes (low) */
1559     put_le16(p + 4, s->mdata_size >> 16);	/* Capacity in bytes (high) */
1560     put_le16(p + 5, spd & 0xffff);		/* Sectors per device (low) */
1561     put_le16(p + 6, spd >> 16);			/* Sectors per device (high) */
1562 }
1563 
1564 static void ide_cfata_metadata_read(IDEState *s)
1565 {
1566     uint16_t *p;
1567 
1568     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
1569         s->status = ERR_STAT;
1570         s->error = ABRT_ERR;
1571         return;
1572     }
1573 
1574     p = (uint16_t *) s->io_buffer;
1575     memset(p, 0, 0x200);
1576 
1577     put_le16(p + 0, s->media_changed);		/* Media status */
1578     memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
1579                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
1580                                     s->nsector << 9), 0x200 - 2));
1581 }
1582 
1583 static void ide_cfata_metadata_write(IDEState *s)
1584 {
1585     if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
1586         s->status = ERR_STAT;
1587         s->error = ABRT_ERR;
1588         return;
1589     }
1590 
1591     s->media_changed = 0;
1592 
1593     memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
1594                     s->io_buffer + 2,
1595                     MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
1596                                     s->nsector << 9), 0x200 - 2));
1597 }
1598 
1599 /* called when the inserted state of the media has changed */
1600 static void cdrom_change_cb(void *opaque, int reason)
1601 {
1602     IDEState *s = opaque;
1603     uint64_t nb_sectors;
1604 
1605     if (!(reason & CHANGE_MEDIA)) {
1606         return;
1607     }
1608 
1609     bdrv_get_geometry(s->bs, &nb_sectors);
1610     s->nb_sectors = nb_sectors;
1611 
1612     s->sense_key = SENSE_UNIT_ATTENTION;
1613     s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED;
1614     s->cdrom_changed = 1;
1615     ide_set_irq(s->bus);
1616 }
1617 
1618 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
1619 {
1620     s->lba48 = lba48;
1621 
1622     /* handle the 'magic' 0 nsector count conversion here. to avoid
1623      * fiddling with the rest of the read logic, we just store the
1624      * full sector count in ->nsector and ignore ->hob_nsector from now
1625      */
1626     if (!s->lba48) {
1627 	if (!s->nsector)
1628 	    s->nsector = 256;
1629     } else {
1630 	if (!s->nsector && !s->hob_nsector)
1631 	    s->nsector = 65536;
1632 	else {
1633 	    int lo = s->nsector;
1634 	    int hi = s->hob_nsector;
1635 
1636 	    s->nsector = (hi << 8) | lo;
1637 	}
1638     }
1639 }
1640 
1641 static void ide_clear_hob(IDEBus *bus)
1642 {
1643     /* any write clears HOB high bit of device control register */
1644     bus->ifs[0].select &= ~(1 << 7);
1645     bus->ifs[1].select &= ~(1 << 7);
1646 }
1647 
1648 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1649 {
1650     IDEBus *bus = opaque;
1651 
1652 #ifdef DEBUG_IDE
1653     printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
1654 #endif
1655 
1656     addr &= 7;
1657 
1658     /* ignore writes to command block while busy with previous command */
1659     if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
1660         return;
1661 
1662     switch(addr) {
1663     case 0:
1664         break;
1665     case 1:
1666 	ide_clear_hob(bus);
1667         /* NOTE: data is written to the two drives */
1668 	bus->ifs[0].hob_feature = bus->ifs[0].feature;
1669 	bus->ifs[1].hob_feature = bus->ifs[1].feature;
1670         bus->ifs[0].feature = val;
1671         bus->ifs[1].feature = val;
1672         break;
1673     case 2:
1674 	ide_clear_hob(bus);
1675 	bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
1676 	bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
1677         bus->ifs[0].nsector = val;
1678         bus->ifs[1].nsector = val;
1679         break;
1680     case 3:
1681 	ide_clear_hob(bus);
1682 	bus->ifs[0].hob_sector = bus->ifs[0].sector;
1683 	bus->ifs[1].hob_sector = bus->ifs[1].sector;
1684         bus->ifs[0].sector = val;
1685         bus->ifs[1].sector = val;
1686         break;
1687     case 4:
1688 	ide_clear_hob(bus);
1689 	bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
1690 	bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
1691         bus->ifs[0].lcyl = val;
1692         bus->ifs[1].lcyl = val;
1693         break;
1694     case 5:
1695 	ide_clear_hob(bus);
1696 	bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
1697 	bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
1698         bus->ifs[0].hcyl = val;
1699         bus->ifs[1].hcyl = val;
1700         break;
1701     case 6:
1702 	/* FIXME: HOB readback uses bit 7 */
1703         bus->ifs[0].select = (val & ~0x10) | 0xa0;
1704         bus->ifs[1].select = (val | 0x10) | 0xa0;
1705         /* select drive */
1706         bus->unit = (val >> 4) & 1;
1707         break;
1708     default:
1709     case 7:
1710         /* command */
1711         ide_exec_cmd(bus, val);
1712         break;
1713     }
1714 }
1715 
1716 
1717 void ide_exec_cmd(IDEBus *bus, uint32_t val)
1718 {
1719     IDEState *s;
1720     int n;
1721     int lba48 = 0;
1722 
1723 #if defined(DEBUG_IDE)
1724     printf("ide: CMD=%02x\n", val);
1725 #endif
1726     s = idebus_active_if(bus);
1727     /* ignore commands to non existant slave */
1728     if (s != bus->ifs && !s->bs)
1729         return;
1730 
1731     /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1732     if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1733         return;
1734 
1735     switch(val) {
1736     case WIN_IDENTIFY:
1737         if (s->bs && s->drive_kind != IDE_CD) {
1738             if (s->drive_kind != IDE_CFATA)
1739                 ide_identify(s);
1740             else
1741                 ide_cfata_identify(s);
1742             s->status = READY_STAT | SEEK_STAT;
1743             ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1744         } else {
1745             if (s->drive_kind == IDE_CD) {
1746                 ide_set_signature(s);
1747             }
1748             ide_abort_command(s);
1749         }
1750         ide_set_irq(s->bus);
1751         break;
1752     case WIN_SPECIFY:
1753     case WIN_RECAL:
1754         s->error = 0;
1755         s->status = READY_STAT | SEEK_STAT;
1756         ide_set_irq(s->bus);
1757         break;
1758     case WIN_SETMULT:
1759         if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1760             /* Disable Read and Write Multiple */
1761             s->mult_sectors = 0;
1762             s->status = READY_STAT | SEEK_STAT;
1763         } else if ((s->nsector & 0xff) != 0 &&
1764             ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1765              (s->nsector & (s->nsector - 1)) != 0)) {
1766             ide_abort_command(s);
1767         } else {
1768             s->mult_sectors = s->nsector & 0xff;
1769             s->status = READY_STAT | SEEK_STAT;
1770         }
1771         ide_set_irq(s->bus);
1772         break;
1773     case WIN_VERIFY_EXT:
1774 	lba48 = 1;
1775     case WIN_VERIFY:
1776     case WIN_VERIFY_ONCE:
1777         /* do sector number check ? */
1778 	ide_cmd_lba48_transform(s, lba48);
1779         s->status = READY_STAT | SEEK_STAT;
1780         ide_set_irq(s->bus);
1781         break;
1782 	case WIN_READ_EXT:
1783 	lba48 = 1;
1784     case WIN_READ:
1785     case WIN_READ_ONCE:
1786         if (!s->bs)
1787             goto abort_cmd;
1788 	ide_cmd_lba48_transform(s, lba48);
1789         s->req_nb_sectors = 1;
1790         ide_sector_read(s);
1791         break;
1792 	case WIN_WRITE_EXT:
1793 	lba48 = 1;
1794     case WIN_WRITE:
1795     case WIN_WRITE_ONCE:
1796     case CFA_WRITE_SECT_WO_ERASE:
1797     case WIN_WRITE_VERIFY:
1798 	ide_cmd_lba48_transform(s, lba48);
1799         s->error = 0;
1800         s->status = SEEK_STAT | READY_STAT;
1801         s->req_nb_sectors = 1;
1802         ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1803         s->media_changed = 1;
1804         break;
1805 	case WIN_MULTREAD_EXT:
1806 	lba48 = 1;
1807     case WIN_MULTREAD:
1808         if (!s->mult_sectors)
1809             goto abort_cmd;
1810 	ide_cmd_lba48_transform(s, lba48);
1811         s->req_nb_sectors = s->mult_sectors;
1812         ide_sector_read(s);
1813         break;
1814     case WIN_MULTWRITE_EXT:
1815 	lba48 = 1;
1816     case WIN_MULTWRITE:
1817     case CFA_WRITE_MULTI_WO_ERASE:
1818         if (!s->mult_sectors)
1819             goto abort_cmd;
1820 	ide_cmd_lba48_transform(s, lba48);
1821         s->error = 0;
1822         s->status = SEEK_STAT | READY_STAT;
1823         s->req_nb_sectors = s->mult_sectors;
1824         n = s->nsector;
1825         if (n > s->req_nb_sectors)
1826             n = s->req_nb_sectors;
1827         ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1828         s->media_changed = 1;
1829         break;
1830 	case WIN_READDMA_EXT:
1831 	lba48 = 1;
1832     case WIN_READDMA:
1833     case WIN_READDMA_ONCE:
1834         if (!s->bs)
1835             goto abort_cmd;
1836 	ide_cmd_lba48_transform(s, lba48);
1837         ide_sector_start_dma(s, 1);
1838         break;
1839 	case WIN_WRITEDMA_EXT:
1840 	lba48 = 1;
1841     case WIN_WRITEDMA:
1842     case WIN_WRITEDMA_ONCE:
1843         if (!s->bs)
1844             goto abort_cmd;
1845 	ide_cmd_lba48_transform(s, lba48);
1846         ide_sector_start_dma(s, 0);
1847         s->media_changed = 1;
1848         break;
1849     case WIN_READ_NATIVE_MAX_EXT:
1850 	lba48 = 1;
1851     case WIN_READ_NATIVE_MAX:
1852 	ide_cmd_lba48_transform(s, lba48);
1853         ide_set_sector(s, s->nb_sectors - 1);
1854         s->status = READY_STAT | SEEK_STAT;
1855         ide_set_irq(s->bus);
1856         break;
1857     case WIN_CHECKPOWERMODE1:
1858     case WIN_CHECKPOWERMODE2:
1859         s->error = 0;
1860         s->nsector = 0xff; /* device active or idle */
1861         s->status = READY_STAT | SEEK_STAT;
1862         ide_set_irq(s->bus);
1863         break;
1864     case WIN_SETFEATURES:
1865         if (!s->bs)
1866             goto abort_cmd;
1867         /* XXX: valid for CDROM ? */
1868         switch(s->feature) {
1869         case 0xcc: /* reverting to power-on defaults enable */
1870         case 0x66: /* reverting to power-on defaults disable */
1871         case 0x02: /* write cache enable */
1872         case 0x82: /* write cache disable */
1873         case 0xaa: /* read look-ahead enable */
1874         case 0x55: /* read look-ahead disable */
1875         case 0x05: /* set advanced power management mode */
1876         case 0x85: /* disable advanced power management mode */
1877         case 0x69: /* NOP */
1878         case 0x67: /* NOP */
1879         case 0x96: /* NOP */
1880         case 0x9a: /* NOP */
1881         case 0x42: /* enable Automatic Acoustic Mode */
1882         case 0xc2: /* disable Automatic Acoustic Mode */
1883             s->status = READY_STAT | SEEK_STAT;
1884             ide_set_irq(s->bus);
1885             break;
1886         case 0x03: { /* set transfer mode */
1887 		uint8_t val = s->nsector & 0x07;
1888             uint16_t *identify_data = (uint16_t *)s->identify_data;
1889 
1890 		switch (s->nsector >> 3) {
1891 		case 0x00: /* pio default */
1892 		case 0x01: /* pio mode */
1893 			put_le16(identify_data + 62,0x07);
1894 			put_le16(identify_data + 63,0x07);
1895 			put_le16(identify_data + 88,0x3f);
1896 			break;
1897                 case 0x02: /* sigle word dma mode*/
1898 			put_le16(identify_data + 62,0x07 | (1 << (val + 8)));
1899 			put_le16(identify_data + 63,0x07);
1900 			put_le16(identify_data + 88,0x3f);
1901 			break;
1902 		case 0x04: /* mdma mode */
1903 			put_le16(identify_data + 62,0x07);
1904 			put_le16(identify_data + 63,0x07 | (1 << (val + 8)));
1905 			put_le16(identify_data + 88,0x3f);
1906 			break;
1907 		case 0x08: /* udma mode */
1908 			put_le16(identify_data + 62,0x07);
1909 			put_le16(identify_data + 63,0x07);
1910 			put_le16(identify_data + 88,0x3f | (1 << (val + 8)));
1911 			break;
1912 		default:
1913 			goto abort_cmd;
1914 		}
1915             s->status = READY_STAT | SEEK_STAT;
1916             ide_set_irq(s->bus);
1917             break;
1918 	}
1919         default:
1920             goto abort_cmd;
1921         }
1922         break;
1923     case WIN_FLUSH_CACHE:
1924     case WIN_FLUSH_CACHE_EXT:
1925         ide_flush_cache(s);
1926         break;
1927     case WIN_STANDBY:
1928     case WIN_STANDBY2:
1929     case WIN_STANDBYNOW1:
1930     case WIN_STANDBYNOW2:
1931     case WIN_IDLEIMMEDIATE:
1932     case CFA_IDLEIMMEDIATE:
1933     case WIN_SETIDLE1:
1934     case WIN_SETIDLE2:
1935     case WIN_SLEEPNOW1:
1936     case WIN_SLEEPNOW2:
1937         s->status = READY_STAT;
1938         ide_set_irq(s->bus);
1939         break;
1940     case WIN_SEEK:
1941         if(s->drive_kind == IDE_CD)
1942             goto abort_cmd;
1943         /* XXX: Check that seek is within bounds */
1944         s->status = READY_STAT | SEEK_STAT;
1945         ide_set_irq(s->bus);
1946         break;
1947         /* ATAPI commands */
1948     case WIN_PIDENTIFY:
1949         if (s->drive_kind == IDE_CD) {
1950             ide_atapi_identify(s);
1951             s->status = READY_STAT | SEEK_STAT;
1952             ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1953         } else {
1954             ide_abort_command(s);
1955         }
1956         ide_set_irq(s->bus);
1957         break;
1958     case WIN_DIAGNOSE:
1959         ide_set_signature(s);
1960         if (s->drive_kind == IDE_CD)
1961             s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1962                             * devices to return a clear status register
1963                             * with READY_STAT *not* set. */
1964         else
1965             s->status = READY_STAT | SEEK_STAT;
1966         s->error = 0x01; /* Device 0 passed, Device 1 passed or not
1967                           * present.
1968                           */
1969         ide_set_irq(s->bus);
1970         break;
1971     case WIN_SRST:
1972         if (s->drive_kind != IDE_CD)
1973             goto abort_cmd;
1974         ide_set_signature(s);
1975         s->status = 0x00; /* NOTE: READY is _not_ set */
1976         s->error = 0x01;
1977         break;
1978     case WIN_PACKETCMD:
1979         if (s->drive_kind != IDE_CD)
1980             goto abort_cmd;
1981         /* overlapping commands not supported */
1982         if (s->feature & 0x02)
1983             goto abort_cmd;
1984         s->status = READY_STAT | SEEK_STAT;
1985         s->atapi_dma = s->feature & 1;
1986         s->nsector = 1;
1987         ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1988                            ide_atapi_cmd);
1989         break;
1990     /* CF-ATA commands */
1991     case CFA_REQ_EXT_ERROR_CODE:
1992         if (s->drive_kind != IDE_CFATA)
1993             goto abort_cmd;
1994         s->error = 0x09;    /* miscellaneous error */
1995         s->status = READY_STAT | SEEK_STAT;
1996         ide_set_irq(s->bus);
1997         break;
1998     case CFA_ERASE_SECTORS:
1999     case CFA_WEAR_LEVEL:
2000         if (s->drive_kind != IDE_CFATA)
2001             goto abort_cmd;
2002         if (val == CFA_WEAR_LEVEL)
2003             s->nsector = 0;
2004         if (val == CFA_ERASE_SECTORS)
2005             s->media_changed = 1;
2006         s->error = 0x00;
2007         s->status = READY_STAT | SEEK_STAT;
2008         ide_set_irq(s->bus);
2009         break;
2010     case CFA_TRANSLATE_SECTOR:
2011         if (s->drive_kind != IDE_CFATA)
2012             goto abort_cmd;
2013         s->error = 0x00;
2014         s->status = READY_STAT | SEEK_STAT;
2015         memset(s->io_buffer, 0, 0x200);
2016         s->io_buffer[0x00] = s->hcyl;			/* Cyl MSB */
2017         s->io_buffer[0x01] = s->lcyl;			/* Cyl LSB */
2018         s->io_buffer[0x02] = s->select;			/* Head */
2019         s->io_buffer[0x03] = s->sector;			/* Sector */
2020         s->io_buffer[0x04] = ide_get_sector(s) >> 16;	/* LBA MSB */
2021         s->io_buffer[0x05] = ide_get_sector(s) >> 8;	/* LBA */
2022         s->io_buffer[0x06] = ide_get_sector(s) >> 0;	/* LBA LSB */
2023         s->io_buffer[0x13] = 0x00;				/* Erase flag */
2024         s->io_buffer[0x18] = 0x00;				/* Hot count */
2025         s->io_buffer[0x19] = 0x00;				/* Hot count */
2026         s->io_buffer[0x1a] = 0x01;				/* Hot count */
2027         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2028         ide_set_irq(s->bus);
2029         break;
2030     case CFA_ACCESS_METADATA_STORAGE:
2031         if (s->drive_kind != IDE_CFATA)
2032             goto abort_cmd;
2033         switch (s->feature) {
2034         case 0x02:	/* Inquiry Metadata Storage */
2035             ide_cfata_metadata_inquiry(s);
2036             break;
2037         case 0x03:	/* Read Metadata Storage */
2038             ide_cfata_metadata_read(s);
2039             break;
2040         case 0x04:	/* Write Metadata Storage */
2041             ide_cfata_metadata_write(s);
2042             break;
2043         default:
2044             goto abort_cmd;
2045         }
2046         ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2047         s->status = 0x00; /* NOTE: READY is _not_ set */
2048         ide_set_irq(s->bus);
2049         break;
2050     case IBM_SENSE_CONDITION:
2051         if (s->drive_kind != IDE_CFATA)
2052             goto abort_cmd;
2053         switch (s->feature) {
2054         case 0x01:  /* sense temperature in device */
2055             s->nsector = 0x50;      /* +20 C */
2056             break;
2057         default:
2058             goto abort_cmd;
2059         }
2060         s->status = READY_STAT | SEEK_STAT;
2061         ide_set_irq(s->bus);
2062         break;
2063 
2064 	case WIN_SMART:
2065 	if (s->drive_kind == IDE_CD)
2066 		goto abort_cmd;
2067 	if (s->hcyl != 0xc2 || s->lcyl != 0x4f)
2068 		goto abort_cmd;
2069 	if (!s->smart_enabled && s->feature != SMART_ENABLE)
2070 		goto abort_cmd;
2071 	switch (s->feature) {
2072 	case SMART_DISABLE:
2073 		s->smart_enabled = 0;
2074 		s->status = READY_STAT | SEEK_STAT;
2075 		ide_set_irq(s->bus);
2076 		break;
2077 	case SMART_ENABLE:
2078 		s->smart_enabled = 1;
2079 		s->status = READY_STAT | SEEK_STAT;
2080 		ide_set_irq(s->bus);
2081 		break;
2082 	case SMART_ATTR_AUTOSAVE:
2083 		switch (s->sector) {
2084 		case 0x00:
2085 		s->smart_autosave = 0;
2086 		break;
2087 		case 0xf1:
2088 		s->smart_autosave = 1;
2089 		break;
2090 		default:
2091 		goto abort_cmd;
2092 		}
2093 		s->status = READY_STAT | SEEK_STAT;
2094 		ide_set_irq(s->bus);
2095 		break;
2096 	case SMART_STATUS:
2097 		if (!s->smart_errors) {
2098 		s->hcyl = 0xc2;
2099 		s->lcyl = 0x4f;
2100 		} else {
2101 		s->hcyl = 0x2c;
2102 		s->lcyl = 0xf4;
2103 		}
2104 		s->status = READY_STAT | SEEK_STAT;
2105 		ide_set_irq(s->bus);
2106 		break;
2107 	case SMART_READ_THRESH:
2108 		memset(s->io_buffer, 0, 0x200);
2109 		s->io_buffer[0] = 0x01; /* smart struct version */
2110 		for (n=0; n<30; n++) {
2111 		if (smart_attributes[n][0] == 0)
2112 			break;
2113 		s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
2114 		s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
2115 		}
2116 		for (n=0; n<511; n++) /* checksum */
2117 		s->io_buffer[511] += s->io_buffer[n];
2118 		s->io_buffer[511] = 0x100 - s->io_buffer[511];
2119 		s->status = READY_STAT | SEEK_STAT;
2120 		ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2121 		ide_set_irq(s->bus);
2122 		break;
2123 	case SMART_READ_DATA:
2124 		memset(s->io_buffer, 0, 0x200);
2125 		s->io_buffer[0] = 0x01; /* smart struct version */
2126 		for (n=0; n<30; n++) {
2127 		    if (smart_attributes[n][0] == 0) {
2128 			break;
2129 		    }
2130 		    int i;
2131 		    for(i = 0; i < 11; i++) {
2132 			s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
2133 		    }
2134 		}
2135 		s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
2136 		if (s->smart_selftest_count == 0) {
2137 		s->io_buffer[363] = 0;
2138 		} else {
2139 		s->io_buffer[363] =
2140 			s->smart_selftest_data[3 +
2141 					   (s->smart_selftest_count - 1) *
2142 					   24];
2143 		}
2144 		s->io_buffer[364] = 0x20;
2145 		s->io_buffer[365] = 0x01;
2146 		/* offline data collection capacity: execute + self-test*/
2147 		s->io_buffer[367] = (1<<4 | 1<<3 | 1);
2148 		s->io_buffer[368] = 0x03; /* smart capability (1) */
2149 		s->io_buffer[369] = 0x00; /* smart capability (2) */
2150 		s->io_buffer[370] = 0x01; /* error logging supported */
2151 		s->io_buffer[372] = 0x02; /* minutes for poll short test */
2152 		s->io_buffer[373] = 0x36; /* minutes for poll ext test */
2153 		s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
2154 
2155 		for (n=0; n<511; n++)
2156 		s->io_buffer[511] += s->io_buffer[n];
2157 		s->io_buffer[511] = 0x100 - s->io_buffer[511];
2158 		s->status = READY_STAT | SEEK_STAT;
2159 		ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2160 		ide_set_irq(s->bus);
2161 		break;
2162 	case SMART_READ_LOG:
2163 		switch (s->sector) {
2164 		case 0x01: /* summary smart error log */
2165 		memset(s->io_buffer, 0, 0x200);
2166 		s->io_buffer[0] = 0x01;
2167 		s->io_buffer[1] = 0x00; /* no error entries */
2168 		s->io_buffer[452] = s->smart_errors & 0xff;
2169 		s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
2170 
2171 		for (n=0; n<511; n++)
2172 			s->io_buffer[511] += s->io_buffer[n];
2173 		s->io_buffer[511] = 0x100 - s->io_buffer[511];
2174 		break;
2175 		case 0x06: /* smart self test log */
2176 		memset(s->io_buffer, 0, 0x200);
2177 		s->io_buffer[0] = 0x01;
2178 		if (s->smart_selftest_count == 0) {
2179 			s->io_buffer[508] = 0;
2180 		} else {
2181 			s->io_buffer[508] = s->smart_selftest_count;
2182 			for (n=2; n<506; n++)
2183 			s->io_buffer[n] = s->smart_selftest_data[n];
2184 		}
2185 		for (n=0; n<511; n++)
2186 			s->io_buffer[511] += s->io_buffer[n];
2187 		s->io_buffer[511] = 0x100 - s->io_buffer[511];
2188 		break;
2189 		default:
2190 		goto abort_cmd;
2191 		}
2192 		s->status = READY_STAT | SEEK_STAT;
2193 		ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
2194 		ide_set_irq(s->bus);
2195 		break;
2196 	case SMART_EXECUTE_OFFLINE:
2197 		switch (s->sector) {
2198 		case 0: /* off-line routine */
2199 		case 1: /* short self test */
2200 		case 2: /* extended self test */
2201 		s->smart_selftest_count++;
2202 		if(s->smart_selftest_count > 21)
2203 			s->smart_selftest_count = 0;
2204 		n = 2 + (s->smart_selftest_count - 1) * 24;
2205 		s->smart_selftest_data[n] = s->sector;
2206 		s->smart_selftest_data[n+1] = 0x00; /* OK and finished */
2207 		s->smart_selftest_data[n+2] = 0x34; /* hour count lsb */
2208 		s->smart_selftest_data[n+3] = 0x12; /* hour count msb */
2209 		s->status = READY_STAT | SEEK_STAT;
2210 		ide_set_irq(s->bus);
2211 		break;
2212 		default:
2213 		goto abort_cmd;
2214 		}
2215 		break;
2216 	default:
2217 		goto abort_cmd;
2218 	}
2219 	break;
2220     default:
2221     abort_cmd:
2222         ide_abort_command(s);
2223         ide_set_irq(s->bus);
2224         break;
2225     }
2226 }
2227 
2228 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
2229 {
2230     IDEBus *bus = opaque;
2231     IDEState *s = idebus_active_if(bus);
2232     uint32_t addr;
2233     int ret, hob;
2234 
2235     addr = addr1 & 7;
2236     /* FIXME: HOB readback uses bit 7, but it's always set right now */
2237     //hob = s->select & (1 << 7);
2238     hob = 0;
2239     switch(addr) {
2240     case 0:
2241         ret = 0xff;
2242         break;
2243     case 1:
2244         if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
2245             (s != bus->ifs && !s->bs))
2246             ret = 0;
2247         else if (!hob)
2248             ret = s->error;
2249 	else
2250 	    ret = s->hob_feature;
2251         break;
2252     case 2:
2253         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2254             ret = 0;
2255         else if (!hob)
2256             ret = s->nsector & 0xff;
2257 	else
2258 	    ret = s->hob_nsector;
2259         break;
2260     case 3:
2261         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2262             ret = 0;
2263         else if (!hob)
2264             ret = s->sector;
2265 	else
2266 	    ret = s->hob_sector;
2267         break;
2268     case 4:
2269         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2270             ret = 0;
2271         else if (!hob)
2272             ret = s->lcyl;
2273 	else
2274 	    ret = s->hob_lcyl;
2275         break;
2276     case 5:
2277         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2278             ret = 0;
2279         else if (!hob)
2280             ret = s->hcyl;
2281 	else
2282 	    ret = s->hob_hcyl;
2283         break;
2284     case 6:
2285         if (!bus->ifs[0].bs && !bus->ifs[1].bs)
2286             ret = 0;
2287         else
2288             ret = s->select;
2289         break;
2290     default:
2291     case 7:
2292         if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
2293             (s != bus->ifs && !s->bs))
2294             ret = 0;
2295         else
2296             ret = s->status;
2297         qemu_irq_lower(bus->irq);
2298         break;
2299     }
2300 #ifdef DEBUG_IDE
2301     printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
2302 #endif
2303     return ret;
2304 }
2305 
2306 uint32_t ide_status_read(void *opaque, uint32_t addr)
2307 {
2308     IDEBus *bus = opaque;
2309     IDEState *s = idebus_active_if(bus);
2310     int ret;
2311 
2312     if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
2313         (s != bus->ifs && !s->bs))
2314         ret = 0;
2315     else
2316         ret = s->status;
2317 #ifdef DEBUG_IDE
2318     printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
2319 #endif
2320     return ret;
2321 }
2322 
2323 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
2324 {
2325     IDEBus *bus = opaque;
2326     IDEState *s;
2327     int i;
2328 
2329 #ifdef DEBUG_IDE
2330     printf("ide: write control addr=0x%x val=%02x\n", addr, val);
2331 #endif
2332     /* common for both drives */
2333     if (!(bus->cmd & IDE_CMD_RESET) &&
2334         (val & IDE_CMD_RESET)) {
2335         /* reset low to high */
2336         for(i = 0;i < 2; i++) {
2337             s = &bus->ifs[i];
2338             s->status = BUSY_STAT | SEEK_STAT;
2339             s->error = 0x01;
2340         }
2341     } else if ((bus->cmd & IDE_CMD_RESET) &&
2342                !(val & IDE_CMD_RESET)) {
2343         /* high to low */
2344         for(i = 0;i < 2; i++) {
2345             s = &bus->ifs[i];
2346             if (s->drive_kind == IDE_CD)
2347                 s->status = 0x00; /* NOTE: READY is _not_ set */
2348             else
2349                 s->status = READY_STAT | SEEK_STAT;
2350             ide_set_signature(s);
2351         }
2352     }
2353 
2354     bus->cmd = val;
2355 }
2356 
2357 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
2358 {
2359     IDEBus *bus = opaque;
2360     IDEState *s = idebus_active_if(bus);
2361     uint8_t *p;
2362 
2363     /* PIO data access allowed only when DRQ bit is set */
2364     if (!(s->status & DRQ_STAT))
2365         return;
2366 
2367     p = s->data_ptr;
2368     *(uint16_t *)p = le16_to_cpu(val);
2369     p += 2;
2370     s->data_ptr = p;
2371     if (p >= s->data_end)
2372         s->end_transfer_func(s);
2373 }
2374 
2375 uint32_t ide_data_readw(void *opaque, uint32_t addr)
2376 {
2377     IDEBus *bus = opaque;
2378     IDEState *s = idebus_active_if(bus);
2379     uint8_t *p;
2380     int ret;
2381 
2382     /* PIO data access allowed only when DRQ bit is set */
2383     if (!(s->status & DRQ_STAT))
2384         return 0;
2385 
2386     p = s->data_ptr;
2387     ret = cpu_to_le16(*(uint16_t *)p);
2388     p += 2;
2389     s->data_ptr = p;
2390     if (p >= s->data_end)
2391         s->end_transfer_func(s);
2392     return ret;
2393 }
2394 
2395 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
2396 {
2397     IDEBus *bus = opaque;
2398     IDEState *s = idebus_active_if(bus);
2399     uint8_t *p;
2400 
2401     /* PIO data access allowed only when DRQ bit is set */
2402     if (!(s->status & DRQ_STAT))
2403         return;
2404 
2405     p = s->data_ptr;
2406     *(uint32_t *)p = le32_to_cpu(val);
2407     p += 4;
2408     s->data_ptr = p;
2409     if (p >= s->data_end)
2410         s->end_transfer_func(s);
2411 }
2412 
2413 uint32_t ide_data_readl(void *opaque, uint32_t addr)
2414 {
2415     IDEBus *bus = opaque;
2416     IDEState *s = idebus_active_if(bus);
2417     uint8_t *p;
2418     int ret;
2419 
2420     /* PIO data access allowed only when DRQ bit is set */
2421     if (!(s->status & DRQ_STAT))
2422         return 0;
2423 
2424     p = s->data_ptr;
2425     ret = cpu_to_le32(*(uint32_t *)p);
2426     p += 4;
2427     s->data_ptr = p;
2428     if (p >= s->data_end)
2429         s->end_transfer_func(s);
2430     return ret;
2431 }
2432 
2433 static void ide_dummy_transfer_stop(IDEState *s)
2434 {
2435     s->data_ptr = s->io_buffer;
2436     s->data_end = s->io_buffer;
2437     s->io_buffer[0] = 0xff;
2438     s->io_buffer[1] = 0xff;
2439     s->io_buffer[2] = 0xff;
2440     s->io_buffer[3] = 0xff;
2441 }
2442 
2443 static void ide_reset(IDEState *s)
2444 {
2445 #ifdef DEBUG_IDE
2446     printf("ide: reset\n");
2447 #endif
2448     if (s->drive_kind == IDE_CFATA)
2449         s->mult_sectors = 0;
2450     else
2451         s->mult_sectors = MAX_MULT_SECTORS;
2452     /* ide regs */
2453     s->feature = 0;
2454     s->error = 0;
2455     s->nsector = 0;
2456     s->sector = 0;
2457     s->lcyl = 0;
2458     s->hcyl = 0;
2459 
2460     /* lba48 */
2461     s->hob_feature = 0;
2462     s->hob_sector = 0;
2463     s->hob_nsector = 0;
2464     s->hob_lcyl = 0;
2465     s->hob_hcyl = 0;
2466 
2467     s->select = 0xa0;
2468     s->status = READY_STAT | SEEK_STAT;
2469 
2470     s->lba48 = 0;
2471 
2472     /* ATAPI specific */
2473     s->sense_key = 0;
2474     s->asc = 0;
2475     s->cdrom_changed = 0;
2476     s->packet_transfer_size = 0;
2477     s->elementary_transfer_size = 0;
2478     s->io_buffer_index = 0;
2479     s->cd_sector_size = 0;
2480     s->atapi_dma = 0;
2481     /* ATA DMA state */
2482     s->io_buffer_size = 0;
2483     s->req_nb_sectors = 0;
2484 
2485     ide_set_signature(s);
2486     /* init the transfer handler so that 0xffff is returned on data
2487        accesses */
2488     s->end_transfer_func = ide_dummy_transfer_stop;
2489     ide_dummy_transfer_stop(s);
2490     s->media_changed = 0;
2491 }
2492 
2493 void ide_bus_reset(IDEBus *bus)
2494 {
2495     bus->unit = 0;
2496     bus->cmd = 0;
2497     ide_reset(&bus->ifs[0]);
2498     ide_reset(&bus->ifs[1]);
2499     ide_clear_hob(bus);
2500 
2501     /* pending async DMA */
2502     if (bus->dma->aiocb) {
2503 #ifdef DEBUG_AIO
2504         printf("aio_cancel\n");
2505 #endif
2506         bdrv_aio_cancel(bus->dma->aiocb);
2507         bus->dma->aiocb = NULL;
2508     }
2509 
2510     /* reset dma provider too */
2511     bus->dma->ops->reset(bus->dma);
2512 }
2513 
2514 int ide_init_drive(IDEState *s, BlockDriverState *bs,
2515                    const char *version, const char *serial)
2516 {
2517     int cylinders, heads, secs;
2518     uint64_t nb_sectors;
2519 
2520     s->bs = bs;
2521     bdrv_get_geometry(bs, &nb_sectors);
2522     bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
2523     if (cylinders < 1 || cylinders > 16383) {
2524         error_report("cyls must be between 1 and 16383");
2525         return -1;
2526     }
2527     if (heads < 1 || heads > 16) {
2528         error_report("heads must be between 1 and 16");
2529         return -1;
2530     }
2531     if (secs < 1 || secs > 63) {
2532         error_report("secs must be between 1 and 63");
2533         return -1;
2534     }
2535     s->cylinders = cylinders;
2536     s->heads = heads;
2537     s->sectors = secs;
2538     s->nb_sectors = nb_sectors;
2539     /* The SMART values should be preserved across power cycles
2540        but they aren't.  */
2541     s->smart_enabled = 1;
2542     s->smart_autosave = 1;
2543     s->smart_errors = 0;
2544     s->smart_selftest_count = 0;
2545     if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
2546         s->drive_kind = IDE_CD;
2547         bdrv_set_change_cb(bs, cdrom_change_cb, s);
2548         bs->buffer_alignment = 2048;
2549     } else {
2550         if (!bdrv_is_inserted(s->bs)) {
2551             error_report("Device needs media, but drive is empty");
2552             return -1;
2553         }
2554         if (bdrv_is_read_only(bs)) {
2555             error_report("Can't use a read-only drive");
2556             return -1;
2557         }
2558     }
2559     if (serial) {
2560         strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
2561     } else {
2562         snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
2563                  "QM%05d", s->drive_serial);
2564     }
2565     if (version) {
2566         pstrcpy(s->version, sizeof(s->version), version);
2567     } else {
2568         pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
2569     }
2570 
2571     ide_reset(s);
2572     bdrv_set_removable(bs, s->drive_kind == IDE_CD);
2573     return 0;
2574 }
2575 
2576 static void ide_init1(IDEBus *bus, int unit)
2577 {
2578     static int drive_serial = 1;
2579     IDEState *s = &bus->ifs[unit];
2580 
2581     s->bus = bus;
2582     s->unit = unit;
2583     s->drive_serial = drive_serial++;
2584     /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2585     s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4);
2586     s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2587     s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2588     s->sector_write_timer = qemu_new_timer_ns(vm_clock,
2589                                            ide_sector_write_timer_cb, s);
2590 }
2591 
2592 static void ide_nop_start(IDEDMA *dma, IDEState *s,
2593                           BlockDriverCompletionFunc *cb)
2594 {
2595 }
2596 
2597 static int ide_nop(IDEDMA *dma)
2598 {
2599     return 0;
2600 }
2601 
2602 static int ide_nop_int(IDEDMA *dma, int x)
2603 {
2604     return 0;
2605 }
2606 
2607 static void ide_nop_restart(void *opaque, int x, int y)
2608 {
2609 }
2610 
2611 static const IDEDMAOps ide_dma_nop_ops = {
2612     .start_dma      = ide_nop_start,
2613     .start_transfer = ide_nop,
2614     .prepare_buf    = ide_nop_int,
2615     .rw_buf         = ide_nop_int,
2616     .set_unit       = ide_nop_int,
2617     .add_status     = ide_nop_int,
2618     .set_inactive   = ide_nop,
2619     .restart_cb     = ide_nop_restart,
2620     .reset          = ide_nop,
2621 };
2622 
2623 static IDEDMA ide_dma_nop = {
2624     .ops = &ide_dma_nop_ops,
2625     .aiocb = NULL,
2626 };
2627 
2628 void ide_init2(IDEBus *bus, qemu_irq irq)
2629 {
2630     int i;
2631 
2632     for(i = 0; i < 2; i++) {
2633         ide_init1(bus, i);
2634         ide_reset(&bus->ifs[i]);
2635     }
2636     bus->irq = irq;
2637     bus->dma = &ide_dma_nop;
2638 }
2639 
2640 /* TODO convert users to qdev and remove */
2641 void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
2642                                     DriveInfo *hd1, qemu_irq irq)
2643 {
2644     int i;
2645     DriveInfo *dinfo;
2646 
2647     for(i = 0; i < 2; i++) {
2648         dinfo = i == 0 ? hd0 : hd1;
2649         ide_init1(bus, i);
2650         if (dinfo) {
2651             if (ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL,
2652                                *dinfo->serial ? dinfo->serial : NULL) < 0) {
2653                 error_report("Can't set up IDE drive %s", dinfo->id);
2654                 exit(1);
2655             }
2656         } else {
2657             ide_reset(&bus->ifs[i]);
2658         }
2659     }
2660     bus->irq = irq;
2661     bus->dma = &ide_dma_nop;
2662 }
2663 
2664 void ide_init_ioport(IDEBus *bus, int iobase, int iobase2)
2665 {
2666     register_ioport_write(iobase, 8, 1, ide_ioport_write, bus);
2667     register_ioport_read(iobase, 8, 1, ide_ioport_read, bus);
2668     if (iobase2) {
2669         register_ioport_read(iobase2, 1, 1, ide_status_read, bus);
2670         register_ioport_write(iobase2, 1, 1, ide_cmd_write, bus);
2671     }
2672 
2673     /* data ports */
2674     register_ioport_write(iobase, 2, 2, ide_data_writew, bus);
2675     register_ioport_read(iobase, 2, 2, ide_data_readw, bus);
2676     register_ioport_write(iobase, 4, 4, ide_data_writel, bus);
2677     register_ioport_read(iobase, 4, 4, ide_data_readl, bus);
2678 }
2679 
2680 static bool is_identify_set(void *opaque, int version_id)
2681 {
2682     IDEState *s = opaque;
2683 
2684     return s->identify_set != 0;
2685 }
2686 
2687 static EndTransferFunc* transfer_end_table[] = {
2688         ide_sector_read,
2689         ide_sector_write,
2690         ide_transfer_stop,
2691         ide_atapi_cmd_reply_end,
2692         ide_atapi_cmd,
2693         ide_dummy_transfer_stop,
2694 };
2695 
2696 static int transfer_end_table_idx(EndTransferFunc *fn)
2697 {
2698     int i;
2699 
2700     for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2701         if (transfer_end_table[i] == fn)
2702             return i;
2703 
2704     return -1;
2705 }
2706 
2707 static int ide_drive_post_load(void *opaque, int version_id)
2708 {
2709     IDEState *s = opaque;
2710 
2711     if (version_id < 3) {
2712         if (s->sense_key == SENSE_UNIT_ATTENTION &&
2713             s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
2714             s->cdrom_changed = 1;
2715         }
2716     }
2717     return 0;
2718 }
2719 
2720 static int ide_drive_pio_post_load(void *opaque, int version_id)
2721 {
2722     IDEState *s = opaque;
2723 
2724     if (s->end_transfer_fn_idx > ARRAY_SIZE(transfer_end_table)) {
2725         return -EINVAL;
2726     }
2727     s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2728     s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2729     s->data_end = s->data_ptr + s->cur_io_buffer_len;
2730 
2731     return 0;
2732 }
2733 
2734 static void ide_drive_pio_pre_save(void *opaque)
2735 {
2736     IDEState *s = opaque;
2737     int idx;
2738 
2739     s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2740     s->cur_io_buffer_len = s->data_end - s->data_ptr;
2741 
2742     idx = transfer_end_table_idx(s->end_transfer_func);
2743     if (idx == -1) {
2744         fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2745                         __func__);
2746         s->end_transfer_fn_idx = 2;
2747     } else {
2748         s->end_transfer_fn_idx = idx;
2749     }
2750 }
2751 
2752 static bool ide_drive_pio_state_needed(void *opaque)
2753 {
2754     IDEState *s = opaque;
2755 
2756     return (s->status & DRQ_STAT) != 0;
2757 }
2758 
2759 const VMStateDescription vmstate_ide_drive_pio_state = {
2760     .name = "ide_drive/pio_state",
2761     .version_id = 1,
2762     .minimum_version_id = 1,
2763     .minimum_version_id_old = 1,
2764     .pre_save = ide_drive_pio_pre_save,
2765     .post_load = ide_drive_pio_post_load,
2766     .fields      = (VMStateField []) {
2767         VMSTATE_INT32(req_nb_sectors, IDEState),
2768         VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2769 			     vmstate_info_uint8, uint8_t),
2770         VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2771         VMSTATE_INT32(cur_io_buffer_len, IDEState),
2772         VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2773         VMSTATE_INT32(elementary_transfer_size, IDEState),
2774         VMSTATE_INT32(packet_transfer_size, IDEState),
2775         VMSTATE_END_OF_LIST()
2776     }
2777 };
2778 
2779 const VMStateDescription vmstate_ide_drive = {
2780     .name = "ide_drive",
2781     .version_id = 3,
2782     .minimum_version_id = 0,
2783     .minimum_version_id_old = 0,
2784     .post_load = ide_drive_post_load,
2785     .fields      = (VMStateField []) {
2786         VMSTATE_INT32(mult_sectors, IDEState),
2787         VMSTATE_INT32(identify_set, IDEState),
2788         VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2789         VMSTATE_UINT8(feature, IDEState),
2790         VMSTATE_UINT8(error, IDEState),
2791         VMSTATE_UINT32(nsector, IDEState),
2792         VMSTATE_UINT8(sector, IDEState),
2793         VMSTATE_UINT8(lcyl, IDEState),
2794         VMSTATE_UINT8(hcyl, IDEState),
2795         VMSTATE_UINT8(hob_feature, IDEState),
2796         VMSTATE_UINT8(hob_sector, IDEState),
2797         VMSTATE_UINT8(hob_nsector, IDEState),
2798         VMSTATE_UINT8(hob_lcyl, IDEState),
2799         VMSTATE_UINT8(hob_hcyl, IDEState),
2800         VMSTATE_UINT8(select, IDEState),
2801         VMSTATE_UINT8(status, IDEState),
2802         VMSTATE_UINT8(lba48, IDEState),
2803         VMSTATE_UINT8(sense_key, IDEState),
2804         VMSTATE_UINT8(asc, IDEState),
2805         VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2806         VMSTATE_END_OF_LIST()
2807     },
2808     .subsections = (VMStateSubsection []) {
2809         {
2810             .vmsd = &vmstate_ide_drive_pio_state,
2811             .needed = ide_drive_pio_state_needed,
2812         }, {
2813             /* empty */
2814         }
2815     }
2816 };
2817 
2818 const VMStateDescription vmstate_ide_bus = {
2819     .name = "ide_bus",
2820     .version_id = 1,
2821     .minimum_version_id = 1,
2822     .minimum_version_id_old = 1,
2823     .fields      = (VMStateField []) {
2824         VMSTATE_UINT8(cmd, IDEBus),
2825         VMSTATE_UINT8(unit, IDEBus),
2826         VMSTATE_END_OF_LIST()
2827     }
2828 };
2829 
2830 void ide_drive_get(DriveInfo **hd, int max_bus)
2831 {
2832     int i;
2833 
2834     if (drive_get_max_bus(IF_IDE) >= max_bus) {
2835         fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2836         exit(1);
2837     }
2838 
2839     for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2840         hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
2841     }
2842 }
2843