Machine-Check 全局控制MSR包括:
IA32_MCG_CAP, IA32_MCG_STATUS,
IA32_MCG_CAP, IA32_MCG_STATUS。其中后两个是可选的
1. IA32_MCG_CAP MSR
IA32_MCG_CAP是一个只读寄存器,其中报告了当前芯片MCA相关的能力信息。如下图所示
其中
Count field, bits 7:0 - 当前处理器记录错误信息的banks的数量(每个bank对应一个硬件单元)
MCG_CTL_P (control MSR present) flag, bit 8 - 当前处理器是否实现了
IA32_MCG_CTL MSR
MCG_EXT_P (extended MSRs present) flag, bit 9 - 当前处理器是否实现了
extended
machine-check state寄存器(该寄存器地址为180H)
MCG_CMCI_P (Corrected MC error counting/signaling extension present) flag, bit 10 - 当前处理器是否支持
corrected MC error事件和
count threshold of corrected MC errors时间相隔的MSR。如果设置了也并不是说所有的bank都支持,系统软件需要逐个bank的检查
MCG_TES_P (threshold-based error status present) flag, bit 11 - 当设置了,表明
IA32_MCi_STATUS[56:53]是架构通用的,其中
56:55被保留,
54:53用来报告
threshold-based error的状态。如果没有设置
IA32_MCi_STATUS[56:53]是特定芯片相关的
MCG_EXT_CNT, bits 23:16 - 表明
extended machine-check state registers的数量,只有当
MCG_EXT_P设置的时候,该位才有意义
MCG_SER_P (software error recovery support present) flag, bit 24 - 表明当前处理器支持用软件进行错误恢复
IA32_MCi_STATUS[56:55]用来表示是否已经发送了#MC信号和表示是否软件必须进行错误恢复。
MCG_EMC_P (Enhanced Machine Check Capability) flag, bit 25 - 表明处理是否支持增强的
machine check能力(
firmware first signaling
)
MCG_ELOG_P (extended error logging) flag, bit 26 - 如果设定表明当探测到一个错误的时候,处理器允许引入
firmware,
firmware可以提供更多的平台特性信息到MC的banks寄存器中,平台特定信息用 ACPI的
Generic Error Data Entry格式提供
MCG_LMCE_P (local machine check exception) flag, bit 27 — 如果设定,就表示下面两个接口被实现了:
extended state LMCE_S (located in bit 3 of IA32_MCG_STATUS)和支持LMCE的
IA32_MCG_EXT_CTL MSR。如果LMCE被使能了,那么MC的errors被精准发送到发生错误的CPU上,而不是所有逻辑核上
如果对
IA32_MCG_CAP MSR进行写入操作,将产生未定义的行为
2. IA32_MCG_STATUS MSR
IA32_MCG_STATUS MSR用来描述在产生
machine-check exception后当前处理器的状态
其中
RIPV (restart IP valid) flag, bit 0 - 当设置了,表明当产生#MC后,处理器是否可以可信的的重新支持栈顶的EIP指针
EIPV (error IP valid) flag, bit 1 — 当设置了,表明EIP指针是产生该错误的指令
MCIP (machine check in progress) flag, bit 2 — 当设置了,表明已经产生了一个#MC。软件可以对其进行修改(当处理完#MC就会清除这个标志)。如果在MCIP设置的时候,又产生了#MC,那么将会让处理器进入shutdown状态,不允许#MC嵌套
LMCE_S (local machine check exception signaled), bit 3 — 当设定了,表明产生了一个本地精准#MC,也就是说该#MC被发送给产生错误的逻辑核上,而不是广播出去
IA32_MCG_STATUS[63:04]被保留,写入非0数据将会产生#GP
3. IA32_MCG_CTL MSR
IA32_MCG_CTL MSR只有当
IA32_MCG_CAP.
MCG_CTL_P被设定的时候才会出现在处理器中
IA32_MCG_CTL控制着
machine-check exceptions的报告。如果出现了该MSR,全部位写1来使能
machine-check的特性,全部位写0来关闭一些
machine-check特性。其他的值是未定义的或者是特定处理器相关的
4. IA32_MCG_EXT_CTL MSR
IA32_MCG_EXT_CTL MSR只有当
IA32_MCG_CAP.
MCG_LMCE_P被设定的时候,才会在处理器中有。
IA32_MCG_EXT_CTL.LMCE_EN (bit 0)用来使能处理器的LMCE特性(精准单播)
如果
IA32_MCG_CAP.
MCG_LMCE_P = 0或
IA32_FEATURE_CONTROL.LMCE_ON = 0,向
IA32_MCG_EXT_CTL进行读写操作将会导致#GP
在RESET的时候,
IA32_MCG_EXT_CTL MSR会被清零
MSR如下所示
LMCE_EN (local machine check exception enable) flag, bit 0 - 系统软件可以对其进行设定来使能LMCE特性。只有在对
IA32_FEATURE_CONTROL进行了LMCE的使能后,才可以设置
LMCE_EN
5. 使能LMCE
如果要想使用LMCE,就需要对系统软件和平台软件都进行适当的设定。平台软件可以通过
IA32_FEATURE_CONTROL.
LMCE_ON(bit 20)来开启LMCE功能。对于系统软件来说,在设定
IA32_MCG_EXT_CTL.LMCE_EN (bit
0)之前,需要确保
IA32_FEATURE_CONTROL.Lock (bit 0)和
IA32_FEATURE_CONTROL.LMCE_ON (bit 20)都已经被设定了。都使能后,
软件不能假设哪种类型的错误会以LMCE的形式传递,
硬件在发生error的时候决定是否该特定的error会以LMCE的方式传递到哪个逻辑核上。
参考文章
MACHINE-CHECK 相关的MSR(一) - 概述