reset_primary函數(shù)的執(zhí)行
以CONFIG_BOOT_SYNC_CPU使能為例, 在使能PSCI系統(tǒng)中,不需要使能此宏 。

reset_primary函數(shù)執(zhí)行流程
reset_primary函數(shù)是OP-TEE對CPU主核進(jìn)行初始化操作的函數(shù),該函數(shù)會初始化系統(tǒng)的MMU,并調(diào)用generic_boot_init_primary函數(shù)完成OP-TEE運(yùn)行環(huán)境的建立, 然后觸發(fā)sev操作來喚醒從核 , 待所有CPU核都啟動完成之后 ,OP-TEE會觸發(fā)安全監(jiān)控模式調(diào)用(smc), 通知系統(tǒng)OP-TEE啟動已完成并將CPU的狀態(tài)切換回到正常世界狀態(tài) ,該函數(shù)的執(zhí)行流程如圖所示。
reset_primary函數(shù)的主要代碼內(nèi)容如下:
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
/* 初始化內(nèi)存shadow區(qū)域,并設(shè)定權(quán)限 */
#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
/* 標(biāo)記整個棧區(qū)域準(zhǔn)備完成 */
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 //設(shè)定sp寄存器
bl plat_cpu_reset_late //core的后期初始化,可根據(jù)具體情況執(zhí)行特定操作
bl console_init //初始化log數(shù)據(jù)
inval_cache_vrange(__text_start, __end) //在初始化階段禁止數(shù)據(jù)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的數(shù)據(jù)cache
mov r0, r4 /* 頁表區(qū)域的地址 */
mov r1, r5 /* 非安全入口地址 */
mov r2, r6 /* 設(shè)備樹地址 */
//帶入paged_table、Linux內(nèi)核的地址、設(shè)備樹信息進(jìn)入OP-TEE系統(tǒng)運(yùn)行環(huán)境的建立
bl generic_boot_init_primary
mov r4, r0
flush_cache_vrange(__text_start, __end) //刷新cache
cpu_is_ready //設(shè)定CPU主核已經(jīng)ready
flush_cpu_semaphores //刷新信號量通知從核啟動
wait_secondary //等待從核啟動完成
bl thread_clr_boot_thread //清空系統(tǒng)各thread的狀態(tài)
#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 //設(shè)定返回給Normal World的值
smc #0 //調(diào)用SMC操作切回到Normal World狀態(tài),OP-TEE啟動結(jié)束
b . /* SMC should not return */
UNWIND( .fnend)
END_FUNC reset_primary
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
內(nèi)存
+關(guān)注
關(guān)注
9文章
3238瀏覽量
76525 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4422瀏覽量
67867 -
TEE
+關(guān)注
關(guān)注
0文章
30瀏覽量
10709 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1047瀏覽量
22407
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
單片機(jī)main函數(shù)在中斷函數(shù)里執(zhí)行?
最近看了硬漢分享的一個內(nèi)容:為什么復(fù)位中斷服務(wù)程序里面直接調(diào)用的main函數(shù),難道所有程序都在復(fù)位中斷里面執(zhí)行的?
發(fā)表于 10-24 11:04
?1564次閱讀
STM32在復(fù)位上電后會立即執(zhí)行main函數(shù)嗎
,在執(zhí)行main函數(shù)前,STM32會依次經(jīng)歷:硬件選擇啟動模式讀取啟動模式對應(yīng)存儲器的中斷向量表初始化棧初始化PC指針,指向Reset Handler初始化系統(tǒng)時鐘執(zhí)行C庫
發(fā)表于 01-21 11:13
SOC的多核啟動流程詳解
(bl31warmentrypoint或平臺自定義函數(shù))處開始執(zhí)行.總結(jié) (針對本文示例情況:reset地址是可編程的、cold boot的時候只啟動一個cpu):開機(jī)一上電只有Primary
發(fā)表于 02-21 15:11
S32K3功能復(fù)位導(dǎo)致Reset_B引腳執(zhí)行復(fù)位動作的原因?
會使PTA5:Reset_B也執(zhí)行復(fù)位動作。我正在代碼中執(zhí)行任務(wù)循環(huán)以執(zhí)行函數(shù)重置。開發(fā)板上實(shí)驗問題描述如下圖: 我也關(guān)閉了功能重置升級功
發(fā)表于 03-17 07:47
RESET原理及故障分析
我們知道,對于計算機(jī)用戶來說,RESET在多數(shù)情況下都是一種正常的人為操作。最熟悉的就是在機(jī)箱前面板上有一個專門用于執(zhí)行RESET操作的RESET按鍵,還有在某些高級操作系統(tǒng)如WIN9
發(fā)表于 09-21 08:50
?3次下載
mfc程序執(zhí)行流程小結(jié),MFC程序的執(zhí)行順序
摘要:本文章主要以MFC程序的執(zhí)行流程、執(zhí)行順序等執(zhí)行過程的剖析做出的結(jié)論,下面一起來看看原文的具體介紹。
發(fā)表于 12-08 15:48
?1w次閱讀
MySQL流程函數(shù)的操作方法
流程函數(shù)是一類很常用的函數(shù),我們可以通過流程函數(shù)在SQL語句中實(shí)現(xiàn)條件選擇,能實(shí)現(xiàn)我們想要的條件判斷。下表列出了MySQL中的
如何使用Arduino millis函數(shù)執(zhí)行多任務(wù)處理
在本教程中,我們將學(xué)習(xí)Arduino 如何使用 Arduino millis 函數(shù)執(zhí)行多任務(wù)處理。通常在 Arduino 中使用delay()函數(shù)來執(zhí)行LED 閃爍等周期性任務(wù),但此
AURIX? TC3xx芯片的firmware和用戶程序啟動流程
Startup Firmware根據(jù)Reset方式的不同,執(zhí)行的流程也不一樣。例如,Cold Power Reset后Startup Firmware
Linux bind的核心執(zhí)行函數(shù)
bind的核心執(zhí)行函數(shù) bind系統(tǒng)調(diào)用的核心函數(shù)調(diào)用流程如下: SYSCALL_DEFINE3( bind , int , fd, struct sockaddr __user
GIC驅(qū)動的執(zhí)行流程是什么
驅(qū)動流程分析 GIC驅(qū)動的執(zhí)行流程如下圖所示: 首先需要了解一下鏈接腳本 vmlinux.lds ,腳本中定義了一個 __irqchip_of_table 段,該段用于存放中斷控制器信息,用于最終來
OP-TEE的內(nèi)核初始化函數(shù)調(diào)用
OP-TEE內(nèi)核組件等操作。該函數(shù)的執(zhí)行流程如圖所示。 generic_boot_init_primary函數(shù)
bootm命令的執(zhí)行流程
Bootm命令用來從memory啟動內(nèi)核,bootm命令的執(zhí)行流程如下圖所示。 在串口終端輸入bootm命令后,執(zhí)行do_bootm函數(shù)來完成相應(yīng)的功能。Do_bootm
secondary cpu執(zhí)行流程介紹
secondary cpu執(zhí)行流程 aarch64架構(gòu)secondary cpu的內(nèi)核入口函數(shù)為secondary_entry(arch/arm64/kernel/head.S),以下為其執(zhí)行
reset_primary函數(shù)的執(zhí)行流程
評論