El3 级别运行环境初始化定义在 include/commom/aarch64/el3_common_macros.S文件中
.macro el3_entrypoint_common \
_set_endian, _warm_boot_mailbox, _secondary_cold_boot, \
_init_memory, _init_c_runtime, _exception_vectors
.if \_set_endian
mrs x0, sctlr_el3
bic x0, x0, #SCTLR_EE_BIT
msr sctlr_el3, x0
isb
.endif /* _set_endian */
.if \_warm_boot_mailbox
bl plat_get_my_entrypoint
cbz x0, do_cold_boot
br x0
do_cold_boot:
.endif /* _warm_boot_mailbox */
.if \_secondary_cold_boot
bl plat_is_my_cpu_primary
cbnz w0, do_primary_cold_boot
secondary_panic:
b secondary_panic
do_primary_cold_boot:
.endif
bl reset_handler
el3_arch_init_common \_exception_vectors
.if \_init_memory
bl platform_mem_init
.endif /* _init_memory */
.if \_init_c_runtime
这是在冷启动过程中需要执行的超级动作或在EL3中启动热启动。该代码由BL1和BL31共享。
该宏将始终执行重置处理,架构初始化和堆栈设置。其余的操作是可选的,因为它们可能不是需要,这取决于调用此宏的上下文。这是为什么这个宏被参数化了每个参数允许启用/禁用一些行动。
- _set_endian:
宏需要配置数据访问的字节顺序。
- _warm_boot_mailbox:
宏需要检测引导类型(冷/暖)。该检测是基于平台entrypoint地址:如果为零那么它是一个冷启动,否则它是一个温暖的启动。在后一种情况下,这个宏跳到平台entrypoint地址。
- _secondary_cold_boot:
宏是否需要识别正在调用它的CPU:primaryCPU或二级CPU。主CPU将被允许进行平台初始化,而次级将被放在一个同时平台特定的状态。如果主叫方知道这个宏只会被主CPU调用那么此参数可以定义为0以跳过此步骤。
- _init_memory:
宏需要初始化内存。
- _init_c_runtime:
宏是否需要初始化C运行时环境。
- _exception_vectors:
异常向量的地址在VBAR_EL3寄存器中编程。