中断转换表ITT指定每个设备可以创建一定数量的event。ITT中的每个表项为ITE。
在GICv3中,ITE仅被物理中断定义。
在GICv4中,ITE被物理中断和虚拟中断定义,并提供如下区分:
(1)物理LPI的entry和使用ICT作为路由信息;
(2)虚拟LPI的entry和使用vPE表;
ITT必须赋予起始ITT地址的连续物理地址空间。大小为2^(DTE.ITT range + 1) * GITS_TYPER.ITT_entry_size。
如果内存在开始分配时不全为0时,行为不可预测。
如果多个ITT在内存中重叠,行为不可预测。
ITS访问ITT使用相同的Shareability和Cacheability属性来指定给Device Table。
对于物理中断,每个ITE描述输入EventID和下列项的映射:
(1)被发送到目的PE的输出物理INTID(pINTID);
(2)ICID区分Collection表中的项,这决定了LPI的目标PE。为获取更多信息,可以查看Collection table。
对于虚拟中断,每个ITE描述了EventID和下列项的映射:
(1)被发送到目的PE的输出虚拟INTID(vINTID);
(2)虚拟PE标号(vPEID)区分vPE表中的表项来决定当前host Redistributor。为获取更多信息,查看vPE表;
(3)当目标vPE当前没有被调度到物理PE上,如果虚拟中断被转换,物理LPI被发送到物理PE;
EventID提供了表的索引值。
Table 5-3 显示了可以被保存在ITE的位数。
位数 |
Assignment |
备注 |
1 |
Valid |
BOOL型 |
1 |
Interrupt_Type |
BOOL型,表明中断为物理还是虚拟中断 |
LPI数字空间的大小 |
Interrupt_Number |
依赖于中断类型的pINTID或vINTID |
Interrupt_Number_HypervisorID |
在GICv4中pINTID被当doorbell使用。在GICv3中和不要求doorbell的GICv4中,可编程值为1023 |
|
16 |
ICID |
中断collection ID,仅物理中断 |
16 |
vPEID |
vPE,仅虚拟中断 |
Collection表CT提供了collection表项的表。仅对于物理LPI,每个CTE描述了下列两者之间的映射:
(1)ITT产生ICID;
(2)以GITS_TYPER.PTA定义的格式的目标Redistributor的地址;
对于每个ITS存在单独的CT,它可以保持在寄存器中或内存中,或同时存在两者中。查看GITS_BASER
TableID提供表的索引值。它源自于ICID。
Table 5-4给出位数可能被赋予给每个CT的例子。
位数 |
Assignment |
备注 |
1 |
Valid |
BOOL型 |
RDbase identifier大小 |
RDbase |
GIC支持两种格式RDbase |
vPE表由vPE表项组成,vPE表项提供了ITS产生vPEID映射到:
(1)目标Redistributor,以GITS_TYPER.PTA定义的格式;
(2)与目标vPE相关的虚拟LPI Pending表的基地址;
GITS_BASER
vPE表描述与ITS相关的所有vPE。Table5-5 描述了在vPE表实现位数。
16bit vPEID提供了表的索引值。
位数 |
Assignment |
备注 |
1 |
Valid |
BOOL型 |
RDbase identifier大小 |
RDbase |
GIC支持RDbase的两种格式 |
地址的大小 |
VPT_addr |
当VM不驻留在Redistributor中时,VPT_addr找到LPI pending表的位置。当vPE在与RDbases相关的GICR_*寄存器中被调度时它被用来在GICR_VPENDBASER作为地址 |
5 |
Size |
支持的vINTID范围大小 |
ITS通过内存映射接口被控制和配置:
每个ITS有一个使能位GITS_CTLR.Enabled。
图5-5 描述了ITS如何提供ITS命令队列使用的基地址和大小。
GITS_CBASER,GITS_CREADR,和GITS_CWRITER定义ITS命令队列。
(1)GITS_CBASER使用下列域:
- Valid。该域表明了ITS命令队列分配的内存。
- Cacheability。该域表明了ITS命令队列的访问cacheability属性。
- Shareability。该域表明了ITS命令队列的访问shareability属性。
- Physical address。该域表明包含ITS命令队列的内存的物理基地址。
- Size。该域表明了ITS命令队列的4KB物理内存页的数目。
(2)GITS_CREADR指定了ITS读取下一个命令的基地址偏移;
(3)GITS_CWRITER指定了软件写下一个命令free entry的基地址偏移。
一个ITS命令队列项的大小为32byte。这意味着在每个4KB页支持128个项。
ITS命令队列使用小端内存模型。
在ITS命令队列:
NOTE: 所有地址为非安全物理地址。
当第一个命令完成时,ITS开始处理下一个命令。读指针GITS_CREADR随着ITS处理命令的前进。如果GITS_CREADR达到GITS_CBASER指定的内存顶端,指针wrap回到GITS_CBASER指定的基地址。GITS_CWRITER由软件控制。
当GITS_CWRITER和GITS_CREADR指定相同的基地址偏移值时,ITS命令队列为空。
当GITS_CWRITER指向GITS_CREADR后的一个32byte时,ITS命令队列为满。
当GITS_CREADR.Stalled=1时,没有后续命令被处理。
INT ITS命令在执行时产生中断,这会在命令的一个特定的时序完成时产生一个中断。
每个命令队列entry自动被执行,因此一个转换请求或在一个命令之前看到ITS的状态或在这个命令之后看到ITS的状态。
在SYNC或VSYNC命令完成后一个初始化的转换请求使用ITS状态被转换,在命令被执行后ITS状态与该状态保持一致。
在缺少SYNC或VSYNC命令时,ITS命令和转换请的顺序不是由架构定义的。
如果软件有下列行为,GIC的行为不可预测:
NOTE:概念上限制为软件不能映射多个EventID-DeviceID到给定的虚拟机上的vLPI。但是,ITS没有意识到哪个vPE属于相同的虚拟机。