我是ARMv8架构的新手。我有以下基本问题:
我怎么知道当前执行模式AArch32或AArch64是什么?我应该阅读CPSR或SPSR以确定这一点吗?
目前的例外情况EL0 / 1/2/3是什么?
一旦出现异常,我是否可以读取任何寄存器以确定我是否处于Serror / Synchronous / IRQ / FIQ异常处理程序中。
TIA。
答案 0 :(得分:5)
#ifdef
)通过编译器提供的宏完成,如armclang
:__aarch64__
为64位,__arm__
为32位提供的宏MRS <Rn>, CPSR
将当前状态读入寄存器编号n。然后提取包含当前模式的位3:0。MRS <Xn>, CurrentEL
将当前EL读入寄存器编号n 答案 1 :(得分:1)
aarch64 C代码:
register uint64_t x0 __asm__ ("x0");
__asm__ ("mrs x0, CurrentEL;" : : : "%x0");
printf("EL = %" PRIu64 "\n", x0 >> 2);
手臂C代码:
register uint32_t r0 __asm__ ("r0");
__asm__ ("mrs r0, CPSR" : : : "%r0");
printf("EL = %" PRIu32 "\n", r0 & 0x1F);
但是,如ARMv8手册C5.2.1“ CurrentEL,当前异常级别”部分“可访问性”中所示,不能从EL0读取 CurrentEL
。试图在Linux用户环境中运行它会引发SIGILL。但是我想你可以捕捉到那个信号...
可从EL0读取CPSR。
在QEMU和gem5 with this setup上进行了测试。