SMMU软件指南SMMU编程之命令队列
安全之安全(security²)博客目录导读
SMMU通过内存中的循环命令队列进行控制。例如,当软件更改STE或翻译时,需要在SMMU中失效相关缓存。这可以通过向命令队列发出相应的失效命令来实现。有关命令类型的详细信息,请参见“命令”部分。
在SMMUv3.3之前,每个安全状态只有一个命令队列。支持SMMUv3.3的SMMU可以选择支持多个命令队列,以减少多个处理器元素(PE)同时向SMMU提交命令时的争用。
SMMU_CMDQ_BASE存储了命令队列的基址和大小。软件在添加新命令之前需要检查命令队列是否有空间。当软件向队列添加一个或多个命令时,会更新SMMU_CMDQ_PROD指针以通知SMMU有新命令可用。随着SMMU处理命令,它会更新SMMU_CMDQ_CONS指针。软件通过读取SMMU_CMDQ_CONS指针确定命令已被消费并释放了空间。
如果SMMU_CMDQ_PROD.WR == SMMU_CMDQ_CONS.RD 且 SMMU_CMDQ_PROD.WR_WRAP != SMMU_CMDQ_CONS.RD_WRAP,则队列已满。
仅更新SMMU_CMDQ_CONS表示命令已被消费,但这可能不意味着命令的效果已可见。CMD_SYNC命令可用于同步。只有当之前命令的效果可见时,它才会被消费。例如:
CMD_TLBI_EL3_ALL
CMD_SYNC
当CMD_SYNC被消费时,可以确保CMD_TLBI_EL3_ALL的效果可见。
一、命令
命令队列中的所有条目均为16字节长,所有命令队列条目均为小端格式。每个命令以一个8位的命令操作码开始。以下列表展示了命令的类别:
- 预取命令(Prefetch commands):预取翻译或配置。
- TLB失效命令(TLB invalidation commands):在给定的异常级别中使匹配标签(VMID、ASID、VA或全部)的所有TLB条目失效。
- 配置缓存失效命令(Configuration cache invalidation commands):使指定范围内的所有配置缓存条目失效(对于STE,范围为StreamID;对于CD,范围为StreamID和SubstreamID)。
- 同步命令(Synchronization command):为与同步命令在同一命令队列中发布的前置命令提供同步机制。
- PRI响应命令(PRI response command):当SSV == 1时,通知与StreamID和SubstreamID对应的设备,指示由PRGIndex标识的页请求组已完成,并提供相应的响应。
- ATC失效命令(ATC invalidation command):使匹配标签(StreamID、SubstreamID、地址范围)的所有ATC条目失效。
- 挂起恢复/终止命令(Stall resume/termination command):恢复或终止由给定StreamID和STAG参数标识的挂起事务的处理。
- DPT失效命令(DPT invalidation commands):这些命令从DPT TLB中移除缓存的DPT信息。
有关命令的完整说明,请参阅《Arm System Memory Management Unit version 3》。