Intel MCE CMCI (三) 系统软件中CMCI的相关实现

系统软件必须负责使能CMCI,并能管理CMCI。系统软件在相关的逻辑CPU上需要设定CMCI的中断处理程序,可以对CMCI LVT进行编程,并且可以串行的查询被多个处理器共享的 machine check banks

本文将讲述系统软件如何管理CMCI,包括:CMCI的初始化,中断处理函数(如何同最小的方式处理banks访问的竞争问题)

1. CMCI的初始化
虽然根据 corrected MC error的特性,CMCI可能被传递到多个逻辑处理器上,但是只需要一个逻辑处理器完成相应的处理且完成相关banks的查询。下面描述的步骤,将最小化系统响应CMCI的操作

  • 为每个逻辑处理器定义一个每线程数据结构( per-thread)(这里的每线程指的是处理器的超线程)来增加CMCI的平衡影响概率。特别的每超线程结构都要包括一组banks的域,这些bank的域用来记录CMCI相关的bank寄存器的信息。banks域的数量由IA32_MCG_CAP[7:0]的值决定。   
  • 初始化每超线程结构的初始化工作必须在系统中的每个逻辑处理器上串行的完成,而从哪个逻辑处理器开始初始化每超线程变量是任意的。但是初始化工作必须注意一下几点来确保能够正确的处理多处理器共享MSR资源
    • a . 每个线程都初始化自己的相应的数据结构,初始值为该超线程不负责处理任何MC bank的CMCI
    • b.  该超线程检查所有bank的IA32_MCi_CTL2[30],该位表示是否本bank的CMCI已经被其他超线程处理了
      • 如果 IA32_MCi_CTL2[30] = 1,那么该bank的CMCI处理权已经被其他超线程占有了,那么就返回b检查下一个bank,直到所有的bank都检查完毕
      • 如果 IA32_MCi_CTL2[30] = 0,那么进入步骤c
    • c.   向IA32_MCi_CTL2[30]写入1后进行读取,查看是否为1,为1才表示支持CMCI
      • 如果 IA32_MCi_CTL2[30] = 0,那么表示本bank不支持CMCI,返回步骤b检查下一个bank,直到所有的bank都检查完毕
      • 如果 IA32_MCi_CTL2[30] = 1,那么修改每超线程数据结构,标明本超线程负责处理本MC bank的CMCI,初始化错误阈值数量(bit 15:0). 然后返回b检查下一个bank,直到所有的bank都检查完毕
  • 当处理器线程已经检查了所有的 machine check banks,该线程就会查看他自己是否负责某个(某几个)MC bank的CMCI处理,如果该超线程负责CMCI的处理,那么
  • 确保CMCI的中断处理函数已经被安装
  • 初始化CMCI LVT
  • 记录并清除该thread所管理bank的IA32_MCi_Status寄存器的值,这样的话才可以记录新的错误信息

2. CMCI的阈值管理
IA32_MCi_CTL2[15:0]表示了 Corrected MC error 的阈值域,是架构通用的。特别是,这个域是软件写入的,每个thread、每个bank都可以设定不同的值。这个阀值用来和 IA32_MCi_STATUS[52:38]中的错误数量进行比较,超过了就发送CMCI。下面描述了系统软件处理阈值管理的方法

  • 系统软件可以通过向 IA32_MCi_CTL2[15:0]中写入1来初始化阈值为1,这样的话就会导致每个 corrected MC error都会发出CMCI
  • 提高阈值的值来减少CMCI的发生频率,从而减小系统负载
    • a. 探知最大阀值的方法
      • IA32_MCi_CTL2[15:0]中写入0x7FFFF
      • 读回 IA32_MCi_CTL2[15:0]的值,低15bit(14:0)就是该处理器支持的最大阀值
    • b. 设置阀值位步骤a中探测的最大阀值


3. CMCI中断处理函数
下面描述CMCI中断处理函数的处理流程
  • 本线程的中断处理函数 per-thread结构中的私有数据,来查看该中断处理函数负责哪个bank的CMCI。如果中断处理函数没有本bankCMCI的处理权,那么就检查下一个bank,处理权是在初始化时候定下来的。
  • 如果本线程拥有本bank的CMCI处理权,那么
    • 通过 IA32_MCi_STATUS.VALID[63]检查MC errors的有效性
      • 记录MC errors
      • 清除本MC bank的相关MSR
    • 如果没有有效的错误,处理下一个bank
  • 当所有的 MC banks都被处理器了,退出中断处理函数,返回到原先执行程序的执行流中

以上描述的每逻辑处理CMCI MC errors的方式是独立运行的,不需要对访问共享MSR资源进行串行加锁访问。


相关文章


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值