|
@@ -353,6 +353,16 @@ static const VMStateDescription vmstate_hpet = {
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static void hpet_arm(HPETTimer *t, uint64_t ticks)
|
|
|
|
+{
|
|
|
|
+ if (ticks < ns_to_ticks(INT64_MAX / 2)) {
|
|
|
|
+ timer_mod(t->qemu_timer,
|
|
|
|
+ qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ticks_to_ns(ticks));
|
|
|
|
+ } else {
|
|
|
|
+ timer_del(t->qemu_timer);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* timer expiration callback
|
|
* timer expiration callback
|
|
*/
|
|
*/
|
|
@@ -375,13 +385,11 @@ static void hpet_timer(void *opaque)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
diff = hpet_calculate_diff(t, cur_tick);
|
|
diff = hpet_calculate_diff(t, cur_tick);
|
|
- timer_mod(t->qemu_timer,
|
|
|
|
- qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (int64_t)ticks_to_ns(diff));
|
|
|
|
|
|
+ hpet_arm(t, diff);
|
|
} else if (t->config & HPET_TN_32BIT && !timer_is_periodic(t)) {
|
|
} else if (t->config & HPET_TN_32BIT && !timer_is_periodic(t)) {
|
|
if (t->wrap_flag) {
|
|
if (t->wrap_flag) {
|
|
diff = hpet_calculate_diff(t, cur_tick);
|
|
diff = hpet_calculate_diff(t, cur_tick);
|
|
- timer_mod(t->qemu_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
|
|
|
|
- (int64_t)ticks_to_ns(diff));
|
|
|
|
|
|
+ hpet_arm(t, diff);
|
|
t->wrap_flag = 0;
|
|
t->wrap_flag = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -408,8 +416,7 @@ static void hpet_set_timer(HPETTimer *t)
|
|
t->wrap_flag = 1;
|
|
t->wrap_flag = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- timer_mod(t->qemu_timer,
|
|
|
|
- qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + (int64_t)ticks_to_ns(diff));
|
|
|
|
|
|
+ hpet_arm(t, diff);
|
|
}
|
|
}
|
|
|
|
|
|
static void hpet_del_timer(HPETTimer *t)
|
|
static void hpet_del_timer(HPETTimer *t)
|