卢骏 · 2020年05月27日

ARM GIC(十) GICv3软中断

软中断(software generated interrupts),用来多个核之间的通信(inter-processor communication)。软件通过写SGI寄存器来产生。

◾软件写ICC_SGI1R_EL1产生对应当前secure状态的group1软中断

◾软件写ICC_ASGI1R_EL1产生secure状态的group1软中断

◾软件写ICC_SGI0R_EL1产生secure状态的group0软中断

这三个寄存器的位域是一样的,如下图:
1.png

◾Aff3.Aff2.Aff1:表示软中断目的CPU的属性层次。

◾TargetList:表示要发给哪些CPU。

◾INTID:表示软中断号

◾IRM:软中断发送,是按照属性层次发送,还是发起其他所有的cpu

◾RS:range selector,和TargetList结合,表示发送哪些CPU

例如,IRM为0,INTID为1,Aff3.Aff2.Aff1为0.0.0,TargetList为0xf,RS为0,就表示,软中断发送给属性层次为0.0.0.[0-3]的cpu。

GICv3对软中断的中断号,进行了规定,只能是0-15。
2.png

一、cpu interface SGI命令

软件写SGI寄存器后,cpu interface会通过gic stream接口,发送SGI命令。
3.png

◾SGT:表示写的哪一个SGI寄存器

0b00: ICC_SGI0R_EL1

0b01: ICC_SGI1R_EL1

0b10: ICC_ASGI1R_EL1

0b11: Reserved

◾NS: 当前的secure状态,0表示secure,1表示non-secure

◾IRM: SGI寄存器的IRM bit

◾A3V: aff3是否有效,如果有效,需要发送A3数据。

◾RSV: range selector域是否有效

◾SGInum: 软中断中断号

◾A3,A2,A1: 对应Aff3.Aff2.Aff1

◾TargetList: 对应SGI寄存器中的TargetList

◾Range Selecto: 对应SGI寄存器中的RS域

比如,往ICC_SGI0R_EL1寄存器写0xffffef_ffffffff,那么cpu interface会发送如下波形:
4.png

二、A3V

GICv3中,使用属性层次对CPU进行编号,属性层次最多有4层,最高层为Aff3,这一层可以通过cpu interface系统寄存器来控制,是否使能。
5.png

ICC_CTLR_EL3和ICC_CTLR_EL1的A3V表示cpu interface是否支持Aff3,而GICD_TYPER.A3V表示gic ip是否支持Aff3。

三、关于range selector的理解。

gicv3的spec对range selector的解释如下:
6.png

gic3中,使用属性层次,来对CPU进行标识,这样可以精确的将中断发送指定的cpu。属性层次最高有4层,为aff3.aff2.aff1.aff0。每一个属性层次,用8bit来表示。如下图所示:
7.png

SGI中断,是可以同时发送给多个cpu的中断,通过TargetList来表示要发送给哪一些CPU。而TargetList只有16个bit,也就是只能发送给16个cpu,但是Aff0最多可以表示256个cpu,那怎么发送给其他的cpu的了?

这个时候range selector就派上用场了,RS域共4个bit,可以表示16个范围,16×16=256,刚好表示256个cpu。所以spec里面,说TargetList[n]表示的aff0的值为RS*16 + n。

比如要给65-68号CPU发送软中断,首先判断这些cpu属于的range,为5,那么给这些CPU发送软中断,RS为5,TargetList为0x1E。

四、GIC的SGI认可响应

当GIC收到cpu interface发的SGI命令,需要回SGI认可响应。
8.png

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23382
内容数
889
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息