主题 : Linux内核中断代码分析疑惑 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 5915
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2009-05-13
最后登录: 2010-09-13
楼主  发表于: 2010-09-13 14:30

 Linux内核中断代码分析疑惑

大家好,我在分析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