Table 5-6提供了所有ITS命令的集合。
命令 |
命令参数 |
描述 |
CLEAR |
DeviceID, EventID |
将EventID和DeviceID定义的event转化为ICID和pINTID,并发送到合适的Redistributor移除pending状态 |
DISCARD |
DeviceID, EventID |
将EventID和DeviceID定义的event转化为ICID和pINTID,并发送到合适的Redistributor移除pending状态。它也保证与特定的EventID相关的Redistributor的任何缓存与内存中配置保持一致。DISCARD移除了ITT中DeviceID和EventID的映射,保证特定EventID的请求被丢弃。 |
INT |
DeviceID, EventID |
将EventID和DeviceID定义的event转化为ICID和pINTID,并发送到合适的Redistributor设置pending状态 |
INV |
DeviceID, EventID |
指定ITS必须保证与特定EventID相关的Redistributor的任何缓存与内存中LPI配置表保持一致 |
INVALL |
ICID |
指定ITS必须保证由ICID定义的中断collection的任何缓存与所有Redistributor内存中LPI配置表保持一致 |
INVDB 仅GICv4.1 |
vPEID |
仅GICv4.1。指定ITS必须保证vPEID的默认doorbell相关的任何缓存与所有Redistributor内存中LPI配置表保持一致 |
MAPC |
ICID, RDbase |
将ICID定义的collection表映射到RDbase定义的Redistributor |
MAPD |
DeviceID,ITT_addr,Size |
将DeviceID相关的设备表项映射到由ITT_addr和Size定义的ITT |
MAPI |
DeviceID,EventID, ICID |
将EventID和DeviceID定义的event映射到ICID和pINTID=EventID的ITT项 |
MAPTI |
DeviceID,EventID, pINTID, ICID |
将EventID和DeviceID定义的event映射到它相关的ITE,ITE由DeviceID相关的ITT中ICID和pINTID定义 |
MOVALL |
RDbase1, RDbase2 |
让RDbase1指定的Redistributor上所有的中断移到RDbase2指定的Redistributor上 |
MOVI |
DeviceID,EventID, ICID |
更新DeviceID和EventID定义的event的ITT表项的ICID域。它也将DeviceID和EventID定义的event转化为ICID和pINTID,并在合适的Redistributor移除pending状态,如果它被设置,将中断移到新的ICID定义的Redistributor,并使用新的ICID更新event相关的ITE |
SYNC |
RDbase |
保证RDbase指定的Redistributor的物理中断相关的所有未完成ITS操作在执行任何更多ITS命令之前全局可见。跟随SYNC的执行,所有之前命令必须应用于后续写入GITS_TRANSLATE。 |
VINVALL |
vPEID |
保证与vPEID相关的任何缓存的Redistributor信息与内存中相关的LPI配置表保持一致 |
VMAPI |
DeviceID, EventID,Dbell_pINTID, vPEID |
将由DeviceID和EventID定义的event映射到ITT表项,该表项vPEID, vINTID=EventID, Dbell_pINTID,一个doorbell |
VMAPP GICv4.0 |
vPEID,RDbase,VPT_addr, VPT_size |
将vPEID定义的vPE表项映射到目标RDbase,包括相关的虚拟LPI pending表(VPT_addr, VPT_size) |
VMAPP GICv4.1 |
vPEID,RDbase, VCONF_addr,VPT_addr, VPT_size, PTZ, Alloc, Default_Doorbell_pINTID |
映射vPEID定义的vPE,包括相关的虚拟LPI配置和pending表。可选的指定默认doorbell。 |
VMAPTI |
DeviceID, EventID, vINTID, Dbell_pINTID,vPEID |
使用vPEID,vINTID,Dbell_pINTID和doorbell将DeviceID和EventID定义的event映射到ITT表项 |
VMOVI |
DeviceID, EventID, vPEID |
为DeviceID和EventID定义的event更新ITT表项的vPEID域。将DeviceID和EventID定义的event转化为vPEID和pINTID,让合适的Redistributor移除pending状态,如果有设置,将中断发送到新vPEID定义的Redistributor,使用新的vPEID更新event相关的ITE |
VMOVP GICv4.0 |
vPEID, RDbase, SequenceNumber, ITSList |
更新vPEID定义的vPE表项到由RDbase定义的目标Redistributor。软件必须使用SequenceNumber和ITSList在超过一个ITS的情况下同步VMOVP命令的执行 |
VMOVP GICv4.1 |
vPEID, RDbase, SequenceNumber, ITSList, Default_Doorbell_pINTID |
将vPEID定义的vPE映射更新到RDbase定义的目标Redistributor |
VSGI 仅GICv4.1 |
vPEID, Priority, G, C, E, vPEID |
仅GICv4.1。对于vPEID定义的vPE,设置配置或更新由vINTID定义的中断状态 |
VSYNC |
vPEID |
保证在任何更多ITS命令被执行之前所有未完成的ITS操作被全局可见。VSYNC接下来的执行,所有之前的命令必须应用到后续写GITS_TRANSLATER。 |
实现支持的EventID和DeviceID的位数由GITS_TYPER.Unimplemented位发现。
NOTE:
(1)LPI的INTID的范围为8192-最大数目。最大数目是由实现定义的。
(2)以下参数名从GIC spec最初使用的信息进行修改:
- Device被修改为DeviceID;
- ID被修改为EventID;
- pID被修改为pINTID;
- vID被修改为vINTID;
- pCID被修改为ICID;
- 目标地址被修改为RDbase;
- vCPU被修改为vPE
(3)collection目标地址,RDbase的格式由GITS_TYPER.PTA指定。
一些ITS命令包括下列参数类型是由实现定义的大小。
DeviceID: 相关设备表支持的最大数目的DeviceID由GITS_TYPER.Devbits指定的位数决定。
EventID: 它由最大MAPD大小域决定,由GITS_TYPER.ID_bits限制。
ICID:支持的collection的数目由实现定义。
(1)在外部内存不支持collection表的实现中,GITS_TYPER.HCC指定collection的数目;
(2)在外部内存支持collection表的实现中,支持的collection的数目由分配collection表的大小决定:
- 支持的collection数目可通过如下计算:
GITS_TYPER.HCC + collection表大小/Entry大小
当GITS_TYPER.CIL=1时,collection的最大数目由GITS_TYPER.CIDbits。
pINTID: pINTID由GICR_PROPBASER.IDbits指定,它由GICD_TYPER.IDbits。这也应用于Dbell_pINTID。
RDbase: RDbase与Redistributor相关并被指定由两种格式中的一个:
(1)当GITS_TYPER.PTA=1时RDbase的基本物理地址;
(2)当GITS_TYPER.PTA=0时由GICR_TYPER.Processor_Number指定的PE数目。
vINTID: 它由GICR_VPROPBASER.IDbits限制,这也由GICD_TYPER.IDbits决定。
vPEID:由vPE表的大小决定。
如果ITS在提供给命令的数据中检测到错误时,由此产生的行为是无法预测的选择,如下:
(1)忽略命令
- 不会有其他行为修改中断的处理;
- GITS_CREADR增加指向下一个命令,如果有必要会wrap;
- 如果GITS_TYPER.SEIS被设置为1时,产生系统错误;
NOTE: 由实现决定系统错误是如何被记录和如何报告给PE。
(2)Stall ITS命令队列
- GITS_CREADR不会增加,并继续指向触发错误的条目;
- GITS_CREADR.Stalled被设置为1;
- 通过对GITS_CWRITER.Retry写1软件可以重新处理命令;
- 如果GITS_TYPER.SEIS被设置为1时,产生系统错误。
NOTE: 由实现决定系统错误是如何被记录和如何报告给PE。
(3)将数据当作有效数据
- 产生错误的数据被当作合法的值,并且该命令被处理;
- GITS_CREADR增加并指向下一个命令,如果必要会wrap;
- 如果GITS_TYPER.SEIS被设置为1,产生系统错误。
NOTE: 由实现决定系统错误是如何被记录和如何报告给PE。
命令将EventID和DeviceID定义的event转化为ICID和pINTID,并在合适的Redistributor上移除pending状态。
图5-6显示了CLEAR命令的格式。
在上图中:
命令和它的参数如下:
CLEAR DeviceID, EventID
如果下列任一发生,命令错误产生:
在这种情况下,ITS必须采用前面描述的行为。
下列伪代码描述了CLEAR命令的操作:
ITS.CLEAR(ITSCommand cmd)
if DeviceOutOfRange(cmd.DeviceID) then
UNPREDICTABLE;
dte = ReadDeviceTable(UInt(cmd.DeviceID))
if !dte.Valid then
if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_UNMAPPED_DEVICE";
UNPREDICTABLE;
if IdOutOfRange(cmd.EventID,dte.ITT_size) then
if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_ID_OOR";
UNPREDICTABLE;
InterruptTableEntry ite = ReadTranslationTable(dte.ITT_base, UInt(cmd.EventID));
if !ite.Valid then
if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_UNMAPPED_INTERRUPT";
UNPREDICTABLE;
success = ClearPendingState(ite);
if !success then
if GITS_TYPER.SEIS == '1' then IMPLEMENTATION_DEFINED "SError CLEAR_ITE_INVALID";
UNPREDICTABLE;
IncrementReadPointer();
return;