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,则写入 ‘Y’ 到 dawr_enable_dangerous 文件将失败。
要仔细检查 DAWR 是否正常工作,请运行此内核自测
tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c
任何错误/失败/跳过都意味着有问题。