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 ide_transfer_stop(s);
424 s->status = READY_STAT | ERR_STAT;
428 /* prepare data transfer and tell what to do after */
429 void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
430 EndTransferFunc *end_transfer_func)
432 s->end_transfer_func = end_transfer_func;
434 s->data_end = buf + size;
435 if (!(s->status & ERR_STAT)) {
436 s->status |= DRQ_STAT;
438 if (s->bus->dma->ops->start_transfer) {
439 s->bus->dma->ops->start_transfer(s->bus->dma);
443 void ide_transfer_stop(IDEState *s)
445 s->end_transfer_func = ide_transfer_stop;
446 s->data_ptr = s->io_buffer;
447 s->data_end = s->io_buffer;
448 s->status &= ~DRQ_STAT;
451 int64_t ide_get_sector(IDEState *s)
454 if (s->select & 0x40) {
457 sector_num = ((s->select & 0x0f) << 24) | (s->hcyl << 16) |
458 (s->lcyl << 8) | s->sector;
460 sector_num = ((int64_t)s->hob_hcyl << 40) |
461 ((int64_t) s->hob_lcyl << 32) |
462 ((int64_t) s->hob_sector << 24) |
463 ((int64_t) s->hcyl << 16) |
464 ((int64_t) s->lcyl << 8) | s->sector;
467 sector_num = ((s->hcyl << 8) | s->lcyl) * s->heads * s->sectors +
468 (s->select & 0x0f) * s->sectors + (s->sector - 1);
473 void ide_set_sector(IDEState *s, int64_t sector_num)
476 if (s->select & 0x40) {
478 s->select = (s->select & 0xf0) | (sector_num >> 24);
479 s->hcyl = (sector_num >> 16);
480 s->lcyl = (sector_num >> 8);
481 s->sector = (sector_num);
483 s->sector = sector_num;
484 s->lcyl = sector_num >> 8;
485 s->hcyl = sector_num >> 16;
486 s->hob_sector = sector_num >> 24;
487 s->hob_lcyl = sector_num >> 32;
488 s->hob_hcyl = sector_num >> 40;
491 cyl = sector_num / (s->heads * s->sectors);
492 r = sector_num % (s->heads * s->sectors);
495 s->select = (s->select & 0xf0) | ((r / s->sectors) & 0x0f);
496 s->sector = (r % s->sectors) + 1;
500 static void ide_rw_error(IDEState *s) {
501 ide_abort_command(s);
505 static bool ide_sect_range_ok(IDEState *s,
506 uint64_t sector, uint64_t nb_sectors)
508 uint64_t total_sectors;
510 bdrv_get_geometry(s->bs, &total_sectors);
511 if (sector > total_sectors || nb_sectors > total_sectors - sector) {
517 static void ide_sector_read_cb(void *opaque, int ret)
519 IDEState *s = opaque;
523 s->status &= ~BUSY_STAT;
525 bdrv_acct_done(s->bs, &s->acct);
527 if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO |
534 if (n > s->req_nb_sectors) {
535 n = s->req_nb_sectors;
538 /* Allow the guest to read the io_buffer */
539 ide_transfer_start(s, s->io_buffer, n * BDRV_SECTOR_SIZE, ide_sector_read);
543 ide_set_sector(s, ide_get_sector(s) + n);
547 void ide_sector_read(IDEState *s)
552 s->status = READY_STAT | SEEK_STAT;
553 s->error = 0; /* not needed by IDE spec, but needed by Windows */
554 sector_num = ide_get_sector(s);
558 ide_transfer_stop(s);
562 s->status |= BUSY_STAT;
564 if (n > s->req_nb_sectors) {
565 n = s->req_nb_sectors;
568 #if defined(DEBUG_IDE)
569 printf("sector=%" PRId64 "\n", sector_num);
572 if (!ide_sect_range_ok(s, sector_num, n)) {
577 s->iov.iov_base = s->io_buffer;
578 s->iov.iov_len = n * BDRV_SECTOR_SIZE;
579 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
581 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
582 s->pio_aiocb = bdrv_aio_readv(s->bs, sector_num, &s->qiov, n,
583 ide_sector_read_cb, s);
586 static void dma_buf_commit(IDEState *s)
588 qemu_sglist_destroy(&s->sg);
591 static void ide_async_cmd_done(IDEState *s)
593 if (s->bus->dma->ops->async_cmd_done) {
594 s->bus->dma->ops->async_cmd_done(s->bus->dma);
598 void ide_set_inactive(IDEState *s, bool more)
600 s->bus->dma->aiocb = NULL;
601 if (s->bus->dma->ops->set_inactive) {
602 s->bus->dma->ops->set_inactive(s->bus->dma, more);
604 ide_async_cmd_done(s);
607 void ide_dma_error(IDEState *s)
609 ide_abort_command(s);
610 ide_set_inactive(s, false);
614 static int ide_handle_rw_error(IDEState *s, int error, int op)
616 bool is_read = (op & IDE_RETRY_READ) != 0;
617 BlockErrorAction action = bdrv_get_error_action(s->bs, is_read, error);
619 if (action == BLOCK_ERROR_ACTION_STOP) {
620 s->bus->dma->ops->set_unit(s->bus->dma, s->unit);
621 s->bus->error_status = op;
622 } else if (action == BLOCK_ERROR_ACTION_REPORT) {
623 if (op & IDE_RETRY_DMA) {
630 bdrv_error_action(s->bs, action, is_read, error);
631 return action != BLOCK_ERROR_ACTION_IGNORE;
634 void ide_dma_cb(void *opaque, int ret)
636 IDEState *s = opaque;
639 bool stay_active = false;
642 int op = IDE_RETRY_DMA;
644 if (s->dma_cmd == IDE_DMA_READ)
645 op |= IDE_RETRY_READ;
646 else if (s->dma_cmd == IDE_DMA_TRIM)
647 op |= IDE_RETRY_TRIM;
649 if (ide_handle_rw_error(s, -ret, op)) {
654 n = s->io_buffer_size >> 9;
655 if (n > s->nsector) {
656 /* The PRDs were longer than needed for this request. Shorten them so
657 * we don't get a negative remainder. The Active bit must remain set
658 * after the request completes. */
663 sector_num = ide_get_sector(s);
667 ide_set_sector(s, sector_num);
671 /* end of transfer ? */
672 if (s->nsector == 0) {
673 s->status = READY_STAT | SEEK_STAT;
678 /* launch next transfer */
680 s->io_buffer_index = 0;
681 s->io_buffer_size = n * 512;
682 if (s->bus->dma->ops->prepare_buf(s->bus->dma, ide_cmd_is_read(s)) == 0) {
683 /* The PRDs were too short. Reset the Active bit, but don't raise an
685 s->status = READY_STAT | SEEK_STAT;
690 printf("ide_dma_cb: sector_num=%" PRId64 " n=%d, cmd_cmd=%d\n",
691 sector_num, n, s->dma_cmd);
694 if (!ide_sect_range_ok(s, sector_num, n)) {
700 switch (s->dma_cmd) {
702 s->bus->dma->aiocb = dma_bdrv_read(s->bs, &s->sg, sector_num,
706 s->bus->dma->aiocb = dma_bdrv_write(s->bs, &s->sg, sector_num,
710 s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num,
711 ide_issue_trim, ide_dma_cb, s,
712 DMA_DIRECTION_TO_DEVICE);
718 if (s->dma_cmd == IDE_DMA_READ || s->dma_cmd == IDE_DMA_WRITE) {
719 bdrv_acct_done(s->bs, &s->acct);
721 ide_set_inactive(s, stay_active);
724 static void ide_sector_start_dma(IDEState *s, enum ide_dma_cmd dma_cmd)
726 s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
727 s->io_buffer_index = 0;
728 s->io_buffer_size = 0;
729 s->dma_cmd = dma_cmd;
733 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
737 bdrv_acct_start(s->bs, &s->acct, s->nsector * BDRV_SECTOR_SIZE,
744 ide_start_dma(s, ide_dma_cb);
747 void ide_start_dma(IDEState *s, BlockDriverCompletionFunc *cb)
749 if (s->bus->dma->ops->start_dma) {
750 s->bus->dma->ops->start_dma(s->bus->dma, s, cb);
754 static void ide_sector_write_timer_cb(void *opaque)
756 IDEState *s = opaque;
760 static void ide_sector_write_cb(void *opaque, int ret)
762 IDEState *s = opaque;
765 bdrv_acct_done(s->bs, &s->acct);
768 s->status &= ~BUSY_STAT;
771 if (ide_handle_rw_error(s, -ret, IDE_RETRY_PIO)) {
777 if (n > s->req_nb_sectors) {
778 n = s->req_nb_sectors;
781 if (s->nsector == 0) {
782 /* no more sectors to write */
783 ide_transfer_stop(s);
786 if (n1 > s->req_nb_sectors) {
787 n1 = s->req_nb_sectors;
789 ide_transfer_start(s, s->io_buffer, n1 * BDRV_SECTOR_SIZE,
792 ide_set_sector(s, ide_get_sector(s) + n);
794 if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
795 /* It seems there is a bug in the Windows 2000 installer HDD
796 IDE driver which fills the disk with empty logs when the
797 IDE write IRQ comes too early. This hack tries to correct
798 that at the expense of slower write performances. Use this
799 option _only_ to install Windows 2000. You must disable it
801 timer_mod(s->sector_write_timer,
802 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (get_ticks_per_sec() / 1000));
808 void ide_sector_write(IDEState *s)
813 s->status = READY_STAT | SEEK_STAT | BUSY_STAT;
814 sector_num = ide_get_sector(s);
815 #if defined(DEBUG_IDE)
816 printf("sector=%" PRId64 "\n", sector_num);
819 if (n > s->req_nb_sectors) {
820 n = s->req_nb_sectors;
823 if (!ide_sect_range_ok(s, sector_num, n)) {
828 s->iov.iov_base = s->io_buffer;
829 s->iov.iov_len = n * BDRV_SECTOR_SIZE;
830 qemu_iovec_init_external(&s->qiov, &s->iov, 1);
832 bdrv_acct_start(s->bs, &s->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
833 s->pio_aiocb = bdrv_aio_writev(s->bs, sector_num, &s->qiov, n,
834 ide_sector_write_cb, s);
837 static void ide_flush_cb(void *opaque, int ret)
839 IDEState *s = opaque;
844 /* XXX: What sector number to set here? */
845 if (ide_handle_rw_error(s, -ret, IDE_RETRY_FLUSH)) {
850 bdrv_acct_done(s->bs, &s->acct);
851 s->status = READY_STAT | SEEK_STAT;
852 ide_async_cmd_done(s);
856 void ide_flush_cache(IDEState *s)
863 s->status |= BUSY_STAT;
864 bdrv_acct_start(s->bs, &s->acct, 0, BDRV_ACCT_FLUSH);
865 s->pio_aiocb = bdrv_aio_flush(s->bs, ide_flush_cb, s);
868 static void ide_cfata_metadata_inquiry(IDEState *s)
873 p = (uint16_t *) s->io_buffer;
875 spd = ((s->mdata_size - 1) >> 9) + 1;
877 put_le16(p + 0, 0x0001); /* Data format revision */
878 put_le16(p + 1, 0x0000); /* Media property: silicon */
879 put_le16(p + 2, s->media_changed); /* Media status */
880 put_le16(p + 3, s->mdata_size & 0xffff); /* Capacity in bytes (low) */
881 put_le16(p + 4, s->mdata_size >> 16); /* Capacity in bytes (high) */
882 put_le16(p + 5, spd & 0xffff); /* Sectors per device (low) */
883 put_le16(p + 6, spd >> 16); /* Sectors per device (high) */
886 static void ide_cfata_metadata_read(IDEState *s)
890 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
891 s->status = ERR_STAT;
896 p = (uint16_t *) s->io_buffer;
899 put_le16(p + 0, s->media_changed); /* Media status */
900 memcpy(p + 1, s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
901 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
902 s->nsector << 9), 0x200 - 2));
905 static void ide_cfata_metadata_write(IDEState *s)
907 if (((s->hcyl << 16) | s->lcyl) << 9 > s->mdata_size + 2) {
908 s->status = ERR_STAT;
913 s->media_changed = 0;
915 memcpy(s->mdata_storage + (((s->hcyl << 16) | s->lcyl) << 9),
917 MIN(MIN(s->mdata_size - (((s->hcyl << 16) | s->lcyl) << 9),
918 s->nsector << 9), 0x200 - 2));
921 /* called when the inserted state of the media has changed */
922 static void ide_cd_change_cb(void *opaque, bool load)
924 IDEState *s = opaque;
927 s->tray_open = !load;
928 bdrv_get_geometry(s->bs, &nb_sectors);
929 s->nb_sectors = nb_sectors;
932 * First indicate to the guest that a CD has been removed. That's
933 * done on the next command the guest sends us.
935 * Then we set UNIT_ATTENTION, by which the guest will
936 * detect a new CD in the drive. See ide_atapi_cmd() for details.
938 s->cdrom_changed = 1;
939 s->events.new_media = true;
940 s->events.eject_request = false;
944 static void ide_cd_eject_request_cb(void *opaque, bool force)
946 IDEState *s = opaque;
948 s->events.eject_request = true;
950 s->tray_locked = false;
955 static void ide_cmd_lba48_transform(IDEState *s, int lba48)
959 /* handle the 'magic' 0 nsector count conversion here. to avoid
960 * fiddling with the rest of the read logic, we just store the
961 * full sector count in ->nsector and ignore ->hob_nsector from now
967 if (!s->nsector && !s->hob_nsector)
971 int hi = s->hob_nsector;
973 s->nsector = (hi << 8) | lo;
978 static void ide_clear_hob(IDEBus *bus)
980 /* any write clears HOB high bit of device control register */
981 bus->ifs[0].select &= ~(1 << 7);
982 bus->ifs[1].select &= ~(1 << 7);
985 void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
987 IDEBus *bus = opaque;
990 printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
995 /* ignore writes to command block while busy with previous command */
996 if (addr != 7 && (idebus_active_if(bus)->status & (BUSY_STAT|DRQ_STAT)))
1004 /* NOTE: data is written to the two drives */
1005 bus->ifs[0].hob_feature = bus->ifs[0].feature;
1006 bus->ifs[1].hob_feature = bus->ifs[1].feature;
1007 bus->ifs[0].feature = val;
1008 bus->ifs[1].feature = val;
1012 bus->ifs[0].hob_nsector = bus->ifs[0].nsector;
1013 bus->ifs[1].hob_nsector = bus->ifs[1].nsector;
1014 bus->ifs[0].nsector = val;
1015 bus->ifs[1].nsector = val;
1019 bus->ifs[0].hob_sector = bus->ifs[0].sector;
1020 bus->ifs[1].hob_sector = bus->ifs[1].sector;
1021 bus->ifs[0].sector = val;
1022 bus->ifs[1].sector = val;
1026 bus->ifs[0].hob_lcyl = bus->ifs[0].lcyl;
1027 bus->ifs[1].hob_lcyl = bus->ifs[1].lcyl;
1028 bus->ifs[0].lcyl = val;
1029 bus->ifs[1].lcyl = val;
1033 bus->ifs[0].hob_hcyl = bus->ifs[0].hcyl;
1034 bus->ifs[1].hob_hcyl = bus->ifs[1].hcyl;
1035 bus->ifs[0].hcyl = val;
1036 bus->ifs[1].hcyl = val;
1039 /* FIXME: HOB readback uses bit 7 */
1040 bus->ifs[0].select = (val & ~0x10) | 0xa0;
1041 bus->ifs[1].select = (val | 0x10) | 0xa0;
1043 bus->unit = (val >> 4) & 1;
1048 ide_exec_cmd(bus, val);
1053 static bool cmd_nop(IDEState *s, uint8_t cmd)
1058 static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
1060 switch (s->feature) {
1063 ide_sector_start_dma(s, IDE_DMA_TRIM);
1069 ide_abort_command(s);
1073 static bool cmd_identify(IDEState *s, uint8_t cmd)
1075 if (s->bs && s->drive_kind != IDE_CD) {
1076 if (s->drive_kind != IDE_CFATA) {
1079 ide_cfata_identify(s);
1081 s->status = READY_STAT | SEEK_STAT;
1082 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1083 ide_set_irq(s->bus);
1086 if (s->drive_kind == IDE_CD) {
1087 ide_set_signature(s);
1089 ide_abort_command(s);
1095 static bool cmd_verify(IDEState *s, uint8_t cmd)
1097 bool lba48 = (cmd == WIN_VERIFY_EXT);
1099 /* do sector number check ? */
1100 ide_cmd_lba48_transform(s, lba48);
1105 static bool cmd_set_multiple_mode(IDEState *s, uint8_t cmd)
1107 if (s->drive_kind == IDE_CFATA && s->nsector == 0) {
1108 /* Disable Read and Write Multiple */
1109 s->mult_sectors = 0;
1110 } else if ((s->nsector & 0xff) != 0 &&
1111 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
1112 (s->nsector & (s->nsector - 1)) != 0)) {
1113 ide_abort_command(s);
1115 s->mult_sectors = s->nsector & 0xff;
1121 static bool cmd_read_multiple(IDEState *s, uint8_t cmd)
1123 bool lba48 = (cmd == WIN_MULTREAD_EXT);
1125 if (!s->bs || !s->mult_sectors) {
1126 ide_abort_command(s);
1130 ide_cmd_lba48_transform(s, lba48);
1131 s->req_nb_sectors = s->mult_sectors;
1136 static bool cmd_write_multiple(IDEState *s, uint8_t cmd)
1138 bool lba48 = (cmd == WIN_MULTWRITE_EXT);
1141 if (!s->bs || !s->mult_sectors) {
1142 ide_abort_command(s);
1146 ide_cmd_lba48_transform(s, lba48);
1148 s->req_nb_sectors = s->mult_sectors;
1149 n = MIN(s->nsector, s->req_nb_sectors);
1151 s->status = SEEK_STAT | READY_STAT;
1152 ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_write);
1154 s->media_changed = 1;
1159 static bool cmd_read_pio(IDEState *s, uint8_t cmd)
1161 bool lba48 = (cmd == WIN_READ_EXT);
1163 if (s->drive_kind == IDE_CD) {
1164 ide_set_signature(s); /* odd, but ATA4 8.27.5.2 requires it */
1165 ide_abort_command(s);
1170 ide_abort_command(s);
1174 ide_cmd_lba48_transform(s, lba48);
1175 s->req_nb_sectors = 1;
1181 static bool cmd_write_pio(IDEState *s, uint8_t cmd)
1183 bool lba48 = (cmd == WIN_WRITE_EXT);
1186 ide_abort_command(s);
1190 ide_cmd_lba48_transform(s, lba48);
1192 s->req_nb_sectors = 1;
1193 s->status = SEEK_STAT | READY_STAT;
1194 ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
1196 s->media_changed = 1;
1201 static bool cmd_read_dma(IDEState *s, uint8_t cmd)
1203 bool lba48 = (cmd == WIN_READDMA_EXT);
1206 ide_abort_command(s);
1210 ide_cmd_lba48_transform(s, lba48);
1211 ide_sector_start_dma(s, IDE_DMA_READ);
1216 static bool cmd_write_dma(IDEState *s, uint8_t cmd)
1218 bool lba48 = (cmd == WIN_WRITEDMA_EXT);
1221 ide_abort_command(s);
1225 ide_cmd_lba48_transform(s, lba48);
1226 ide_sector_start_dma(s, IDE_DMA_WRITE);
1228 s->media_changed = 1;
1233 static bool cmd_flush_cache(IDEState *s, uint8_t cmd)
1239 static bool cmd_seek(IDEState *s, uint8_t cmd)
1241 /* XXX: Check that seek is within bounds */
1245 static bool cmd_read_native_max(IDEState *s, uint8_t cmd)
1247 bool lba48 = (cmd == WIN_READ_NATIVE_MAX_EXT);
1249 /* Refuse if no sectors are addressable (e.g. medium not inserted) */
1250 if (s->nb_sectors == 0) {
1251 ide_abort_command(s);
1255 ide_cmd_lba48_transform(s, lba48);
1256 ide_set_sector(s, s->nb_sectors - 1);
1261 static bool cmd_check_power_mode(IDEState *s, uint8_t cmd)
1263 s->nsector = 0xff; /* device active or idle */
1267 static bool cmd_set_features(IDEState *s, uint8_t cmd)
1269 uint16_t *identify_data;
1272 ide_abort_command(s);
1276 /* XXX: valid for CDROM ? */
1277 switch (s->feature) {
1278 case 0x02: /* write cache enable */
1279 bdrv_set_enable_write_cache(s->bs, true);
1280 identify_data = (uint16_t *)s->identify_data;
1281 put_le16(identify_data + 85, (1 << 14) | (1 << 5) | 1);
1283 case 0x82: /* write cache disable */
1284 bdrv_set_enable_write_cache(s->bs, false);
1285 identify_data = (uint16_t *)s->identify_data;
1286 put_le16(identify_data + 85, (1 << 14) | 1);
1289 case 0xcc: /* reverting to power-on defaults enable */
1290 case 0x66: /* reverting to power-on defaults disable */
1291 case 0xaa: /* read look-ahead enable */
1292 case 0x55: /* read look-ahead disable */
1293 case 0x05: /* set advanced power management mode */
1294 case 0x85: /* disable advanced power management mode */
1295 case 0x69: /* NOP */
1296 case 0x67: /* NOP */
1297 case 0x96: /* NOP */
1298 case 0x9a: /* NOP */
1299 case 0x42: /* enable Automatic Acoustic Mode */
1300 case 0xc2: /* disable Automatic Acoustic Mode */
1302 case 0x03: /* set transfer mode */
1304 uint8_t val = s->nsector & 0x07;
1305 identify_data = (uint16_t *)s->identify_data;
1307 switch (s->nsector >> 3) {
1308 case 0x00: /* pio default */
1309 case 0x01: /* pio mode */
1310 put_le16(identify_data + 62, 0x07);
1311 put_le16(identify_data + 63, 0x07);
1312 put_le16(identify_data + 88, 0x3f);
1314 case 0x02: /* sigle word dma mode*/
1315 put_le16(identify_data + 62, 0x07 | (1 << (val + 8)));
1316 put_le16(identify_data + 63, 0x07);
1317 put_le16(identify_data + 88, 0x3f);
1319 case 0x04: /* mdma mode */
1320 put_le16(identify_data + 62, 0x07);
1321 put_le16(identify_data + 63, 0x07 | (1 << (val + 8)));
1322 put_le16(identify_data + 88, 0x3f);
1324 case 0x08: /* udma mode */
1325 put_le16(identify_data + 62, 0x07);
1326 put_le16(identify_data + 63, 0x07);
1327 put_le16(identify_data + 88, 0x3f | (1 << (val + 8)));
1337 ide_abort_command(s);
1342 /*** ATAPI commands ***/
1344 static bool cmd_identify_packet(IDEState *s, uint8_t cmd)
1346 ide_atapi_identify(s);
1347 s->status = READY_STAT | SEEK_STAT;
1348 ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
1349 ide_set_irq(s->bus);
1353 static bool cmd_exec_dev_diagnostic(IDEState *s, uint8_t cmd)
1355 ide_set_signature(s);
1357 if (s->drive_kind == IDE_CD) {
1358 s->status = 0; /* ATAPI spec (v6) section 9.10 defines packet
1359 * devices to return a clear status register
1360 * with READY_STAT *not* set. */
1363 s->status = READY_STAT | SEEK_STAT;
1364 /* The bits of the error register are not as usual for this command!
1365 * They are part of the regular output (this is why ERR_STAT isn't set)
1366 * Device 0 passed, Device 1 passed or not present. */
1368 ide_set_irq(s->bus);
1374 static bool cmd_device_reset(IDEState *s, uint8_t cmd)
1376 ide_set_signature(s);
1377 s->status = 0x00; /* NOTE: READY is _not_ set */
1383 static bool cmd_packet(IDEState *s, uint8_t cmd)
1385 /* overlapping commands not supported */
1386 if (s->feature & 0x02) {
1387 ide_abort_command(s);
1391 s->status = READY_STAT | SEEK_STAT;
1392 s->atapi_dma = s->feature & 1;
1394 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
1400 /*** CF-ATA commands ***/
1402 static bool cmd_cfa_req_ext_error_code(IDEState *s, uint8_t cmd)
1404 s->error = 0x09; /* miscellaneous error */
1405 s->status = READY_STAT | SEEK_STAT;
1406 ide_set_irq(s->bus);
1411 static bool cmd_cfa_erase_sectors(IDEState *s, uint8_t cmd)
1413 /* WIN_SECURITY_FREEZE_LOCK has the same ID as CFA_WEAR_LEVEL and is
1414 * required for Windows 8 to work with AHCI */
1416 if (cmd == CFA_WEAR_LEVEL) {
1420 if (cmd == CFA_ERASE_SECTORS) {
1421 s->media_changed = 1;
1427 static bool cmd_cfa_translate_sector(IDEState *s, uint8_t cmd)
1429 s->status = READY_STAT | SEEK_STAT;
1431 memset(s->io_buffer, 0, 0x200);
1432 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
1433 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
1434 s->io_buffer[0x02] = s->select; /* Head */
1435 s->io_buffer[0x03] = s->sector; /* Sector */
1436 s->io_buffer[0x04] = ide_get_sector(s) >> 16; /* LBA MSB */
1437 s->io_buffer[0x05] = ide_get_sector(s) >> 8; /* LBA */
1438 s->io_buffer[0x06] = ide_get_sector(s) >> 0; /* LBA LSB */
1439 s->io_buffer[0x13] = 0x00; /* Erase flag */
1440 s->io_buffer[0x18] = 0x00; /* Hot count */
1441 s->io_buffer[0x19] = 0x00; /* Hot count */
1442 s->io_buffer[0x1a] = 0x01; /* Hot count */
1444 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1445 ide_set_irq(s->bus);
1450 static bool cmd_cfa_access_metadata_storage(IDEState *s, uint8_t cmd)
1452 switch (s->feature) {
1453 case 0x02: /* Inquiry Metadata Storage */
1454 ide_cfata_metadata_inquiry(s);
1456 case 0x03: /* Read Metadata Storage */
1457 ide_cfata_metadata_read(s);
1459 case 0x04: /* Write Metadata Storage */
1460 ide_cfata_metadata_write(s);
1463 ide_abort_command(s);
1467 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1468 s->status = 0x00; /* NOTE: READY is _not_ set */
1469 ide_set_irq(s->bus);
1474 static bool cmd_ibm_sense_condition(IDEState *s, uint8_t cmd)
1476 switch (s->feature) {
1477 case 0x01: /* sense temperature in device */
1478 s->nsector = 0x50; /* +20 C */
1481 ide_abort_command(s);
1489 /*** SMART commands ***/
1491 static bool cmd_smart(IDEState *s, uint8_t cmd)
1495 if (s->hcyl != 0xc2 || s->lcyl != 0x4f) {
1499 if (!s->smart_enabled && s->feature != SMART_ENABLE) {
1503 switch (s->feature) {
1505 s->smart_enabled = 0;
1509 s->smart_enabled = 1;
1512 case SMART_ATTR_AUTOSAVE:
1513 switch (s->sector) {
1515 s->smart_autosave = 0;
1518 s->smart_autosave = 1;
1526 if (!s->smart_errors) {
1535 case SMART_READ_THRESH:
1536 memset(s->io_buffer, 0, 0x200);
1537 s->io_buffer[0] = 0x01; /* smart struct version */
1539 for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1540 s->io_buffer[2 + 0 + (n * 12)] = smart_attributes[n][0];
1541 s->io_buffer[2 + 1 + (n * 12)] = smart_attributes[n][11];
1545 for (n = 0; n < 511; n++) {
1546 s->io_buffer[511] += s->io_buffer[n];
1548 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1550 s->status = READY_STAT | SEEK_STAT;
1551 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1552 ide_set_irq(s->bus);
1555 case SMART_READ_DATA:
1556 memset(s->io_buffer, 0, 0x200);
1557 s->io_buffer[0] = 0x01; /* smart struct version */
1559 for (n = 0; n < ARRAY_SIZE(smart_attributes); n++) {
1561 for (i = 0; i < 11; i++) {
1562 s->io_buffer[2 + i + (n * 12)] = smart_attributes[n][i];
1566 s->io_buffer[362] = 0x02 | (s->smart_autosave ? 0x80 : 0x00);
1567 if (s->smart_selftest_count == 0) {
1568 s->io_buffer[363] = 0;
1571 s->smart_selftest_data[3 +
1572 (s->smart_selftest_count - 1) *
1575 s->io_buffer[364] = 0x20;
1576 s->io_buffer[365] = 0x01;
1577 /* offline data collection capacity: execute + self-test*/
1578 s->io_buffer[367] = (1 << 4 | 1 << 3 | 1);
1579 s->io_buffer[368] = 0x03; /* smart capability (1) */
1580 s->io_buffer[369] = 0x00; /* smart capability (2) */
1581 s->io_buffer[370] = 0x01; /* error logging supported */
1582 s->io_buffer[372] = 0x02; /* minutes for poll short test */
1583 s->io_buffer[373] = 0x36; /* minutes for poll ext test */
1584 s->io_buffer[374] = 0x01; /* minutes for poll conveyance */
1586 for (n = 0; n < 511; n++) {
1587 s->io_buffer[511] += s->io_buffer[n];
1589 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1591 s->status = READY_STAT | SEEK_STAT;
1592 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1593 ide_set_irq(s->bus);
1596 case SMART_READ_LOG:
1597 switch (s->sector) {
1598 case 0x01: /* summary smart error log */
1599 memset(s->io_buffer, 0, 0x200);
1600 s->io_buffer[0] = 0x01;
1601 s->io_buffer[1] = 0x00; /* no error entries */
1602 s->io_buffer[452] = s->smart_errors & 0xff;
1603 s->io_buffer[453] = (s->smart_errors & 0xff00) >> 8;
1605 for (n = 0; n < 511; n++) {
1606 s->io_buffer[511] += s->io_buffer[n];
1608 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1610 case 0x06: /* smart self test log */
1611 memset(s->io_buffer, 0, 0x200);
1612 s->io_buffer[0] = 0x01;
1613 if (s->smart_selftest_count == 0) {
1614 s->io_buffer[508] = 0;
1616 s->io_buffer[508] = s->smart_selftest_count;
1617 for (n = 2; n < 506; n++) {
1618 s->io_buffer[n] = s->smart_selftest_data[n];
1622 for (n = 0; n < 511; n++) {
1623 s->io_buffer[511] += s->io_buffer[n];
1625 s->io_buffer[511] = 0x100 - s->io_buffer[511];
1630 s->status = READY_STAT | SEEK_STAT;
1631 ide_transfer_start(s, s->io_buffer, 0x200, ide_transfer_stop);
1632 ide_set_irq(s->bus);
1635 case SMART_EXECUTE_OFFLINE:
1636 switch (s->sector) {
1637 case 0: /* off-line routine */
1638 case 1: /* short self test */
1639 case 2: /* extended self test */
1640 s->smart_selftest_count++;
1641 if (s->smart_selftest_count > 21) {
1642 s->smart_selftest_count = 1;
1644 n = 2 + (s->smart_selftest_count - 1) * 24;
1645 s->smart_selftest_data[n] = s->sector;
1646 s->smart_selftest_data[n + 1] = 0x00; /* OK and finished */
1647 s->smart_selftest_data[n + 2] = 0x34; /* hour count lsb */
1648 s->smart_selftest_data[n + 3] = 0x12; /* hour count msb */
1657 ide_abort_command(s);
1661 #define HD_OK (1u << IDE_HD)
1662 #define CD_OK (1u << IDE_CD)
1663 #define CFA_OK (1u << IDE_CFATA)
1664 #define HD_CFA_OK (HD_OK | CFA_OK)
1665 #define ALL_OK (HD_OK | CD_OK | CFA_OK)
1667 /* Set the Disk Seek Completed status bit during completion */
1668 #define SET_DSC (1u << 8)
1670 /* See ACS-2 T13/2015-D Table B.2 Command codes */
1671 static const struct {
1672 /* Returns true if the completion code should be run */
1673 bool (*handler)(IDEState *s, uint8_t cmd);
1675 } ide_cmd_table[0x100] = {
1676 /* NOP not implemented, mandatory for CD */
1677 [CFA_REQ_EXT_ERROR_CODE] = { cmd_cfa_req_ext_error_code, CFA_OK },
1678 [WIN_DSM] = { cmd_data_set_management, ALL_OK },
1679 [WIN_DEVICE_RESET] = { cmd_device_reset, CD_OK },
1680 [WIN_RECAL] = { cmd_nop, HD_CFA_OK | SET_DSC},
1681 [WIN_READ] = { cmd_read_pio, ALL_OK },
1682 [WIN_READ_ONCE] = { cmd_read_pio, ALL_OK },
1683 [WIN_READ_EXT] = { cmd_read_pio, HD_CFA_OK },
1684 [WIN_READDMA_EXT] = { cmd_read_dma, HD_CFA_OK },
1685 [WIN_READ_NATIVE_MAX_EXT] = { cmd_read_native_max, HD_CFA_OK | SET_DSC },
1686 [WIN_MULTREAD_EXT] = { cmd_read_multiple, HD_CFA_OK },
1687 [WIN_WRITE] = { cmd_write_pio, HD_CFA_OK },
1688 [WIN_WRITE_ONCE] = { cmd_write_pio, HD_CFA_OK },
1689 [WIN_WRITE_EXT] = { cmd_write_pio, HD_CFA_OK },
1690 [WIN_WRITEDMA_EXT] = { cmd_write_dma, HD_CFA_OK },
1691 [CFA_WRITE_SECT_WO_ERASE] = { cmd_write_pio, CFA_OK },
1692 [WIN_MULTWRITE_EXT] = { cmd_write_multiple, HD_CFA_OK },
1693 [WIN_WRITE_VERIFY] = { cmd_write_pio, HD_CFA_OK },
1694 [WIN_VERIFY] = { cmd_verify, HD_CFA_OK | SET_DSC },
1695 [WIN_VERIFY_ONCE] = { cmd_verify, HD_CFA_OK | SET_DSC },
1696 [WIN_VERIFY_EXT] = { cmd_verify, HD_CFA_OK | SET_DSC },
1697 [WIN_SEEK] = { cmd_seek, HD_CFA_OK | SET_DSC },
1698 [CFA_TRANSLATE_SECTOR] = { cmd_cfa_translate_sector, CFA_OK },
1699 [WIN_DIAGNOSE] = { cmd_exec_dev_diagnostic, ALL_OK },
1700 [WIN_SPECIFY] = { cmd_nop, HD_CFA_OK | SET_DSC },
1701 [WIN_STANDBYNOW2] = { cmd_nop, ALL_OK },
1702 [WIN_IDLEIMMEDIATE2] = { cmd_nop, ALL_OK },
1703 [WIN_STANDBY2] = { cmd_nop, ALL_OK },
1704 [WIN_SETIDLE2] = { cmd_nop, ALL_OK },
1705 [WIN_CHECKPOWERMODE2] = { cmd_check_power_mode, ALL_OK | SET_DSC },
1706 [WIN_SLEEPNOW2] = { cmd_nop, ALL_OK },
1707 [WIN_PACKETCMD] = { cmd_packet, CD_OK },
1708 [WIN_PIDENTIFY] = { cmd_identify_packet, CD_OK },
1709 [WIN_SMART] = { cmd_smart, HD_CFA_OK | SET_DSC },
1710 [CFA_ACCESS_METADATA_STORAGE] = { cmd_cfa_access_metadata_storage, CFA_OK },
1711 [CFA_ERASE_SECTORS] = { cmd_cfa_erase_sectors, CFA_OK | SET_DSC },
1712 [WIN_MULTREAD] = { cmd_read_multiple, HD_CFA_OK },
1713 [WIN_MULTWRITE] = { cmd_write_multiple, HD_CFA_OK },
1714 [WIN_SETMULT] = { cmd_set_multiple_mode, HD_CFA_OK | SET_DSC },
1715 [WIN_READDMA] = { cmd_read_dma, HD_CFA_OK },
1716 [WIN_READDMA_ONCE] = { cmd_read_dma, HD_CFA_OK },
1717 [WIN_WRITEDMA] = { cmd_write_dma, HD_CFA_OK },
1718 [WIN_WRITEDMA_ONCE] = { cmd_write_dma, HD_CFA_OK },
1719 [CFA_WRITE_MULTI_WO_ERASE] = { cmd_write_multiple, CFA_OK },
1720 [WIN_STANDBYNOW1] = { cmd_nop, ALL_OK },
1721 [WIN_IDLEIMMEDIATE] = { cmd_nop, ALL_OK },
1722 [WIN_STANDBY] = { cmd_nop, ALL_OK },
1723 [WIN_SETIDLE1] = { cmd_nop, ALL_OK },
1724 [WIN_CHECKPOWERMODE1] = { cmd_check_power_mode, ALL_OK | SET_DSC },
1725 [WIN_SLEEPNOW1] = { cmd_nop, ALL_OK },
1726 [WIN_FLUSH_CACHE] = { cmd_flush_cache, ALL_OK },
1727 [WIN_FLUSH_CACHE_EXT] = { cmd_flush_cache, HD_CFA_OK },
1728 [WIN_IDENTIFY] = { cmd_identify, ALL_OK },
1729 [WIN_SETFEATURES] = { cmd_set_features, ALL_OK | SET_DSC },
1730 [IBM_SENSE_CONDITION] = { cmd_ibm_sense_condition, CFA_OK | SET_DSC },
1731 [CFA_WEAR_LEVEL] = { cmd_cfa_erase_sectors, HD_CFA_OK | SET_DSC },
1732 [WIN_READ_NATIVE_MAX] = { cmd_read_native_max, ALL_OK | SET_DSC },
1735 static bool ide_cmd_permitted(IDEState *s, uint32_t cmd)
1737 return cmd < ARRAY_SIZE(ide_cmd_table)
1738 && (ide_cmd_table[cmd].flags & (1u << s->drive_kind));
1741 void ide_exec_cmd(IDEBus *bus, uint32_t val)
1746 #if defined(DEBUG_IDE)
1747 printf("ide: CMD=%02x\n", val);
1749 s = idebus_active_if(bus);
1750 /* ignore commands to non existent slave */
1751 if (s != bus->ifs && !s->bs)
1754 /* Only DEVICE RESET is allowed while BSY or/and DRQ are set */
1755 if ((s->status & (BUSY_STAT|DRQ_STAT)) && val != WIN_DEVICE_RESET)
1758 if (!ide_cmd_permitted(s, val)) {
1759 ide_abort_command(s);
1760 ide_set_irq(s->bus);
1764 s->status = READY_STAT | BUSY_STAT;
1767 complete = ide_cmd_table[val].handler(s, val);
1769 s->status &= ~BUSY_STAT;
1770 assert(!!s->error == !!(s->status & ERR_STAT));
1772 if ((ide_cmd_table[val].flags & SET_DSC) && !s->error) {
1773 s->status |= SEEK_STAT;
1776 ide_set_irq(s->bus);
1780 uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1782 IDEBus *bus = opaque;
1783 IDEState *s = idebus_active_if(bus);
1788 /* FIXME: HOB readback uses bit 7, but it's always set right now */
1789 //hob = s->select & (1 << 7);
1796 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1797 (s != bus->ifs && !s->bs))
1802 ret = s->hob_feature;
1805 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1808 ret = s->nsector & 0xff;
1810 ret = s->hob_nsector;
1813 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1818 ret = s->hob_sector;
1821 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1829 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1837 if (!bus->ifs[0].bs && !bus->ifs[1].bs)
1844 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1845 (s != bus->ifs && !s->bs))
1849 qemu_irq_lower(bus->irq);
1853 printf("ide: read addr=0x%x val=%02x\n", addr1, ret);
1858 uint32_t ide_status_read(void *opaque, uint32_t addr)
1860 IDEBus *bus = opaque;
1861 IDEState *s = idebus_active_if(bus);
1864 if ((!bus->ifs[0].bs && !bus->ifs[1].bs) ||
1865 (s != bus->ifs && !s->bs))
1870 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1875 void ide_cmd_write(void *opaque, uint32_t addr, uint32_t val)
1877 IDEBus *bus = opaque;
1882 printf("ide: write control addr=0x%x val=%02x\n", addr, val);
1884 /* common for both drives */
1885 if (!(bus->cmd & IDE_CMD_RESET) &&
1886 (val & IDE_CMD_RESET)) {
1887 /* reset low to high */
1888 for(i = 0;i < 2; i++) {
1890 s->status = BUSY_STAT | SEEK_STAT;
1893 } else if ((bus->cmd & IDE_CMD_RESET) &&
1894 !(val & IDE_CMD_RESET)) {
1896 for(i = 0;i < 2; i++) {
1898 if (s->drive_kind == IDE_CD)
1899 s->status = 0x00; /* NOTE: READY is _not_ set */
1901 s->status = READY_STAT | SEEK_STAT;
1902 ide_set_signature(s);
1910 * Returns true if the running PIO transfer is a PIO out (i.e. data is
1911 * transferred from the device to the guest), false if it's a PIO in
1913 static bool ide_is_pio_out(IDEState *s)
1915 if (s->end_transfer_func == ide_sector_write ||
1916 s->end_transfer_func == ide_atapi_cmd) {
1918 } else if (s->end_transfer_func == ide_sector_read ||
1919 s->end_transfer_func == ide_transfer_stop ||
1920 s->end_transfer_func == ide_atapi_cmd_reply_end ||
1921 s->end_transfer_func == ide_dummy_transfer_stop) {
1928 void ide_data_writew(void *opaque, uint32_t addr, uint32_t val)
1930 IDEBus *bus = opaque;
1931 IDEState *s = idebus_active_if(bus);
1934 /* PIO data access allowed only when DRQ bit is set. The result of a write
1935 * during PIO out is indeterminate, just ignore it. */
1936 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1941 *(uint16_t *)p = le16_to_cpu(val);
1944 if (p >= s->data_end)
1945 s->end_transfer_func(s);
1948 uint32_t ide_data_readw(void *opaque, uint32_t addr)
1950 IDEBus *bus = opaque;
1951 IDEState *s = idebus_active_if(bus);
1955 /* PIO data access allowed only when DRQ bit is set. The result of a read
1956 * during PIO in is indeterminate, return 0 and don't move forward. */
1957 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
1962 ret = cpu_to_le16(*(uint16_t *)p);
1965 if (p >= s->data_end)
1966 s->end_transfer_func(s);
1970 void ide_data_writel(void *opaque, uint32_t addr, uint32_t val)
1972 IDEBus *bus = opaque;
1973 IDEState *s = idebus_active_if(bus);
1976 /* PIO data access allowed only when DRQ bit is set. The result of a write
1977 * during PIO out is indeterminate, just ignore it. */
1978 if (!(s->status & DRQ_STAT) || ide_is_pio_out(s)) {
1983 *(uint32_t *)p = le32_to_cpu(val);
1986 if (p >= s->data_end)
1987 s->end_transfer_func(s);
1990 uint32_t ide_data_readl(void *opaque, uint32_t addr)
1992 IDEBus *bus = opaque;
1993 IDEState *s = idebus_active_if(bus);
1997 /* PIO data access allowed only when DRQ bit is set. The result of a read
1998 * during PIO in is indeterminate, return 0 and don't move forward. */
1999 if (!(s->status & DRQ_STAT) || !ide_is_pio_out(s)) {
2004 ret = cpu_to_le32(*(uint32_t *)p);
2007 if (p >= s->data_end)
2008 s->end_transfer_func(s);
2012 static void ide_dummy_transfer_stop(IDEState *s)
2014 s->data_ptr = s->io_buffer;
2015 s->data_end = s->io_buffer;
2016 s->io_buffer[0] = 0xff;
2017 s->io_buffer[1] = 0xff;
2018 s->io_buffer[2] = 0xff;
2019 s->io_buffer[3] = 0xff;
2022 static void ide_reset(IDEState *s)
2025 printf("ide: reset\n");
2029 bdrv_aio_cancel(s->pio_aiocb);
2030 s->pio_aiocb = NULL;
2033 if (s->drive_kind == IDE_CFATA)
2034 s->mult_sectors = 0;
2036 s->mult_sectors = MAX_MULT_SECTORS;
2053 s->status = READY_STAT | SEEK_STAT;
2057 /* ATAPI specific */
2060 s->cdrom_changed = 0;
2061 s->packet_transfer_size = 0;
2062 s->elementary_transfer_size = 0;
2063 s->io_buffer_index = 0;
2064 s->cd_sector_size = 0;
2069 s->io_buffer_size = 0;
2070 s->req_nb_sectors = 0;
2072 ide_set_signature(s);
2073 /* init the transfer handler so that 0xffff is returned on data
2075 s->end_transfer_func = ide_dummy_transfer_stop;
2076 ide_dummy_transfer_stop(s);
2077 s->media_changed = 0;
2080 void ide_bus_reset(IDEBus *bus)
2084 ide_reset(&bus->ifs[0]);
2085 ide_reset(&bus->ifs[1]);
2088 /* pending async DMA */
2089 if (bus->dma->aiocb) {
2091 printf("aio_cancel\n");
2093 bdrv_aio_cancel(bus->dma->aiocb);
2094 bus->dma->aiocb = NULL;
2097 /* reset dma provider too */
2098 if (bus->dma->ops->reset) {
2099 bus->dma->ops->reset(bus->dma);
2103 static bool ide_cd_is_tray_open(void *opaque)
2105 return ((IDEState *)opaque)->tray_open;
2108 static bool ide_cd_is_medium_locked(void *opaque)
2110 return ((IDEState *)opaque)->tray_locked;
2113 static const BlockDevOps ide_cd_block_ops = {
2114 .change_media_cb = ide_cd_change_cb,
2115 .eject_request_cb = ide_cd_eject_request_cb,
2116 .is_tray_open = ide_cd_is_tray_open,
2117 .is_medium_locked = ide_cd_is_medium_locked,
2120 int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
2121 const char *version, const char *serial, const char *model,
2123 uint32_t cylinders, uint32_t heads, uint32_t secs,
2126 uint64_t nb_sectors;
2129 s->drive_kind = kind;
2131 bdrv_get_geometry(bs, &nb_sectors);
2132 s->cylinders = cylinders;
2135 s->chs_trans = chs_trans;
2136 s->nb_sectors = nb_sectors;
2138 /* The SMART values should be preserved across power cycles
2140 s->smart_enabled = 1;
2141 s->smart_autosave = 1;
2142 s->smart_errors = 0;
2143 s->smart_selftest_count = 0;
2144 if (kind == IDE_CD) {
2145 bdrv_set_dev_ops(bs, &ide_cd_block_ops, s);
2146 bdrv_set_guest_block_size(bs, 2048);
2148 if (!bdrv_is_inserted(s->bs)) {
2149 error_report("Device needs media, but drive is empty");
2152 if (bdrv_is_read_only(bs)) {
2153 error_report("Can't use a read-only drive");
2158 pstrcpy(s->drive_serial_str, sizeof(s->drive_serial_str), serial);
2160 snprintf(s->drive_serial_str, sizeof(s->drive_serial_str),
2161 "QM%05d", s->drive_serial);
2164 pstrcpy(s->drive_model_str, sizeof(s->drive_model_str), model);
2168 strcpy(s->drive_model_str, "QEMU DVD-ROM");
2171 strcpy(s->drive_model_str, "QEMU MICRODRIVE");
2174 strcpy(s->drive_model_str, "QEMU HARDDISK");
2180 pstrcpy(s->version, sizeof(s->version), version);
2182 pstrcpy(s->version, sizeof(s->version), qemu_get_version());
2186 bdrv_iostatus_enable(bs);
2190 static void ide_init1(IDEBus *bus, int unit)
2192 static int drive_serial = 1;
2193 IDEState *s = &bus->ifs[unit];
2197 s->drive_serial = drive_serial++;
2198 /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */
2199 s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4;
2200 s->io_buffer = qemu_memalign(2048, s->io_buffer_total_len);
2201 memset(s->io_buffer, 0, s->io_buffer_total_len);
2203 s->smart_selftest_data = qemu_blockalign(s->bs, 512);
2204 memset(s->smart_selftest_data, 0, 512);
2206 s->sector_write_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
2207 ide_sector_write_timer_cb, s);
2210 static int ide_nop_int(IDEDMA *dma, int x)
2215 static void ide_nop_restart(void *opaque, int x, RunState y)
2219 static const IDEDMAOps ide_dma_nop_ops = {
2220 .prepare_buf = ide_nop_int,
2221 .rw_buf = ide_nop_int,
2222 .set_unit = ide_nop_int,
2223 .restart_cb = ide_nop_restart,
2226 static IDEDMA ide_dma_nop = {
2227 .ops = &ide_dma_nop_ops,
2231 void ide_init2(IDEBus *bus, qemu_irq irq)
2235 for(i = 0; i < 2; i++) {
2237 ide_reset(&bus->ifs[i]);
2240 bus->dma = &ide_dma_nop;
2243 static const MemoryRegionPortio ide_portio_list[] = {
2244 { 0, 8, 1, .read = ide_ioport_read, .write = ide_ioport_write },
2245 { 0, 2, 2, .read = ide_data_readw, .write = ide_data_writew },
2246 { 0, 4, 4, .read = ide_data_readl, .write = ide_data_writel },
2247 PORTIO_END_OF_LIST(),
2250 static const MemoryRegionPortio ide_portio2_list[] = {
2251 { 0, 1, 1, .read = ide_status_read, .write = ide_cmd_write },
2252 PORTIO_END_OF_LIST(),
2255 void ide_init_ioport(IDEBus *bus, ISADevice *dev, int iobase, int iobase2)
2257 /* ??? Assume only ISA and PCI configurations, and that the PCI-ISA
2258 bridge has been setup properly to always register with ISA. */
2259 isa_register_portio_list(dev, iobase, ide_portio_list, bus, "ide");
2262 isa_register_portio_list(dev, iobase2, ide_portio2_list, bus, "ide");
2266 static bool is_identify_set(void *opaque, int version_id)
2268 IDEState *s = opaque;
2270 return s->identify_set != 0;
2273 static EndTransferFunc* transfer_end_table[] = {
2277 ide_atapi_cmd_reply_end,
2279 ide_dummy_transfer_stop,
2282 static int transfer_end_table_idx(EndTransferFunc *fn)
2286 for (i = 0; i < ARRAY_SIZE(transfer_end_table); i++)
2287 if (transfer_end_table[i] == fn)
2293 static int ide_drive_post_load(void *opaque, int version_id)
2295 IDEState *s = opaque;
2297 if (s->identify_set) {
2298 bdrv_set_enable_write_cache(s->bs, !!(s->identify_data[85] & (1 << 5)));
2303 static int ide_drive_pio_post_load(void *opaque, int version_id)
2305 IDEState *s = opaque;
2307 if (s->end_transfer_fn_idx >= ARRAY_SIZE(transfer_end_table)) {
2310 s->end_transfer_func = transfer_end_table[s->end_transfer_fn_idx];
2311 s->data_ptr = s->io_buffer + s->cur_io_buffer_offset;
2312 s->data_end = s->data_ptr + s->cur_io_buffer_len;
2317 static void ide_drive_pio_pre_save(void *opaque)
2319 IDEState *s = opaque;
2322 s->cur_io_buffer_offset = s->data_ptr - s->io_buffer;
2323 s->cur_io_buffer_len = s->data_end - s->data_ptr;
2325 idx = transfer_end_table_idx(s->end_transfer_func);
2327 fprintf(stderr, "%s: invalid end_transfer_func for DRQ_STAT\n",
2329 s->end_transfer_fn_idx = 2;
2331 s->end_transfer_fn_idx = idx;
2335 static bool ide_drive_pio_state_needed(void *opaque)
2337 IDEState *s = opaque;
2339 return ((s->status & DRQ_STAT) != 0)
2340 || (s->bus->error_status & IDE_RETRY_PIO);
2343 static bool ide_tray_state_needed(void *opaque)
2345 IDEState *s = opaque;
2347 return s->tray_open || s->tray_locked;
2350 static bool ide_atapi_gesn_needed(void *opaque)
2352 IDEState *s = opaque;
2354 return s->events.new_media || s->events.eject_request;
2357 static bool ide_error_needed(void *opaque)
2359 IDEBus *bus = opaque;
2361 return (bus->error_status != 0);
2364 /* Fields for GET_EVENT_STATUS_NOTIFICATION ATAPI command */
2365 static const VMStateDescription vmstate_ide_atapi_gesn_state = {
2366 .name ="ide_drive/atapi/gesn_state",
2368 .minimum_version_id = 1,
2369 .fields = (VMStateField[]) {
2370 VMSTATE_BOOL(events.new_media, IDEState),
2371 VMSTATE_BOOL(events.eject_request, IDEState),
2372 VMSTATE_END_OF_LIST()
2376 static const VMStateDescription vmstate_ide_tray_state = {
2377 .name = "ide_drive/tray_state",
2379 .minimum_version_id = 1,
2380 .fields = (VMStateField[]) {
2381 VMSTATE_BOOL(tray_open, IDEState),
2382 VMSTATE_BOOL(tray_locked, IDEState),
2383 VMSTATE_END_OF_LIST()
2387 static const VMStateDescription vmstate_ide_drive_pio_state = {
2388 .name = "ide_drive/pio_state",
2390 .minimum_version_id = 1,
2391 .pre_save = ide_drive_pio_pre_save,
2392 .post_load = ide_drive_pio_post_load,
2393 .fields = (VMStateField[]) {
2394 VMSTATE_INT32(req_nb_sectors, IDEState),
2395 VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
2396 vmstate_info_uint8, uint8_t),
2397 VMSTATE_INT32(cur_io_buffer_offset, IDEState),
2398 VMSTATE_INT32(cur_io_buffer_len, IDEState),
2399 VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
2400 VMSTATE_INT32(elementary_transfer_size, IDEState),
2401 VMSTATE_INT32(packet_transfer_size, IDEState),
2402 VMSTATE_END_OF_LIST()
2406 const VMStateDescription vmstate_ide_drive = {
2407 .name = "ide_drive",
2409 .minimum_version_id = 0,
2410 .post_load = ide_drive_post_load,
2411 .fields = (VMStateField[]) {
2412 VMSTATE_INT32(mult_sectors, IDEState),
2413 VMSTATE_INT32(identify_set, IDEState),
2414 VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
2415 VMSTATE_UINT8(feature, IDEState),
2416 VMSTATE_UINT8(error, IDEState),
2417 VMSTATE_UINT32(nsector, IDEState),
2418 VMSTATE_UINT8(sector, IDEState),
2419 VMSTATE_UINT8(lcyl, IDEState),
2420 VMSTATE_UINT8(hcyl, IDEState),
2421 VMSTATE_UINT8(hob_feature, IDEState),
2422 VMSTATE_UINT8(hob_sector, IDEState),
2423 VMSTATE_UINT8(hob_nsector, IDEState),
2424 VMSTATE_UINT8(hob_lcyl, IDEState),
2425 VMSTATE_UINT8(hob_hcyl, IDEState),
2426 VMSTATE_UINT8(select, IDEState),
2427 VMSTATE_UINT8(status, IDEState),
2428 VMSTATE_UINT8(lba48, IDEState),
2429 VMSTATE_UINT8(sense_key, IDEState),
2430 VMSTATE_UINT8(asc, IDEState),
2431 VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
2432 VMSTATE_END_OF_LIST()
2434 .subsections = (VMStateSubsection []) {
2436 .vmsd = &vmstate_ide_drive_pio_state,
2437 .needed = ide_drive_pio_state_needed,
2439 .vmsd = &vmstate_ide_tray_state,
2440 .needed = ide_tray_state_needed,
2442 .vmsd = &vmstate_ide_atapi_gesn_state,
2443 .needed = ide_atapi_gesn_needed,
2450 static const VMStateDescription vmstate_ide_error_status = {
2451 .name ="ide_bus/error",
2453 .minimum_version_id = 1,
2454 .fields = (VMStateField[]) {
2455 VMSTATE_INT32(error_status, IDEBus),
2456 VMSTATE_END_OF_LIST()
2460 const VMStateDescription vmstate_ide_bus = {
2463 .minimum_version_id = 1,
2464 .fields = (VMStateField[]) {
2465 VMSTATE_UINT8(cmd, IDEBus),
2466 VMSTATE_UINT8(unit, IDEBus),
2467 VMSTATE_END_OF_LIST()
2469 .subsections = (VMStateSubsection []) {
2471 .vmsd = &vmstate_ide_error_status,
2472 .needed = ide_error_needed,
2479 void ide_drive_get(DriveInfo **hd, int max_bus)
2483 if (drive_get_max_bus(IF_IDE) >= max_bus) {
2484 fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
2488 for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
2489 hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);