2025年POWERPC中断

POWERPC中断从 CPU 的 e500 核的角度 中断源分为自己内核产生的异常和 PIC 提供的中断 异常 是 e500 核产生的 它是同步产生的 可以预知的 如非法指令 或访问存储器时出现 TLB Miss 等情况 中断 是 e500 核外部引脚产生的中断 由 PIC 送进来来的

大家好,我是讯享网,很高兴认识大家。 从CPU的e500核的角度,中断源分为自己内核产生的异常和  PIC提供的中断
 
异常,是e500核产生的,它是同步产生的(可以预知的),如非法指令,或访问存储器时出现TLB Miss等情况
中断,是e500核外部引脚产生的中断,由PIC送进来来的,它是异步产生的(无法预知的),
主要有:int#, cint#, mcp#
分别对应一般中断,critical中断和machine check中断。
下面是简图

讯享网


一、中断的开关



中断的开关由寄存器MSR来控制的
CE:if set 1,Critical input and watchdog timer interrupts are enabled.
EE:if set 1,External input, decrementer, fixed-interval timer and performance monitor interrupts are enabled
ME:if set 1, Machine check interrupts are enabled.
DE:if set 1,Debug interrputs are enabled if DBCR0[IDM] = 1.

MSR[EE] 这个bit很重要,中断的使能要靠它。
注意:当发生中断后,MSR[EE]会自动置0屏蔽所有其他的中。
      如果在MSR[EE]置1前,又来了一个中断
           1.此中断是 边沿触发 的,那么此中断丢失。此种中断就是电平变化,一次就没了
           2.此中断时水平触发的,此中断不会丢失。此种中断的电平会一直active,直到硬件处理它
     


二、中断向量





每个中断都有自己的中断向量,通过它能计算出中断handler的指令地址。
指令地址的计算方法:
        IVPR[32-47] || IVOR n [48-59] || 0b0000
这样就得到一个32个bit地址。
IVOR 是一系列寄存器,有下面一张表:



有2个中断向量对程序员来说比较亲切:
    一个是 IVOR4 用来处理外部中断和内部SOC中断
    一个是 IVOR8 用来处理系统调用

随便找一个,比如IVOR10,在uboot下验证。查看uboot-1.1.4/cpu/mpc85xx/start.S
    185 /* Setup interrupt vectors 设置IVPR寄存器*/
    186 lis r1,TEXT_BASE@h
    187 mtspr IVPR, r1

    197 li r1,0x0500
    198 mtspr IVOR4,r1 /* 4: External interrupt */
    。。。省略
    205 li r1,0x0900
    206 mtspr IVOR8,r1 /* 8: System call */
    207 /* 9: Auxiliary processor unavailable(unsupported) */
    208 li r1,0x0a00

    209 mtspr IVOR10,r1 /* 10: Decrementer */
    。。。省略

看board/pq37pc/pq37pc_8560/config.mk 里有 
     TEXT_BASE = 0xFF
所以 IVPR   = 0xFFF80000
     IVOR10 = 0x00000a00
计算 IVPR[32-47] || IVPOR10[48-59] || 0b0000  得  0xFFF80a00

检查uboot的符号表文件System.map,验证一下
    14 fff80900 t SystemCall
    15 fff80970 t _back
    16 fff809cc t _end_back

    17 fff80a00 t Decrementer
    18 fff80b00 t IntervalTimer
    19 fff80c00 t WatchdogTimer


至于 Decrementer符号处调用那个函数,也是在uboot-1.1.4/cpu/mpc85xx/start.S文件里定义
    572 STD_EXCEPTION(0x0a00, Decrementer, timer_interrupt)
    573 STD_EXCEPTION(0x0b00, IntervalTimer, UnknownException)
    574 STD_EXCEPTION(0x0c00, WatchdogTimer, WatchdogHandle)


STD_EXCEPTION宏 和 CRIT_EXCEPTION宏 具体咋操作,待看.....

在include/ppc_asm.tmpl 中定义
 #define STD_EXCEPTION(n, label, hdlr)                           \
小讯
上一篇 2025-03-21 12:31
下一篇 2025-03-27 22:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54003.html