一种解决方法是在EL3中使用Secure Monitor Call(SMC)指令触发EL3到EL1的转换,并在Secure Monitor中切换到非安全EL1。以下是一个简单的示例代码:
/* 在EL3中触发SMC指令 */
asm(
"smc #0;"
);
/* 在Secure Monitor中切换到Non-Secure EL1 */
register unsigned long sp_user __asm("sp_el0");
register unsigned long elr_user __asm("elr_el1");
register unsigned long scr_user __asm("scr_el3");
scr_user |= (1 << 10); /* 将NS(Non-Secure)标志位置1 */
asm volatile("msr scr_el3, %0" : : "r"(scr_user));
asm volatile("msr sp_el0, %0" : : "r"(sp_user));
asm volatile("msr elr_el1, %0" : : "r"(elr_user));
/* 离开Secure Monitor,切换到EL1 */
eret();