Instead of calling HYPERVISOR_sched_op(SCHEDOP_block, 0) we need to use
the "hlt" instruction with interrupts enabled to switch to idle when
running as HVMlite domain.
This requires to setup a new timer in the timer handler as there is no
guarantee the original timer event we are waiting for won't fire
between enabling interrupts and calling "hlt".
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
if(monotonic_clock() < until)
{
HYPERVISOR_set_timer_op(until);
+#ifdef CONFIG_PARAVIRT
HYPERVISOR_sched_op(SCHEDOP_block, 0);
+#else
+ local_irq_enable();
+ asm volatile ( "hlt" : : : "memory" );
+#endif
local_irq_disable();
+ HYPERVISOR_set_timer_op(0);
}
}
-
-/*
- * Just a dummy
- */
static void timer_handler(evtchn_port_t ev, struct pt_regs *regs, void *ign)
{
+ HYPERVISOR_set_timer_op(monotonic_clock() + MILLISECS(1));
}