fdc: adding vmstate for save/restore
VMState added by this patch preserves correct loading of the FDC device state. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru> Acked-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4603ea0105
commit
c0b92f3037
@ -695,10 +695,34 @@ static const VMStateDescription vmstate_fdrive_media_rate = {
|
||||
}
|
||||
};
|
||||
|
||||
static bool fdrive_perpendicular_needed(void *opaque)
|
||||
{
|
||||
FDrive *drive = opaque;
|
||||
|
||||
return drive->perpendicular != 0;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_fdrive_perpendicular = {
|
||||
.name = "fdrive/perpendicular",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT8(perpendicular, FDrive),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
static int fdrive_post_load(void *opaque, int version_id)
|
||||
{
|
||||
fd_revalidate(opaque);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_fdrive = {
|
||||
.name = "fdrive",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.post_load = fdrive_post_load,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_UINT8(head, FDrive),
|
||||
VMSTATE_UINT8(track, FDrive),
|
||||
@ -712,6 +736,9 @@ static const VMStateDescription vmstate_fdrive = {
|
||||
} , {
|
||||
.vmsd = &vmstate_fdrive_media_rate,
|
||||
.needed = &fdrive_media_rate_needed,
|
||||
} , {
|
||||
.vmsd = &vmstate_fdrive_perpendicular,
|
||||
.needed = &fdrive_perpendicular_needed,
|
||||
} , {
|
||||
/* empty */
|
||||
}
|
||||
@ -734,6 +761,40 @@ static int fdc_post_load(void *opaque, int version_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool fdc_reset_sensei_needed(void *opaque)
|
||||
{
|
||||
FDCtrl *s = opaque;
|
||||
|
||||
return s->reset_sensei != 0;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_fdc_reset_sensei = {
|
||||
.name = "fdc/reset_sensei",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_INT32(reset_sensei, FDCtrl),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
static bool fdc_result_timer_needed(void *opaque)
|
||||
{
|
||||
FDCtrl *s = opaque;
|
||||
|
||||
return timer_pending(s->result_timer);
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_fdc_result_timer = {
|
||||
.name = "fdc/result_timer",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.fields = (VMStateField[]) {
|
||||
VMSTATE_TIMER(result_timer, FDCtrl),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
static const VMStateDescription vmstate_fdc = {
|
||||
.name = "fdc",
|
||||
.version_id = 2,
|
||||
@ -770,6 +831,17 @@ static const VMStateDescription vmstate_fdc = {
|
||||
VMSTATE_STRUCT_ARRAY(drives, FDCtrl, MAX_FD, 1,
|
||||
vmstate_fdrive, FDrive),
|
||||
VMSTATE_END_OF_LIST()
|
||||
},
|
||||
.subsections = (VMStateSubsection[]) {
|
||||
{
|
||||
.vmsd = &vmstate_fdc_reset_sensei,
|
||||
.needed = fdc_reset_sensei_needed,
|
||||
} , {
|
||||
.vmsd = &vmstate_fdc_result_timer,
|
||||
.needed = fdc_result_timer_needed,
|
||||
} , {
|
||||
/* empty */
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -844,6 +916,8 @@ static void fdctrl_reset(FDCtrl *fdctrl, int do_irq)
|
||||
fdctrl->dor = FD_DOR_nRESET;
|
||||
fdctrl->dor |= (fdctrl->dma_chann != -1) ? FD_DOR_DMAEN : 0;
|
||||
fdctrl->msr = FD_MSR_RQM;
|
||||
fdctrl->reset_sensei = 0;
|
||||
timer_del(fdctrl->result_timer);
|
||||
/* FIFO state */
|
||||
fdctrl->data_pos = 0;
|
||||
fdctrl->data_len = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user