针对龙芯 LA664 CPU 核心(用于 3C6000/S 和 3A6000 系列)的技术调查揭示了一个涉及原子指令失效的硬件错误。该问题表现为“更新丢失”,即原子操作(如加法)未能正确记录对共享变量的更改。这一现象最初是在为 Debian 打包 `normaliz` 数学软件期间被观察到的,当时一个并行处理循环陷入了死循环,因为尽管所有数据点都已处理完毕,计数器变量仍未能达到预期值。

代表龙芯 CPU 硬件错误和更新丢失问题的图形。
龙芯 LA664 核心中的硬件错误导致原子指令偶尔失效,从而导致更新丢失。jia.je

这张图片展示了在龙芯 LA664 CPU 核心中发现的关于原子更新丢失的特定硬件错误。

根本原因被确定为 CPU 原子指令与向量化内存操作之间的特定交互。具体而言,当 `amadd`(原子加法)指令在不同的物理核心上执行且没有数据屏障时,如果至少有一个线程在原子操作之间插入特定类型的内存读取,就会导致更新丢失。虽然 LASX 256 位向量化内存读取(`xvld`)被确定为主要的触发因素,但进一步测试显示,如果原子变量和读取操作的内存地址具有特定的位置关系,即使是标准的标量读取也可能触发此问题。这种复杂性解释了为什么该漏洞在初始测试中一直处于隐藏状态。

龙芯已通过固件修复解决了这一错误,该修复修改了一个内部配置寄存器(MCSR24)。此修复确保了原子指令能够正确运行,且不会造成显著的性能下降,单核性能保持不变,多核性能仅略有下降。该修复预计将在 2026 年 10 月 1 日之前的固件更新中发布。此次调查强调了现代硬件优化(如 `glibc` 中的向量化内存复制)如何与底层原子原语产生难以预测的交互,而这些交互在缺乏严格的多架构测试的情况下很难被发现。