esp: add vmstate_esp version to embedded ESPState
The QOM object representing ESPState is currently embedded within both the SYSBUS_ESP and PCI_ESP devices with migration state handled by embedding vmstate_esp within each device using VMSTATE_STRUCT. Since the vmstate_esp fields are embedded directly within the migration stream, the incoming vmstate_esp version_id is lost. The only version information available is that from vmstate_sysbus_esp_scsi and vmstate_esp_pci_scsi, but those versions represent their respective devices and not that of the underlying ESPState. Resolve this by adding a new version-dependent field in vmstate_sysbus_esp_scsi and vmstate_esp_pci_scsi which stores the vmstate_esp version_id field within ESPState to be used to allow migration from older QEMU versions. Finally bump the vmstate_esp version to 5 to cover the upcoming ESPState changes within this patch series. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20210304221103.6369-5-mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
eb169c76d0
commit
0bd005be78
@ -330,11 +330,12 @@ static void esp_pci_hard_reset(DeviceState *dev)
|
|||||||
|
|
||||||
static const VMStateDescription vmstate_esp_pci_scsi = {
|
static const VMStateDescription vmstate_esp_pci_scsi = {
|
||||||
.name = "pciespscsi",
|
.name = "pciespscsi",
|
||||||
.version_id = 1,
|
.version_id = 2,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 1,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_PCI_DEVICE(parent_obj, PCIESPState),
|
VMSTATE_PCI_DEVICE(parent_obj, PCIESPState),
|
||||||
VMSTATE_BUFFER_UNSAFE(dma_regs, PCIESPState, 0, 8 * sizeof(uint32_t)),
|
VMSTATE_BUFFER_UNSAFE(dma_regs, PCIESPState, 0, 8 * sizeof(uint32_t)),
|
||||||
|
VMSTATE_UINT8_V(esp.mig_version_id, PCIESPState, 2),
|
||||||
VMSTATE_STRUCT(esp, PCIESPState, 0, vmstate_esp, ESPState),
|
VMSTATE_STRUCT(esp, PCIESPState, 0, vmstate_esp, ESPState),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
|
@ -795,10 +795,28 @@ static const VMStateDescription vmstate_esp_pdma = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int esp_pre_save(void *opaque)
|
||||||
|
{
|
||||||
|
ESPState *s = ESP(opaque);
|
||||||
|
|
||||||
|
s->mig_version_id = vmstate_esp.version_id;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int esp_post_load(void *opaque, int version_id)
|
||||||
|
{
|
||||||
|
ESPState *s = ESP(opaque);
|
||||||
|
|
||||||
|
s->mig_version_id = vmstate_esp.version_id;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
const VMStateDescription vmstate_esp = {
|
const VMStateDescription vmstate_esp = {
|
||||||
.name = "esp",
|
.name = "esp",
|
||||||
.version_id = 4,
|
.version_id = 5,
|
||||||
.minimum_version_id = 3,
|
.minimum_version_id = 3,
|
||||||
|
.pre_save = esp_pre_save,
|
||||||
|
.post_load = esp_post_load,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_BUFFER(rregs, ESPState),
|
VMSTATE_BUFFER(rregs, ESPState),
|
||||||
VMSTATE_BUFFER(wregs, ESPState),
|
VMSTATE_BUFFER(wregs, ESPState),
|
||||||
@ -997,9 +1015,10 @@ static void sysbus_esp_init(Object *obj)
|
|||||||
|
|
||||||
static const VMStateDescription vmstate_sysbus_esp_scsi = {
|
static const VMStateDescription vmstate_sysbus_esp_scsi = {
|
||||||
.name = "sysbusespscsi",
|
.name = "sysbusespscsi",
|
||||||
.version_id = 1,
|
.version_id = 2,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 1,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_UINT8_V(esp.mig_version_id, SysBusESPState, 2),
|
||||||
VMSTATE_STRUCT(esp, SysBusESPState, 0, vmstate_esp, ESPState),
|
VMSTATE_STRUCT(esp, SysBusESPState, 0, vmstate_esp, ESPState),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,8 @@ struct ESPState {
|
|||||||
uint32_t pdma_start;
|
uint32_t pdma_start;
|
||||||
uint32_t pdma_cur;
|
uint32_t pdma_cur;
|
||||||
void (*pdma_cb)(ESPState *s);
|
void (*pdma_cb)(ESPState *s);
|
||||||
|
|
||||||
|
uint8_t mig_version_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TYPE_SYSBUS_ESP "sysbus-esp"
|
#define TYPE_SYSBUS_ESP "sysbus-esp"
|
||||||
|
Loading…
Reference in New Issue
Block a user