bl2到bl31的跳轉
在bl2_main函數中最終會調用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl_ep_info,0,0,0,0,0,0)來觸發一個類型為BL1_SMC_RUN_IMAGE的安全監控模式調用。
安全監控模式調用的處理接口在bl1階段時被指定,調用該函數時傳入的command ID是BL1_SMC_RUN_IMAGE,故執行該函數之后,系統將跳轉到中斷處理函數(smc_handler64)繼續執行。該函數定義在bl1/aarch64/bl1_exception.S文件中。
該函數最終通過判定安全監控模式調用的類型(在bl2中將會發送類型為BL1_SMC_RUN_IMAGE的smc)查看當前的安全監控模式調用是否是用于跳轉,其內容如下:
func smc_handler64
/* 判定觸發smc操作時帶入的參數是否為跳轉執行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中的數據保存到x20中
mov x0, x20 //將x20的數據保存到x0中
bl bl1_print_next_bl_ep_info //打印出bl3x鏡像文件信息
//傳入參數和bl3x入口函數的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/
/* 設定返回參數 */
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執行
endfunc smc_handler64
在此安全監控模式調用處理過程中會將ARM核的狀態切到EL3運行,即bl31是運行在EL3中的。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
ARM
+關注
關注
135文章
9552瀏覽量
391841 -
監控
+關注
關注
6文章
2380瀏覽量
59419 -
函數
+關注
關注
3文章
4417瀏覽量
67499
發布評論請先 登錄
相關推薦
熱點推薦
BL2 在跳轉到 BL31 之前掛起 — 訓練后出現 DDR PHY (0x01400000) 訪問問題,求解
SDK (LSDK 25.06)使用以下調試選項:
調試=1
ddr_debug=是
ddr_phy_debug=是
我目前面臨一個問題,即BL2 在跳到 BL31 之前停止.
為了調查這一點,我將
發表于 03-03 06:34
【NanoPi M2試用體驗】+SD卡啟動BL1拷貝BL2到DDR2中運行
裸機程序SD卡啟動BL1拷貝BL2到DDR2中運行;代碼的拷貝會用到一些指針函數,第一個參數為SD卡存放
發表于 06-11 17:03
如何在BL2中配置DDR init?
:2022 年 10 月 25 日 18:55:21錯誤:BL2:加載圖像失敗(-2)身份驗證失敗我認為我們必須更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
發表于 03-24 08:50
如何讓BL31的調試信息輸出到S32R45的uart?
我用“DEBUG=1”構建 ATF 映像,uart 可以顯示 BL2 的調試信息,但沒有顯示 BL31 的調試信息。 為什么?BL2到
發表于 04-11 08:20
BL31未在Kirkstone上加載的原因?
imx8mm_evk.h 和 imx8mm_evk.c 中的設置時,SPL 打印 do uart3,但它應該顯示:注意:BL31:v2.6(發布
發表于 04-19 11:00
Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c中的任何其他函數/值或ATF源中的任何其他文件??
了 BUILD_STRING = \"custom\" 選項來檢查我正在運行的 BL2 是否是我的。
為了使 DDR 工作,我是否需要編輯 ddr_init.c 中的任何其他函數/值或ATF 源
發表于 06-01 09:03
ATF的啟動過程介紹
ATF的啟動過程根據ARMv8的運行模式(AArch32/AArch64)會有所不同,但基本一致。 在AArch32中是不會去加載bl31而是將EL3或者Monitor模式的運行代碼保存在bl
ATF中如何用函數完成bl2的啟動
bl31加載到內存中后會觸發安全監控模式調用(smc)將CPU權限轉交給bl31。 該函數的主要內容和相關注釋如下: ** void bl2_main ( void
ATF中bl31函數介紹與使用
runtime_svc_init函數 該函數主要用來建立安全監控模式調用處理函數的索引表,并執行EL3中提供的服務項的初始化操作,獲取TEE OS的入口地址并賦值給bl32_init變量,以備啟動
ATF中bl2到bl31的跳轉介紹
評論