ARM64位与ARM32位OP-TEE启动过程的差异

描述

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
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分