现场扫描 (In-Field Scan)

31. 现场扫描

31.1. 简介

现场扫描(In Field Scan, IFS)是一项硬件特性,用于在 CPU 核心上运行电路级别的测试,以检测奇偶校验或 ECC 校验未能捕获的问题。未来的 CPU 将支持多种类型的测试,这些测试将通过一个新的平台设备实例 ID(platform-device instance-id)显示出来。

31.2. IFS 镜像

Intel 通过网页 [1] 提供包含扫描测试的固件文件。请在页面底部的“In-Field Scan Test Images Download”部分查找。与微码(microcode)类似,每个 family-model-stepping(家族-型号-步进)都有单独的文件。IFS 镜像并不适用于某些测试类型。在适用的情况下,sysfs 目录会提供一个“current_batch”文件(见下文)用于加载镜像。

31.3. IFS 镜像加载

驱动程序通过两步过程将测试加载到每个 CPU 插槽本地由 BIOS 保留的内存中:首先通过写入 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)写入 current_batch 文件来加载不同的测试文件。要加载 ff-mm-ss-02.scan,可以使用以下命令

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

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

31.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

部分完成

31.5. 驱动程序设计选择

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

2) 硬件允许并行测试一定数量的核心。驱动程序没有利用这一点,它一次只测试一个核心。

31.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

与 Intel 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

来自硬件的不透明扫描状态代码

cur_batch

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

generation

由硬件枚举的 IFS 测试代

chunk_size

测试块的大小

array_gen

阵列测试的测试代

max_bundle

最大束索引