diff options
-rw-r--r-- | qemu/hw/ide.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/qemu/hw/ide.c b/qemu/hw/ide.c index 30a175e6..e9911625 100644 --- a/qemu/hw/ide.c +++ b/qemu/hw/ide.c @@ -417,6 +417,7 @@ typedef struct IDEState { /* ATAPI specific */ uint8_t sense_key; uint8_t asc; + uint8_t cdrom_changed; int packet_transfer_size; int elementary_transfer_size; int io_buffer_index; @@ -1595,9 +1596,10 @@ static void ide_atapi_cmd(IDEState *s) } switch(s->io_buffer[0]) { case GPCMD_TEST_UNIT_READY: - if (bdrv_is_inserted(s->bs)) { + if (bdrv_is_inserted(s->bs) && !s->cdrom_changed) { ide_atapi_cmd_ok(s); } else { + s->cdrom_changed = 0; ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT); } @@ -2057,7 +2059,7 @@ static void cdrom_change_cb(void *opaque) s->sense_key = SENSE_UNIT_ATTENTION; s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED; - + s->cdrom_changed = 1; ide_set_irq(s); } @@ -3181,6 +3183,7 @@ static void pci_ide_save(QEMUFile* f, void *opaque) /* per IDE drive data */ for(i = 0; i < 4; i++) { ide_save(f, &d->ide_if[i]); + qemu_put_8s(f, &d->ide_if[i].cdrom_changed); } } @@ -3189,7 +3192,7 @@ static int pci_ide_load(QEMUFile* f, void *opaque, int version_id) PCIIDEState *d = opaque; int ret, i; - if (version_id != 2) + if (version_id < 2) return -EINVAL; ret = pci_device_load(&d->dev, f); if (ret < 0) @@ -3220,6 +3223,8 @@ static int pci_ide_load(QEMUFile* f, void *opaque, int version_id) /* per IDE drive data */ for(i = 0; i < 4; i++) { ide_load(f, &d->ide_if[i]); + if (version_id == 3) + qemu_get_8s(f, &d->ide_if[i].cdrom_changed); } return 0; } @@ -3312,7 +3317,7 @@ void pci_cmd646_ide_init(PCIBus *bus, BlockDriverState **hd_table, ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], irq[0]); ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], irq[1]); - register_savevm("ide", 0, 2, pci_ide_save, pci_ide_load, d); + register_savevm("ide", 0, 3, pci_ide_save, pci_ide_load, d); qemu_register_reset(cmd646_reset, d); cmd646_reset(d); } |