在ARMv8-A中,EL1/2/3除了可以自身的堆栈寄存器SP_ELn以外,还可以使用SP_EL0。
与此同时EL0也可以使用SP_EL0。
我想在EL0的应用程序应该可以通过SP_EL0,访问到EL1/2/3的数据,这岂不是不安全?
希望帮忙解答,谢谢!
Hi Chendader,
例如产生异常taken 到EL3,默认是使用的SP_EL3,software在EL3可以选择使用EL0 的stack pointer,但是不是EL0的stack,这样做可以ATF可以使用一个小的stack来管理exception,处理异常时可以使用Runtime的stack。你可以看下面是ATF的code,在这种场景下EL0是访问不到EL3的内容的。
进入EL3时
=========================
/* Save the EL3 system registers needed to return from this exception */ mrs x0, spsr_el3 mrs x1, elr_el3 stp x0, x1, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]
/* Switch to the runtime stack i.e. SP_EL0 */ ldr x2, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] mov x20, sp msr spsel, #0 mov sp, x2
=====================
退出EL3时
===================
func el3_exit /* ----------------------------------------------------- * Save the current SP_EL0 i.e. the EL3 runtime stack * which will be used for handling the next SMC. Then * switch to SP_EL3 * ----------------------------------------------------- */ mov x17, sp msr spsel, #1 str x17, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]
======================