How to mask IRQ

leonp at plris.com leonp at plris.com
Sun May 29 12:54:01 UTC 2005


Eric, thank you for reply.

On Sunday, 29 בMay 2005 15:42, Eric Valette wrote:
> leonp at plris.com wrote:
> > 	I need to mask, for example, IRQ5 interrupt from within the ISR.
>
> You mean while handling another IRQ (e.g IRQ 4) I guess?
In my case - both. When I have received IRQ5, i need to mask itself and IRQ4 
too.


> > 	Today's implementation seems not to allow this operation, as the ISR is
> > called from the IRQ dispatcher, which restores the mask state to the
> > value it saved before the ISR was called.
> > 	The most simple decision I see, is to return the desired mask as a
> > return value from the ISR function. Thus, the dispatcher must check that
> > the ISR return value is not zero.
>
> In the MPC860, there is a way to mask automatically other interrupts
> when a dedicated interrupt occur (at least at the CPM level) I do not
> remember for the SIU. Its from memory as I do not have the source handy...
>
> In theory, the masks in the interrupt controller enables to define a set
> of interrupt blocked on a per irq basis. Check the sources I think there
> is a mask somewhere...
Hmmm, may be I miss something.
The dispatcher code I see in general looks like:

void C_dispatch_irq_handler (CPU_Interrupt_frame *frame, unsigned int excNum)
{
register unsigned oldMask;                  /* old siu pic masks */
.......
    oldMask = ppc_cached_irq_mask;
    ppc_cached_irq_mask = oldMask & SIU_IvectMask[irq];
...
   rtems_hdl_tbl[irq].hdl(irq);
....
    ppc_cached_irq_mask = oldMask;
    ((volatile immap_t *)IMAP_ADDR)->im_siu_conf.sc_simask =
		ppc_cached_irq_mask;
...
}

I do not understand how the current value may be masked without changing 
oldMask from within this code.

Thanks again.

-- 
Leon M.Pollak



More information about the users mailing list