如何判断导致MMU故障异常的翻译阶段(Stage1/Stage2)
EL1触发、EL2处理的数据中止:区分Stage1/Stage2故障
直接看寄存器字段是最可靠的方式,别靠EL级别组合猜——异常路由是可配置的,靠直觉容易错。具体步骤:
- 先读
ESR_EL2寄存器:- 先看EC字段(bits 31:26),必须是
0x24,这说明是来自EL1的数据中止。 - 再看S1PTW位(bit 11):
- 要是这位置1,那肯定是Stage1页表行走时出的故障,直接用
S1PTW_EL2拿相关地址就行。 - 要是这位置0,接着看FSC字段(bits 3:0):如果是翻译故障、权限故障这类,再结合EL2的配置判断:
- 要是EL2开了Stage2 MMU(
HCR_EL2.VM=1),查HPFAR_EL2——里面有有效IPA的话,就是Stage2故障;没效的话就是Stage1的普通访问故障,此时DFAR_EL1存的是故障虚拟地址。 - 要是EL2没开Stage2 MMU,那故障只能是Stage1的。
- 要是EL2开了Stage2 MMU(
- 要是这位置1,那肯定是Stage1页表行走时出的故障,直接用
- 先看EC字段(bits 31:26),必须是
- 先读
关于你说的靠源/目标EL推断的问题:
这方法确实不靠谱,因为HCR_EL2里的配置(比如VM、TGE位)能改异常路由。比如开了嵌套虚拟化或者Guest EL1的特定配置,Stage1故障也会跑到EL2,所以必须看寄存器字段,不能凭EL组合猜。
内容的提问来源于stack exchange,提问作者Alba Mendez
相关产品推荐
相关产品推荐

