确定ARMv7-A上当前处理器模式的简单方法

pra*_*mic 6 assembly arm armv7

在ARMv7-A处理器上,我正在寻找一种从任何模式确定处理器的当前模式(用户,主管,IRQ等)的简单方法。这将使我能够动态决定是否执行某些操作,例如打主管电话或直接执行操作。

乍一看,这似乎很简单。在CPSR含有(M)模式比特,其确定处理器模式。

《 ARMv7-A体系结构参考手册》的修订版Cb的第1150页的B1.3.3节(程序状态寄存器)指出:

该字段只能写入PL1或更高版本。可以在任何模式下读取其值,但是ARM会不赞成在PL0执行的软件使用其值或尝试对其进行更改。

因此,CPSR.M在用户模式下不建议使用这些位,但是应该可以使用。

但是,继续实际使用MRS(我知道的唯一方法)读取CPSR 。ARM 1988年的B9.3.8节(MRS)指出:

在用户模式下执行并访问CPSR的MRS返回CPSR。{E,A,I,F,M}字段的UNKNOWN值。

由于这些字段是未知的,因此似乎没有一种从用户模式读取模式位的方法。是否存在从用户模式读取CPSR的替代方法,或者确定正在执行哪种模式代码的替代方法?

我可能会检测未定义的指令异常,并尝试在用户模式下执行非法指令,但我希望有更好的方法。