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 退回到对监视点进行软件模拟(速度很慢)。

在 POWER9 主机上,h_set_mode(DAWR) 和 h_set_dabr() 现在会向客户机返回错误。当前的 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。

这是一个危险的设置,后果自负(USE AT YOUR OWN RISK)。

某些用户可能不在乎恶意用户使其计算机崩溃(即单用户/桌面系统),并且确实需要 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

任何错误/失败/跳过都意味着某些地方出了问题。