bl2到bl31的跳轉
在bl2_main函數(shù)中最終會調用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl_ep_info,0,0,0,0,0,0)來觸發(fā)一個類型為BL1_SMC_RUN_IMAGE的安全監(jiān)控模式調用。
安全監(jiān)控模式調用的處理接口在bl1階段時被指定,調用該函數(shù)時傳入的command ID是BL1_SMC_RUN_IMAGE,故執(zhí)行該函數(shù)之后,系統(tǒng)將跳轉到中斷處理函數(shù)(smc_handler64)繼續(xù)執(zhí)行。該函數(shù)定義在bl1/aarch64/bl1_exception.S文件中。
該函數(shù)最終通過判定安全監(jiān)控模式調用的類型(在bl2中將會發(fā)送類型為BL1_SMC_RUN_IMAGE的smc)查看當前的安全監(jiān)控模式調用是否是用于跳轉,其內容如下:
func smc_handler64
/* 判定觸發(fā)smc操作時帶入的參數(shù)是否為跳轉執(zhí)行image的操作 */
mov x30, #BL1_SMC_RUN_IMAGE //將BL1_SMC_RUN_IMAGE的值保存到x30
cmp x30, x0 //比較x30與x0的值
//如果x30與x0不同,則認為是普通類型的異常,進入smc_handler進行處理
b.ne smc_handler
mrs x30, scr_el3 //獲取scr寄存器的值
tst x30, #SCR_NS_BIT //比較scr寄存器中的NS bit與SCR_NS_BIT是否相等
//如果當前NS bit為非安全位,則證明不合法,產生異常
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鏡像文件信息
//傳入參數(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 //設定ARM核模式
cmp x0, #MODE_EL3 //比較x0寄存器中的值是否為MODE_EL3
b.ne unexpected_sync_exception //如果x0中不是MODE_EL3,則產生異常
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ù) */
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 //跳轉到bl3x執(zhí)行
endfunc smc_handler64
在此安全監(jiān)控模式調用處理過程中會將ARM核的狀態(tài)切到EL3運行,即bl31是運行在EL3中的。
-
ARM
+關注
關注
134文章
9099瀏覽量
367744 -
監(jiān)控
+關注
關注
6文章
2212瀏覽量
55234 -
函數(shù)
+關注
關注
3文章
4332瀏覽量
62677
發(fā)布評論請先 登錄
相關推薦
評論