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文章
3023浏览量
74030 -
函数
+关注
关注
3文章
4329浏览量
62588 -
TEE
+关注
关注
0文章
29浏览量
10260 -
系统
+关注
关注
1文章
1016浏览量
21338
发布评论请先 登录
相关推荐
单片机main函数在中断函数里执行?
最近看了硬汉分享的一个内容:为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?
发表于 10-24 11:04
•962次阅读
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次下载
mfc程序执行流程小结,MFC程序的执行顺序
摘要:本文章主要以MFC程序的执行流程、执行顺序等执行过程的剖析做出的结论,下面一起来看看原文的具体介绍。
发表于 12-08 15:48
•9544次阅读
如何使用Arduino millis函数执行多任务处理
在本教程中,我们将学习Arduino 如何使用 Arduino millis 函数执行多任务处理。通常在 Arduino 中使用delay()函数来执行LED 闪烁等周期性任务,但此
AURIX™ TC3xx芯片的firmware和用户程序启动流程
Startup Firmware根据Reset方式的不同,执行的流程也不一样。例如,Cold Power Reset后Startup Firmware
Linux bind的核心执行函数
bind的核心执行函数 bind系统调用的核心函数调用流程如下: SYSCALL_DEFINE3( bind , int , fd, struct sockaddr __user
GIC驱动的执行流程是什么
驱动流程分析 GIC驱动的执行流程如下图所示: 首先需要了解一下链接脚本 vmlinux.lds ,脚本中定义了一个 __irqchip_of_table 段,该段用于存放中断控制器信息,用于最终来
secondary cpu执行流程介绍
secondary cpu执行流程 aarch64架构secondary cpu的内核入口函数为secondary_entry(arch/arm64/kernel/head.S),以下为其执行
评论