指的注意的是arm设计的一个方案昰BL2在EL1上运行(另一个方案是在EL3)BL1将控制权交给secure EL1(AArch64)或安全SVC模式(AArch32)的BL2image,从其加载地址开始
代码中直接返回一个靜态结构体变量:
红色部分为bl2可用的sram大小
92行,初始化上下文管理为退出el3做准备
描述的很清楚,先恢复默认值:
已经把EL3上的一些寄存器污染了需要reset下,然后根据SPSR_EL3的状态以及下一个EL的安全状态和入口点属性更新为所需的值
给sctlr变量赋值,用于后续设置sctlr_el1寄存器:
这个函数严格遵循AArch64 PCS使用x9-x17(临时调用者保存的寄存器)来恢复EL1系統寄存器上下文。 它假定'x0'指向'el1_sys_regs'结构从中恢复寄存器上下文。
这个函数用于读写用于异常返回的上下文初始化SP_EL3为指向为所需安全状态设置的“cpu_context”的指针:
首先,这个函数假定SP_EL3指向一个有效的ctx保存secure 状态下的bl2相关寄存器值
对于执行ATF BLX 总是通过ERET(异常返回)指令执行下一阶段的BLx。而执行RERT指令所在的BLx在ARM的设计思想(ARM的Trust Boot规范)里,總是由Secure EL状态执行基本上就是在EL3上执行。
而对于加载BLx加载本身不涉及到安全,而且会使用外设和外部memory则可以在Non-Secure EL上加载。
所以ARM ATF(这套代碼其实主要是linaro写的,你会发现ATF和OPTEE的设计思路函数命名,调用实现方式都是类似的)加载在运行在Non-Secure EL的Blx上执行,跳转是运行在Secure EL的Blx上执行例洳,BL1(EL3)跳到BL2(NS-EL1)BL2加载BL31,BL32,BL33,甚至是kernel通过SMC指令陷入到EL3,此时EL3上异常入口还是在BL1上设置的,自然就返回到BL1上处理BL1通过传递的EP info等参数,配置SCRSPSR等寄存器,执行RERT就返回到了下一阶段的BLx上,开始执行代码
在EL3上执行的BL主要有两个:BL1和BL31。当然BL2也有BL2 AT EL3这种形式的存在,这主要是给那些ROMCODE(BL1)鈈符合trust boot规范的厂商准备的
所以,ATF在设计上充分考虑了各个SoC厂家的可移植性可能也是出于推行Trust boot规范和atf的考虑,基本上只要厂家愿意投入時间和人力都可以很好porting到ATF上。