AR# 52032

Zynq-7000 SoC, APU - 带有 DMB 指示的短回路可能导致试图执行 CP15 广播操作的另一个处理器上的服务拒绝

描述

带有 DMB 指示的短回路可能导致试图执行 CP15 广播操作的另一个处理器上的服务拒绝.

解决方案

该问题的出现,必须具备以下条件:

- 两个处理器都运行在 SMP 模式下 (ACTLR.SMP=1)
- 其中一个处理器连续执行一个包含至少一个 DMB 指令的短回路。此外,短回路还必须满足以下所有附加条件:

  •        除了 DMB 之外,在每个 DMB 之间执行的指令不超过 10 个
  •        在每个 DMB 之间不执行非条件加载或存储,也不执行通过条件代码检查的条件加载或存储。

- 另一个处理器执行一个广播的 CP15 维护操作。这需要处理器启用 CP15 操作的广播 (ACTLR.FW=1)

所有这些条件都满足时,短回路会生成一个连续的 DMB 指令流。这可能会阻止执行短回路的处理器执行接收到的广播 CP15 操作,从而导致拒绝服务。因此,最初执行广播 CP15 操作的处理器会被停止,直到回路执行中断。

请注意,发出 CP15 广播操作的过程无法完成该操作,因此无法进入任何调试模式,也无法采取任何中断措施。如果执行短回路的处理器也不能中断,例如,如果它已禁用中断,或者如果没有中断路由至该处理器,该错误可能会导致系统活锁。

 
影响:
很小。该错误可能会产生性能问题,在最糟糕的情况下,如果执行 DMB 的处理器处于一个无法中断的无限回路中,它可能还会导致系统活锁。但这种情况很少见,而且也有解决方法。
解决方法:
将无正式文档的诊断控制寄存器的位元[4]设置为 1,可解决该问题。 参考解决详情以获得更多信息。
受影响的配置:
使用 CPU 的系统。
受影响的器件修订版本:全部。无计划修复。参考 (Xilinx Answer 47916) - ZynqZynq-7000 SoC 器件修订版本差异答复记录。


解决方法详情

将无正式文档的诊断控制寄存器的位元[4]设置为 1,可解决该问题。 该寄存器编码为 CP15 c15 0 c0 1。这个比特位只能在安全状态下通过下列读取-修改-写入代码序列写入:

MRC p15, 0, rt, c15, c0, 1
ORR  rt, rt, #0x10
MCR p15, 0, rt, c15, c0, 1


设置该比特位会导致 DMB 指令被解码并像 DSB 一样执行。

使用这个软件解决方法不会影响典型代码库中处理器的整体性能。

此外,该问题还可通过执行以下任何一种操作来解决:

  •  在每个 DMB 之间插入一个非条件加载或存储指令
  •  在该回路中插入 NOP 等其它指令,可避免处理器发现连续的 DMB 指令。
  • 让处理器执行短回路需要定期中断。

链接问答记录

主要问答记录

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