0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

reset_primary函数的执行流程

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-02 18:06 次阅读

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

    关注

    8

    文章

    2767

    浏览量

    72772
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • TEE
    TEE
    +关注

    关注

    0

    文章

    28

    浏览量

    10146
  • 系统
    +关注

    关注

    1

    文章

    981

    浏览量

    21036
收藏 人收藏

    评论

    相关推荐

    U-boot的执行流程

    本文主要讲述了U-boot的执行流程
    发表于 07-14 16:58 468次阅读
    U-boot的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>

    STM32在复位上电后会立即执行main函数

    ,在执行main函数前,STM32会依次经历:硬件选择启动模式读取启动模式对应存储器的中断向量表初始化栈初始化PC指针,指向Reset Handler初始化系统时钟执行C库
    发表于 01-21 11:13

    SOC的多核启动流程详解

    (bl31warmentrypoint或平台自定义函数)处开始执行.总结 (针对本文示例情况:reset地址是可编程的、cold boot的时候只启动一个cpu):开机一上电只有Primary
    发表于 02-21 15:11

    S32K3功能复位导致Reset_B引脚执行复位动作的原因?

    会使PTA5:Reset_B也执行复位动作。我正在代码中执行任务循环以执行函数重置。开发板上实验问题描述如下图: 我也关闭了功能重置升级功
    发表于 03-17 07:47

    RESET原理及故障分析

    我们知道,对于计算机用户来说,RESET在多数情况下都是一种正常的人为操作。最熟悉的就是在机箱前面板上有一个专门用于执行RESET操作的RESET按键,还有在某些高级操作系统如WIN9
    发表于 09-21 08:50 3次下载
    <b class='flag-5'>RESET</b>原理及故障分析

    51单片机的程序执行流程是怎么样的

    单片机是没有上操作系统的东西,在keil中编写的代码都是裸机代码,深入编写裸机代码有助于了解硬件的特性。若不是硬件特性已定的情况之下的其它流程都是代码作祟。忽然想到来探探51单片机的执行流程。这个
    发表于 08-19 17:31 2次下载
    51单片机的程序<b class='flag-5'>执行</b><b class='flag-5'>流程</b>是怎么样的

    MySQL流程函数的操作方法

    流程函数是一类很常用的函数,我们可以通过流程函数在SQL语句中实现条件选择,能实现我们想要的条件判断。下表列出了MySQL中的
    的头像 发表于 04-16 17:17 2831次阅读
    MySQL<b class='flag-5'>流程</b><b class='flag-5'>函数</b>的操作方法

    如何使用Arduino millis函数执行多任务处理

    在本教程中,我们将学习Arduino 如何使用 Arduino millis 函数执行多任务处理。通常在 Arduino 中使用delay()函数执行LED 闪烁等周期性任务,但此
    的头像 发表于 09-06 14:41 1.1w次阅读
    如何使用Arduino millis<b class='flag-5'>函数</b><b class='flag-5'>执行</b>多任务处理

    AURIX™ TC3xx芯片的firmware和用户程序启动流程

    Startup Firmware根据Reset方式的不同,执行流程也不一样。例如,Cold Power Reset后Startup Firmware
    的头像 发表于 05-31 15:23 1461次阅读
    AURIX™ TC3xx芯片的firmware和用户程序启动<b class='flag-5'>流程</b>

    linux操作系统中的进程创建和销毁函数解析

    第一次遇见创建进程是在Linux启动流程中,reset_init函数调用kernel_thread函数创建了2个内核进程:kernel_init和kthreadd。
    发表于 06-26 09:12 413次阅读
    linux操作系统中的进程创建和销毁<b class='flag-5'>函数</b>解析

    Linux bind的核心执行函数

    bind的核心执行函数 bind系统调用的核心函数调用流程如下: SYSCALL_DEFINE3( bind , int , fd, struct sockaddr __user
    的头像 发表于 07-31 10:51 353次阅读

    GIC驱动的执行流程是什么

    驱动流程分析 GIC驱动的执行流程如下图所示: 首先需要了解一下链接脚本 vmlinux.lds ,脚本中定义了一个 __irqchip_of_table 段,该段用于存放中断控制器信息,用于最终
    的头像 发表于 09-28 15:09 237次阅读
    GIC驱动的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>是什么

    OP-TEE的内核初始化函数调用

    OP-TEE内核组件等操作。该函数执行流程如图所示。 generic_boot_init_primary函数
    的头像 发表于 11-02 18:18 357次阅读
    OP-TEE的内核初始化<b class='flag-5'>函数</b>调用

    bootm命令的执行流程

    Bootm命令用来从memory启动内核,bootm命令的执行流程如下图所示。 在串口终端输入bootm命令后,执行do_bootm函数来完成相应的功能。Do_bootm
    的头像 发表于 12-04 17:33 427次阅读
    bootm命令的<b class='flag-5'>执行</b><b class='flag-5'>流程</b>

    secondary cpu执行流程介绍

    secondary cpu执行流程 aarch64架构secondary cpu的内核入口函数为secondary_entry(arch/arm64/kernel/head.S),以下为其执行
    的头像 发表于 12-05 16:12 336次阅读
    secondary cpu<b class='flag-5'>执行</b><b class='flag-5'>流程</b>介绍