ide: port ide_drive to vmstate
Signed-off-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
25dc563b09
commit
37159f1305
111
hw/ide/core.c
111
hw/ide/core.c
@ -2591,70 +2591,69 @@ void ide_init_ioport(IDEBus *bus, int iobase, int iobase2)
|
||||
register_ioport_read(iobase, 4, 4, ide_data_readl, bus);
|
||||
}
|
||||
|
||||
/* save per IDE drive data */
|
||||
static bool is_identify_set(void *opaque, int version_id)
|
||||
{
|
||||
IDEState *s = opaque;
|
||||
|
||||
return s->identify_set != 0;
|
||||
}
|
||||
|
||||
static int ide_drive_post_load(void *opaque, int version_id)
|
||||
{
|
||||
IDEState *s = opaque;
|
||||
|
||||
if (version_id < 3) {
|
||||
if (s->sense_key == SENSE_UNIT_ATTENTION &&
|
||||
s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED) {
|
||||
s->cdrom_changed = 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
const VMStateDescription vmstate_ide_drive = {
|
||||
.name = "ide_drive",
|
||||
.version_id = 3,
|
||||
.minimum_version_id = 0,
|
||||
.minimum_version_id_old = 0,
|
||||
.post_load = ide_drive_post_load,
|
||||
.fields = (VMStateField []) {
|
||||
VMSTATE_INT32(mult_sectors, IDEState),
|
||||
VMSTATE_INT32(identify_set, IDEState),
|
||||
VMSTATE_BUFFER_TEST(identify_data, IDEState, is_identify_set),
|
||||
VMSTATE_UINT8(feature, IDEState),
|
||||
VMSTATE_UINT8(error, IDEState),
|
||||
VMSTATE_UINT32(nsector, IDEState),
|
||||
VMSTATE_UINT8(sector, IDEState),
|
||||
VMSTATE_UINT8(lcyl, IDEState),
|
||||
VMSTATE_UINT8(hcyl, IDEState),
|
||||
VMSTATE_UINT8(hob_feature, IDEState),
|
||||
VMSTATE_UINT8(hob_sector, IDEState),
|
||||
VMSTATE_UINT8(hob_nsector, IDEState),
|
||||
VMSTATE_UINT8(hob_lcyl, IDEState),
|
||||
VMSTATE_UINT8(hob_hcyl, IDEState),
|
||||
VMSTATE_UINT8(select, IDEState),
|
||||
VMSTATE_UINT8(status, IDEState),
|
||||
VMSTATE_UINT8(lba48, IDEState),
|
||||
VMSTATE_UINT8(sense_key, IDEState),
|
||||
VMSTATE_UINT8(asc, IDEState),
|
||||
VMSTATE_UINT8_V(cdrom_changed, IDEState, 3),
|
||||
/* XXX: if a transfer is pending, we do not save it yet */
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
void ide_save(QEMUFile* f, IDEState *s)
|
||||
{
|
||||
qemu_put_be32(f, s->mult_sectors);
|
||||
qemu_put_be32(f, s->identify_set);
|
||||
if (s->identify_set) {
|
||||
qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);
|
||||
}
|
||||
qemu_put_8s(f, &s->feature);
|
||||
qemu_put_8s(f, &s->error);
|
||||
qemu_put_be32s(f, &s->nsector);
|
||||
qemu_put_8s(f, &s->sector);
|
||||
qemu_put_8s(f, &s->lcyl);
|
||||
qemu_put_8s(f, &s->hcyl);
|
||||
qemu_put_8s(f, &s->hob_feature);
|
||||
qemu_put_8s(f, &s->hob_nsector);
|
||||
qemu_put_8s(f, &s->hob_sector);
|
||||
qemu_put_8s(f, &s->hob_lcyl);
|
||||
qemu_put_8s(f, &s->hob_hcyl);
|
||||
qemu_put_8s(f, &s->select);
|
||||
qemu_put_8s(f, &s->status);
|
||||
qemu_put_8s(f, &s->lba48);
|
||||
|
||||
qemu_put_8s(f, &s->sense_key);
|
||||
qemu_put_8s(f, &s->asc);
|
||||
qemu_put_8s(f, &s->cdrom_changed);
|
||||
/* XXX: if a transfer is pending, we do not save it yet */
|
||||
vmstate_save_state(f, &vmstate_ide_drive, s);
|
||||
}
|
||||
|
||||
/* load per IDE drive data */
|
||||
void ide_load(QEMUFile* f, IDEState *s, int version_id)
|
||||
{
|
||||
s->mult_sectors=qemu_get_be32(f);
|
||||
s->identify_set=qemu_get_be32(f);
|
||||
if (s->identify_set) {
|
||||
qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);
|
||||
}
|
||||
qemu_get_8s(f, &s->feature);
|
||||
qemu_get_8s(f, &s->error);
|
||||
qemu_get_be32s(f, &s->nsector);
|
||||
qemu_get_8s(f, &s->sector);
|
||||
qemu_get_8s(f, &s->lcyl);
|
||||
qemu_get_8s(f, &s->hcyl);
|
||||
qemu_get_8s(f, &s->hob_feature);
|
||||
qemu_get_8s(f, &s->hob_nsector);
|
||||
qemu_get_8s(f, &s->hob_sector);
|
||||
qemu_get_8s(f, &s->hob_lcyl);
|
||||
qemu_get_8s(f, &s->hob_hcyl);
|
||||
qemu_get_8s(f, &s->select);
|
||||
qemu_get_8s(f, &s->status);
|
||||
qemu_get_8s(f, &s->lba48);
|
||||
|
||||
qemu_get_8s(f, &s->sense_key);
|
||||
qemu_get_8s(f, &s->asc);
|
||||
if (version_id == 3) {
|
||||
qemu_get_8s(f, &s->cdrom_changed);
|
||||
} else {
|
||||
if (s->sense_key == SENSE_UNIT_ATTENTION &&
|
||||
s->asc == ASC_MEDIUM_MAY_HAVE_CHANGED)
|
||||
s->cdrom_changed = 1;
|
||||
}
|
||||
/* XXX: if a transfer is pending, we do not save it yet */
|
||||
vmstate_load_state(f, &vmstate_ide_drive, s, vmstate_ide_drive.version_id);
|
||||
}
|
||||
|
||||
|
||||
const VMStateDescription vmstate_ide_bus = {
|
||||
.name = "ide_bus",
|
||||
.version_id = 1,
|
||||
|
Loading…
Reference in New Issue
Block a user