现场扫描

30. 现场扫描

30.1. 简介

现场扫描 (IFS) 是一种硬件功能,用于在 CPU 内核上运行电路级测试,以检测奇偶校验或 ECC 检查未发现的问题。未来的 CPU 将支持多种类型的测试,这些测试将通过新的平台设备实例 ID 显示出来。

30.2. IFS 镜像

Intel 通过 github [1] 提供包含扫描测试的固件文件。与微码类似,每个系列-型号-步进都有一个单独的文件。IFS 镜像不适用于某些测试类型。在适用的情况下,sysfs 目录将提供一个 “current_batch” 文件(见下文)来加载镜像。

30.3. IFS 镜像加载

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

测试文件保存在一个固定位置:/lib/firmware/intel/ifs_<n>/ 例如,如果有 3 个测试文件,它们的命名方式如下:ff-mm-ss-01.scan ff-mm-ss-02.scan ff-mm-ss-03.scan(其中 ff 指的是系列,mm 表示型号,ss 表示步进)

可以通过将数字部分(例如,上述场景中的 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

与 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

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

cur_batch

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

generation

由硬件枚举的 IFS 测试代

chunk_size

测试块的大小

array_gen

数组测试的测试代

max_bundle

最大捆绑索引