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, :movx19,x0//保存paged_table的地址到x19中movx20,x2//保存device tree的地址到x20中adrx0,reset_vect_table//获取异常向量表的地址msrvbar_el1,x0//将异常向量表的地址写入VBAR寄存器中isb//设置系统控制寄存器,禁止cache等操作mrsx0,sctlr_el1movx1, #(SCTLR_I | SCTLR_A | SCTLR_SA)orrx0,x0,x1msrsctlr_el1,x0isb//复制OP-TEE镜像中的init部分到内存中copy_init:ldpx3,x4,[x1],#16stpx3,x4,[x0],#16cmpx0,x2b.ltcopy_initmsrdaifclr,#DAIFBIT_ABT//使能异常处理adrx0,__text_start//将__text_start的地址保存到x0中adrpx1,__end//将_end的地址保存到x1中addx1,x1, :lo12:__endsubx1,x1,x0blinv_dcache_range//关闭数据cacheblconsole_init//初始化consoleblcore_init_mmu_map//初始化MMU的页表blcore_init_mmu_regs//将MMU的页表信息写入TTBRx寄存器中blcpu_mmu_enable//使能MMUblcpu_mmu_enable_icache//使能MMU的指令cacheblcpu_mmu_enable_dcache//使能MMU的数据cachemovx0,x19//将paged_table的地址保存到x0中movx1,#-1movx2,x20//将device tree的地址保存到x2中//使用device tree和paged_table作为参数开始OP-TEE的启动blgeneric_boot_init_primarymovx19,x0adrx0,__text_startaddx1,x1, :lo12:__endsubx1,x1,x0blflush_dcache_range//刷新数据cacheblthread_clr_boot_thread//清空系统线程的状态movx1,x19//将TEESMC_OPTEED_RETURN_ENTRY_DONE保存到x0movx0,#TEESMC_OPTEED_RETURN_ENTRY_DONEsmc#0//调用SMC切换到normal world状态b. /*SMC不应该有返回操作 */END_FUNC_start
全部0条评论
快来发表一下你的评论吧 !