pipinovi4/ga107m-bar1-bad0ac

GitHub: pipinovi4/ga107m-bar1-bad0ac

一套用于诊断 NVIDIA GA107M GPU BAR1 孔径返回未文档化「0xBAD0ACxx」无效响应的只读硬件故障调查工具。

Stars: 0 | Forks: 0

# NVIDIA BAR1 `0xBAD0ACxx` 响应调查 本仓库记录了在读取发生故障的 NVIDIA GA107M GPU 的 BAR1 PCI 孔径时观察到的、可重现且显然未被官方记录的响应。 在测试系统上,每次只读对齐的 32 位访问返回的值都符合: ``` 0xBAD0ACxx ``` 高 24 位保持固定,而低字节的表现类似于每次读取的全局计数器。PCIe Function Level Reset (FLR) 会重置该计数器,而解绑 NVIDIA 驱动则不会。 ## 测试系统 | 项目 | 值 | |---|---| | 笔记本电脑 | Acer Nitro AN515-45 | | GPU | NVIDIA GA107M,GeForce RTX 3050 Laptop GPU | | PCI ID | `10de:25a2` | | 子系统 | `1025:151e` | | VBIOS | `94.07.3A.00.AA` | | VBIOS 转储 | 65,024 字节,有效的 8 位校验和 | | PCIe 链接 | Gen3 x8 | | BAR1 孔径 | 4 GiB | | NVIDIA RM 故障 | `RmInitAdapter failed! (0x31:0x40:2780)` | PCIe 链路训练正常,BAR 分配有效,且未观察到 AER/通道错误。NVIDIA RM 初始化仍然失败,并且 `nvidia-smi` 报告 `No devices were found`。 ## 主要观察结果 ### 1. 与偏移量无关的响应 在不同 BAR1 偏移量处进行的只读对齐 32 位访问返回了一个全局序列: ``` 0xbad0ac8f 0xbad0ac90 0xbad0ac91 ... ``` 改变偏移量并没有改变响应模式。 ### 2. 重置行为 - 驱动程序解绑**没有**重置低字节序列。 - PCIe FLR 重置了它。 - 重置后立即观察到的起始值为: ``` 0xbad0ac00 0xbad0ac00 0xbad0ac01 0xbad0ac02 ... ``` 这表明该响应是在 NVIDIA PCI 功能内部或其 FLR 重置域中的另一个模块内生成的,而不是由用户空间或上游 PCIe 根端口生成的。 ### 3. 全孔径稀疏扫描 从完整的 4 GiB BAR1 孔径的每个 1 MiB 区域采样了一个对齐的 DWORD: | 结果 | 计数 | |---|---:| | 样本数 | 4,096 | | `0xBAD0ACxx` | 4,096 | | 其他值 | 0 | ### 4. 分层 1% 扫描 该孔径包含 1,073,741,824 个对齐的 DWORD 位置。它被划分为由 100 个 DWORD 组成的连续组,并使用种子 `12345` 从每组中选择了一个伪随机 DWORD。 | 结果 | 计数 | |---|---:| | 样本数 | 10,737,419 | | `0xBAD0ACxx` | 10,737,419 | | 其他值 | 0 | | 计数器不连续 | 0 | 这意味着完整孔径的每个 400 字节区域都由一个随机选择的读取来表示。 ### 5. 部分穷举扫描 只读顺序扫描达到了: | 结果 | 值 | |---|---:| | 已读取的 DWORD | 780,000,000 | | 覆盖的孔径 | 72.64% | | `0xBAD0ACxx` | 780,000,000 | | 其他值 | 0 | 运行通过 `Ctrl+C` 被手动中断;因此它**没有**被描述为已完成的穷举扫描。 ## 解释 观察结果强烈表明,`0xBAD0ACxx` 是在尚未建立正常的 BAR1 到帧缓冲区的映射时返回的一种合成的无效/未映射访问或 poison 响应。 它们**并不能**确定物理故障。可能的原因仍然包括: - GDDR6 设备; - 内存 PHY/控制器; - 内存供电或时序; - 板级连接性; - VBIOS 内存初始化; - 另一个早期的 GPU 启动失败。 BAR1 是一个孔径,而不是自动映射的原始物理 VRAM。这些工具测试的是 CPU 可见的 BAR1 行为;它们并不能证明读取到了物理 VRAM 的内容。 ## 之前的公开观察 这里的新贡献在于直接的 CPU 端 BAR1 复现、偏移量无关性测试、FLR 重置行为,以及在 GA107M 上进行的大规模只读扫描。 ## 构建 ``` make ``` 二进制文件位于 `build/` 中。 ## 工具 ### 最小对齐读取器 ``` sudo ./build/bar1read32 \ /sys/bus/pci/devices/0000:01:00.0/resource1 \ 0x0 16 ``` ### 稀疏全孔径扫描 每 1 MiB 读取一个 DWORD: ``` sudo ./build/bar1_sparse_scan \ /sys/bus/pci/devices/0000:01:00.0/resource1 \ 1 sparse.csv ``` ### 分层扫描 每 100-DWORD 组随机读取一个 DWORD,种子为 `12345`: ``` sudo ./build/bar1_stratified_scan \ /sys/bus/pci/devices/0000:01:00.0/resource1 \ anomalies.csv 12345 100 0 ``` 最后的 `0` 表示没有样本限制:扫描所有组。 ### 穷举对齐扫描 ``` sudo ./build/bar1_exhaustive_scan \ /sys/bus/pci/devices/0000:01:00.0/resource1 \ anomalies.csv ``` `Ctrl+C` 请求正常停止并保留部分统计数据。 ## 安全与范围 - 所有包含的工具均以只读方式打开资源。 - 不执行任何 BAR0/BAR1 写入。 - 不执行任何 PCI 配置写入。 - 本仓库**不自动执行** FLR。 - 在测试发生故障或不稳定的 PCIe 设备之前,请保存正在进行的工作。 - 在测量计数器连续性时,不要同时运行 MATS、MODS、`nvidia-smi` 或其他 BAR1 测试。 ## 仓库结构 ``` . ├── README.md ├── LICENSE ├── CITATION.cff ├── Makefile ├── CONTRIBUTING.md ├── src/ │ ├── bar1read32.c │ ├── bar1_sparse_scan.c │ ├── bar1_stratified_scan.c │ └── bar1_exhaustive_scan.c ├── scripts/ │ └── collect-system-info.sh ├── docs/ │ ├── observations.md │ ├── nvidia-forum-draft.md │ ├── upstream-issue-draft.md │ ├── prior-art.md │ └── publishing.md └── logs/ ├── README.md ├── sparse-1mib-summary.txt ├── stratified-1pct-seed-12345.txt └── exhaustive-partial-72.64pct.txt ``` ## 建议的上游途径 1. 发布此仓库。 2. 将详细报告发布到 NVIDIA Developer Forums,Graphics / Linux 板块。 3. 在 EnvyTools 中开启一个 issue,询问该观察结果应归入硬件文档的何处。 4. 与 Nouveau 社区讨论。 5. 仅在维护者确定了正确的文件/分支之后,再提交文档 PR。 6. 可选择开启一个单独的 NVIDIA open-kernel-modules issue,同时注意该故障在专有的 RM 路径下也会发生。 ## 许可证 MIT。请参阅 [许可证](LICENSE)。
标签:客户端加密