[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] A question on how interrupts work

  • To: xen-devel@xxxxxxxxxxxxxxxxxxxxx
  • From: "Ronald G. Minnich" <rminnich@xxxxxxxx>
  • Date: Tue, 14 Dec 2004 15:21:02 -0700 (MST)
  • Delivery-date: Tue, 14 Dec 2004 22:22:27 +0000
  • List-id: List for Xen developers <xen-devel.lists.sourceforge.net>

I'm wondering about something in xen I don't understand, related to 

Basically, in hardware systems you have a processor running with
interrupts enabled or disabled, which in Unix and sons generally is called
a priority level, let's just call it hi or lo. In many OSes (Plan 9
included) to block interrupts you splhi, to enable them you spllo. In
Linux it is CLI to block and STI to enable.

When running at lo, you can take an interrupt and you land in the kernel
at splhi; or you can take a fault and land in the kernel without changing
to hi or lo. As a general rule, the cpu saves your state including your
interrupt enable flags (x86 does this in eflags). For page faults,
typically you run at whatever level you were at in the kernel fault
handler; for hardware interrupts typically you run at splhi, regardless of
where you were before. In the handler, you do your work and (e.g.) execute
an iret. Regardless of the level you are running at in the fault handler,
after the iret, you are running at the previous priority level, i.e. hi or
lo. So you can, for example, page fault in an interrupt routine. 

Hardware saves your interrupt-enabled flag and restores it automagically
when you execute the iret. On interrupt, the IF flag is cleared, no more
interrupts can happen. On page fault, the IF flag is not touched. In any
event, it's not the job of the interrupt handler to restore the state of
the IF flag that was in play before the interrupt or exception -- hardware
does that, specifically the IRET popping EFLAGS on the x86 restores the

My question is, why doesn't Xen work that way? In other words, Xen will 
set the mask for the event channel; but restoring it is up to the OS. If 
Xen worked the way the hardware does, Xen would save the mask, set the 
mask, and then restore the mask to its previous value when the OS returns 
from the trap. Is there a reason that the OS has to do the restoration of 
the mask? I am wondering because I just fixed a bug in Plan 9 that boiled 
down to adding an spllo() to the plan 9 trap handler, since Xen sets the 
mask on page fault and does not clear it when the OS returns. Why doesn't 
Xen do the equivalent of this:

        x = splhi();

instead of what is does now, which is pretty much this:
        /* OS restores IF */

There's an awful lot of complexity in the trap handler in the OS to deal 
with the problem of the OS setting spllo() before doing the iret, since as 
soon as the OS sets spllo() it can take an interrupt -- while in the 
interrupt handler. 

thanks for any clarity you can lend to my brain :-)


SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now. 
Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.