2.4 中断转换表
中断转换表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,仅虚拟中断 |
2.5 collection表
Collection表CT提供了collection表项的表。仅对于物理LPI,每个CTE描述了下列两者之间的映射:
(1)ITT产生ICID;
(2)以GITS_TYPER.PTA定义的格式的目标Redistributor的地址;
对于每个ITS存在单独的CT,它可以保持在寄存器中或内存中,或同时存在两者中。查看GITS_BASER<n>.Type和GITS_TYPER.HCC获取更多信息。
TableID提供表的索引值。它源自于ICID。
Table 5-4给出位数可能被赋予给每个CT的例子。
位数 |
Assignment |
备注 |
1 |
Valid |
BOOL型 |
RDbase identifier大小 |
RDbase |
GIC支持两种格式RDbase |
2.6 vPE表
vPE表由vPE表项组成,vPE表项提供了ITS产生vPEID映射到:
(1)目标Redistributor,以GITS_TYPER.PTA定义的格式;
(2)与目标vPE相关的虚拟LPI Pending表的基地址;
GITS_BASER<n>定义的内存区域保持vPE表并指定了表中的每个项大小。
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范围大小 |
2.7 ITS的控制和配置
ITS通过内存映射接口被控制和配置:
- 可以从GITS_IIDR和GITS_PIDR2中读取版本;
- GITS_TYPER指定ITS支持的特性;
- GITS_CTLR控制ITS的操作;
- GITS_TRANSLATER接受EventID信息。由实现定义DeviceID是如何提供的。
- GITS_BASER<n>寄存器提供架构相应的ITS内存结构体的类型,大小和访问属性;
- GITS_CBASER,GITS_CREADR,和GITS_CWRITER保存ITS命令队列接口的地址信息;
每个ITS有一个使能位GITS_CTLR.Enabled。
2.8 ITS命令接口
图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命令队列:
- 基地址通常对齐于64KB;
- Size为4KB的整数倍;
- 队列的地址对齐于4KB,为(base address + (size * 4KB));
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命令在执行时产生中断,这会在命令的一个特定的时序完成时产生一个中断。
2.9 转换的顺序及输出到ITS命令
每个命令队列entry自动被执行,因此一个转换请求或在一个命令之前看到ITS的状态或在这个命令之后看到ITS的状态。
在SYNC或VSYNC命令完成后一个初始化的转换请求使用ITS状态被转换,在命令被执行后ITS状态与该状态保持一致。
在缺少SYNC或VSYNC命令时,ITS命令和转换请的顺序不是由架构定义的。
2.10 INTID映射规则的限制
如果软件有下列行为,GIC的行为不可预测:
- 将多个EventID-DeviceID连结映射到相同的物理LPI INTID;
- 将doorbell中断赋予给相同物理LPI INTID给不同物理PE。这仅应用于GICv4。
- 映射EventID-DeviceID,并将一个单独的doorbell中断映射到相同物理LPI INTID,如果他们不是目标到相同物理PE。这应用于GICv4所有的版本。
- 将多个EventID-DeviceID映射到相同虚拟LPI INTID-vPEID。这应用于GICv4。
- 映射一个EventID-DeviceID,并一个默认doorbell中断到相同的物理LPI INTID。这仅应用于GICv4.1。
- 将一个默认doorbell和一个独立的doorbell映射到相同物理LPI INTID。这仅应用于GICv4.1。
NOTE:概念上限制为软件不能映射多个EventID-DeviceID到给定的虚拟机上的vLPI。但是,ITS没有意识到哪个vPE属于相同的虚拟机。