Simon Kagstrom
2006-Feb-02 08:14 UTC
[Xen-devel] Periodic timer interrupts in the Mini-OS (working?)
Hello!
I have a question about timer interrupts in the Mini-OS and
HYPERVISOR_set_timer_op. From printouts, it seems like the Mini-OS only
recieves timer events after calling block_domain:
void block_domain(u32 millisecs)
{
struct timeval tv;
gettimeofday(&tv);
HYPERVISOR_set_timer_op(monotonic_clock() + 1000000LL * (s64) millisecs);
HYPERVISOR_sched_op(SCHEDOP_block, 0);
}
i.e., not the "regular" 10ms periodic events (if I don''t call
block_domain(),
it will just sit idle). I''m trying to understand why this is the case.
>From looking in the Linux source code, I presume that the periodic ticker is
setup in setup_cpu0_timer_irq() on uniprocessors, and this simply does a
bind_virq_to_irqhandler(VIRQ_TIMER, ...), which is the same thing that the
mini-os does by calling bind_virq(VIRQ_TIMER, ...) in the init_time()
function. These two functions do the same things, including unmasking the
event channel.
The mini-os also does a __sti(), also taken from Linux, to enable event
delivery before init_time().
Is there anything else which needs to be done to deliver periodic timer
events?
--
// Simon
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Simon Kagstrom
2006-Feb-02 08:40 UTC
Re: [Xen-devel] Periodic timer interrupts in the Mini-OS (working?)
On 2006-02-02, 09:14, Simon Kagstrom wrote:> Hello! > > I have a question about timer interrupts in the Mini-OS and > HYPERVISOR_set_timer_op. From printouts, it seems like the Mini-OS only > recieves timer events after calling block_domain: > > void block_domain(u32 millisecs) > { > struct timeval tv; > gettimeofday(&tv); > HYPERVISOR_set_timer_op(monotonic_clock() + 1000000LL * (s64) millisecs); > HYPERVISOR_sched_op(SCHEDOP_block, 0); > } > > i.e., not the "regular" 10ms periodic events (if I don''t call block_domain(), > it will just sit idle). I''m trying to understand why this is the case.It turned out it was my fault, for some reason I had modified do_event() to include a mask_evtchn(port) in the end. So then, naturally, there were no more events... Sorry about the fuss, I should have checked the changes first. -- // Simon _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel