weiqi7777

GICv3软中断

0
阅读(137) 评论(0)

软中断(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个范围,16x16=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认可响应。