migration: Hack to maintain backwards compatibility for ppc
Current code does: - register pre_2_10_vmstate_dummy_icp with "icp/server" and instance dependinfg on cpu number - for newer machines, it register vmstate_icp with "icp/server" name and instance 0 - now it unregisters "icp/server" for the 1st instance. This is wrong at many levels: - we shouldn't have two VMSTATEDescriptions with the same name - In case this is the only solution that we can came with, it needs to be: * register pre_2_10_vmstate_dummy_icp * unregister pre_2_10_vmstate_dummy_icp * register real vmstate_icp Created vmstate_replace_hack_for_ppc() with warnings left and right that it is a hack. CC: Cedric Le Goater <clg@kaod.org> CC: Daniel Henrique Barboza <danielhb413@gmail.com> CC: David Gibson <david@gibson.dropbear.id.au> CC: Greg Kurz <groug@kaod.org> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Juan Quintela <quintela@redhat.com> Message-ID: <20231020090731.28701-8-quintela@redhat.com>
This commit is contained in:
parent
b23db4cd82
commit
485fb95546
@ -335,8 +335,22 @@ static void icp_realize(DeviceState *dev, Error **errp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
vmstate_register(NULL, icp->cs->cpu_index, &vmstate_icp_server, icp);
|
* The way that pre_2_10_icp is handling is really, really hacky.
|
||||||
|
* We used to have here this call:
|
||||||
|
*
|
||||||
|
* vmstate_register(NULL, icp->cs->cpu_index, &vmstate_icp_server, icp);
|
||||||
|
*
|
||||||
|
* But we were doing:
|
||||||
|
* pre_2_10_vmstate_register_dummy_icp()
|
||||||
|
* this vmstate_register()
|
||||||
|
* pre_2_10_vmstate_unregister_dummy_icp()
|
||||||
|
*
|
||||||
|
* So for a short amount of time we had to vmstate entries with
|
||||||
|
* the same name. This fixes it.
|
||||||
|
*/
|
||||||
|
vmstate_replace_hack_for_ppc(NULL, icp->cs->cpu_index,
|
||||||
|
&vmstate_icp_server, icp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void icp_unrealize(DeviceState *dev)
|
static void icp_unrealize(DeviceState *dev)
|
||||||
|
@ -143,6 +143,11 @@ static bool pre_2_10_vmstate_dummy_icp_needed(void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription pre_2_10_vmstate_dummy_icp = {
|
static const VMStateDescription pre_2_10_vmstate_dummy_icp = {
|
||||||
|
/*
|
||||||
|
* Hack ahead. We can't have two devices with the same name and
|
||||||
|
* instance id. So I rename this to pass make check.
|
||||||
|
* Real help from people who knows the hardware is needed.
|
||||||
|
*/
|
||||||
.name = "icp/server",
|
.name = "icp/server",
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 1,
|
||||||
@ -155,16 +160,32 @@ static const VMStateDescription pre_2_10_vmstate_dummy_icp = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See comment in hw/intc/xics.c:icp_realize()
|
||||||
|
*
|
||||||
|
* You have to remove vmstate_replace_hack_for_ppc() when you remove
|
||||||
|
* the machine types that need the following function.
|
||||||
|
*/
|
||||||
static void pre_2_10_vmstate_register_dummy_icp(int i)
|
static void pre_2_10_vmstate_register_dummy_icp(int i)
|
||||||
{
|
{
|
||||||
vmstate_register(NULL, i, &pre_2_10_vmstate_dummy_icp,
|
vmstate_register(NULL, i, &pre_2_10_vmstate_dummy_icp,
|
||||||
(void *)(uintptr_t) i);
|
(void *)(uintptr_t) i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See comment in hw/intc/xics.c:icp_realize()
|
||||||
|
*
|
||||||
|
* You have to remove vmstate_replace_hack_for_ppc() when you remove
|
||||||
|
* the machine types that need the following function.
|
||||||
|
*/
|
||||||
static void pre_2_10_vmstate_unregister_dummy_icp(int i)
|
static void pre_2_10_vmstate_unregister_dummy_icp(int i)
|
||||||
{
|
{
|
||||||
vmstate_unregister(NULL, &pre_2_10_vmstate_dummy_icp,
|
/*
|
||||||
(void *)(uintptr_t) i);
|
* This used to be:
|
||||||
|
*
|
||||||
|
* vmstate_unregister(NULL, &pre_2_10_vmstate_dummy_icp,
|
||||||
|
* (void *)(uintptr_t) i);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
int spapr_max_server_number(SpaprMachineState *spapr)
|
int spapr_max_server_number(SpaprMachineState *spapr)
|
||||||
|
@ -1230,6 +1230,17 @@ static inline int vmstate_register(VMStateIf *obj, int instance_id,
|
|||||||
opaque, -1, 0, NULL);
|
opaque, -1, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* vmstate_replace_hack_for_ppc() - ppc used to abuse vmstate_register
|
||||||
|
*
|
||||||
|
* Don't even think about using this function in new code.
|
||||||
|
*
|
||||||
|
* Returns: 0 on success, -1 on failure
|
||||||
|
*/
|
||||||
|
int vmstate_replace_hack_for_ppc(VMStateIf *obj, int instance_id,
|
||||||
|
const VMStateDescription *vmsd,
|
||||||
|
void *opaque);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vmstate_register_any() - legacy function to register state
|
* vmstate_register_any() - legacy function to register state
|
||||||
* serialisation description and let the function choose the id
|
* serialisation description and let the function choose the id
|
||||||
|
@ -846,6 +846,24 @@ static void vmstate_check(const VMStateDescription *vmsd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See comment in hw/intc/xics.c:icp_realize()
|
||||||
|
*
|
||||||
|
* This function can be removed when
|
||||||
|
* pre_2_10_vmstate_register_dummy_icp() is removed.
|
||||||
|
*/
|
||||||
|
int vmstate_replace_hack_for_ppc(VMStateIf *obj, int instance_id,
|
||||||
|
const VMStateDescription *vmsd,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
SaveStateEntry *se = find_se(vmsd->name, instance_id);
|
||||||
|
|
||||||
|
if (se) {
|
||||||
|
savevm_state_handler_remove(se);
|
||||||
|
}
|
||||||
|
return vmstate_register(obj, instance_id, vmsd, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
int vmstate_register_with_alias_id(VMStateIf *obj, uint32_t instance_id,
|
int vmstate_register_with_alias_id(VMStateIf *obj, uint32_t instance_id,
|
||||||
const VMStateDescription *vmsd,
|
const VMStateDescription *vmsd,
|
||||||
void *opaque, int alias_id,
|
void *opaque, int alias_id,
|
||||||
|
Loading…
Reference in New Issue
Block a user