e200z4核触发异常时,如何判断指令为定长或变长?
e200z4核心机器检查中断中VLE指令长度判断问题
我的问题与e200z4参考手册第5章相关。
我有一段错误修正代码,会根据异常发生时指令的长度,将程序计数器(PC)增加2字节或4字节,使用的核心为e200z4。该核心同时支持4字节定长指令和变长VLE指令。
目前遇到的问题:
- 我们只触发了机器检查中断(IVOR1),发生在开机/关机测试中,开机时中断时长递增、关机时固定。
- 按照逻辑,要判断是否启用VLE,需要检查异常综合征寄存器(ESR)的VLEMI位,但ESR的值始终为0x00000000,无法获取该位信息。
我想知道:
- 为什么CPU在机器检查中断发生时不提供VLE相关信息(比如ESR的VLEMI位)?
- 这种情况下,该如何判断中断发生时的指令是定长还是变长?
补充说明
注1:下方代码中的isOpCode32Bit用于解码操作码判断指令长度,但仅当isFixedLength为0(即(syndrome & VLEMI_MASK)等于1)时才有效。因此必须从syndrome中获取VLEMI的值,但ESR似乎始终为0x00,这是为什么?
注2:如前所述,我们始终进入IVOR1,且可以获取到中断发生前的指令地址。
相关代码
// IVOR1(机器检查中断汇编代码): (mfmcsr r7) // 将MCSR复制到寄存器7(参考手册第5章) (store r7 &syndrome) // IVOR2: (mfesr r7) // 将ESR复制到寄存器7(参考手册第5章) (store r7 &syndrome)
#define VLEMI_MASK 0x00000020uL isFixedLength = ((syndrome & VLEMI_MASK) == 0); if (isFixedLength || isOpCode32Bit) { PC += 4; // 指令为32位,将PC增加4 } else { PC += 2; // 指令为16位,将PC增加2 }
内容的提问来源于stack exchange,提问作者Xfce4
相关产品推荐
相关产品推荐

