提交 a7ff1212 编写于 作者: C Cédric Le Goater 提交者: David Gibson

ppc/xics: move ics-simple post_load under the machine

The ICS object uses a post_load() handler which is implicitly relying
on the fact that the internal state of the ICS and ICP objects has
been restored but this is not guaranteed. So, let's move the code
under the post_load() handler of the machine where we know the objects
have been fully restored.

The icp_resend() handler of the XICSFabric QOM interface is also
removed as it is now obsolete.
Signed-off-by: NCédric Le Goater <clg@kaod.org>
Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
上级 e6f7e110
......@@ -551,15 +551,6 @@ static void ics_simple_reset(DeviceState *dev)
}
}
static int ics_simple_post_load(ICSState *ics, int version_id)
{
XICSFabric *xi = ics->xics;
XICSFabricClass *xic = XICS_FABRIC_GET_CLASS(xi);
xic->icp_resend(xi);
return 0;
}
static void ics_simple_dispatch_pre_save(void *opaque)
{
ICSState *ics = opaque;
......@@ -647,7 +638,6 @@ static void ics_simple_class_init(ObjectClass *klass, void *data)
dc->props = ics_simple_properties;
dc->vmsd = &vmstate_ics_simple;
dc->reset = ics_simple_reset;
isc->post_load = ics_simple_post_load;
isc->reject = ics_simple_reject;
isc->resend = ics_simple_resend;
isc->eoi = ics_simple_eoi;
......
......@@ -1341,6 +1341,13 @@ static int spapr_post_load(void *opaque, int version_id)
sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
int err = 0;
if (!object_dynamic_cast(OBJECT(spapr->ics), TYPE_ICS_KVM)) {
int i;
for (i = 0; i < spapr->nr_servers; i++) {
icp_resend(&spapr->icps[i]);
}
}
/* In earlier versions, there was no separate qdev for the PAPR
* RTC, so the RTC offset was stored directly in sPAPREnvironment.
* So when migrating from those versions, poke the incoming offset
......@@ -2981,16 +2988,6 @@ static ICPState *spapr_icp_get(XICSFabric *xi, int server)
return (server < spapr->nr_servers) ? &spapr->icps[server] : NULL;
}
static void spapr_icp_resend(XICSFabric *xi)
{
sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
int i;
for (i = 0; i < spapr->nr_servers; i++) {
icp_resend(&spapr->icps[i]);
}
}
static void spapr_machine_class_init(ObjectClass *oc, void *data)
{
MachineClass *mc = MACHINE_CLASS(oc);
......@@ -3040,7 +3037,6 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
xic->ics_get = spapr_ics_get;
xic->ics_resend = spapr_ics_resend;
xic->icp_get = spapr_icp_get;
xic->icp_resend = spapr_icp_resend;
}
static const TypeInfo spapr_machine_info = {
......
......@@ -156,7 +156,6 @@ typedef struct XICSFabricClass {
ICSState *(*ics_get)(XICSFabric *xi, int irq);
void (*ics_resend)(XICSFabric *xi);
ICPState *(*icp_get)(XICSFabric *xi, int server);
void (*icp_resend)(XICSFabric *xi);
} XICSFabricClass;
#define XICS_IRQS_SPAPR 1024
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册