紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5259|回复: 10

开启EPT后十分钟内的BSOD的问题

[复制链接]

1

主题

62

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
99
发表于 2021-1-6 20:12:44 | 显示全部楼层 |阅读模式
本帖最后由 kanren 于 2021-1-6 20:14 编辑

笔记本电脑 飞行堡垒5 FX80 504GM 开启EPT后,十分钟内会蓝屏,偶尔不会蓝。
另一台电脑上一直不会蓝,虚拟机里也不会蓝。

WHEA_UNCORRECTABLE_ERROR (124)
A fatal hardware error has occurred. Parameter 1 identifies the type of error
source that reported the error. Parameter 2 holds the address of the
WHEA_ERROR_RECORD structure that describes the error conditon.
Arguments:
Arg1: 0000000000000000, Machine Check Exception
Arg2: ffffd08faee67028, Address of the WHEA_ERROR_RECORD structure.
Arg3: 00000000be000000, High order 32-bits of the MCi_STATUS value.
Arg4: 0000000001001136, Low order 32-bits of the MCi_STATUS value.

[0x0]   nt!KeBugCheckEx   
[0x1]   hal!HalBugCheckSystem + 0xdc   
[0x2]   PSHED!PshedBugCheckSystem + 0x10   
[0x3]   nt!WheaReportHwError + 0x263   
[0x4]   hal!HalpMcaReportError + 0x62   
[0x5]   hal!HalpMceHandlerCore + 0xf2   
[0x6]   hal!HalpMceHandler + 0xda   
[0x7]   hal!HalpMceHandlerWithRendezvous + 0xd4   
[0x8]   hal!HalpHandleMachineCheck + 0x5c   
[0x9]   hal!HalHandleMcheck + 0x37   
[0xa]   nt!KiHandleMcheck + 0x10   
[0xb]   nt!KxMcheckAbort + 0x7a   
[0xc]   nt!KiMcheckAbort + 0x263   


IMAGE_NAME:  GenuineIntel.sys
STACK_COMMAND:  .thread ; .cxr ; kb
FAILURE_BUCKET_ID:  0x124_GenuineIntel_PROCESSOR_CACHE
OS_VERSION:  10.0.17763.1
BUILDLAB_STR:  rs5_release
OSPLATFORM_TYPE:  x64
OSNAME:  Windows 10
FAILURE_ID_HASH:  {4c8f3f5e-1af5-ed8b-df14-d42663b1dfa7}
Followup:     MachineOwner


除了自己的代码会出现这种情况,测试以下两个框架也出现了这种蓝屏
https://github.com/Gbps/gbhv
https://github.com/ionescu007/SimpleVisor

HyperPlatform几分钟后也会出现蓝屏,但是蓝屏的代码和以上的不一样,具体没有看DMP

目前已知的是,并非我一人遇到过这样的问题,希望有大佬遇到并且解决过这个问题

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2021-1-7 00:53:40 | 显示全部楼层
本帖最后由 tangptr@126.com 于 2021-1-7 03:07 编辑

这是产生了#MC异常。看你的DMP应该是取到了MCA错误状态码0xBE000000`01001136,那么
MCi_STATUS.UC=1:错误没有或无法被处理器校正
MCi_STATUS.MISCV=1:MCi_MISC MSR中存有额外的错误记录
MCi_STATUS.ADDRV=1:MCi_ADDRV MSR中存有发生错误的地址
MCi_STATUS.PCC=1:处理器上下文损坏
MCi_STATUS.MS_ERR=0000_0001_0000_0000:要看CPU具体型号才能确定错误代码的意义,你的CPU好像是i7-8750H,但这个u的Model-Specific错误码表还没被Intel公布。
MCi_STATUS.MCA_ERR=0001_0001_0011_0110:缓存体系错误,其中R=0011,T=01,L=10,即Data Cache Level 2 Data Read Error,二级数据缓存发生了数据读取错误。
总之,没被你发出来的内容还有MCi_ADDRV MSR和MCi_MISC MSR的值。以及你没有去看WHEA_ERROR_RECORD结构体的内容,你试着自己仔细阅读并分析成因。
(我玩过的机器不多没遇到过)
参考资料:Intel 64 and IA-32 Architecture Software Developer's Manual, Volume 3B, Chapter 15 Machine-Check Architecture.
MSDN上关于0x124蓝屏的解释:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0x124---whea-uncorrectable-error


以上内容对你来讲恐怕没什么建设性的东西。下面讲讲我猜的有些建设性的东西。
你确定关掉EPT就没事了么?
有一种情况是:系统正在更新微码。系统试图更新处理器微码,则会造成处理器产生不可预测的行为。我在四代i7上见过奇怪的#PF异常:明明页是正常的,却偏偏产生了页异常。我拦截掉微码更新后这诡异的蓝屏就不见了,我把这个诡异的页异常的原因归结为“系统在VMX Non-Root Operation时更新微码造成了不可预测的行为”。理论上不论你是否开启EPT都会产生“不可预测”的行为。不过“不可预测”这个词的语义范围太广,可以解释为没开EPT时会正常,开了之后就不正常。
如果我正巧言中了,那说白了就是踩了没读透Intel文档的坑,解决方法是:
设置IA32_BIOS_UPDT_TRIG这个MSR的写入拦截(MSR Index=0x79,写入的值是一个虚拟地址)。如果你的VT是以Windows驱动的方式加载的,那么只需要按原样把要写入的MSR的值转发到那个寄存器里即可。原理就是把更新微码的时态从VMX Non-Root Operation搬到VMX Root Operation里。如果你是搞安全的,你可以过滤写入的微码的具体内容,防止攻击者试图给处理器装载恶意微码。(但微码的数据结构未文档化,唯一靠谱的过滤方式只有判断是否为已知的微码,Intel会在GitHub上更新所有处理器的微码,也就是说只能阻止第三方微码,不论恶意与否)
值得注意的是更新微码的时机是不定的,从原则上讲任何时候都有可能,未必只是在操作系统或者固件启动的时候才会更新微码。这个策略主要取决于你的机器主板,机器的主板决定了固件更新微码的策略,从而决定了操作系统更新微码的策略。这还会随着固件版本的不同,操作系统的版本不同导致不一样的更新策略。你的机器的u是intel的,那你应该能注意到mcupdate_GenuineIntel.dll这么一个内核模块,它就是更新intel处理器微码的。(在AMD的u上就能看到mcupdate_AuthenticAMD.dll)。这可以解释为什么你遇到有的机器好端端的。另外就是虚拟机里无法更新微码,因此你在虚拟机里就一切正常。
如果这个解决方法无效,那。。。(你自己慢慢分析吧我就不知道啥情况了哈哈哈哈哈哈哈哈哈哈)
参考资料:Intel 64 and IA-32 Architecture Software Developer's Manual, Volume 3C, Chapter 32.4: Microcode Update Facility.

评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100 很给力!

查看全部评分

1

主题

62

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
99
 楼主| 发表于 2021-1-7 09:35:59 | 显示全部楼层
tangptr@126.com 发表于 2021-1-7 00:53
这是产生了#MC异常。看你的DMP应该是取到了MCA错误状态码0xBE000000`01001136,那么
MCi_STATUS.UC=1:错误 ...

多谢大佬,又学到一些知识  _(:з)∠)_

1

主题

62

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
99
 楼主| 发表于 2021-1-7 12:50:50 | 显示全部楼层
tangptr@126.com 发表于 2021-1-7 00:53
这是产生了#MC异常。看你的DMP应该是取到了MCA错误状态码0xBE000000`01001136,那么
MCi_STATUS.UC=1:错误 ...

再次经过多次测试,发现只有开启EPT的时候才会出现这种问题
更新微码问题的话,MSR位图中我设置了IA32_BIOS_UPDT_TRIG的Read和Write,Exit后在Handler中对IA32_BIOS_UPDT_TRIG寄存器写入,不过依旧没能解决这个问题。

WHEA_ERROR_RECORD结构体的内容确实是L2缓存的错误
===============================================================================
Common Platform Error Record @ ffffda0e35509028
-------------------------------------------------------------------------------
Record Id     : 01d6e415f59f96f5
Severity      : Fatal (1)
Length        : 928
Creator       : Microsoft
Notify Type   : Machine Check Exception
Timestamp     : 1/6/2021 10:25:33 (UTC)
Flags         : 0x00000000

===============================================================================
Section 0     : Processor Generic
-------------------------------------------------------------------------------
Descriptor    @ ffffda0e355090a8
Section       @ ffffda0e35509180
Offset        : 344
Length        : 192
Flags         : 0x00000001 Primary
Severity      : Fatal

Proc. Type    : x86/x64
Instr. Set    : x64
Error Type    : Cache error
Operation     : Data Read
Flags         : 0x00
Level         : 2
CPU Version   : 0x00000000000906ea
Processor ID  : 0x0000000000000000

===============================================================================
Section 1     : x86/x64 Processor Specific
-------------------------------------------------------------------------------
Descriptor    @ ffffda0e355090f0
Section       @ ffffda0e35509240
Offset        : 536
Length        : 128
Flags         : 0x00000000
Severity      : Fatal

Local APIC Id : 0x0000000000000000
CPU Id        : ea 06 09 00 00 08 10 00 - 9f fb fa 7f ff fb eb bf
                00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
                00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00

Proc. Info 0  @ ffffda0e35509240

===============================================================================
Section 2     : x86/x64 MCA
-------------------------------------------------------------------------------
Descriptor    @ ffffda0e35509138
Section       @ ffffda0e355092c0
Offset        : 664
Length        : 264
Flags         : 0x00000000
Severity      : Fatal

Error         : DCACHEL2_DRD_ERR (Proc 0 Bank 6)
  Status      : 0xfe00000001001136
  Address     : 0x00000000e00080c0
  Misc.       : 0x0000043044000086

我试着更新过BIOS,但是也没有什么效果,确实是个有些难受的问题,哈哈。。。
我会试着通过翻手册,找到这个问题(*^▽^*)

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2021-2-19 11:41:18 | 显示全部楼层
kanren 发表于 2021-1-7 12:50
再次经过多次测试,发现只有开启EPT的时候才会出现这种问题
更新微码问题的话,MSR位图中我设置了IA32_BI ...

我回头想了一下,EPT也确实和缓存系统相关联。如果EPT页指定的缓存类型与Host产生冲突那好像是会使得缓存出问题。按照手册28.2.7.2节中的最后一句“The MTRRs have no effect on the memory type used for an access to a guest-physical address.”就是说Host的MTRR完全不影响按GPA访问的内存的缓存性质。换言之,虽然在玩GPA=HPA的映射,但此时缓存性质与MTRR无关了,只按照EPT里的来。
怎么做:按照所有MTRR MSR寄存器枚举所有物理地址的缓存类型,按缓存类型在EPT页中指定缓存类型。(也就是EPT最终表项的“Memory Type”)
能不能成功?不知道,我猜能。

1

主题

62

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
99
 楼主| 发表于 2021-2-24 14:15:19 | 显示全部楼层
tangptr@126.com 发表于 2021-2-19 11:41
我回头想了一下,EPT也确实和缓存系统相关联。如果EPT页指定的缓存类型与Host产生冲突那好像是会使得缓存 ...

对于这点,SimpleVisor与gbhv都有做处理,我也移植过这里的代码,但是依旧会出现这样的问题(SimpleVisor与gbhv也会出现),目前没有必须用到VT的地方,而且手头没有其他的电脑,所以目前这个项目暂停下来了。。。
QQ截图20210224140943.png
QQ图片20210224140905.png

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2021-2-24 20:00:11 | 显示全部楼层
kanren 发表于 2021-2-24 14:15
对于这点,SimpleVisor与gbhv都有做处理,我也移植过这里的代码,但是依旧会出现这样的问题(SimpleVisor ...

好像不对,这俩都没有去掉PAT性质,这会使得处理器把EPT上标记的内存属性再和PAT结合计算,应该再把无视PAT选项加上。

1

主题

62

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
99
 楼主| 发表于 2021-2-25 13:13:36 | 显示全部楼层
tangptr@126.com 发表于 2021-2-24 20:00
好像不对,这俩都没有去掉PAT性质,这会使得处理器把EPT上标记的内存属性再和PAT结合计算,应该再把无视P ...

这几天抽空去多了解一下试试看,谢谢!

1

主题

62

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
99
 楼主| 发表于 2021-2-25 18:39:24 | 显示全部楼层
tangptr@126.com 发表于 2021-2-24 20:00
好像不对,这俩都没有去掉PAT性质,这会使得处理器把EPT上标记的内存属性再和PAT结合计算,应该再把无视P ...

请问无视PAT的选项是指什么?我对这个还是了解甚少。。。

76

主题

267

帖子

9

精华

贵宾会员

Rank: 2Rank: 2

积分
15599
发表于 2021-2-26 06:32:20 | 显示全部楼层
kanren 发表于 2021-2-25 18:39
请问无视PAT的选项是指什么?我对这个还是了解甚少。。。

当然是应该去仔细研究Intel的文档呗。
Capture.JPG
按照手册上第三卷的第28.2.7.2章节里的说法,红线划出的是说最后一级表项的第6位表示是否无视PAT。
蓝线指出,如果该位复位,就是不无视PAT,于是处理器就会把最后一级表项的Memory Type域结合PAT选择计算出该页的内存类型。
红框指出,如果该位置位,则无视PAT,于是处理器直接把最后一级表项的Memory Type作为该页的内存类型。
稍微解释一下蓝线的意思吧:
举例说明可能比较容易。通常来说,多数页的内存类型是回写缓存类型,也就是6,那么如果不无视PAT,处理器就会去PAT(Index=0x277)这个MSR里找PA6域(第48位至第50位)作为内存类型。如果这里不是6,那这个页的内存类型就不是回写缓存类型了。
Capture.PNG
碰巧的是,我读到的PAT的值是0x00070106`00070106。也就是说PA6域的值偏偏就不是6,而是7。也就是未缓存类型(Uncached, UC-)。
总之,把所有最后一级页表项的第6位置位就行了。
此外,原则上还应该拦截MTRR的修改,按所修改MSR的值去修改EPT,然后再回到Guest(虽然目测系统不太可能会去改,但不排除系统会有一些奇怪的程序会试图改它)。但因为修改了分页结构,所以不要忘了用invept指令冲掉EPT TLB。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-3-29 15:12 , Processed in 0.032479 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表