ARMv8从el3变为el1安全

时间:2017-09-13 09:41:53

标签: raspberry-pi3 arm64 armv8

我正在尝试从el3更改为el1安全但我继续让处理器挂在某处。我的代码运行在Cortex-A53(raspberry pi 3)上。现在我只能从EL3掉到EL2。

/* Code to try jump to EL1 secure */
MSR SCTLR_EL1, XZR

MRS X0, SCR_EL3
ORR X0, X0, #(1<<10) // RW EL1 Execution state is AArch64.
MSR SCR_EL3, x0
MOV X0, #0b00101 // DAIF=0000
MSR SPSR_EL3, X0

ADR X0, read_core
MSR ELR_EL3, X0 // EL1 code.
ERET

read_core:

/* set stack poiter */
mov sp, #0x3F000000

/* Jump to kernel main entry point */
bl  kernel_entry

有人能指出我在这里可能出错的地方吗?

事先提前

1 个答案:

答案 0 :(得分:0)

最后我设法将rpi3放到了安全el1上。如果有人有兴趣检查代码。

drop_el1_secure:

/* Try drop from el3 to el1 secure */

/*=============================================================*/
/*      Enable FP/SIMD at EL1                                  */
/*=============================================================*/
mov x0, #3 << 20
msr cpacr_el1, x0           /* Enable FP/SIMD at EL1 */

/*=============================================================*/
/*      Initialize sctlr_el1                                   */
/*=============================================================*/
mov x0, xzr
orr x0, x0, #(1 << 29)          /* Checking http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500d/CIHDIEBD.html */
orr x0, x0, #(1 << 28)          /* Bits 29,28,23,22,20,11 should be 1 (res1 on documentation) */
orr x0, x0, #(1 << 23)
orr x0, x0, #(1 << 22)
orr x0, x0, #(1 << 20)
orr x0, x0, #(1 << 11)
msr sctlr_el1, x0

/*=============================================================*/
/*      Initialize scr_el3                                     */
/*=============================================================*/
mrs x0, scr_el3
orr x0, x0, #(1<<10)        /* Lower EL is 64bits */
msr scr_el3, x0

/*=============================================================*/
/*      Initialize spsr_el3                                    */
/*=============================================================*/
mov x0, xzr
mov x0, #0b00101            /* EL1 */
orr x0, x0, #(1 << 8)       /* Enable SError and External Abort. */
orr x0, x0, #(1 << 7)       /* IRQ interrupt Process state mask. */
orr x0, x0, #(1 << 6)       /* FIQ interrupt Process state mask. */
msr spsr_el3, x0

/*=============================================================*/
/*      Initialize elr_el3                                     */
/*=============================================================*/
adr x0, el1_secure
msr elr_el3, x0

eret

el1_secure:   bl call_kernel_main