POWER9 上的 DAWR 问题

在较旧的 POWER9 处理器上,数据地址监视点寄存器 (DAWR) 如果指向缓存禁止 (CI) 内存,可能会导致校验停止。目前,Linux 在配置 DAWR 时无法区分 CI 内存,因此在受影响的系统上,DAWR 已被禁用。

受影响的处理器修订版本

此问题仅存在于 v2.3 之前的处理器上。 修订版本可在 /proc/cpuinfo 中找到

processor       : 0
cpu             : POWER9, altivec supported
clock           : 3800.000000MHz
revision        : 2.3 (pvr 004e 1203)

在存在问题的系统上,DAWR 将按照以下详细说明禁用。

技术细节:

DAWR 有 6 种不同的设置方式。 1) ptrace 2) h_set_mode(DAWR) 3) h_set_dabr() 4) kvmppc_set_one_reg() 5) xmon

对于 ptrace,我们现在通过 PPC_PTRACE_GETHWDBGINFO 调用在 POWER9 上公布零个断点。 这导致 GDB 回退到软件模拟监视点(速度较慢)。

h_set_mode(DAWR) 和 h_set_dabr() 现在将向 POWER9 主机上的访客返回错误。 当前的 Linux 访客会忽略此错误,因此它们不会以静默方式获取 DAWR。

kvmppc_set_one_reg() 会将值存储在 vcpu 中,但实际上不会在 POWER9 硬件上设置它。 这样做是为了避免破坏从 POWER8 到 POWER9 的迁移,但代价是在迁移时静默丢失 DAWR。

对于 xmon,“bd”命令将在 P9 上返回错误。

对用户的影响

对于 POWER9 裸机上的 GDB 监视点(即“watch”命令),GDB 将接受该命令。 遗憾的是,由于没有硬件支持监视点,GDB 将软件模拟监视点,使其运行速度非常慢。

对于在 POWER9 主机上启动的任何访客来说,情况也是如此。 监视点将失败,GDB 将回退到软件模拟。

如果访客在 POWER8 主机上启动,GDB 将接受监视点并配置硬件以使用 DAWR。 由于可以使用硬件仿真,这将以全速运行。 遗憾的是,如果此访客迁移到 POWER9 主机,监视点将在 POWER9 上丢失。 对监视点位置的加载和存储不会在 GDB 中被捕获。 监视点会被记住,因此如果访客迁移回 POWER8 主机,它将再次开始工作。

强制启用 DAWR

内核(自 ~v5.2 以来)可以选择通过以下方式强制启用 DAWR

echo Y > /sys/kernel/debug/powerpc/dawr_enable_dangerous

即使在 POWER9 上,这也会启用 DAWR。

这是一个危险的设置,使用风险自负。

某些用户可能不在意错误的用户导致他们的计算机崩溃(即单用户/桌面系统),并且确实想要 DAWR。 这允许他们强制启用 DAWR。

此标志也可用于禁用 DAWR 访问。 一旦清除此标志,所有 DAWR 访问应立即清除,并且您的机器再次免受崩溃影响。

用户空间可能会被切换此标志弄糊涂。 如果在获取断点数量(通过 PTRACE_GETHWDBGINFO)和设置断点之间强制启用/禁用 DAWR,用户空间将获得可用内容的不一致视图。 访客也是如此。

要在 KVM 访客中启用 DAWR,需要在主机和访客中都强制启用 DAWR。 因此,这在 POWERVM 上不起作用,因为它不允许 HCALL 工作。 如果虚拟机管理程序不支持写入 DAWR,则写入“dawr_enable_dangerous”文件“Y”将失败。

要仔细检查 DAWR 是否正常工作,请运行此内核自检

tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c

任何错误/失败/跳过都意味着出现问题。