AR# 52035

Zynq-7000 SoC, APU - 更新转换项,移动页面映射,可能错误导致意外的转换故障

描述

在针对 Cortex-A9 微架构的某些条件下,更新可高速缓存的转换列表条目的写入操作可能会导致新旧转换条目对转换表步行不可见,从而错误地导致转换故障。

解决方案

这里是对该问题出现时的要求:


  1. 处理器启用了它的数据高速缓存和 MMU。
  2. 可设置 TTB 寄存器,以便在可高速缓存的描述符内存区域工作。
  3. 处理器正在更新一个可高速缓存的现有转换表条目,而且该写入操作可在 L1 数据高速缓存中激发。
  4. 可尝试一个硬件转换表步行。硬件转换表步行可能是由于指令取出引起的,也可能是其它需要地址转换的指令执行引起的,包括任何加载或存储操作。
    这个硬件转换步行必须尝试访问在条件 2 中更新的条目,而且该访问必须在 L1 数据高速缓存中激发。


在实践中,当操作系统改变物理页面的映射时,该问题就会出现。操作系统可能有一个现有的物理页面(旧映射)映射,但希望将该映射移至一个新的页面(新映射)。要做到这一点,操作系统可能会:


  1. 在不取消旧转换条目的情况下,写入一个新条目。在这一点上,物理页面既可使用旧映射访问,也可使用新映射访问。
  2. 执行一个 DSB 指令,然后是一个 ISB 指令对,以确保新的转换条目全面可见。
  3. 删除旧条目。


但由于该问题,新旧两个映射在新条目写入后都不可见,造成转换故障。

影响:
很小。该问题会引起一个转换故障。针对此问题有一个解决方法。
解决方法::
执行一个干净无效的操作,请参阅解决方法详细信息。
受影响的配置:
使用 CPU 的系统。
受影响的器件修订版本:全部. 无计划修复. 参考 (Xilinx Answer 47916) - ZynqZynq-7000 SoC 器件修订版本差异答复记录。


解决方法详情:

推荐的解决方法是在更新条目之前,在包含该转换条目的高速缓存线上执行一个干净且无效的操作,以确保写入操作在数据高速缓存中丢失。 

该解决方法可防止出现问题需要的微架构条件。中断必须暂时禁用,以确保在维护操作和转换条目更新之间不发生中断。

这可避免中断服务例程将高速缓存行返回至高速缓存中的可能性。


另一种可能的解决方法是将转换表条目放在不可缓存的内存区域中,但是这种解决方法很可能会有明显的性能损失。

请注意,在写入新的转换表条目之后立即插入 DSB 指令,可显著降低激发错误的概率,但解决方法可能不完整。

修订历史:
2013 年 3 月新版。

链接问答记录

主要问答记录

Answer Number 问答标题 问题版本 已解决问题的版本
47916 Zynq-7000 SoC 器件:芯片修订差异 N/A N/A
AR# 52035
日期 05/25/2018
状态 Active
Type 设计咨询
器件