kvm对EXIT_REASON_MCE_DURING_VMENTRY的处理
本文档主要关心两个问题:
- kvm对EXIT_REASON_MCE_DURING_VMENTRY的处理
- kvm对Guest中触发的machine-check的处理
背景
- EXIT_REASON_MCE_DURING_VMENTRY
该vmexit发生在"HOST执行VMENTRY指令时发生machine-check"的条件下,vmexit_reason为41.
SDM对这种条件的描述为:
VM Entry时发生machine-check events,会有以下三种情况:
- 会以"machine-check发生于VM entry之前情况"处理该machine-check。
如果CR4.MCE=0,CPU的行为取决于处理器是否处于SMX operation.如果处于,会发生一个Intel TXT shutdown condition. 错误码是0xC。意思为:“不可恢复的machine-check情况。”;如果不处于,CPU会直接关闭。
如果CR.MCE=1,即使能了MC机制,会通过HOST IDT提交一次#MC exception。
- 该Machine-Check会在VM entry完成之后处理,
如果VM Entry之后CR.MCE=0,CPU行为取决于是否处于SMX operation. 如果处于,会发生一个Intel TXT shutdown condition. 错误码是0xC。意思为:“不可恢复的machine-check情况。”;如果不处于,CPU会直接关闭。
如果CR4.MCE=1,即,使能了MC机制,会产生一个#MC异常。如果exception bitmap的bit18,也就是#MC bit为0,那么该异常通过guest IDT提交;如果#MC bit为1,该#MC导致一个vmexit,即MC vmexit.
- 发生exit reason为41的vmexit.
如果MC event发生时,Vmentry已经load了任何Guest state,那么情况1就不会发生.
情况2只发生在VM entry能够load进所有 Guest state时。
如果kvm介入处理了,那么一定是发生了情况3,kvm检测到了编号为41的vmexit.
- Guest中触发machine-check进而vmexit
当Guest触发machine-check且exception bitmap的bit18,也就是#MC bit为1时,该#MC导致一个vmexit,即MC vmexit.在VMCS的vmexit_interrupt_info中会存放0x80000312,vmexit_reason=0。
KVM处理方式
- 非Nested-Virtualization环境
在非Nested-Virtualization环境下:
KVM在Guest发生vmexit后,会检查VMEXIT_REASON,当VMEXIT_REASON=41(EXIT_REASON_MCE_DURING_VMENTRY)时,KVM会设置regs.cs=3,regs->flags.IF=1,然后直接调用Host的machine-check函数。(这期间不会检查vmexit_int_info的内容,因为这不是一个中断/异常相关的vmexit)。
当VMEXIT_REASON=0时,KVM会首先检查该vmexit是否是由Guest内的machine-check导致的,即vmexit_int_info中记录的是否为0x80000312(MC_Vector),如果是,则设置regs.cs=3,regs->flags.IF=1,然后直接调用Host的machine-check函数。
- Nested-Virtualization环境
在Nested-Virtualization环境下:
- L2退出后vmexit reason为EXIT_REASON_MCE_DURING_VMENTRY
事实上,由于nested_vmx_(whether)l0_wants(L2)exit(or not)在nested_vmx_(whether)l1_wants(L2)exit(or not)之前,所以如果遇到L2的vmexit reason = EXIT_REASON_MCE_DURING_VMENTRY(41号),那么会直接返回L0处理,而不会再询问L1的意图。
上面所说的“直接返回L0”只是一个笼统的说法,事实上,如果L1上的nested_vmx_reflect_vmexit返回1,就会导致vmx_handle_exit返回1,进而试图重新进入L2,但还是会发生EXIT_REASON_MCE_DURING_VMENTRY,因而导致vmexit到L0,进行处理。接下来与Host中处理EXIT_REASON_MCE_DURING_VMENTRY的流程就没有区别了。
- L2退出后vmexit reason为0,vmexit_initr_info为0x80000312
这种情况下,L1确认vmexit_reason==0,且vmexit_intr_info为0x80000312,就会调用Guest的machine-check handler进行处理。
总之,在nested环境下,L2发生EXIT_REASON_MCE_DURING_VMENTRY,由Host处理一次用户空间的machine-check异常。L2发生machine-check事件,由L1处理一次发生于L1用户空间的machine-check.
__EOF__

本文链接:https://www.cnblogs.com/haiyonghao/p/14694943.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了