現場掃描

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

最大捆綁索引