This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

ARMv8-A的SP_EL0的安全?

在ARMv8-A中,EL1/2/3除了可以自身的堆栈寄存器SP_ELn以外,还可以使用SP_EL0。

与此同时EL0也可以使用SP_EL0。

 我想在EL0的应用程序应该可以通过SP_EL0,访问到EL1/2/3的数据,这岂不是不安全?

希望帮忙解答,谢谢!

Parents
  • 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]

    ======================

Reply
  • 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]

    ======================

Children
No data