bl2到bl31的跳轉(zhuǎn)
在bl2_main函數(shù)中最終會(huì)調(diào)用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl_ep_info,0,0,0,0,0,0)來(lái)觸發(fā)一個(gè)類(lèi)型為BL1_SMC_RUN_IMAGE的安全監(jiān)控模式調(diào)用。
安全監(jiān)控模式調(diào)用的處理接口在bl1階段時(shí)被指定,調(diào)用該函數(shù)時(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ù)最終通過(guò)判定安全監(jiān)控模式調(diào)用的類(lèi)型(在bl2中將會(huì)發(fā)送類(lèi)型為BL1_SMC_RUN_IMAGE的smc)查看當(dāng)前的安全監(jiān)控模式調(diào)用是否是用于跳轉(zhuǎn),其內(nèi)容如下:
func smc_handler64
/* 判定觸發(fā)smc操作時(shí)帶入的參數(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)為是普通類(lèi)型的異常,進(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)用處理過(guò)程中會(huì)將ARM核的狀態(tài)切到EL3運(yùn)行,即bl31是運(yùn)行在EL3中的。
-
ARM
+關(guān)注
關(guān)注
134文章
9097瀏覽量
367585 -
監(jiān)控
+關(guān)注
關(guān)注
6文章
2208瀏覽量
55202 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62622
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論