Zynq-7000 SoC、APU - ASID 转换完成后,可能发生错误的 MMU 转换

描述
MicroTLB 输入会在 ASID 转换后被破坏,随之可能会破坏后续的 MMU 转换。当投机的显式存储器访问在错误的推测下执行时,会发生这种问题。

当存储器访问发生在预测错误的分支或在存在一定条件但是条件没有满足的情况下,一般会出现这种情况。

解决方法为在 ASID 交换代码序列中新增 DSB 向导。

(1楼)影响:很小。如果不采用这种解决方法,MMU

judyzhong 在 星期五, 06/22/2018 - 14:10 发表。
影响:

很小。如果不采用这种解决方法,MMU 转换会受到破坏。

解决方法::

在 ASID 转换代码序列中添加一个 DSB。查看解决方法详情,了解更多信息。

受影响的配置:

使用 ARM 处理器 MMU 的系统。

受影响的器件修订版本: 全部。无计划修复。参考 (Xilinx Answer 47916) - Zynq-7000 SoC 芯片版本差异答复记录。

推测的存储器访问可能错过在 TLB 中的执行并引起页表查询 (Page Table Walk)。当页表查询在 ASID 转换代码序列之前开始,就会出现这个问题,但之后会完成访问。MicroTLB 将得到一个新的输入,该输入对应旧的 ASID 与新的 TLB 输入一起分配。问题在于,本应利用 ASID 转换后的新 ASID 值进行 MMU 转换,但 MicroTLB 没有寄存 ASID 值,因此 MMU 转换会在旧的 MicroTLB 输入中执行并受到破坏。
值得注意的是,这里不存在信任区安全风险,原因是这种访问的安全状态被寄存在 MicroTLB 中,因此不会被破坏。

解决方法详情

在 ASID 交换代码序列中新增 DSB。ARM 架构只在 ASID 转换之前和之后授权 ISB。在 ASID 转换之前添加 DSB 能确保页表查询在 ASID 变更之前完成,而且在 MicroTLB 中不会分配旧的输入。

参考 devconfig 中的 CONFIG_ARM_ERRATA_754322

面向同步 ASID 和转换表基址寄存器 (TTBR) 变更的 ARM 参考手册中的实例应做如下改变:

原序列

新序列

 

Sequence #1

~

DSB

将 ASID 改为 0

将 ASID 改为 0

ISB

ISB

更改转换表基地址寄存器

更改转换表基地址寄存器

ISB

ISB

~

DSB

为 ASID 赋新值

为 ASID 赋新值

 

Sequence #2

将转换表基地址寄存器改为全局映射

将转换表基地址寄存器改为全局映射

ISB

ISB

~

DSB

为 ASID 赋新值

为 ASID 赋新值

ISB

ISB

为转换表基地址寄存器赋新值

为转换表基地址寄存器赋新值

 

Sequence #3

设置 TTBCR.PD0 = 1

设置 TTBCR.PD0 = 1

ISB

ISB

~

DSB

为 ASID 赋新值

为 ASID 赋新值

为转换表基地址寄存器赋新值

为转换表基地址寄存器赋新值

ISB

ISB

设置 TTBCR.PD0 = 0

设置 TTBCR.PD0 = 0