大家好,我在分析Linux内核中断的时候,在看到这个宏的时候,有几处看不明白,还望好心人多多指教,先谢谢各位啦!
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
mov \base, #S3C24XX_VA_IRQ
@@ try the interrupt offset register, since it is there
ldr \irqstat, [ \base, #INTPND ]
teq \irqstat, #0
beq 1002f
ldr \irqnr, [ \base, #INTOFFSET ]
mov \tmp, #1
tst \irqstat, \tmp, lsl \irqnr
bne 1001f @ not equal 0, means find correspond int pend.
@@ the number specified is not a valid irq, so try
@@ and work it out for ourselves
mov \irqnr, #0 @@ start here
注:前面这部分都能看懂,大体就是判断有没有中断到来,以及中断状态是否与给定的中断号对对应。
@@ work out which irq (if any) we got
movs \tmp, \irqstat, lsl#16
addeq \irqnr, \irqnr, #16 #此处先判断如果中断号大于16,那么移位之后,tmp=0,那么执行irq=irq+16.
moveq \irqstat, \irqstat, lsr#16 #此处就看不懂了,代码的意思是如果irqnr+16之后,Z置位,即irqnr为0,那么irqstat右移16位,但是irqnr是一个32bit的变量,此处怎么会使Z置位呢,下面的情况也类似,每遇到“moveq \irqstat, \irqstat, lsr#n”就感觉很迷惑,还望过来人多多指教,呵呵!
tst \irqstat, #0xff
addeq \irqnr, \irqnr, #8
moveq \irqstat, \irqstat, lsr#8 ##????????????
tst \irqstat, #0xf
addeq \irqnr, \irqnr, #4
moveq \irqstat, \irqstat, lsr#4 ##????????????
tst \irqstat, #0x3
addeq \irqnr, \irqnr, #2
moveq \irqstat, \irqstat, lsr#2 ##????????????
tst \irqstat, #0x1
addeq \irqnr, \irqnr, #1
@@ we have the value
1001:
adds \irqnr, \irqnr, #IRQ_EINT0
1002:
@@ exit here, Z flag unset if IRQ
.endm