summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qemu/hw/ide.c13
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);
}