<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RAS(二)Intel MCA初探

Linux閱碼場 ? 來源:Linux閱碼場 ? 2023-07-10 10:35 ? 次閱讀

談到當前業界使用最廣泛、最好的RAS商用解決方案,那么必定是Intel公司。從廣泛上來說,大部分公司使用的x86服務器,首選Intel;從RAS能力來說,Intel CPUMCA架構,從故障檢測、故障上報、故障恢復等層面功能都非常完善。所以筆者認為,想要學習Linux RAS,那么Intel CPU手冊中MACHINE-CHECK ARCHITECTURE章節和對應的Linux arch/x86/kernel/cpu/mce目錄相關代碼將是非常好的入門學習資料。

MCA介紹

MCAMachine Check Architecture)是Intel Xeon,Intel AtomP6 family系列Processors支持的硬件錯誤檢測、上報機制,硬件錯誤包括system bus errors,ECC errors,parity errors,cache errors and TLB errors。

從硬件層面看,MCA通過一些MSRModel Specific Register)來實現檢測、記錄錯誤信息等功能。它包含了一組Global Control MSRs和多組Error-Reporting Bank RegistersEach Hardware Unit)記錄和上報硬件錯誤。如下圖:

8c9d5594-1ec9-11ee-962d-dac502259ad0.png

關于這一點,很多人開始都不太理解,也被問過多次。通過下面圖可以很清楚的理解:

8ccd8da4-1ec9-11ee-962d-dac502259ad0.png

Intel把各個Processor內硬件以bank為單位分組,每個bank涉及多個硬件,共用一組error-reporting register。這個劃分并不是隨便的、雜亂的,反而是非常規整的。

MCA故障分類

8cf4ede0-1ec9-11ee-962d-dac502259ad0.png

IntelHardware Error分類以及行為如下:

?CECorrected Error):指硬件自行恢復的故障,通常也會通知軟件,軟件讀取Status寄存器記錄故障信息;

?Fata Error:指嚴重的硬件錯誤,比如Processor 電源故障,Memory Control嚴重故障等。此類故障發生后,Intel芯片會直接掛起所有CPU,服務器掛死,不會通知到OS;

?UCEUncorrected Error):硬件無法自行恢復的故障。在Intel MCA架構下,此類錯誤是MCi_STATUS寄存器PCC bit1,表示Processor可能已經被故障損壞,同時重啟Processor也不可靠。軟件會根據此信息主動Panic;

?UCRUncorrected RecoverableError:硬件無法自行恢復,但軟件可以采取某些行為修復的錯誤;

至于UCNA、SRAO、SRAR在講MCA Recovery機制時再細講。

當然上述分類并不是絕對的,只能算是最全面的分類。比如IntelPCIe DeviceRAS故障只分為UCECE,這是因為Pcie連接外設一般是非核心硬件,比如USB、磁盤、網卡等。這些組件發生UCE后,都會通知到OS嘗試修復。

Machine-Check Global Control寄存器組

Machine-Check Global Control MSRs是一組全局寄存器,用于Machine-Check的配置、狀態顯示等,包括IA32_MCG_CAP/IA32_MCG_STATUS/IA32_MCG_CTL/IA32
_MCG_EXT_CTL寄存器。

IA32_MCG_CAP MSR

8d1370a8-1ec9-11ee-962d-dac502259ad0.png

IA32_MCG_CAP MSR是只讀寄存器,表示當前Processor擁有的MCA的能力。

Count field, bits 7:0表示某Processor支持Hardware unit error-reporting banks的數量;

MCG_CTL_P (control MSR present) flag, bit 8MCG_CTL MSR有效位;

MCG_EXT_P (extended MSRs present) flag, bit 9MCG_EXT_CTL有效位;

MCG_CMCI_P (Corrected MC error counting/signaling extension present) flag, bit 10表示當發生一個CECE個數超過閾值后,是否通過CMCI中斷通知錯誤;

MCG_TES_P (threshold-based error status present) flag, bit 11Set時,表示IA32_MCi_STATUS MSR54:53用來上報threshold-based error狀態;

MCG_EXT_CNT, bits 23:16表示extended machine-check state registers個數,僅當MCG_EXT_P set時有效;

MCG_SER_P (software error recovery support present) flag, bit 24Set時,表示Processor支持software error recovery,同時IA32_MCi_STATUS MSR56:55位提供uncorrected recoverable errors信息,以及判斷軟件是否需要task recovery actions來進行恢復。IA32_MCi_STATUS MSR56:55位是ARS位,可以對UER進行分類;

MCG_EMC_P (Enhanced Machine Check Capability) flag, bit 25Set時,表示Processor支持MCA增強特性;

MCG_ELOG_P (extended error logging) flag, bit 26Set時,Processor允許firmware接收硬件錯誤并將bank寄存器信息記錄在ACPI“Generic Error Data Entry”。這樣MCA就可以改為Firmware First并兼容APEI上報方式。

MCG_LMCE_P (local machine check exception) flag, bit 27是否支持Local Machine Check Exception (LMCE)。當Set后,IA32_MCG_STATUS LMCE_S位有效;

Linux內核中使用舉例(v6.3,arch/x86/kernel/cpu/mce/core.c

C++
/*
* Initialize Machine Checks for a CPU.
*/
static void __mcheck_cpu_cap_init(void)
{
u64 cap;
u8 b;

rdmsrl(MSR_IA32_MCG_CAP, cap);

b = cap & MCG_BANKCNT_MASK;

if (b > MAX_NR_BANKS) {
pr_warn("CPU%d: Using only %u machine check banks out of %u ",
smp_processor_id(), MAX_NR_BANKS, b);
b = MAX_NR_BANKS;
}

這段cap init代碼即開始讀取MCG_CAP寄存器的Count field, bits 7:0,獲取Banks數量,MCG_BANKCNT_MASK定義在mce.h

#define MCG_BANKCNT_MASK 0xff /* Number of Banks */

IA32_MCG_STATUS MSR

8d416f9e-1ec9-11ee-962d-dac502259ad0.png

IA32_MCG_STATUS MSR描述的是machine-check exception發生后的當前Processor狀態。

RIPV (restart IP valid) flag, bit 0set時,表示machine-check exception發生后程序是否還可以從異常打斷后的指令處重新可靠的執行;當clear時,表示程序無法可靠地從instruction pointer處重新執行;

EIPV (error IP valid) flag, bit 1set時,表示machine-check exception和當前instruction pointed有直接關聯。當clear時,表示instruction pointed與錯誤無關;

MCIP (machine check in progress) flag, bit 2set時,表示當前machine-check exception正在處理中。軟件可以設置或清除此標志位。

LMCE_S (local machine check exception signaled), bit 3set時,表示當前的machine-check event被當前Processor捕獲和處理。這個bit很有意思,intel以前的cpu,machine-check event可以上報到其他Processor,當前處理的Processor需要遍歷所有Banks來找到真正的machine-check even。這個機制對于同步MCE來說非常不友好,后面icelakearm64,都是自動報到local cpu,省去了很多不必要的麻煩,代碼也更簡潔。

Linux內核中使用舉例(v6.3,arch/x86/kernel/cpu/mce/core.c

C++
noinstr void do_machine_check(struct pt_regs *regs)
{
int worst = 0, order, no_way_out, kill_current_task, lmce, taint = 0;
DECLARE_BITMAP(valid_banks, MAX_NR_BANKS) = { 0 };
DECLARE_BITMAP(toclear, MAX_NR_BANKS) = { 0 };

/*
* MCEs are always local on AMD. Same is determined by MCG_STATUS_LMCES
* on Intel.
*/
lmce = 1;

/*
* Check if this MCE is signaled to only this logical processor,
* on Intel, Zhaoxin only.
*/
if (m.cpuvendor == X86_VENDOR_INTEL ||
m.cpuvendor == X86_VENDOR_ZHAOXIN)
lmce = m.mcgstatus & MCG_STATUS_LMCES;

/*
* Local machine check may already know that we have to panic.
* Broadcast machine check begins rendezvous in mce_start()
* Go through all banks in exclusion of the other CPUs. This way we
* don't report duplicated events on shared banks because the first one
* to see it will clear it.
*/
if (lmce) {
if (no_way_out)
mce_panic("Fatal local machine check", &m, msg);
} else {
order = mce_start(&no_way_out);
}

這里代碼在發生UCEMCE的處理函數do_machine_check()中,通過MCG_STATUS_LMCES確定故障是否是local machine check。

IA32_MCG_CTL MSR

控制machine-check exceptions的上報,寫1使能machine-check特性。

IA32_MCG_EXT_CTL MSR

8d64ef50-1ec9-11ee-962d-dac502259ad0.png

LMCE_EN (local machine check exception enable) flag, bit 0LMCE功能的使能位。

Error-Reporting Register Banks寄存器組

每個error-reporting register bank包括IA32_MCi_CTL, IA32_MCi_STATUS, IA32_MCi_ADDR, and IA32_MCi_MISC MSRs。

IA32_MCi_CTL MSRs

8d81f000-1ec9-11ee-962d-dac502259ad0.png

IA32_MCi_CTL控制每個bank發生硬件錯誤時產生的#MC信號。

IA32_MCi_STATUS MSRS

8da29c1a-1ec9-11ee-962d-dac502259ad0.png

每個IA32_MCi_STATUS MSR包含了machine-check error的信息。這個寄存器是比較重要的,包含了硬件錯誤的故障類型信息等,Linux主要通過這個寄存器對故障進行分類并采取相應的Action。

MCA (machine-check architecture) error code field, bits 15:0MCA架構定義的Error Code,內部包含了詳細的錯誤信息,比如錯誤發生硬件、觸發原因等。下面會單獨將MCA Error Codes;

Model-specific error code field, bits 31:16MCA架構定義的model-specific error code;

Reserved, Error Status, and Other Information fields, bits 56:32Error StatusOther Information區域。這些bit包含了更多錯誤信息,比如UCE的錯誤類型等等。

PCC (processor context corrupt) flag, bit 57Set時,表示Processor可能已經被故障損壞,同時重啟Processor也不可靠。當Clear時,表示錯誤并未影響到Processor狀態,并且軟件可以采取recovery actions隔離、恢復故障;

ADDRV (IA32_MCi_ADDR register valid) flag, bit 58ADDR有效位,當Set時,IA32_MCi_ADDR包含了錯誤發生的物理地址。這個寄存器僅當Memory、Cache data、TLB data發生錯誤時才會寫入物理地址;

MISCV (IA32_MCi_MISC register valid) flag, bit 59Set時,表示IA32_MCi_MISC寄存器內包含了附加的錯誤信息。當Clear時,不要讀取IA32_MCi_MISC寄存器信息;

EN (error enabled) flag, bit 60對應IA32_MCi_CTL register使能位;

UC (error uncorrected) flag, bit 61Set時,表示Processor硬件無法恢復這個硬件故障。即UCE;當Clear時,表示Processor可以糾正這次錯誤,即CE;

OVER (machine check overflow) flag, bit 62Set時,表示前一次錯誤還在上報、處理過程中時又發生了硬件錯誤,即多次machine error同時發生;

VAL (IA32_MCi_STATUS register valid) flag, bit 63IA32_MCi_STATUS寄存器信息是否有效;

Linux內核中使用舉例(v6.3,arch/x86/kernel/cpu/mce/severity.c

C++
static struct severity {
u64 mask;
u64 result;

} severities[] = {

MCESEV(
KEEP, "Corrected error",
NOSER, BITCLR(MCI_STATUS_UC)
),
/*
* known AO MCACODs reported via MCE or CMC:
*
* SRAO could be signaled either via a machine check exception or
* CMCI with the corresponding bit S 1 or 0. So we don't need to
* check bit S for SRAO.
*/
MCESEV(
AO, "Action optional: memory scrubbing error",
SER, MASK(MCI_UC_AR|MCACOD_SCRUBMSK, MCI_STATUS_UC|MCACOD_SCRUB)
),
MCESEV(
AO, "Action optional: last level cache writeback error",
SER, MASK(MCI_UC_AR|MCACOD, MCI_STATUS_UC|MCACOD_L3WB)
),

Intel服務器在mce_severity_intel()函數中

?通過MCI_STATUS_UC=0確定發生CE類型故障;

?通過MCI_STATUS_UC=1,MCI_UC_AR=1確定發生AO類型故障;

IA32_MCi_ADDR MSRs

8dc5bd30-1ec9-11ee-962d-dac502259ad0.png

IA32_MCi_STATUSADDRV位設置后,IA32_MCi_ADDR MSR表示硬件故障的codedata地址信息:The address returned is an offset into a segment, linear address, or physical address. This depends on the error encountered.

Linux內核中使用舉例(v6.3,arch/x86/kernel/cpu/mce/core.c

C++
/*
* Read ADDR and MISC registers.
*/
static noinstr void mce_read_aux(struct mce *m, int i)
{
if (m->status & MCI_STATUS_MISCV)
m->misc = mce_rdmsrl(mca_msr_reg(i, MCA_MISC));

if (m->status & MCI_STATUS_ADDRV) {
m->addr = mce_rdmsrl(mca_msr_reg(i, MCA_ADDR));

/*
* Mask the reported address by the reported granularity.
*/
if (mca_cfg.ser && (m->status & MCI_STATUS_MISCV)) {
u8 shift = MCI_MISC_ADDR_LSB(m->misc);
m->addr >>= shift;
m->addr <<= shift;
}

smca_extract_err_addr(m);
}

MCE驅動代碼中,通過mce_rdmsrl(mca_msr_reg(i, MCA_ADDR))函數讀取MCA_ADDR計算內存故障的物理地址。

IA32_MCi_MISC MSRs

8dde9620-1ec9-11ee-962d-dac502259ad0.png

如果IA32_MCi_STATUS寄存器的MISCV標志位Set時,IA32_MCi_MISC MSR包含了附加的machine-check error信息。

Recoverable Address LSB (bits 5最低地址有效位。比如IA32_MCi_MISC01001b,十進制是9,那么故障地址的bits [8:0]需要忽略。

Address Mode (bits 8IA32_MCi_ADDR的地址模式,如下圖

8e033854-1ec9-11ee-962d-dac502259ad0.png

Model Specific Information (bits 63 Not architecturally defined.

IA32_MCi_CTL2 MSRs

8e2e9fb2-1ec9-11ee-962d-dac502259ad0.png

IA32_MCi_CTL2 MSR描述了進程使用CE的通知能力。

Corrected error count threshold, bits 14:0軟件必須初始化這個區域。描述CMCIcorrected machine-check error interrupt)觸發的CE閾值,即corrected error數量達到閾值會觸發CMCI信號;

CMCI_EN (Corrected error interrupt enable/disable/indicator), bits 30CMCI使能位

本篇主要對Intel MCA機制、Global Control MSR/Error-reporting Register Bank進行介紹。了解上述2組寄存器,對MCA硬件有個大概的了解,后續會結合內核介紹MCA的增強功能。

參考文檔:《Intel 64 and IA-32 Architectures Software Developer’s Manual


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10512

    瀏覽量

    207268
  • intel
    +關注

    關注

    19

    文章

    3456

    瀏覽量

    184988
  • MCA
    MCA
    +關注

    關注

    0

    文章

    9

    瀏覽量

    9141

原文標題:RAS(二)Intel MCA初探

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    MCA將為臨床醫護帶來革命

    伴隨INTEL數字醫療團隊的努力,MCA(移動醫護助手)已經在歐美取得了巨大的成功,明顯提升醫護人員工作效率,進一步降低醫患糾紛等.在不久的將來,伴隨我國醫療改革的深入開展,這種產品將廣泛使用于醫療衛生系統.
    發表于 12-10 14:41

    TETRACAM全新的Micro-MCA 和Micro-MCA Snap系列產品

    數據支持,強悍的技術和產品質量,TETRACAM能夠充分滿足航拍,水體,野外,實驗室等各類環境,包括各類復雜的工業環境。 TETRACAM推出了全新的Micro-MCA 和Micro-MCA Snap
    發表于 12-12 17:31

    MATLAB中.mca文件如何打開

    數據都包含在一個.mca文件中,但是這個文件用matlab打開是一堆亂碼,請問大佬們如何獲取.mca文件里面的數據。
    發表于 01-23 14:15

    美國泰克(Tektronix)MCA3027微波計數器 MCA3027 泰克MCA3027計數器

    `東莞市求購美國泰克(Tektronix)MCA3027微波計數器 MCA3027 泰克MCA3027計數器數量:5臺,功能好壞都回收價格“1200元”電1-5-9-2-0-8-4-5-9-6-9
    發表于 04-11 21:45

    美國泰克MCA3027回收MCA3040微波計數器

    銷售、租賃、維修、回收、升級各類手儀器儀表. 上門回收工廠閑置/倒閉電子儀器,個人處理儀器美國泰克(Tektronix)MCA3027微波計數器 MCA3027美國泰克[Tektronix
    發表于 01-11 19:29

    用于ARMv8-A RAS擴展和RAS系統架構2.0 BET0平臺的ACPI設計文檔

    本規范提供了ACPI[2]擴展的詳細描述,這些擴展是在支持Armv8-a RAS擴展和a配置文件體系結構規范的Arm體系結構參考手冊補充可靠性、可用性和可服務性(RAS)定義的RAS系統體系結構的系統中實現內核優先錯誤處理所需的
    發表于 08-08 07:24

    學習架構-RAS概述

    健壯、可靠的計算機系統有三個關鍵屬性:可靠性、可用性和可維護性(RAS)。 這些屬性可以定義如下: 可靠性可靠的系統始終按照其規范提供正確的服務。 結果或計算是正確的,并且在分配給任務的時間內到達
    發表于 08-08 07:53

    電池的特型——初探

    電池的特型——初探1、電動勢和內電阻的概念;2、外電壓和干路電流的關系;3、電池的伏-安特型圖像。
    發表于 11-05 15:35 ?8次下載

    利用MCA技術對電機進行故障診斷

    MCA技術是把電機視同于一個由電阻、電感和電容組成的復雜電路進行分析,可以對電機進行不解體狀態下的故障診斷。本文重點介紹MCA測試方法,及在電機故障診斷中的應用。
    發表于 01-16 15:54 ?11次下載

    研祥終端MCA急救方案

    針對如何有效的利用搶救現場和途中的黃金時間,本文設計了研祥終端MCA急救方案。
    發表于 04-15 11:38 ?1034次閱讀

    步進電機細分驅動系統設計初探

    步進電機細分驅動系統設計初探,有需要的下來看看
    發表于 04-25 10:10 ?41次下載

    MCA_TouchProbeECAT探針是什么

    本節介紹另一個探針功能塊:MCA_TouchProbeECAT。 ECAT_CiA402_Touchprobe_App功能塊的輸入設置比較繁瑣且有冗余,以次功能塊為執行內核,精簡輸入端子,二次開發
    發表于 03-08 13:56 ?405次閱讀

    功能塊MCA_CamInDirect的電子凸輪功能

    1_回顧及簡介 從本節開始,將持續介紹基于功能塊MCA_CamInDirect的電子凸輪功能。 前面曾介紹過MCA_GearInDirect,MCA_CamInDirect與之特點近似,也是個急性子
    的頭像 發表于 04-30 16:12 ?865次閱讀

    Intel MCA-CMCI初探

    Corrected machine-check error interrupt (CMCI)是MCA的增強特性,它提供了一種threshold-based的錯誤上報方式。這種模式下,軟件可以配置硬件
    的頭像 發表于 07-11 09:57 ?591次閱讀
    <b class='flag-5'>Intel</b> <b class='flag-5'>MCA</b>-CMCI<b class='flag-5'>初探</b>

    skill語言及IPC初探.zip

    skill語言及IPC初探
    發表于 12-30 09:20 ?8次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>