现场扫描

30. 现场扫描

30.1. 简介

现场扫描 (IFS) 是一种硬件功能,用于在 CPU 核心上运行电路级测试,以检测奇偶校验或 ECC 检查无法捕获的问题。未来的 CPU 将支持多种类型的测试,这些测试将显示具有新的 platform-device 实例 ID。

30.2. IFS 镜像

英特尔通过网页 [1] 提供包含扫描测试的固件文件。在页面末尾的“现场扫描测试镜像下载”部分查找。与微码类似,每个 family-model-stepping 都有单独的文件。IFS 镜像不适用于某些测试类型。在适用的情况下,sysfs 目录将提供一个 “current_batch” 文件(见下文)来加载镜像。

30.3. IFS 镜像加载

驱动程序将测试加载到 BIOS 为每个 CPU 插槽保留的内存中,该过程分为两步,首先通过写入 MSR 来加载测试的 SHA 哈希值,然后加载测试本身。状态 MSR 提供有关这些步骤成功/失败的反馈。

测试文件保存在固定位置:/lib/firmware/intel/ifs_<n>/ 例如,如果有 3 个测试文件,它们将按以下方式命名:ff-mm-ss-01.scan ff-mm-ss-02.scan ff-mm-ss-03.scan(其中 ff 指 family,mm 指示 model,ss 指示 stepping)

可以通过将数字部分(例如,上述情况下的 1、2 或 3)写入 curent_batch 文件来加载不同的测试文件。要加载 ff-mm-ss-02.scan,可以使用以下命令

# echo 2 > /sys/devices/virtual/misc/intel_ifs_<n>/current_batch

也可以读取上述文件以了解当前加载的镜像。

30.4. 运行测试

测试的运行方式是驱动程序同步核心上所有线程的执行,然后写入所有线程上的 ACTIVATE_SCAN MSR。 当以下情况发生时,指令执行继续:

  1. 所有测试已完成。

  2. 执行被中断。

  3. 测试检测到问题。

请注意,**核心上的所有线程在测试期间实际上处于离线状态**。这可能长达 200 毫秒。如果系统正在运行对延迟敏感的应用程序,并且无法容忍如此大的中断,则系统管理员必须在运行核心测试之前安排将这些应用程序迁移到其他核心。也可能需要将中断重定向到其他 CPU。

在所有情况下,读取相应测试的 STATUS MSR 都会提供有关发生情况的详细信息。驱动程序通过 “details” 文件(见下文)使该 MSR 的值对应用程序可见。可以重新启动中断的测试。

IFS 驱动程序通过 /sys/devices/virtual/misc/intel_ifs_<n>/ 提供 sysfs 接口来控制执行

测试特定核心

# echo <cpu#> > /sys/devices/virtual/misc/intel_ifs_<n>/run_test

当启用 HT 时,可以指定任何一个兄弟 cpu# 来测试其对应的物理核心。由于测试是每个物理核心的,因此测试任何线程的结果都是相同的。所有兄弟线程都必须在线才能运行核心测试。只需要测试一个线程。

例如,要测试与 cpu5 对应的核心

# echo 5 > /sys/devices/virtual/misc/intel_ifs_<n>/run_test

上次测试的结果在 /sys 中提供

$ cat /sys/devices/virtual/misc/intel_ifs_<n>/status
pass

状态可以是 pass、fail、untested

details 文件提供上次测试的更多详细信息

$ cat /sys/devices/virtual/misc/intel_ifs_<n>/details
0x8081

details 文件报告测试特定状态 MSR 的十六进制值。硬件定义的错误代码记录在 Intel 软件开发人员手册第 4 卷中,但 error_code 字段可能包含以下驱动程序定义的软件代码之一

0xFD

软件超时

0xFE

部分完成

30.5. 驱动程序设计选择

1) ACTIVATE_SCAN MSR 允许运行任何连续的可用测试子范围。但是,驱动程序始终尝试运行所有测试,并且仅使用子范围功能来重新启动中断的测试。

2) 硬件允许并行测试一些核心。 驱动程序不使用此功能,它一次只测试一个核心。

30.6. 现场结构化功能测试 (SBAF):

SBAF 是一种新型测试,提供全面的核心测试覆盖,作为现场扫描 (SAF) 测试的补充。SBAF 模仿制造筛选环境并利用相同的测试套件。它利用面向测试设计 (DFT) 的观察点和功能,以在最短的时间内最大限度地提高覆盖率。

与 SAF 测试类似,SBAF 在执行期间将受测核心与系统的其余部分隔离。 完成后,核心无缝重置到其测试前状态并恢复正常运行。 测试期间遇到的任何机器检查或挂起都仅限于隔离的核心,从而防止对整个系统造成中断。

与 SAF 测试一样,SBAF 测试也分为多个批次,每个批次测试可能需要数百毫秒 (100-200 毫秒) 才能完成。 如果不希望出现如此长时间的中断,建议将时间敏感型应用程序重新定位到其他核心。

struct ifs_test_msrs

IFS 测试中使用的 MSR

定义:

struct ifs_test_msrs {
    u32 copy_hashes;
    u32 copy_hashes_status;
    u32 copy_chunks;
    u32 copy_chunks_status;
    u32 test_ctrl;
};

成员

copy_hashes

复制测试哈希数据

copy_hashes_status

复制的测试哈希数据的状态

copy_chunks

复制测试数据的块

copy_chunks_status

复制的测试数据块的状态

test_ctrl

控制测试属性

struct ifs_data

与英特尔 IFS 驱动程序相关的属性

定义:

struct ifs_data {
    int loaded_version;
    bool loaded;
    bool loading_error;
    int valid_chunks;
    int status;
    u64 scan_details;
    u32 cur_batch;
    u32 generation;
    u32 chunk_size;
    u32 array_gen;
    u32 max_bundle;
};

成员

loaded_version

存储当前加载的 ifs 镜像版本。

loaded

如果已将有效的测试二进制文件加载到内存中

loading_error

在加载镜像时,另一个 CPU 上发生错误

valid_chunks

可以验证的块数。

status

它保存简单的状态 pass/fail/untested

scan_details

来自 h/w 的不透明扫描状态代码

cur_batch

指示当前加载的测试文件的编号

generation

硬件枚举的 IFS 测试代

chunk_size

测试块的大小

array_gen

阵列测试的测试代

max_bundle

最大捆绑索引