ARM32的OP-TEE与ARM64的OP-TEE启动过程大致相同。ARM64的OP-TEE的_start函数定义在generic_entry_a64.S文件中,而且该函数不像ARM32位系统一样会进入reset中去执行OP-TEE启动,而是直接在_start函数中就完成整个启动过程,
在进行初始化操作之前会注册一个异常向量表,该异常向量表会在唤醒从核阶段被使用,当主核通知唤醒从核时,从核会查找该异常向量表,然后命中对应的处理函数并执行从核的启动操作。
ARM64的OP-TEE的启动过程与ARM32的OP-TEE的启动过程几乎一样。ARM64位系统的_start函数内容说明如下:
FUNC _start , :
mov x19, x0 //保存paged_table的地址到x19中
mov x20, x2 //保存device tree的地址到x20中
adr x0, reset_vect_table //获取异常向量表的地址
msr vbar_el1, x0 //将异常向量表的地址写入VBAR寄存器中
isb
//设置系统控制寄存器,禁止cache等操作
mrs x0, sctlr_el1
mov x1, #(SCTLR_I | SCTLR_A | SCTLR_SA)
orr x0, x0, x1
msr sctlr_el1, x0
isb
//复制OP-TEE镜像中的init部分到内存中
copy_init:
ldp x3, x4, [x1], #16
stp x3, x4, [x0], #16
cmp x0, x2
b.lt copy_init
msr daifclr, #DAIFBIT_ABT //使能异常处理
adr x0, __text_start //将__text_start的地址保存到x0中
adrp x1, __end //将_end的地址保存到x1中
add x1, x1, :lo12:__end
sub x1, x1, x0
bl inv_dcache_range //关闭数据cache
bl console_init //初始化console
bl core_init_mmu_map //初始化MMU的页表
bl core_init_mmu_regs //将MMU的页表信息写入TTBRx寄存器中
bl cpu_mmu_enable //使能MMU
bl cpu_mmu_enable_icache //使能MMU的指令cache
bl cpu_mmu_enable_dcache //使能MMU的数据cache
mov x0, x19 //将paged_table的地址保存到x0中
mov x1, #-1
mov x2, x20 //将device tree的地址保存到x2中
//使用device tree和paged_table作为参数开始OP-TEE的启动
bl generic_boot_init_primary
mov x19, x0
adr x0, __text_start
add x1, x1, :lo12:__end
sub x1, x1, x0
bl flush_dcache_range //刷新数据cache
bl thread_clr_boot_thread //清空系统线程的状态
mov x1, x19
//将TEESMC_OPTEED_RETURN_ENTRY_DONE保存到x0
mov x0, #TEESMC_OPTEED_RETURN_ENTRY_DONE
smc #0 //调用SMC切换到normal world状态
b . /* SMC不应该有返回操作 */
END_FUNC _start
全部0条评论
快来发表一下你的评论吧 !