天天看點

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

BANK的概念在概述部分已經介紹過了,不清楚可以參考我的部落格《 Intel MCA 硬體機制概述 》。 每一個 error-reporting register bank都含有 IA32_MCi_CTL, IA32_MCi_STATUS, IA32_MCi_ADDR, 和 IA32_MCi_MISC 四個MSR。 IA32_MCG_CAP[7:0]指定了 bank的數量。第一個 error-reporting register (IA32_MC0_CTL)的起始位址為400H

1. IA32_MCi_CTL MSRs IA32_MCi_CTL MSR 控制着某個(某組)硬體單元産生的error的 error reporting。64個标志位 (EEj)的每一位代表一種可能的error,設定 EEj的相應标志來使能相關error的 reporting,清除了就關閉相應error的 reporting功能。如果處理器沒有實作某些error,那麼是不會改變相應位的。 IA32_MCi_CTL如下所示

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

2. IA32_MCi_STATUS MSRS

如果VAL(vaild flag)被設定了,那麼每一個 IA32_MCi_STATUS MSR都包含了一個 machine-check error的相關資訊。軟體通過顯式地寫入全0來清除 IA32_MCi_STATUS MSRs。對任何位寫入1将會導緻#GP

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

其中 MCA (machine-check architecture) error code field, bits 15:0 — 當 machine-check error被探測到,這裡就寫入了通用架構相關的 machine-check error code。既然是架構相關,那麼所有種類的CPU都會了解這些error code的含義。注意這裡也會保證和IA32的相容。 Model-specific error code field, bits 31:16 — 指定了 model-specific error code,這種error code是每種CPU都有不同解釋的,唯一的辨別了一種錯誤 Reserved, Error Status, and Other Information fields, bits 56:32 —  這部分很亂,主要是Other Information用來提供額外資訊和error發生的counter累加器用來判斷是否超過閥值需要告警, 有興趣的可以參考SDM。 最重要的是兩個位。當 IA32_MCG_CAP[11] = 1時, S (Signaling) flag, bit 56 為1 表示需要針對該error report需要發送#MC, AR (Action Required) flag, bit 55為1表明是否需要軟體采用recovery Action,這也是區分SRAR和SRAO的地方。 PCC (processor context corrupt) flag, bit 57 — 當設定了,就意味着整個處理器都被探測到的錯誤污染了,沒法進行修複或者重新執行指令。當沒有設定,表明處理器目前還沒有被錯誤污染,軟體有可能通過恢複動作讓系統正常運作 ADDRV (IA32_MCi_ADDR register valid) flag, bit 58 — 當設定了,就代表 IA32_MCi_ADDR寄存器中含有發生錯誤時候的記憶體位址 MISCV (IA32_MCi_MISC register valid) flag, bit 59 — 當設定了,表明 IA32_MCi_MISC寄存器中包含了錯誤的額外資訊 EN (error enabled) flag, bit 60 — 當設定了,就說明了改錯誤在 IA32_MCi_CTL寄存器中對應的 EEj位被設定了 UC (error uncorrected) flag, bit 61 — 當設定了,表明處理器不能依靠硬體來矯正這個錯誤(如多bit的記憶體錯誤),當清除則該錯誤可以被處理器硬體糾正(如單bit記憶體錯誤) OVER (machine check overflow) flag, bit 62 — 當設定了,就表明發生了MC嵌套。也就是說 error-reporting register bank 裡面還有着前一個錯誤資訊(VAL=1,軟體正在處理)時,另外一個錯誤就發生了。處理器會設定OVER位,軟體負責清除。通常按照一定的規則對錯誤内容進行覆寫。通常來說, enabled errors 覆寫 disabled errors, uncorrected errors 覆寫  corrected errors。 Uncorrected errors不會覆寫前一個有效的 Uncorrected errors VAL (IA32_MCi_STATUS register valid) flag, bit 63 — 當設定了,就意味着 IA32_MCi_STATUS中的錯誤資訊是有效的,系統軟體正在處理。當該位被設定時,處理器按照覆寫規則來處理更多的錯誤資訊。處理器負責設定VAL,系統軟體負責清除這個位(當處理完成)。覆寫規則很操蛋,筒子們自己看SDM吧

3. IA32_MCi_ADDR MSRs 當 IA32_MCi_STATUS. ADDRV = 1的時候, IA32_MCi_ADDR中含有産生本次錯誤的指令或資料記憶體的記憶體位址。當 IA32_MCi_STATUS. ADDRV = 0,任何讀寫IA32_MCi_ADDR的動作都會導緻#GP 根據遇到的錯誤不同,傳回的位址可能是一個段内偏移量、線性位址或實體位址。可以通過寫入全0來清除該寄存器,如果在任何一位寫入1都會導緻#GP

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

4. IA32_MCi_MISC MSRs

當 IA32_MCi_STATUS. MISCV = 1時, IA32_MCi_MISC MSR中包含了本次 machine-check error的額外資訊。如果 IA32_MCi_STATUS. MISCV = 0,任何讀寫 IA32_MCi_MISC MSR都會導緻#GP 軟體通過顯示的寫入全0來清除該寄存器,當寫入任意一位1都會導緻#GP 如果 MISCV =1 且  IA32_MCG_CAP[24] = 1, IA32_MCi_MISC_MSR的定義如下圖所示,用來支援軟體恢複 uncorrected errors

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

Recoverable Address LSB (bits 5:0): 表明error address的最低有效位。例如, IA32_MCi_MISC. LSB =  01001b (9), 那麼 IA32_MCi_ADDR 中記錄的錯誤位址[43:9]是有效的,[8:0]直接忽略。如果是12,那麼就說明頁面是4K對其的 Address Mode (bits 8:6):  IA32_MCi_ADDR中記錄的位址的類型,支援的類型如下所示

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

Model Specific Information (bits 63:9): 非架構相關的

5. IA32_MCi_CTL2 MSRs IA32_MCi_CTL2 MSR提供了對于 corrected MC error發送信号能力的可程式設計接口,也同時意味着要求 IA32_MCG_CAP[10] = 1。系統軟體檢查每個bank的 IA32_MCi_CTL2 當 IA32_MCG_CAP[10] = 1,每bank的 IA32_MCi_CTL2 MSR都存在。但是對于 corrected MC error不一定是每個bank都發送信号的,需要檢查相應bank的标志位。 寄存器如下所示

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

Corrected error count threshold, bits 14:0 — 系統軟體負責初始化這個域,然會會同 IA32_MCi_STATUS[52:38]比較。當 IA32_MCi_STATUS[52:38]等于閥值的時候,就會發送一個 overflow事件到APIC的 CMCI LVT entry( APIC_BASE+02F0H )。如果CMCI功能沒有使能,但是 IA32_MCG_CAP[10] = 1,那麼這個域總是0 CMCI_EN (Corrected error interrupt enable/disable/indicator), bits 30 — 系統軟體設定這個位來使能發送 corrected machine-check error interrupt (CMCI) 的特性。如果某bank的CMCI沒有使能, 但是 IA32_MCG_CAP[10] = 1,寫1到這個bit會傳回0,這個BIT也就意味着對應bank的CMCI是否被支援。

某些 微架構作為 corrected MC errors的源,肯能被多個邏輯處理器共享,那麼這個bank的内容也就會被共享,軟體需要負責 IA32_MCi_CTL2 MSR内容在多個邏輯處理器間的一緻性問題

在系統重新開機後 IA32_MCi_CTL2 MSRs統統被清零

6. IA32_MCG Extended Machine Check State MSRs 對于Intel志強處理器,當 IA32_MCG_CAP. MCG_EXT_P = 1 時, 實作了更多的擴充 machine-check state MSRs,可以記錄更加詳細的錯誤資訊。  IA32_MCG_CAP. MCG_EXT_CNT表明了這些擴充寄存器的數量。這些擴充寄存器如下所示

32位下的擴充寄存器

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

64為下的擴充寄存器

MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks
MACHINE-CHECK 相關的MSR(三) - Error-Reporting Register Banks

這些寄存器通過寫入全零來進行清除,寫入其他值會導緻#GP。當硬重新開機時寄存器被清除( power-up or RESET),當軟重新開機這些寄存器的值保留( INIT reset)

關于相容性我就不講了,有興趣的參考Intel的SDM

參考文章 MACHINE-CHECK 相關的MSR(二) - Machine-Check 全局控制MSR 

繼續閱讀