到目前为止,在 Linux 下的 AMD 处理器上加载更新的 CPU 微码只是为了确保每个物理 CPU 内核都加载了新的微码,而不是 SMT 处理器的同级线程。虽然从逻辑上讲这是有道理的,但事实证明,一些 AMD 微码更新确实执行了每个线程的修改,这意味着需要在每个线程上执行微码更新。Linux 修复程序正在前往内核以调整该行为。
今天作为 TIP 的 x86/微码分支的一部分排队的是一个补丁,因此现在在每个逻辑线程上尝试加载 AMD CPU 微码,而不是在物理 CPU 核心级别检查微码更新是否执行,然后忽略任何同级线程每个核心。
在内核开发人员调试问题时,AMD 微码更新可能会执行每个线程的修改。自 7 月初以来,有关轻量级分析“LWP”指令的错误报告仅在 Linux 下的 AMD Bulldozer/Piledriver 系统的一半 CPU 内核/线程上公开。虽然很少使用 LWP 指令,但在使用“-march=native”编译代码然后运行代码并根据执行是否发生在暴露 CPU 功能的线程之一上发现不同的行为时,它可能会产生问题。
这种情况最初困扰着内核开发人员以及线程上的 AMD Linux 开发人员,但随后错误报告作者发现这种 LWP 功能暴露差异是由 CPU 微码引起的。当 AMD 致力于他们的 Spectre V2 缓解并在微码中引入 IBPB(间接分支预测屏障)时,他们从 K8 和 K10 处理器系列中删除了 LWP,因为该功能很少使用。
事实证明,当 AMD 系统上的 BIOS 在启动时执行微码更新时,它是在每个线程的基础上完成的(并且可能也适用于 Windows)。但在 Linux 上,AMD CPU 微码更新仅针对每个核心的物理基础进行检查,并跳过了兄弟线程的更新。现在至少有了这个 LWP 错误报告,有证据表明正在执行每个线程的修改。也有可能其他 AMD CPU 微码更新也一直在执行每个线程的修改,但直到由于删除旧 AMD CPU 上宣传的 LWP 而产生的这种非常明显的差异才被注意到。
无论如何,这个补丁现在正在进入内核,以便在所有 AMD CPU 线程上正确执行微码更新。
原创文章,作者:校长,如若转载,请注明出处:https://www.yundongfang.com/Yun180831.html