|
@@ -318,6 +318,12 @@ static void a9_gtimer_realize(DeviceState *dev, Error **errp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool vmstate_a9_gtimer_control_needed(void *opaque)
|
|
|
|
+{
|
|
|
|
+ A9GTimerState *s = opaque;
|
|
|
|
+ return s->control != 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static const VMStateDescription vmstate_a9_gtimer_per_cpu = {
|
|
static const VMStateDescription vmstate_a9_gtimer_per_cpu = {
|
|
.name = "arm.cortex-a9-global-timer.percpu",
|
|
.name = "arm.cortex-a9-global-timer.percpu",
|
|
.version_id = 1,
|
|
.version_id = 1,
|
|
@@ -331,6 +337,17 @@ static const VMStateDescription vmstate_a9_gtimer_per_cpu = {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static const VMStateDescription vmstate_a9_gtimer_control = {
|
|
|
|
+ .name = "arm.cortex-a9-global-timer.control",
|
|
|
|
+ .version_id = 1,
|
|
|
|
+ .minimum_version_id = 1,
|
|
|
|
+ .needed = vmstate_a9_gtimer_control_needed,
|
|
|
|
+ .fields = (VMStateField[]) {
|
|
|
|
+ VMSTATE_UINT32(control, A9GTimerState),
|
|
|
|
+ VMSTATE_END_OF_LIST()
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
static const VMStateDescription vmstate_a9_gtimer = {
|
|
static const VMStateDescription vmstate_a9_gtimer = {
|
|
.name = "arm.cortex-a9-global-timer",
|
|
.name = "arm.cortex-a9-global-timer",
|
|
.version_id = 1,
|
|
.version_id = 1,
|
|
@@ -344,6 +361,10 @@ static const VMStateDescription vmstate_a9_gtimer = {
|
|
1, vmstate_a9_gtimer_per_cpu,
|
|
1, vmstate_a9_gtimer_per_cpu,
|
|
A9GTimerPerCPU),
|
|
A9GTimerPerCPU),
|
|
VMSTATE_END_OF_LIST()
|
|
VMSTATE_END_OF_LIST()
|
|
|
|
+ },
|
|
|
|
+ .subsections = (const VMStateDescription*[]) {
|
|
|
|
+ &vmstate_a9_gtimer_control,
|
|
|
|
+ NULL
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|