软中断(software generated interrupts),用来多个核之间的通信(inter-processor communication)。软件通过写SGI寄存器来产生。
◾软件写ICC_SGI1R_EL1产生对应当前secure状态的group1软中断
◾软件写ICC_ASGI1R_EL1产生secure状态的group1软中断
◾软件写ICC_SGI0R_EL1产生secure状态的group0软中断
这三个寄存器的位域是一样的,如下图:
◾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。
一、cpu interface SGI命令
软件写SGI寄存器后,cpu interface会通过gic stream接口,发送SGI命令。
◾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会发送如下波形:
二、A3V
GICv3中,使用属性层次对CPU进行编号,属性层次最多有4层,最高层为Aff3,这一层可以通过cpu interface系统寄存器来控制,是否使能。
ICC_CTLR_EL3和ICC_CTLR_EL1的A3V表示cpu interface是否支持Aff3,而GICD_TYPER.A3V表示gic ip是否支持Aff3。
三、关于range selector的理解。
gicv3的spec对range selector的解释如下:
gic3中,使用属性层次,来对CPU进行标识,这样可以精确的将中断发送指定的cpu。属性层次最高有4层,为aff3.aff2.aff1.aff0。每一个属性层次,用8bit来表示。如下图所示:
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认可响应。
系列其他篇
原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。