GICv3软件overview手册之中断处理(2)

1. 执行优先级&抢占

        PMR设置中断发给某个PE的最小优先级。GICv3架构存在执行优先级的概念。当PE应答一个中断时,它的执行优先级变成中断的。当PE写EOI寄存器时执行优先级返回之前的值。

        在CPU接口中执行优先级寄存器ICC_RPR_EL1报告当前执行优先级。当考虑抢占时执行优先级的概念非常重要。当更高优先级发送给已经在处理较低优先级中断的PE时,抢占产生。抢占增加了软件的复杂度,但低优先级的中断不能阻塞高优先级的中断。

        抢占图显示了一级抢占。但有可能存在多级抢占。在一些情况下不要求抢占。GICv3架构通过二进制点寄存器ICC_BPRn_EL1允许控制不同的优先级给不同的抢占。

        二进制点寄存器将优先级切分成两部分:group优先级和子优先级

        对于抢占,仅考虑Group优先级。子优先级域忽略。

比如,考虑如下三个中断:

INTID A优先级为0x10

INTID B优先级为0x20

INTID C优先级为0x30

        在本场景下它决定:

  1. A可以抢占B或C;
  2. B不能抢占C,因为B和C有类似的优先级

        为完成这个场景Group域和子优先级域可以将N=4:

         这种切分,B和C可以认为在抢占情况下存在相同的优先级。但A仍是更高优先级,因此可以抢占B或C。

NOTE: 抢占要求中断处理支持nesting。本文档不再描述更多的细节。

2. 中断的结束

        当中断被处理时,软件需要通知中断控制器中断已经被处理,这样状态机可以转换到下一个状态。GICv3架构认为可分为两个任务:

(1)降低优先级

这意味着将运行优先级降到中断处理之前的值。

(2)未激活

这意味着更新当前正处理的中断的状态机。通常从active状态转换为inactive状态。

        在GICv3架构中降低会优先级和未激活可以同时产生或分开产生。由ICC_CTLR.EOImode决定。

(1)EOImode = 0

        对Group0中断写ICC_EIOR0_EL1,或对Group1中断写ICC_EIOR1_EL1,会同时发送降低优先级和未激活。这是通常对裸设备上使用的模式。

(2)EOImode = 1

        对Group0中断写ICC_EIOR_EL0,或对Group1中断写ICC_EIOR1_EL1,会导致优先级降低。A若要求deactivate,需要单独写ICC_DIR_EL1。这种模式通常在虚拟化中使用。

        在写这些寄存器时,软件必须写INTID。

3. 检查系统当前状态

3.1 最高优先级pending中断和运行优先级

        最高优先级pending中断寄存器ICC_HPRIR0_EL1&ICC_HPRIR1_EL1为PE报告最高优先级pending中断的INTID。在不同的PE上可能存在差异,比如由于SPI的不同路由设置。

        之前章节介绍运行优先级,由运行优先级ICC_RPR_EL1报告。

3.2 独立INTID的状态

        Distributor提供寄存器指明每个SPI的当前状态。类似的Redistributor也提供寄存器指明PPI和SGI的状态。

        这些寄存器也能够将中断移到某个状态。这非常有用,比如,在不要求外设发送中断情况下可以测试配置是否正确。

        这里用单独的寄存器来报告active状态和pending状态。下表列出active状态寄存器。pending状态寄存器也是相同格式。

Register

描述

GICD_ISACTIVERn

设置SPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active  0 - INTID为非active

写1到该bit可以激活当前INTID。写0没有效果。

GICD_ICACTIVERn

清除SPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active  0 - INTID为非active

写1到该bit可以deactive当前INTID。写0没有效果。

GICR_ISACTIVER0

设置SGI和PPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active  0 - INTID为非active

写1到该bit可以激活当前INTID。写0没有效果。

GICR_ICACTIVER0

清除SGI和PPI的active状态。每个INTID一个bit。读该bit返回INTID的当前状态:1 - INTID为active  0 - INTID为非active

写1到该bit可以deactive当前INTID。写0没有效果。

NOTE: 在使能亲和路由时GICD_ISACTIVER0和GICD_ICACTIVER0被当作保留。这是因为GICD_ISACTIVER0和GICD_ICACTIVER0与INTID0~31相关,而它们是基于PE的,且由PE的Redistributor上报。

NOTE: 执行在非安全状态的软件不能看到Group0或安全状态Group1中断,若访问没有被GICD_NASCRn或GICR_NASCRn允许。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值