@@ -55,6 +55,19 @@ typedef struct HPETTimer { /* timers */
uint8_t wrap_flag; /* timer pop will indicate wrap for one-shot 32-bit
* mode. Next pop will be actual timer expiration.
*/
+ /* driftfix state */
+ uint64_t prev_period; /* needed when the guest o/s changes the
+ * comparator value */
+ uint64_t ticks_not_accounted; /* ticks for which no interrupts have been
+ * delivered to the guest o/s yet */
+ uint32_t irq_rate; /* rate at which interrupts are delivered
+ * to the guest o/s during one period
+ * interval; if rate is greater than 1,
+ * additional interrupts are delivered
+ * to compensate missed interrupts */
+ uint32_t divisor; /* needed to determine when the next
+ * timer callback should occur while
+ * rate is greater than 1 */
} HPETTimer;
typedef struct HPETState {
@@ -246,6 +259,27 @@ static int hpet_post_load(void *opaque, int version_id)
return 0;
}
+static bool hpet_timer_driftfix_vmstate_needed(void *opaque)
+{
+ HPETTimer *t = opaque;
+
+ return (t->state->driftfix != 0);
+}
+
+static const VMStateDescription vmstate_hpet_timer_driftfix = {
+ .name = "hpet_timer_driftfix",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField []) {
+ VMSTATE_UINT64(prev_period, HPETTimer),
+ VMSTATE_UINT64(ticks_not_accounted, HPETTimer),
+ VMSTATE_UINT32(irq_rate, HPETTimer),
+ VMSTATE_UINT32(divisor, HPETTimer),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
static const VMStateDescription vmstate_hpet_timer = {
.name = "hpet_timer",
.version_id = 1,
@@ -260,6 +294,14 @@ static const VMStateDescription vmstate_hpet_timer = {
VMSTATE_UINT8(wrap_flag, HPETTimer),
VMSTATE_TIMER(qemu_timer, HPETTimer),
VMSTATE_END_OF_LIST()
+ },
+ .subsections = (VMStateSubsection []) {
+ {
+ .vmsd = &vmstate_hpet_timer_driftfix,
+ .needed = hpet_timer_driftfix_vmstate_needed,
+ }, {
+ /* empty */
+ }
}
};
The new fields in HPETTimer are covered by a separate VMStateDescription which is a subsection of 'vmstate_hpet_timer'. They are only migrated if -global hpet.driftfix=on Signed-off-by: Ulrich Obergfell <uobergfe@redhat.com> --- hw/hpet.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+), 0 deletions(-)