bl2到bl31的跳轉(zhuǎn)
在bl2_main函數(shù)中最終會調(diào)用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl_ep_info,0,0,0,0,0,0)來觸發(fā)一個類型為BL1_SMC_RUN_IMAGE的安全監(jiān)控模式調(diào)用。
安全監(jiān)控模式調(diào)用的處理接口在bl1階段時被指定,調(diào)用該函數(shù)時傳入的command ID是BL1_SMC_RUN_IMAGE,故執(zhí)行該函數(shù)之后,系統(tǒng)將跳轉(zhuǎn)到中斷處理函數(shù)(smc_handler64)繼續(xù)執(zhí)行。該函數(shù)定義在bl1/aarch64/bl1_exception.S文件中。
該函數(shù)最終通過判定安全監(jiān)控模式調(diào)用的類型(在bl2中將會發(fā)送類型為BL1_SMC_RUN_IMAGE的smc)查看當(dāng)前的安全監(jiān)控模式調(diào)用是否是用于跳轉(zhuǎn),其內(nèi)容如下:
func smc_handler64
/* 判定觸發(fā)smc操作時帶入的參數(shù)是否為跳轉(zhuǎn)執(zhí)行image的操作 */
mov x30, #BL1_SMC_RUN_IMAGE //將BL1_SMC_RUN_IMAGE的值保存到x30
cmp x30, x0 //比較x30與x0的值
//如果x30與x0不同,則認(rèn)為是普通類型的異常,進(jìn)入smc_handler進(jìn)行處理
b.ne smc_handler
mrs x30, scr_el3 //獲取scr寄存器的值
tst x30, #SCR_NS_BIT //比較scr寄存器中的NS bit與SCR_NS_BIT是否相等
//如果當(dāng)前NS bit為非安全位,則證明不合法,產(chǎn)生異常
b.ne unexpected_sync_exception
//獲取offset和sp的值
ldr x30, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]
msr spsel, #0 //清空spsel中的值
mov sp, x30 //保存x30的值到sp寄存器,用于返回
mov x20, x1 //將x1中的數(shù)據(jù)保存到x20中
mov x0, x20 //將x20的數(shù)據(jù)保存到x0中
bl bl1_print_next_bl_ep_info //打印出bl3x鏡像文件信息
//傳入?yún)?shù)和bl3x入口函數(shù)的PC指針
ldp x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]
msr elr_el3, x0
msr spsr_el3, x1
ubfx x0, x1, #MODE_EL_SHIFT, #2 //設(shè)定ARM核模式
cmp x0, #MODE_EL3 //比較x0寄存器中的值是否為MODE_EL3
b.ne unexpected_sync_exception //如果x0中不是MODE_EL3,則產(chǎn)生異常
bl disable_mmu_icache_el3 //禁止MMU的指令cache
tlbi alle3
#if SPIN_ON_BL1_EXIT
bl print_debug_loop_message
debug_loop:
b debug_loop
#endif
mov x0, x20
bl bl1_plat_prepare_exit/
/* 設(shè)定返回參數(shù) */
ldp x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)]
ldp x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)]
ldp x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)]
ldp x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)]
eret //跳轉(zhuǎn)到bl3x執(zhí)行
endfunc smc_handler64
在此安全監(jiān)控模式調(diào)用處理過程中會將ARM核的狀態(tài)切到EL3運(yùn)行,即bl31是運(yùn)行在EL3中的。
-
ARM
+關(guān)注
關(guān)注
134文章
9312瀏覽量
375163 -
監(jiān)控
+關(guān)注
關(guān)注
6文章
2308瀏覽量
56703 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4371瀏覽量
64229
發(fā)布評論請先 登錄
【NanoPi M2試用體驗(yàn)】+SD卡啟動BL1拷貝BL2到DDR2中運(yùn)行
關(guān)于TF-A(ATF)固件的基本知識詳解
如何在BL2中配置DDR init?
如何讓BL31的調(diào)試信息輸出到S32R45的uart?
BL31未在Kirkstone上加載的原因?
Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c中的任何其他函數(shù)/值或ATF源中的任何其他文件??
ATF的啟動過程介紹

code層面 ATF中bl1的啟動

ATF中bl2的啟動

ATF中如何用函數(shù)完成bl2的啟動
ATF中bl31函數(shù)介紹與使用
ATF中bl32的啟動方法

bl31中的psci架構(gòu)介紹

評論