reset_primary函数的执行流程

描述

reset_primary函数的执行

以CONFIG_BOOT_SYNC_CPU使能为例, 在使能PSCI系统中,不需要使能此宏

内存
reset_primary函数执行流程

reset_primary函数是OP-TEE对CPU主核进行初始化操作的函数,该函数会初始化系统的MMU,并调用generic_boot_init_primary函数完成OP-TEE运行环境的建立, 然后触发sev操作来唤醒从核待所有CPU核都启动完成之后 ,OP-TEE会触发安全监控模式调用(smc), 通知系统OP-TEE启动已完成并将CPU的状态切换回到正常世界状态 ,该函数的执行流程如图所示。

reset_primary函数的主要代码内容如下:

LOCAL_FUNC reset_primary , :
    UNWIND( .fnstart)
    UNWIND( .cantunwind)
        /* 清空BSS段 */
        ldr r0, =__bss_start
        ldr r1, =__bss_end
        mov r2, #0
        mov r3, #0
    clear_bss:
        stmia    r0! , {r2, r3}
        cmp r0, r1
        bls clear_bss
    /* 初始化内存shadow区域,并设定权限 */
    #ifdef CFG_CORE_SANITIZE_KADDRESS
        ldr r0, =__asan_shadow_start
        ldr r1, =__asan_shadow_end
        mov r2, #ASAN_DATA_RED_ZONE
    shadow_no_access:
        str r2, [r0], #4
        cmp r0, r1
        bls shadow_no_access
        /* 标记整个栈区域准备完成 */
        ldr r2, =CFG_ASAN_SHADOW_OFFSET
        ldr r0, =__nozi_stack_start
        lsr r0, r0, #ASAN_BLOCK_SHIFT
        add r0, r0, r2
        ldr r1, =__nozi_stack_end
        lsr r1, r1, #ASAN_BLOCK_SHIFT
        add r1, r1, r2
        mov r2, #0
    shadow_stack_access_ok:
        strb     r2, [r0], #1
        cmp r0, r1
        bls shadow_stack_access_ok
    #endif
        set_sp                                       //设定sp寄存器
        bl  plat_cpu_reset_late //core的后期初始化,可根据具体情况执行特定操作
        bl  console_init                            //初始化log数据
        inval_cache_vrange(__text_start, __end) //在初始化阶段禁止数据cache
        bl  core_init_mmu_map                      //初始化MMU页表
        bl  core_init_mmu_regs                     //将MMU页表信息写入MMU的TTBRx寄存器中
        bl  cpu_mmu_enable                         //使能MMU
        bl  cpu_mmu_enable_icache                 //使能MMU的指令cache
        bl  cpu_mmu_enable_dcache                 //使能MMU的数据cache
        mov r0, r4                                   /* 页表区域的地址 */
        mov r1, r5                                   /* 非安全入口地址 */
        mov r2, r6                                   /* 设备树地址 */
        //带入paged_table、Linux内核的地址、设备树信息进入OP-TEE系统运行环境的建立
        bl  generic_boot_init_primary
              mov r4, r0
              flush_cache_vrange(__text_start, __end) //刷新cache
              cpu_is_ready                                //设定CPU主核已经ready
              flush_cpu_semaphores                       //刷新信号量通知从核启动
              wait_secondary                              //等待从核启动完成
              bl  thread_clr_boot_thread                //清空系统各thread的状态
          #if defined(CFG_WITH_ARM_TRUSTED_FW)
              mov r1, r4  //如果支持ATF,则将OP-TEE的handle返回给ATF
          #else
              mov r4, #0
              mov r3, r6
              mov r2, r7
              mov r1, #0
          #endif /* CFG_WITH_ARM_TRUSTED_FW */
              mov r0, #TEESMC_OPTEED_RETURN_ENTRY_DONE     //设定返回给Normal World的值
              smc #0  //调用SMC操作切回到Normal World状态,OP-TEE启动结束
              b    .    /* SMC should not return */
          UNWIND( .fnend)
          END_FUNC reset_primary
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

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

×
20
完善资料,
赚取积分