2 * QEMU IDE disk and CD/DVD-ROM Emulator
4 * Copyright (c) 2003 Fabrice Bellard
5 * Copyright (c) 2006 Openedhand Ltd.
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:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
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
26 #include <hw/i386/pc.h>
27 #include <hw/pci/pci.h>
28 #include <hw/isa/isa.h>
29 #include "qemu/error-report.h"
30 #include "qemu/timer.h"
31 #include "sysemu/sysemu.h"
32 #include "sysemu/dma.h"
33 #include "hw/block/block.h"
34 #include "sysemu/blockdev.h"
36 #include <hw/ide/internal.h>
38 /* These values were based on a Seagate ST3500418AS but have been modified
39 to make more sense in QEMU */
40 static const int smart_attributes[][12] = {
41 /* id, flags, hflags, val, wrst, raw (6 bytes), threshold */
42 /* raw read error rate*/
43 { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
45 { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
46 /* start stop count */
47 { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
48 /* remapped sectors */
49 { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
51 { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
52 /* power cycle count */
53 { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
54 /* airflow-temperature-celsius */
55 { 190, 0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
58 static int ide_handle_rw_error(IDEState *s, int error, int op);
59 static void ide_dummy_transfer_stop(IDEState *s);
61 static void padstr(char *str, const char *src, int len)
64 for(i = 0; i < len; i++) {
73 static void put_le16(uint16_t *p, unsigned int v)
78 static void ide_identify(IDEState *s)
82 IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
84 if (s->identify_set) {
85 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
89 memset(s->io_buffer, 0, 512);
90 p = (uint16_t *)s->io_buffer;
91 put_le16(p + 0, 0x0040);
92 put_le16(p + 1, s->cylinders);
93 put_le16(p + 3, s->heads);
94 put_le16(p + 4, 512 * s->sectors); /* XXX: retired, remove ? */
95 put_le16(p + 5, 512); /* XXX: retired, remove ? */
96 put_le16(p + 6, s->sectors);
97 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
98 put_le16(p + 20, 3); /* XXX: retired, remove ? */
99 put_le16(p + 21, 512); /* cache size in sectors */
100 put_le16(p + 22, 4); /* ecc bytes */
101 padstr((char *)(p + 23), s->version, 8); /* firmware version */
102 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
103 #if MAX_MULT_SECTORS > 1
104 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
106 put_le16(p + 48, 1); /* dword I/O */
107 put_le16(p + 49, (1 << 11) | (1 << 9) | (1 << 8)); /* DMA and LBA supported */
108 put_le16(p + 51, 0x200); /* PIO transfer cycle */
109 put_le16(p + 52, 0x200); /* DMA transfer cycle */
110 put_le16(p + 53, 1 | (1 << 1) | (1 << 2)); /* words 54-58,64-70,88 are valid */
111 put_le16(p + 54, s->cylinders);
112 put_le16(p + 55, s->heads);
113 put_le16(p + 56, s->sectors);
114 oldsize = s->cylinders * s->heads * s->sectors;
115 put_le16(p + 57, oldsize);
116 put_le16(p + 58, oldsize >> 16);
118 put_le16(p + 59, 0x100 | s->mult_sectors);
119 put_le16(p + 60, s->nb_sectors);
120 put_le16(p + 61, s->nb_sectors >> 16);
121 put_le16(p + 62, 0x07); /* single word dma0-2 supported */
122 put_le16(p + 63, 0x07); /* mdma0-2 supported */
123 put_le16(p + 64, 0x03); /* pio3-4 supported */
124 put_le16(p + 65, 120);
125 put_le16(p + 66, 120);
126 put_le16(p + 67, 120);
127 put_le16(p + 68, 120);
128 if (dev && dev->conf.discard_granularity) {
129 put_le16(p + 69, (1 << 14)); /* determinate TRIM behavior */
133 put_le16(p + 75, s->ncq_queues - 1);
135 put_le16(p + 76, (1 << 8));
138 put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
139 put_le16(p + 81, 0x16); /* conforms to ata5 */
140 /* 14=NOP supported, 5=WCACHE supported, 0=SMART supported */
141 put_le16(p + 82, (1 << 14) | (1 << 5) | 1);
142 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
143 put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
144 /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
146 put_le16(p + 84, (1 << 14) | (1 << 8) | 0);
148 put_le16(p + 84, (1 << 14) | 0);
150 /* 14 = NOP supported, 5=WCACHE enabled, 0=SMART feature set enabled */
151 if (bdrv_enable_write_cache(s->bs))
152 put_le16(p + 85, (1 << 14) | (1 << 5) | 1);
154 put_le16(p + 85, (1 << 14) | 1);
155 /* 13=flush_cache_ext,12=flush_cache,10=lba48 */
156 put_le16(p + 86, (1 << 13) | (1 <<12) | (1 << 10));
157 /* 14=set to 1, 8=has WWN, 1=SMART self test, 0=SMART error logging */
159 put_le16(p + 87, (1 << 14) | (1 << 8) | 0);
161 put_le16(p + 87, (1 << 14) | 0);
163 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
164 put_le16(p + 93, 1 | (1 << 14) | 0x2000);
165 put_le16(p + 100, s->nb_sectors);
166 put_le16(p + 101, s->nb_sectors >> 16);
167 put_le16(p + 102, s->nb_sectors >> 32);
168 put_le16(p + 103, s->nb_sectors >> 48);
170 if (dev && dev->conf.physical_block_size)
171 put_le16(p + 106, 0x6000 | get_physical_block_exp(&dev->conf));
173 /* LE 16-bit words 111-108 contain 64-bit World Wide Name */
174 put_le16(p + 108, s->wwn >> 48);
175 put_le16(p + 109, s->wwn >> 32);
176 put_le16(p + 110, s->wwn >> 16);
177 put_le16(p + 111, s->wwn);
179 if (dev && dev->conf.discard_granularity) {
180 put_le16(p + 169, 1); /* TRIM support */
183 memcpy(s->identify_data, p, sizeof(s->identify_data));
187 static void ide_atapi_identify(IDEState *s)
191 if (s->identify_set) {
192 memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
196 memset(s->io_buffer, 0, 512);
197 p = (uint16_t *)s->io_buffer;
198 /* Removable CDROM, 50us response, 12 byte packets */
199 put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
200 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
201 put_le16(p + 20, 3); /* buffer type */
202 put_le16(p + 21, 512); /* cache size in sectors */
203 put_le16(p + 22, 4); /* ecc bytes */
204 padstr((char *)(p + 23), s->version, 8); /* firmware version */
205 padstr((char *)(p + 27), s->drive_model_str, 40); /* model */
206 put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
208 put_le16(p + 49, 1 << 9 | 1 << 8); /* DMA and LBA supported */
209 put_le16(p + 53, 7); /* words 64-70, 54-58, 88 valid */
210 put_le16(p + 62, 7); /* single word dma0-2 supported */
211 put_le16(p + 63, 7); /* mdma0-2 supported */
213 put_le16(p + 49, 1 << 9); /* LBA supported, no DMA */
214 put_le16(p + 53, 3); /* words 64-70, 54-58 valid */
215 put_le16(p + 63, 0x103); /* DMA modes XXX: may be incorrect */
217 put_le16(p + 64, 3); /* pio3-4 supported */
218 put_le16(p + 65, 0xb4); /* minimum DMA multiword tx cycle time */
219 put_le16(p + 66, 0xb4); /* recommended DMA multiword tx cycle time */
220 put_le16(p + 67, 0x12c); /* minimum PIO cycle time without flow control */
221 put_le16(p + 68, 0xb4); /* minimum PIO cycle time with IORDY flow control */
223 put_le16(p + 71, 30); /* in ns */
224 put_le16(p + 72, 30); /* in ns */
227 put_le16(p + 75, s->ncq_queues - 1);
229 put_le16(p + 76, (1 << 8));
232 put_le16(p + 80, 0x1e); /* support up to ATA/ATAPI-4 */
234 put_le16(p + 88, 0x3f | (1 << 13)); /* udma5 set and supported */
236 memcpy(s->identify_data, p, sizeof(s->identify_data));
240 static void ide_cfata_identify(IDEState *s)
245 p = (uint16_t *) s->identify_data;
249 memset(p, 0, sizeof(s->identify_data));
251 cur_sec = s->cylinders * s->heads * s->sectors;
253 put_le16(p + 0, 0x848a); /* CF Storage Card signature */
254 put_le16(p + 1, s->cylinders); /* Default cylinders */
255 put_le16(p + 3, s->heads); /* Default heads */
256 put_le16(p + 6, s->sectors); /* Default sectors per track */
257 put_le16(p + 7, s->nb_sectors >> 16); /* Sectors per card */
258 put_le16(p + 8, s->nb_sectors); /* Sectors per card */
259 padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
260 put_le16(p + 22, 0x0004); /* ECC bytes */
261 padstr((char *) (p + 23), s->version, 8); /* Firmware Revision */
262 padstr((char *) (p + 27), s->drive_model_str, 40);/* Model number */
263 #if MAX_MULT_SECTORS > 1
264 put_le16(p + 47, 0x8000 | MAX_MULT_SECTORS);
266 put_le16(p + 47, 0x0000);
268 put_le16(p + 49, 0x0f00); /* Capabilities */
269 put_le16(p + 51, 0x0002); /* PIO cycle timing mode */
270 put_le16(p + 52, 0x0001); /* DMA cycle timing mode */
271 put_le16(p + 53, 0x0003); /* Translation params valid */
272 put_le16(p + 54, s->cylinders); /* Current cylinders */
273 put_le16(p + 55, s->heads); /* Current heads */
274 put_le16(p + 56, s->sectors); /* Current sectors */
275 put_le16(p + 57, cur_sec); /* Current capacity */
276 put_le16(p + 58, cur_sec >> 16); /* Current capacity */
277 if (s->mult_sectors) /* Multiple sector setting */
278 put_le16(p + 59, 0x100 | s->mult_sectors);
279 put_le16(p + 60, s->nb_sectors); /* Total LBA sectors */
280 put_le16(p + 61, s->nb_sectors >> 16); /* Total LBA sectors */
281 put_le16(p + 63, 0x0203); /* Multiword DMA capability */
282 put_le16(p + 64, 0x0001); /* Flow Control PIO support */
283 put_le16(p + 65, 0x0096); /* Min. Multiword DMA cycle */
284 put_le16(p + 66, 0x0096); /* Rec. Multiword DMA cycle */
285 put_le16(p + 68, 0x00b4); /* Min. PIO cycle time */
286 put_le16(p + 82, 0x400c); /* Command Set supported */
287 put_le16(p + 83, 0x7068); /* Command Set supported */
288 put_le16(p + 84, 0x4000); /* Features supported */
289 put_le16(p + 85, 0x000c); /* Command Set enabled */
290 put_le16(p + 86, 0x7044); /* Command Set enabled */
291 put_le16(p + 87, 0x4000); /* Features enabled */
292 put_le16(p + 91, 0x4060); /* Current APM level */
293 put_le16(p + 129, 0x0002); /* Current features option */
294 put_le16(p + 130, 0x0005); /* Reassigned sectors */
295 put_le16(p + 131, 0x0001); /* Initial power mode */
296 put_le16(p + 132, 0x0000); /* User signature */
297 put_le16(p + 160, 0x8100); /* Power requirement */
298 put_le16(p + 161, 0x8001); /* CF command set */
303 memcpy(s->io_buffer, p, sizeof(s->identify_data));
306 static void ide_set_signature(IDEState *s)
308 s->select &= 0xf0; /* clear head */
312 if (s->drive_kind == IDE_CD) {
324 typedef struct TrimAIOCB {
325 BlockDriverAIOCB common;
329 BlockDriverAIOCB *aiocb;
333 static void trim_aio_cancel(BlockDriverAIOCB *acb)
335 TrimAIOCB *iocb = container_of(acb, TrimAIOCB, common);
337 /* Exit the loop in case bdrv_aio_cancel calls ide_issue_trim_cb again. */
338 iocb->j = iocb->qiov->niov - 1;
339 iocb->i = (iocb->qiov->iov[iocb->j].iov_len / 8) - 1;
341 /* Tell ide_issue_trim_cb not to trigger the completion, too. */
342 qemu_bh_delete(iocb->bh);
346 bdrv_aio_cancel(iocb->aiocb);
348 qemu_aio_release(iocb);
351 static const AIOCBInfo trim_aiocb_info = {
352 .aiocb_size = sizeof(TrimAIOCB),
353 .cancel = trim_aio_cancel,
356 static void ide_trim_bh_cb(void *opaque)
358 TrimAIOCB *iocb = opaque;
360 iocb->common.cb(iocb->common.opaque, iocb->ret);
362 qemu_bh_delete(iocb->bh);
364 qemu_aio_release(iocb);
367 static void ide_issue_trim_cb(void *opaque, int ret)
369 TrimAIOCB *iocb = opaque;
371 while (iocb->j < iocb->qiov->niov) {
373 while (++iocb->i < iocb->qiov->iov[j].iov_len / 8) {
375 uint64_t *buffer = iocb->qiov->iov[j].iov_base;
377 /* 6-byte LBA + 2-byte range per entry */
378 uint64_t entry = le64_to_cpu(buffer[i]);
379 uint64_t sector = entry & 0x0000ffffffffffffULL;
380 uint16_t count = entry >> 48;
386 /* Got an entry! Submit and exit. */
387 iocb->aiocb = bdrv_aio_discard(iocb->common.bs, sector, count,
388 ide_issue_trim_cb, opaque);
401 qemu_bh_schedule(iocb->bh);
405 BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
406 int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
407 BlockDriverCompletionFunc *cb, void *opaque)
411 iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque);
412 iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
417 ide_issue_trim_cb(iocb, 0);
418 return &iocb->common;
421 static inline void ide_abort_command(IDEState *s)
423 s->status = READY_STAT | ERR_STAT;
427 /* prepare data transfer and tell what to do after */
428 void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
429 EndTransferFunc *end_transfer_func)
431 s->end_transfer_func = end_transfer_func;
433 s->data_end = buf + size;
434 if (!(s->status & ERR_STAT)) {
435 s->status |= DRQ_STAT;
437 s->bus->dma->ops->start_transfer(s->bus->dma);
440 void ide_transfer_stop(IDEState *s)
442 s->end_transfer_func = ide_transfer_stop;
443 s->data_ptr = s->io_buffer;
444 s->data_end = s->io_buffer;
445 s->status &= ~DRQ_STAT;
448 int64_t ide_get_sector(IDEState *s)
451 if (s->select & 0x40) {
454 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
455 (s->lcyl << 8) | s->sector;
457 sector_num = ((int64_t)s->hob_hcyl << 40) |
458 ((int64_t) s->hob_lcyl << 32) |
459 ((int64_t) s->hob_sector << 24) |
460 ((int64_t) s->hcyl << 16) |
461 ((int64_t) s->lcyl << 8) | s->sector;
464 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
465 (s->select & 0x0f) * s->sectors + (s->sector - 1);
470 void ide_set_sector(IDEState *s, int64_t sector_num)
473 if (s->select & 0x40) {
475 s->select = (s->select & 0xf0) | (sector_num >> 24);
476 s->hcyl = (sector_num >> 16);
477 s->lcyl = (sector_num >> 8);
478 s->sector = (sector_num);
480 s->sector = sector_num;
481 s->lcyl = sector_num >> 8;
482 s->hcyl = sector_num >> 16;
483 s->hob_sector = sector_num >> 24;
484 s->hob_lcyl = sector_num >> 32;
485 s->hob_hcyl = sector_num >> 40;
488 cyl = sector_num / (s->heads * s->sectors);
489 r = sector_num % (s->heads * s->sectors);
492 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
493 s->sector = (r % s->sectors) + 1;
497 static void ide_rw_error(IDEState *s) {
498 ide_abort_command(s);
502 static void ide_sector_read_cb(void *opaque, int ret)
504 IDEState *s = opaque;
508 s->status &= ~BUSY_STAT;
510 bdrv_acct_done(s->bs, &s->acct);
512 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY |
513 BM_STATUS_RETRY_READ)) {
519 if (n > s->req_nb_sectors) {
520 n = s->req_nb_sectors;
523 /* Allow the guest to read the io_buffer */
524 ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
528 ide_set_sector(s, ide_get_sector(s) + n);
532 void ide_sector_read(IDEState *s)
537 s->status = READY_STAT | SEEK_STAT;
538 s->error = 0; /* not needed by IDE spec, but needed by Windows */
539 sector_num = ide_get_sector(s);
543 ide_transfer_stop(s);
547 s->status |= BUSY_STAT;
549 if (n > s->req_nb_sectors) {
550 n = s->req_nb_sectors;
553 #if defined(DEBUG_IDE)
554 printf("sector=%" PRId64 "\n", sector_num);
557 s->iov.iov_base = s->io_buffer;
558 s->iov.iov_len = n * BDRV_SECTOR_SIZE;
559 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
561 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
562 s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
563 ide_sector_read_cb, s);
566 static void dma_buf_commit(IDEState *s)
568 qemu_sglist_destroy(&s->sg);
571 static void ide_async_cmd_done(IDEState *s)
573 if (s->bus->dma->ops->async_cmd_done) {
574 s->bus->dma->ops->async_cmd_done(s->bus->dma);
578 void ide_set_inactive(IDEState *s)
580 s->bus->dma->aiocb = NULL;
581 s->bus->dma->ops->set_inactive(s->bus->dma);
582 ide_async_cmd_done(s);
585 void ide_dma_error(IDEState *s)
587 ide_transfer_stop(s);
589 s->status = READY_STAT | ERR_STAT;
594 static int ide_handle_rw_error(IDEState *s, int error, int op)
596 bool is_read = (op & BM_STATUS_RETRY_READ) != 0;
597 BlockErrorAction action = bdrv_get_error_action(s->bs, is_read, error);
599 if (action == BDRV_ACTION_STOP) {
600 s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
601 s->bus->error_status = op;
602 } else if (action == BDRV_ACTION_REPORT) {
603 if (op & BM_STATUS_DMA_RETRY) {
610 bdrv_error_action(s->bs, action, is_read, error);
611 return action != BDRV_ACTION_IGNORE;
614 void ide_dma_cb(void *opaque, int ret)
616 IDEState *s = opaque;
619 bool stay_active = false;
622 int op = BM_STATUS_DMA_RETRY;
624 if (s->dma_cmd == IDE_DMA_READ)
625 op |= BM_STATUS_RETRY_READ;
626 else if (s->dma_cmd == IDE_DMA_TRIM)
627 op |= BM_STATUS_RETRY_TRIM;
629 if (ide_handle_rw_error(s, -ret, op)) {
634 n = s->io_buffer_size >> 9;
635 if (n > s->nsector) {
636 /* The PRDs were longer than needed for this request. Shorten them so
637 * we don't get a negative remainder. The Active bit must remain set
638 * after the request completes. */
643 sector_num = ide_get_sector(s);
647 ide_set_sector(s, sector_num);
651 /* end of transfer ? */
652 if (s->nsector == 0) {
653 s->status = READY_STAT | SEEK_STAT;
658 /* launch next transfer */
660 s->io_buffer_index = 0;
661 s->io_buffer_size = n * 512;
662 if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
663 /* The PRDs were too short. Reset the Active bit, but don't raise an
665 s->status = READY_STAT | SEEK_STAT;
670 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
671 sector_num, n, s->dma_cmd);
674 switch (s->dma_cmd) {
676 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
680 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
684 s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
685 ide_issue_trim, ide_dma_cb, s,
686 DMA_DIRECTION_TO_DEVICE);
692 if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
693 bdrv_acct_done(s->bs, &s->acct);
697 s->bus->dma->ops->add_status(s->bus->dma, BM_STATUS_DMAING);
701 static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
703 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
704 s->io_buffer_index = 0;
705 s->io_buffer_size = 0;
706 s->dma_cmd = dma_cmd;
710 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
714 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
721 s->bus->dma->ops->start_dma(s->bus->dma, s, ide_dma_cb);
724 static void ide_sector_write_timer_cb(void *opaque)
726 IDEState *s = opaque;
730 static void ide_sector_write_cb(void *opaque, int ret)
732 IDEState *s = opaque;
735 bdrv_acct_done(s->bs, &s->acct);
738 s->status &= ~BUSY_STAT;
741 if (ide_handle_rw_error(s, -ret, BM_STATUS_PIO_RETRY)) {
747 if (n > s->req_nb_sectors) {
748 n = s->req_nb_sectors;
751 if (s->nsector == 0) {
752 /* no more sectors to write */
753 ide_transfer_stop(s);
756 if (n1 > s->req_nb_sectors) {
757 n1 = s->req_nb_sectors;
759 ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
762 ide_set_sector(s, ide_get_sector(s) + n);
764 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
765 /* It seems there is a bug in the Windows 2000 installer HDD
766 IDE driver which fills the disk with empty logs when the
767 IDE write IRQ comes too early. This hack tries to correct
768 that at the expense of slower write performances. Use this
769 option _only_ to install Windows 2000. You must disable it
771 timer_mod(s->sector_write_timer,
772 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (get_ticks_per_sec() / 1000));
778 void ide_sector_write(IDEState *s)
783 s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
784 sector_num = ide_get_sector(s);
785 #if defined(DEBUG_IDE)
786 printf("sector=%" PRId64 "\n", sector_num);
789 if (n > s->req_nb_sectors) {
790 n = s->req_nb_sectors;
793 s->iov.iov_base = s->io_buffer;
794 s->iov.iov_len = n * BDRV_SECTOR_SIZE;
795 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
797 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
798 s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
799 ide_sector_write_cb, s);
802 static void ide_flush_cb(void *opaque, int ret)
804 IDEState *s = opaque;
807 /* XXX: What sector number to set here? */
808 if (ide_handle_rw_error(s, -ret, BM_STATUS_RETRY_FLUSH)) {
813 bdrv_acct_done(s->bs, &s->acct);
814 s->status = READY_STAT | SEEK_STAT;
815 ide_async_cmd_done(s);
819 void ide_flush_cache(IDEState *s)
826 s->status |= BUSY_STAT;
827 bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
828 bdrv_aio_flush(s->bs, ide_flush_cb, s);
831 static void ide_cfata_metadata_inquiry(IDEState *s)
836 p = (uint16_t *) s->io_buffer;
838 spd = ((s->mdata_size - 1) >> 9) + 1;
840 put_le16(p + 0, 0x0001); /* Data format revision */
841 put_le16(p + 1, 0x0000); /* Media property: silicon */
842 put_le16(p + 2, s->media_changed); /* Media status */
843 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
844 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
845 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
846 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
849 static void ide_cfata_metadata_read(IDEState *s)
853 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
854 s->status = ERR_STAT;
859 p = (uint16_t *) s->io_buffer;
862 put_le16(p + 0, s->media_changed); /* Media status */
863 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
864 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
865 s->nsector << 9), 0x200 - 2));
868 static void ide_cfata_metadata_write(IDEState *s)
870 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
871 s->status = ERR_STAT;
876 s->media_changed = 0;
878 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
880 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
881 s->nsector << 9), 0x200 - 2));
884 /* called when the inserted state of the media has changed */
885 static void ide_cd_change_cb(void *opaque, bool load)
887 IDEState *s = opaque;
890 s->tray_open = !load;
891 bdrv_get_geometry(s->bs, &nb_sectors);
892 s->nb_sectors = nb_sectors;
895 * First indicate to the guest that a CD has been removed. That's
896 * done on the next command the guest sends us.
898 * Then we set UNIT_ATTENTION, by which the guest will
899 * detect a new CD in the drive. See ide_atapi_cmd() for details.
901 s->cdrom_changed = 1;
902 s->events.new_media = true;
903 s->events.eject_request = false;
907 static void ide_cd_eject_request_cb(void *opaque, bool force)
909 IDEState *s = opaque;
911 s->events.eject_request = true;
913 s->tray_locked = false;
918 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
922 /* handle the 'magic' 0 nsector count conversion here. to avoid
923 * fiddling with the rest of the read logic, we just store the
924 * full sector count in ->nsector and ignore ->hob_nsector from now
930 if (!s->nsector && !s->hob_nsector)
934 int hi = s->hob_nsector;
936 s->nsector = (hi << 8) | lo;
941 static void ide_clear_hob(IDEBus *bus)
943 /* any write clears HOB high bit of device control register */
944 bus->ifs[0].select &= ~(1 << 7);
945 bus->ifs[1].select &= ~(1 << 7);
948 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
950 IDEBus *bus = opaque;
953 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
958 /* ignore writes to command block while busy with previous command */
959 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
967 /* NOTE: data is written to the two drives */
968 bus->ifs[0].hob_feature = bus->ifs[0].feature;
969 bus->ifs[1].hob_feature = bus->ifs[1].feature;
970 bus->ifs[0].feature = val;
971 bus->ifs[1].feature = val;
975 bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
976 bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
977 bus->ifs[0].nsector = val;
978 bus->ifs[1].nsector = val;
982 bus->ifs[0].hob_sector = bus->ifs[0].sector;
983 bus->ifs[1].hob_sector = bus->ifs[1].sector;
984 bus->ifs[0].sector = val;
985 bus->ifs[1].sector = val;
989 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
990 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
991 bus->ifs[0].lcyl = val;
992 bus->ifs[1].lcyl = val;
996 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
997 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
998 bus->ifs[0].hcyl = val;
999 bus->ifs[1].hcyl = val;
1002 /* FIXME: HOB readback uses bit 7 */
1003 bus->ifs[0].select = (val & ~0x10) | 0xa0;
1004 bus->ifs[1].select = (val | 0x10) | 0xa0;
1006 bus->unit = (val >> 4) & 1;
1011 ide_exec_cmd(bus, val);
1016 static bool cmd_nop(IDEState *s, uint8_t cmd)
1021 static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
1023 switch (s->feature) {
1026 ide_sector_start_dma(s, IDE_DMA_TRIM);
1032 ide_abort_command(s);
1036 static bool cmd_identify(IDEState *s, uint8_t cmd)
1038 if (s->bs && s->drive_kind != IDE_CD) {
1039 if (s->drive_kind != IDE_CFATA) {
1042 ide_cfata_identify(s);
1044 s->status = READY_STAT | SEEK_STAT;
1045 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1046 ide_set_irq(s->bus);
1049 if (s->drive_kind == IDE_CD) {
1050 ide_set_signature(s);
1052 ide_abort_command(s);
1058 static bool cmd_verify(IDEState *s, uint8_t cmd)
1060 bool lba48 = (cmd == WIN_VERIFY_EXT);
1062 /* do sector number check ? */
1063 ide_cmd_lba48_transform(s, lba48);
1068 static bool cmd_set_multiple_mode(IDEState *s, uint8_t cmd)
1070 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1071 /* Disable Read and Write Multiple */
1072 s->mult_sectors = 0;
1073 } else if ((s->nsector & 0xff) != 0 &&
1074 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1075 (s->nsector & (s->nsector - 1)) != 0)) {
1076 ide_abort_command(s);
1078 s->mult_sectors = s->nsector & 0xff;
1084 static bool cmd_read_multiple(IDEState *s, uint8_t cmd)
1086 bool lba48 = (cmd == WIN_MULTREAD_EXT);
1088 if (!s->bs || !s->mult_sectors) {
1089 ide_abort_command(s);
1093 ide_cmd_lba48_transform(s, lba48);
1094 s->req_nb_sectors = s->mult_sectors;
1099 static bool cmd_write_multiple(IDEState *s, uint8_t cmd)
1101 bool lba48 = (cmd == WIN_MULTWRITE_EXT);
1104 if (!s->bs || !s->mult_sectors) {
1105 ide_abort_command(s);
1109 ide_cmd_lba48_transform(s, lba48);
1111 s->req_nb_sectors = s->mult_sectors;
1112 n = MIN(s->nsector, s->req_nb_sectors);
1114 s->status = SEEK_STAT | READY_STAT;
1115 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1117 s->media_changed = 1;
1122 static bool cmd_read_pio(IDEState *s, uint8_t cmd)
1124 bool lba48 = (cmd == WIN_READ_EXT);
1126 if (s->drive_kind == IDE_CD) {
1127 ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1128 ide_abort_command(s);
1133 ide_abort_command(s);
1137 ide_cmd_lba48_transform(s, lba48);
1138 s->req_nb_sectors = 1;
1144 static bool cmd_write_pio(IDEState *s, uint8_t cmd)
1146 bool lba48 = (cmd == WIN_WRITE_EXT);
1149 ide_abort_command(s);
1153 ide_cmd_lba48_transform(s, lba48);
1155 s->req_nb_sectors = 1;
1156 s->status = SEEK_STAT | READY_STAT;
1157 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1159 s->media_changed = 1;
1164 static bool cmd_read_dma(IDEState *s, uint8_t cmd)
1166 bool lba48 = (cmd == WIN_READDMA_EXT);
1169 ide_abort_command(s);
1173 ide_cmd_lba48_transform(s, lba48);
1174 ide_sector_start_dma(s, IDE_DMA_READ);
1179 static bool cmd_write_dma(IDEState *s, uint8_t cmd)
1181 bool lba48 = (cmd == WIN_WRITEDMA_EXT);
1184 ide_abort_command(s);
1188 ide_cmd_lba48_transform(s, lba48);
1189 ide_sector_start_dma(s, IDE_DMA_WRITE);
1191 s->media_changed = 1;
1196 static bool cmd_flush_cache(IDEState *s, uint8_t cmd)
1202 static bool cmd_seek(IDEState *s, uint8_t cmd)
1204 /* XXX: Check that seek is within bounds */
1208 static bool cmd_read_native_max(IDEState *s, uint8_t cmd)
1210 bool lba48 = (cmd == WIN_READ_NATIVE_MAX_EXT);
1212 /* Refuse if no sectors are addressable (e.g. medium not inserted) */
1213 if (s->nb_sectors == 0) {
1214 ide_abort_command(s);
1218 ide_cmd_lba48_transform(s, lba48);
1219 ide_set_sector(s, s->nb_sectors - 1);
1224 static bool cmd_check_power_mode(IDEState *s, uint8_t cmd)
1226 s->nsector = 0xff; /* device active or idle */
1230 static bool cmd_set_features(IDEState *s, uint8_t cmd)
1232 uint16_t *identify_data;
1235 ide_abort_command(s);
1239 /* XXX: valid for CDROM ? */
1240 switch (s->feature) {
1241 case 0x02: /* write cache enable */
1242 bdrv_set_enable_write_cache(s->bs, true);
1243 identify_data = (uint16_t *)s->identify_data;
1244 put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
1246 case 0x82: /* write cache disable */
1247 bdrv_set_enable_write_cache(s->bs, false);
1248 identify_data = (uint16_t *)s->identify_data;
1249 put_le16(identify_data + 85, (1 << 14) | 1);
1252 case 0xcc: /* reverting to power-on defaults enable */
1253 case 0x66: /* reverting to power-on defaults disable */
1254 case 0xaa: /* read look-ahead enable */
1255 case 0x55: /* read look-ahead disable */
1256 case 0x05: /* set advanced power management mode */
1257 case 0x85: /* disable advanced power management mode */
1258 case 0x69: /* NOP */
1259 case 0x67: /* NOP */
1260 case 0x96: /* NOP */
1261 case 0x9a: /* NOP */
1262 case 0x42: /* enable Automatic Acoustic Mode */
1263 case 0xc2: /* disable Automatic Acoustic Mode */
1265 case 0x03: /* set transfer mode */
1267 uint8_t val = s->nsector & 0x07;
1268 identify_data = (uint16_t *)s->identify_data;
1270 switch (s->nsector >> 3) {
1271 case 0x00: /* pio default */
1272 case 0x01: /* pio mode */
1273 put_le16(identify_data + 62, 0x07);
1274 put_le16(identify_data + 63, 0x07);
1275 put_le16(identify_data + 88, 0x3f);
1277 case 0x02: /* sigle word dma mode*/
1278 put_le16(identify_data + 62, 0x07 | (1 << (val + 8)));
1279 put_le16(identify_data + 63, 0x07);
1280 put_le16(identify_data + 88, 0x3f);
1282 case 0x04: /* mdma mode */
1283 put_le16(identify_data + 62, 0x07);
1284 put_le16(identify_data + 63, 0x07 | (1 << (val + 8)));
1285 put_le16(identify_data + 88, 0x3f);
1287 case 0x08: /* udma mode */
1288 put_le16(identify_data + 62, 0x07);
1289 put_le16(identify_data + 63, 0x07);
1290 put_le16(identify_data + 88, 0x3f | (1 << (val + 8)));
1300 ide_abort_command(s);
1305 /*** ATAPI commands ***/
1307 static bool cmd_identify_packet(IDEState *s, uint8_t cmd)
1309 ide_atapi_identify(s);
1310 s->status = READY_STAT | SEEK_STAT;
1311 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1312 ide_set_irq(s->bus);
1316 static bool cmd_exec_dev_diagnostic(IDEState *s, uint8_t cmd)
1318 ide_set_signature(s);
1320 if (s->drive_kind == IDE_CD) {
1321 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1322 * devices to return a clear status register
1323 * with READY_STAT *not* set. */
1325 s->status = READY_STAT | SEEK_STAT;
1326 /* The bits of the error register are not as usual for this command!
1327 * They are part of the regular output (this is why ERR_STAT isn't set)
1328 * Device 0 passed, Device 1 passed or not present. */
1330 ide_set_irq(s->bus);
1336 static bool cmd_device_reset(IDEState *s, uint8_t cmd)
1338 ide_set_signature(s);
1339 s->status = 0x00; /* NOTE: READY is _not_ set */
1345 static bool cmd_packet(IDEState *s, uint8_t cmd)
1347 /* overlapping commands not supported */
1348 if (s->feature & 0x02) {
1349 ide_abort_command(s);
1353 s->status = READY_STAT | SEEK_STAT;
1354 s->atapi_dma = s->feature & 1;
1356 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1362 /*** CF-ATA commands ***/
1364 static bool cmd_cfa_req_ext_error_code(IDEState *s, uint8_t cmd)
1366 s->error = 0x09; /* miscellaneous error */
1367 s->status = READY_STAT | SEEK_STAT;
1368 ide_set_irq(s->bus);
1373 static bool cmd_cfa_erase_sectors(IDEState *s, uint8_t cmd)
1375 /* WIN_SECURITY_FREEZE_LOCK has the same ID as CFA_WEAR_LEVEL and is
1376 * required for Windows 8 to work with AHCI */
1378 if (cmd == CFA_WEAR_LEVEL) {
1382 if (cmd == CFA_ERASE_SECTORS) {
1383 s->media_changed = 1;
1389 static bool cmd_cfa_translate_sector(IDEState *s, uint8_t cmd)
1391 s->status = READY_STAT | SEEK_STAT;
1393 memset(s->io_buffer, 0, 0x200);
1394 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
1395 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
1396 s->io_buffer[0x02] = s->select; /* Head */
1397 s->io_buffer[0x03] = s->sector; /* Sector */
1398 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
1399 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
1400 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
1401 s->io_buffer[0x13] = 0x00; /* Erase flag */
1402 s->io_buffer[0x18] = 0x00; /* Hot count */
1403 s->io_buffer[0x19] = 0x00; /* Hot count */
1404 s->io_buffer[0x1a] = 0x01; /* Hot count */
1406 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1407 ide_set_irq(s->bus);
1412 static bool cmd_cfa_access_metadata_storage(IDEState *s, uint8_t cmd)
1414 switch (s->feature) {
1415 case 0x02: /* Inquiry Metadata Storage */
1416 ide_cfata_metadata_inquiry(s);
1418 case 0x03: /* Read Metadata Storage */
1419 ide_cfata_metadata_read(s);
1421 case 0x04: /* Write Metadata Storage */
1422 ide_cfata_metadata_write(s);
1425 ide_abort_command(s);
1429 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1430 s->status = 0x00; /* NOTE: READY is _not_ set */
1431 ide_set_irq(s->bus);
1436 static bool cmd_ibm_sense_condition(IDEState *s, uint8_t cmd)
1438 switch (s->feature) {
1439 case 0x01: /* sense temperature in device */
1440 s->nsector = 0x50; /* +20 C */
1443 ide_abort_command(s);
1451 /*** SMART commands ***/
1453 static bool cmd_smart(IDEState *s, uint8_t cmd)
1457 if (s->hcyl != 0xc2 || s->lcyl != 0x4f) {
1461 if (!s->smart_enabled && s->feature != SMART_ENABLE) {
1465 switch (s->feature) {
1467 s->smart_enabled = 0;
1471 s->smart_enabled = 1;
1474 case SMART_ATTR_AUTOSAVE:
1475 switch (s->sector) {
1477 s->smart_autosave = 0;
1480 s->smart_autosave = 1;
1488 if (!s->smart_errors) {
1497 case SMART_READ_THRESH:
1498 memset(s->io_buffer, 0, 0x200);
1499 s->io_buffer[0] = 0x01; /* smart struct version */
1501 for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1502 s->io_buffer[2 + 0 + (n * 12)] = smart_attributes[n][0];
1503 s->io_buffer[2 + 1 + (n * 12)] = smart_attributes[n][11];
1507 for (n = 0; n < 511; n++) {
1508 s->io_buffer[511] += s->io_buffer[n];
1510 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1512 s->status = READY_STAT | SEEK_STAT;
1513 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1514 ide_set_irq(s->bus);
1517 case SMART_READ_DATA:
1518 memset(s->io_buffer, 0, 0x200);
1519 s->io_buffer[0] = 0x01; /* smart struct version */
1521 for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1523 for (i = 0; i < 11; i++) {
1524 s->io_buffer[2 + i + (n * 12)] = smart_attributes[n][i];
1528 s->io_buffer[362] = 0x02 | (s->smart_autosave ? 0x80 : 0x00);
1529 if (s->smart_selftest_count == 0) {
1530 s->io_buffer[363] = 0;
1533 s->smart_selftest_data[3 +
1534 (s->smart_selftest_count - 1) *
1537 s->io_buffer[364] = 0x20;
1538 s->io_buffer[365] = 0x01;
1539 /* offline data collection capacity: execute + self-test*/
1540 s->io_buffer[367] = (1 << 4 | 1 << 3 | 1);
1541 s->io_buffer[368] = 0x03; /* smart capability (1) */
1542 s->io_buffer[369] = 0x00; /* smart capability (2) */
1543 s->io_buffer[370] = 0x01; /* error logging supported */
1544 s->io_buffer[372] = 0x02; /* minutes for poll short test */
1545 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1546 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1548 for (n = 0; n < 511; n++) {
1549 s->io_buffer[511] += s->io_buffer[n];
1551 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1553 s->status = READY_STAT | SEEK_STAT;
1554 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1555 ide_set_irq(s->bus);
1558 case SMART_READ_LOG:
1559 switch (s->sector) {
1560 case 0x01: /* summary smart error log */
1561 memset(s->io_buffer, 0, 0x200);
1562 s->io_buffer[0] = 0x01;
1563 s->io_buffer[1] = 0x00; /* no error entries */
1564 s->io_buffer[452] = s->smart_errors & 0xff;
1565 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1567 for (n = 0; n < 511; n++) {
1568 s->io_buffer[511] += s->io_buffer[n];
1570 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1572 case 0x06: /* smart self test log */
1573 memset(s->io_buffer, 0, 0x200);
1574 s->io_buffer[0] = 0x01;
1575 if (s->smart_selftest_count == 0) {
1576 s->io_buffer[508] = 0;
1578 s->io_buffer[508] = s->smart_selftest_count;
1579 for (n = 2; n < 506; n++) {
1580 s->io_buffer[n] = s->smart_selftest_data[n];
1584 for (n = 0; n < 511; n++) {
1585 s->io_buffer[511] += s->io_buffer[n];
1587 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1592 s->status = READY_STAT | SEEK_STAT;
1593 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1594 ide_set_irq(s->bus);
1597 case SMART_EXECUTE_OFFLINE:
1598 switch (s->sector) {
1599 case 0: /* off-line routine */
1600 case 1: /* short self test */
1601 case 2: /* extended self test */
1602 s->smart_selftest_count++;
1603 if (s->smart_selftest_count > 21) {
1604 s->smart_selftest_count = 0;
1606 n = 2 + (s->smart_selftest_count - 1) * 24;
1607 s->smart_selftest_data[n] = s->sector;
1608 s->smart_selftest_data[n + 1] = 0x00; /* OK and finished */
1609 s->smart_selftest_data[n + 2] = 0x34; /* hour count lsb */
1610 s->smart_selftest_data[n + 3] = 0x12; /* hour count msb */
1619 ide_abort_command(s);
1623 #define HD_OK (1u << IDE_HD)
1624 #define CD_OK (1u << IDE_CD)
1625 #define CFA_OK (1u << IDE_CFATA)
1626 #define HD_CFA_OK (HD_OK | CFA_OK)
1627 #define ALL_OK (HD_OK | CD_OK | CFA_OK)
1629 /* Set the Disk Seek Completed status bit during completion */
1630 #define SET_DSC (1u << 8)
1632 /* See ACS-2 T13/2015-D Table B.2 Command codes */
1633 static const struct {
1634 /* Returns true if the completion code should be run */
1635 bool (*handler)(IDEState *s, uint8_t cmd);
1637 } ide_cmd_table[0x100] = {
1638 /* NOP not implemented, mandatory for CD */
1639 [CFA_REQ_EXT_ERROR_CODE] = { cmd_cfa_req_ext_error_code, CFA_OK },
1640 [WIN_DSM] = { cmd_data_set_management, ALL_OK },
1641 [WIN_DEVICE_RESET] = { cmd_device_reset, CD_OK },
1642 [WIN_RECAL] = { cmd_nop, HD_CFA_OK | SET_DSC},
1643 [WIN_READ] = { cmd_read_pio, ALL_OK },
1644 [WIN_READ_ONCE] = { cmd_read_pio, ALL_OK },
1645 [WIN_READ_EXT] = { cmd_read_pio, HD_CFA_OK },
1646 [WIN_READDMA_EXT] = { cmd_read_dma, HD_CFA_OK },
1647 [WIN_READ_NATIVE_MAX_EXT] = { cmd_read_native_max, HD_CFA_OK | SET_DSC },
1648 [WIN_MULTREAD_EXT] = { cmd_read_multiple, HD_CFA_OK },
1649 [WIN_WRITE] = { cmd_write_pio, HD_CFA_OK },
1650 [WIN_WRITE_ONCE] = { cmd_write_pio, HD_CFA_OK },
1651 [WIN_WRITE_EXT] = { cmd_write_pio, HD_CFA_OK },
1652 [WIN_WRITEDMA_EXT] = { cmd_write_dma, HD_CFA_OK },
1653 [CFA_WRITE_SECT_WO_ERASE] = { cmd_write_pio, CFA_OK },
1654 [WIN_MULTWRITE_EXT] = { cmd_write_multiple, HD_CFA_OK },
1655 [WIN_WRITE_VERIFY] = { cmd_write_pio, HD_CFA_OK },
1656 [WIN_VERIFY] = { cmd_verify, HD_CFA_OK | SET_DSC },
1657 [WIN_VERIFY_ONCE] = { cmd_verify, HD_CFA_OK | SET_DSC },
1658 [WIN_VERIFY_EXT] = { cmd_verify, HD_CFA_OK | SET_DSC },
1659 [WIN_SEEK] = { cmd_seek, HD_CFA_OK | SET_DSC },
1660 [CFA_TRANSLATE_SECTOR] = { cmd_cfa_translate_sector, CFA_OK },
1661 [WIN_DIAGNOSE] = { cmd_exec_dev_diagnostic, ALL_OK },
1662 [WIN_SPECIFY] = { cmd_nop, HD_CFA_OK | SET_DSC },
1663 [WIN_STANDBYNOW2] = { cmd_nop, ALL_OK },
1664 [WIN_IDLEIMMEDIATE2] = { cmd_nop, ALL_OK },
1665 [WIN_STANDBY2] = { cmd_nop, ALL_OK },
1666 [WIN_SETIDLE2] = { cmd_nop, ALL_OK },
1667 [WIN_CHECKPOWERMODE2] = { cmd_check_power_mode, ALL_OK | SET_DSC },
1668 [WIN_SLEEPNOW2] = { cmd_nop, ALL_OK },
1669 [WIN_PACKETCMD] = { cmd_packet, CD_OK },
1670 [WIN_PIDENTIFY] = { cmd_identify_packet, CD_OK },
1671 [WIN_SMART] = { cmd_smart, HD_CFA_OK | SET_DSC },
1672 [CFA_ACCESS_METADATA_STORAGE] = { cmd_cfa_access_metadata_storage, CFA_OK },
1673 [CFA_ERASE_SECTORS] = { cmd_cfa_erase_sectors, CFA_OK | SET_DSC },
1674 [WIN_MULTREAD] = { cmd_read_multiple, HD_CFA_OK },
1675 [WIN_MULTWRITE] = { cmd_write_multiple, HD_CFA_OK },
1676 [WIN_SETMULT] = { cmd_set_multiple_mode, HD_CFA_OK | SET_DSC },
1677 [WIN_READDMA] = { cmd_read_dma, HD_CFA_OK },
1678 [WIN_READDMA_ONCE] = { cmd_read_dma, HD_CFA_OK },
1679 [WIN_WRITEDMA] = { cmd_write_dma, HD_CFA_OK },
1680 [WIN_WRITEDMA_ONCE] = { cmd_write_dma, HD_CFA_OK },
1681 [CFA_WRITE_MULTI_WO_ERASE] = { cmd_write_multiple, CFA_OK },
1682 [WIN_STANDBYNOW1] = { cmd_nop, ALL_OK },
1683 [WIN_IDLEIMMEDIATE] = { cmd_nop, ALL_OK },
1684 [WIN_STANDBY] = { cmd_nop, ALL_OK },
1685 [WIN_SETIDLE1] = { cmd_nop, ALL_OK },
1686 [WIN_CHECKPOWERMODE1] = { cmd_check_power_mode, ALL_OK | SET_DSC },
1687 [WIN_SLEEPNOW1] = { cmd_nop, ALL_OK },
1688 [WIN_FLUSH_CACHE] = { cmd_flush_cache, ALL_OK },
1689 [WIN_FLUSH_CACHE_EXT] = { cmd_flush_cache, HD_CFA_OK },
1690 [WIN_IDENTIFY] = { cmd_identify, ALL_OK },
1691 [WIN_SETFEATURES] = { cmd_set_features, ALL_OK | SET_DSC },
1692 [IBM_SENSE_CONDITION] = { cmd_ibm_sense_condition, CFA_OK | SET_DSC },
1693 [CFA_WEAR_LEVEL] = { cmd_cfa_erase_sectors, HD_CFA_OK | SET_DSC },
1694 [WIN_READ_NATIVE_MAX] = { cmd_read_native_max, ALL_OK | SET_DSC },
1697 static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
1699 return cmd < ARRAY_SIZE(ide_cmd_table)
1700 && (ide_cmd_table[cmd].flags & (1u << s->drive_kind));
1703 void ide_exec_cmd(IDEBus *bus, uint32_t val)
1708 #if defined(DEBUG_IDE)
1709 printf("ide: CMD=%02x\n", val);
1711 s = idebus_active_if(bus);
1712 /* ignore commands to non existent slave */
1713 if (s != bus->ifs && !s->bs)
1716 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1717 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1720 if (!ide_cmd_permitted(s, val)) {
1721 ide_abort_command(s);
1722 ide_set_irq(s->bus);
1726 s->status = READY_STAT | BUSY_STAT;
1729 complete = ide_cmd_table[val].handler(s, val);
1731 s->status &= ~BUSY_STAT;
1732 assert(!!s->error == !!(s->status & ERR_STAT));
1734 if ((ide_cmd_table[val].flags & SET_DSC) && !s->error) {
1735 s->status |= SEEK_STAT;
1738 ide_set_irq(s->bus);
1742 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1744 IDEBus *bus = opaque;
1745 IDEState *s = idebus_active_if(bus);
1750 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1751 //hob = s->select & (1 << 7);
1758 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1759 (s != bus->ifs && !s->bs))
1764 ret = s->hob_feature;
1767 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1770 ret = s->nsector & 0xff;
1772 ret = s->hob_nsector;
1775 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1780 ret = s->hob_sector;
1783 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1791 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1799 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1806 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1807 (s != bus->ifs && !s->bs))
1811 qemu_irq_lower(bus->irq);
1815 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1820 uint32_t ide_status_read(void *opaque, uint32_t addr)
1822 IDEBus *bus = opaque;
1823 IDEState *s = idebus_active_if(bus);
1826 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1827 (s != bus->ifs && !s->bs))
1832 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1837 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1839 IDEBus *bus = opaque;
1844 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1846 /* common for both drives */
1847 if (!(bus->cmd & IDE_CMD_RESET) &&
1848 (val & IDE_CMD_RESET)) {
1849 /* reset low to high */
1850 for(i = 0;i < 2; i++) {
1852 s->status = BUSY_STAT | SEEK_STAT;
1855 } else if ((bus->cmd & IDE_CMD_RESET) &&
1856 !(val & IDE_CMD_RESET)) {
1858 for(i = 0;i < 2; i++) {
1860 if (s->drive_kind == IDE_CD)
1861 s->status = 0x00; /* NOTE: READY is _not_ set */
1863 s->status = READY_STAT | SEEK_STAT;
1864 ide_set_signature(s);
1872 * Returns true if the running PIO transfer is a PIO out (i.e. data is
1873 * transferred from the device to the guest), false if it's a PIO in
1875 static bool ide_is_pio_out(IDEState *s)
1877 if (s->end_transfer_func == ide_sector_write ||
1878 s->end_transfer_func == ide_atapi_cmd) {
1880 } else if (s->end_transfer_func == ide_sector_read ||
1881 s->end_transfer_func == ide_transfer_stop ||
1882 s->end_transfer_func == ide_atapi_cmd_reply_end ||
1883 s->end_transfer_func == ide_dummy_transfer_stop) {
1890 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1892 IDEBus *bus = opaque;
1893 IDEState *s = idebus_active_if(bus);
1896 /* PIO data access allowed only when DRQ bit is set. The result of a write
1897 * during PIO out is indeterminate, just ignore it. */
1898 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1903 *(uint16_t *)p = le16_to_cpu(val);
1906 if (p >= s->data_end)
1907 s->end_transfer_func(s);
1910 uint32_t ide_data_readw(void *opaque, uint32_t addr)
1912 IDEBus *bus = opaque;
1913 IDEState *s = idebus_active_if(bus);
1917 /* PIO data access allowed only when DRQ bit is set. The result of a read
1918 * during PIO in is indeterminate, return 0 and don't move forward. */
1919 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1924 ret = cpu_to_le16(*(uint16_t *)p);
1927 if (p >= s->data_end)
1928 s->end_transfer_func(s);
1932 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1934 IDEBus *bus = opaque;
1935 IDEState *s = idebus_active_if(bus);
1938 /* PIO data access allowed only when DRQ bit is set. The result of a write
1939 * during PIO out is indeterminate, just ignore it. */
1940 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1945 *(uint32_t *)p = le32_to_cpu(val);
1948 if (p >= s->data_end)
1949 s->end_transfer_func(s);
1952 uint32_t ide_data_readl(void *opaque, uint32_t addr)
1954 IDEBus *bus = opaque;
1955 IDEState *s = idebus_active_if(bus);
1959 /* PIO data access allowed only when DRQ bit is set. The result of a read
1960 * during PIO in is indeterminate, return 0 and don't move forward. */
1961 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1966 ret = cpu_to_le32(*(uint32_t *)p);
1969 if (p >= s->data_end)
1970 s->end_transfer_func(s);
1974 static void ide_dummy_transfer_stop(IDEState *s)
1976 s->data_ptr = s->io_buffer;
1977 s->data_end = s->io_buffer;
1978 s->io_buffer[0] = 0xff;
1979 s->io_buffer[1] = 0xff;
1980 s->io_buffer[2] = 0xff;
1981 s->io_buffer[3] = 0xff;
1984 static void ide_reset(IDEState *s)
1987 printf("ide: reset\n");
1991 bdrv_aio_cancel(s->pio_aiocb);
1992 s->pio_aiocb = NULL;
1995 if (s->drive_kind == IDE_CFATA)
1996 s->mult_sectors = 0;
1998 s->mult_sectors = MAX_MULT_SECTORS;
2015 s->status = READY_STAT | SEEK_STAT;
2019 /* ATAPI specific */
2022 s->cdrom_changed = 0;
2023 s->packet_transfer_size = 0;
2024 s->elementary_transfer_size = 0;
2025 s->io_buffer_index = 0;
2026 s->cd_sector_size = 0;
2031 s->io_buffer_size = 0;
2032 s->req_nb_sectors = 0;
2034 ide_set_signature(s);
2035 /* init the transfer handler so that 0xffff is returned on data
2037 s->end_transfer_func = ide_dummy_transfer_stop;
2038 ide_dummy_transfer_stop(s);
2039 s->media_changed = 0;
2042 void ide_bus_reset(IDEBus *bus)
2046 ide_reset(&bus->ifs[0]);
2047 ide_reset(&bus->ifs[1]);
2050 /* pending async DMA */
2051 if (bus->dma->aiocb) {
2053 printf("aio_cancel\n");
2055 bdrv_aio_cancel(bus->dma->aiocb);
2056 bus->dma->aiocb = NULL;
2059 /* reset dma provider too */
2060 bus->dma->ops->reset(bus->dma);
2063 static bool ide_cd_is_tray_open(void *opaque)
2065 return ((IDEState *)opaque)->tray_open;
2068 static bool ide_cd_is_medium_locked(void *opaque)
2070 return ((IDEState *)opaque)->tray_locked;
2073 static const BlockDevOps ide_cd_block_ops = {
2074 .change_media_cb = ide_cd_change_cb,
2075 .eject_request_cb = ide_cd_eject_request_cb,
2076 .is_tray_open = ide_cd_is_tray_open,
2077 .is_medium_locked = ide_cd_is_medium_locked,
2080 int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
2081 const char *version, const char *serial, const char *model,
2083 uint32_t cylinders, uint32_t heads, uint32_t secs,
2086 uint64_t nb_sectors;
2089 s->drive_kind = kind;
2091 bdrv_get_geometry(bs, &nb_sectors);
2092 s->cylinders = cylinders;
2095 s->chs_trans = chs_trans;
2096 s->nb_sectors = nb_sectors;
2098 /* The SMART values should be preserved across power cycles
2100 s->smart_enabled = 1;
2101 s->smart_autosave = 1;
2102 s->smart_errors = 0;
2103 s->smart_selftest_count = 0;
2104 if (kind == IDE_CD) {
2105 bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
2106 bdrv_set_guest_block_size(bs, 2048);
2108 if (!bdrv_is_inserted(s->bs)) {
2109 error_report("Device needs media, but drive is empty");
2112 if (bdrv_is_read_only(bs)) {
2113 error_report("Can't use a read-only drive");
2118 pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
2120 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
2121 "QM%05d", s->drive_serial);
2124 pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
2128 strcpy(s->drive_model_str, "QEMU DVD-ROM");
2131 strcpy(s->drive_model_str, "QEMU MICRODRIVE");
2134 strcpy(s->drive_model_str, "QEMU HARDDISK");
2140 pstrcpy(s->version, sizeof(s->version), version);
2142 pstrcpy(s->version, sizeof(s->version), qemu_get_version());
2146 bdrv_iostatus_enable(bs);
2150 static void ide_init1(IDEBus *bus, int unit)
2152 static int drive_serial = 1;
2153 IDEState *s = &bus->ifs[unit];
2157 s->drive_serial = drive_serial++;
2158 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2159 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2160 s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
2161 memset(s->io_buffer, 0, s->io_buffer_total_len);
2163 s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2164 memset(s->smart_selftest_data, 0, 512);
2166 s->sector_write_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
2167 ide_sector_write_timer_cb, s);
2170 static void ide_nop_start(IDEDMA *dma, IDEState *s,
2171 BlockDriverCompletionFunc *cb)
2175 static int ide_nop(IDEDMA *dma)
2180 static int ide_nop_int(IDEDMA *dma, int x)
2185 static void ide_nop_restart(void *opaque, int x, RunState y)
2189 static const IDEDMAOps ide_dma_nop_ops = {
2190 .start_dma = ide_nop_start,
2191 .start_transfer = ide_nop,
2192 .prepare_buf = ide_nop_int,
2193 .rw_buf = ide_nop_int,
2194 .set_unit = ide_nop_int,
2195 .add_status = ide_nop_int,
2196 .set_inactive = ide_nop,
2197 .restart_cb = ide_nop_restart,
2201 static IDEDMA ide_dma_nop = {
2202 .ops = &ide_dma_nop_ops,
2206 void ide_init2(IDEBus *bus, qemu_irq irq)
2210 for(i = 0; i < 2; i++) {
2212 ide_reset(&bus->ifs[i]);
2215 bus->dma = &ide_dma_nop;
2218 static const MemoryRegionPortio ide_portio_list[] = {
2219 { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2220 { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
2221 { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
2222 PORTIO_END_OF_LIST(),
2225 static const MemoryRegionPortio ide_portio2_list[] = {
2226 { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2227 PORTIO_END_OF_LIST(),
2230 void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
2232 /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2233 bridge has been setup properly to always register with ISA. */
2234 isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2237 isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
2241 static bool is_identify_set(void *opaque, int version_id)
2243 IDEState *s = opaque;
2245 return s->identify_set != 0;
2248 static EndTransferFunc* transfer_end_table[] = {
2252 ide_atapi_cmd_reply_end,
2254 ide_dummy_transfer_stop,
2257 static int transfer_end_table_idx(EndTransferFunc *fn)
2261 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2262 if (transfer_end_table[i] == fn)
2268 static int ide_drive_post_load(void *opaque, int version_id)
2270 IDEState *s = opaque;
2272 if (s->identify_set) {
2273 bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
2278 static int ide_drive_pio_post_load(void *opaque, int version_id)
2280 IDEState *s = opaque;
2282 if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
2285 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2286 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2287 s->data_end = s->data_ptr + s->cur_io_buffer_len;
2292 static void ide_drive_pio_pre_save(void *opaque)
2294 IDEState *s = opaque;
2297 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2298 s->cur_io_buffer_len = s->data_end - s->data_ptr;
2300 idx = transfer_end_table_idx(s->end_transfer_func);
2302 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2304 s->end_transfer_fn_idx = 2;
2306 s->end_transfer_fn_idx = idx;
2310 static bool ide_drive_pio_state_needed(void *opaque)
2312 IDEState *s = opaque;
2314 return ((s->status & DRQ_STAT) != 0)
2315 || (s->bus->error_status & BM_STATUS_PIO_RETRY);
2318 static bool ide_tray_state_needed(void *opaque)
2320 IDEState *s = opaque;
2322 return s->tray_open || s->tray_locked;
2325 static bool ide_atapi_gesn_needed(void *opaque)
2327 IDEState *s = opaque;
2329 return s->events.new_media || s->events.eject_request;
2332 static bool ide_error_needed(void *opaque)
2334 IDEBus *bus = opaque;
2336 return (bus->error_status != 0);
2339 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
2340 static const VMStateDescription vmstate_ide_atapi_gesn_state = {
2341 .name ="ide_drive/atapi/gesn_state",
2343 .minimum_version_id = 1,
2344 .minimum_version_id_old = 1,
2345 .fields = (VMStateField []) {
2346 VMSTATE_BOOL(events.new_media, IDEState),
2347 VMSTATE_BOOL(events.eject_request, IDEState),
2348 VMSTATE_END_OF_LIST()
2352 static const VMStateDescription vmstate_ide_tray_state = {
2353 .name = "ide_drive/tray_state",
2355 .minimum_version_id = 1,
2356 .minimum_version_id_old = 1,
2357 .fields = (VMStateField[]) {
2358 VMSTATE_BOOL(tray_open, IDEState),
2359 VMSTATE_BOOL(tray_locked, IDEState),
2360 VMSTATE_END_OF_LIST()
2364 static const VMStateDescription vmstate_ide_drive_pio_state = {
2365 .name = "ide_drive/pio_state",
2367 .minimum_version_id = 1,
2368 .minimum_version_id_old = 1,
2369 .pre_save = ide_drive_pio_pre_save,
2370 .post_load = ide_drive_pio_post_load,
2371 .fields = (VMStateField []) {
2372 VMSTATE_INT32(req_nb_sectors, IDEState),
2373 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2374 vmstate_info_uint8, uint8_t),
2375 VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2376 VMSTATE_INT32(cur_io_buffer_len, IDEState),
2377 VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2378 VMSTATE_INT32(elementary_transfer_size, IDEState),
2379 VMSTATE_INT32(packet_transfer_size, IDEState),
2380 VMSTATE_END_OF_LIST()
2384 const VMStateDescription vmstate_ide_drive = {
2385 .name = "ide_drive",
2387 .minimum_version_id = 0,
2388 .minimum_version_id_old = 0,
2389 .post_load = ide_drive_post_load,
2390 .fields = (VMStateField []) {
2391 VMSTATE_INT32(mult_sectors, IDEState),
2392 VMSTATE_INT32(identify_set, IDEState),
2393 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2394 VMSTATE_UINT8(feature, IDEState),
2395 VMSTATE_UINT8(error, IDEState),
2396 VMSTATE_UINT32(nsector, IDEState),
2397 VMSTATE_UINT8(sector, IDEState),
2398 VMSTATE_UINT8(lcyl, IDEState),
2399 VMSTATE_UINT8(hcyl, IDEState),
2400 VMSTATE_UINT8(hob_feature, IDEState),
2401 VMSTATE_UINT8(hob_sector, IDEState),
2402 VMSTATE_UINT8(hob_nsector, IDEState),
2403 VMSTATE_UINT8(hob_lcyl, IDEState),
2404 VMSTATE_UINT8(hob_hcyl, IDEState),
2405 VMSTATE_UINT8(select, IDEState),
2406 VMSTATE_UINT8(status, IDEState),
2407 VMSTATE_UINT8(lba48, IDEState),
2408 VMSTATE_UINT8(sense_key, IDEState),
2409 VMSTATE_UINT8(asc, IDEState),
2410 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2411 VMSTATE_END_OF_LIST()
2413 .subsections = (VMStateSubsection []) {
2415 .vmsd = &vmstate_ide_drive_pio_state,
2416 .needed = ide_drive_pio_state_needed,
2418 .vmsd = &vmstate_ide_tray_state,
2419 .needed = ide_tray_state_needed,
2421 .vmsd = &vmstate_ide_atapi_gesn_state,
2422 .needed = ide_atapi_gesn_needed,
2429 static const VMStateDescription vmstate_ide_error_status = {
2430 .name ="ide_bus/error",
2432 .minimum_version_id = 1,
2433 .minimum_version_id_old = 1,
2434 .fields = (VMStateField []) {
2435 VMSTATE_INT32(error_status, IDEBus),
2436 VMSTATE_END_OF_LIST()
2440 const VMStateDescription vmstate_ide_bus = {
2443 .minimum_version_id = 1,
2444 .minimum_version_id_old = 1,
2445 .fields = (VMStateField []) {
2446 VMSTATE_UINT8(cmd, IDEBus),
2447 VMSTATE_UINT8(unit, IDEBus),
2448 VMSTATE_END_OF_LIST()
2450 .subsections = (VMStateSubsection []) {
2452 .vmsd = &vmstate_ide_error_status,
2453 .needed = ide_error_needed,
2460 void ide_drive_get(DriveInfo **hd, int max_bus)
2464 if (drive_get_max_bus(IF_IDE) >= max_bus) {
2465 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2469 for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2470 hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);