描述
在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 |
没有回复内容