Zynq-7000 SoC,APU  – 遵循ASID交换机,可能发生错误的MMU转换-Xilinx-AMD社区-FPGA CPLD-ChipDebug

Zynq-7000 SoC,APU – 遵循ASID交换机,可能发生错误的MMU转换

描述

在ASID交换机之后,microTLB条目可能会被破坏,可能会破坏后续的MMU转换。在错误的推测下执行推测显式内存访问时会出现问题。

这通常发生在错误预测的分支下发生内存访问时,或者在条件有条件且条件失败的情况下。

解决方法是在ASID切换代码序列中添加DSB指令。

影响:

次要。 MMU翻译可能会在没有解决方法的情况下被破坏。

解决方法:

在ASID切换代码序列中添加DSB。有关详细信息,请参阅解决方法详细信息。

受影响的配置:

使用ARM处理器MMU的系统。

受影响的器件版本: 所有。没有计划修复。参考 (Xilinx答复47916) – Zynq-7000 SoC芯片版本差异答复记录。

这种推测性内存访问可能会在TLB中丢失并导致页表行走。当Page Table Walk在ASID切换代码序列之前启动时会发生此问题,但之后会完成。 microTLB将获得一个新的TLD条目分配的条目,对应于旧的ASID。问题是microTLB没有注册ASID值,因此ASID交换机后面的新ASID应该发生的MMU转换可以在这个陈旧的microTLB条目中命中并被破坏。
重要的是要注意,没有Trustzone安全风险,因为访问的安全状态在microTLB中注册,因此不会被破坏。

解决方法细节

在ASID切换代码序列中添加DSB。 ARM体系结构仅在ASID切换之前和之后强制要求ISB。在ASID切换之前添加DSB可确保在ASID更改之前完成Page Table Walk,并且不能在microTLB中分配过时条目。

请参阅devconfig中的CONFIG_ARM_ERRATA_754322。

用于同步ASID和转换表基址寄存器(TTBR)中的更改的ARM参考手册中的示例应更改如下:

原始序列:

新序列:

序列#1

DSB

将ASID更改为0

将ASID更改为0

为B

为B

更改翻译表基础注册

更改翻译表基础注册

为B

为B

DSB

将ASID更改为新值

将ASID更改为新值

序列#2

将转换表基础注册更改为仅全局映射

将转换表基础注册更改为仅全局映射

为B

为B

DSB

将ASID更改为新值

将ASID更改为新值

为B

为B

更改转换表基础注册到新值

更改转换表基础注册到新值

序列#3

设置TTBCR.PD0 = 1

设置TTBCR.PD0 = 1

为B

为B

DSB

将ASID更改为新值

将ASID更改为新值

更改转换表基础注册到新值

更改转换表基础注册到新值

为B

为B

设置TTBCR.PD0 = 0

设置TTBCR.PD0 = 0

请登录后发表评论

    没有回复内容