0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ATF中bl2到bl31的跳轉(zhuǎn)介紹

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:TrustZone ? 2023-11-07 16:09 ? 次閱讀

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中的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【NanoPi M2試用體驗(yàn)】+SD卡啟動(dòng)BL1拷貝BL2DDR2運(yùn)行

    裸機(jī)程序SD卡啟動(dòng)BL1拷貝BL2DDR2運(yùn)行;代碼的拷貝會(huì)用到一些指針函數(shù),第一個(gè)參數(shù)為SD卡存放
    發(fā)表于 06-11 17:03

    關(guān)于TF-A(ATF)固件的基本知識(shí)詳解

    。ATF定義的啟動(dòng)模型ATF將鏡像進(jìn)行了劃分,BL1 BL2屬于啟動(dòng)引導(dǎo)鏡像,BL3屬于runtime鏡像。
    發(fā)表于 06-15 16:57

    如何在BL2配置DDR init?

    :2022 年 10 月 25 日 18:55:21錯(cuò)誤:BL2:加載圖像失敗(-2)身份驗(yàn)證失敗我認(rèn)為我們必須更改 atf\plat\nxp\soc-ls1046\ls1046ardb\ddr_init.c
    發(fā)表于 03-24 08:50

    如何讓BL31的調(diào)試信息輸出到S32R45的uart?

    我用“DEBUG=1”構(gòu)建 ATF 映像,uart 可以顯示 BL2 的調(diào)試信息,但沒(méi)有顯示 BL31 的調(diào)試信息。 為什么?BL2
    發(fā)表于 04-11 08:20

    BL31未在Kirkstone上加載的原因?

    imx8mm_evk.h 和 imx8mm_evk.c 的設(shè)置時(shí),SPL 打印 do uart3,但它應(yīng)該顯示:注意:BL31:v2.6(發(fā)布
    發(fā)表于 04-19 11:00

    Yocto LS1028定制板用BL2,為了使DDR工作是否需要編輯ddr_init.c的任何其他函數(shù)/值或ATF的任何其他文件??

    了 BUILD_STRING = \"custom\" 選項(xiàng)來(lái)檢查我正在運(yùn)行的 BL2 是否是我的。 為了使 DDR 工作,我是否需要編輯 ddr_init.c 的任何其他函數(shù)/值或ATF
    發(fā)表于 06-01 09:03

    ATF啟動(dòng)流程介紹

    一、BL32(TEE OS)的準(zhǔn)備 ATF啟動(dòng)流程 ATF流程 ATF冷啟動(dòng)實(shí)現(xiàn)分為5個(gè)步驟: ? BL1 - AP Trusted ROM
    的頭像 發(fā)表于 11-02 17:51 ?1255次閱讀
    <b class='flag-5'>ATF</b>啟動(dòng)流程<b class='flag-5'>介紹</b>

    ATF的啟動(dòng)過(guò)程介紹

    ATF的啟動(dòng)過(guò)程根據(jù)ARMv8的運(yùn)行模式(AArch32/AArch64)會(huì)有所不同,但基本一致。 在AArch32是不會(huì)去加載bl31而是將EL3或者M(jìn)onitor模式的運(yùn)行代碼保存在bl
    的頭像 發(fā)表于 11-07 15:48 ?1287次閱讀
    <b class='flag-5'>ATF</b>的啟動(dòng)過(guò)程<b class='flag-5'>介紹</b>

    code層面 ATFbl1的啟動(dòng)

    系統(tǒng)上電之后首先會(huì)運(yùn)行ChipRom,之后會(huì)跳轉(zhuǎn)ATFbl1繼續(xù)執(zhí)行。bl1主要初始化CPU、設(shè)定異常向量、將
    的頭像 發(fā)表于 11-07 15:53 ?1082次閱讀
    code層面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的啟動(dòng)

    ATFbl2的啟動(dòng)

    bl2鏡像將為后續(xù)鏡像的加載執(zhí)行相關(guān)的初始化操作,主要是內(nèi)存、MMU、串口以及EL3軟件運(yùn)行環(huán)境的設(shè)置,并且加載bl3x的鏡像內(nèi)存。 通過(guò)查看b
    的頭像 發(fā)表于 11-07 15:59 ?824次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl2</b>的啟動(dòng)

    ATF如何用函數(shù)完成bl2的啟動(dòng)

    bl31加載到內(nèi)存后會(huì)觸發(fā)安全監(jiān)控模式調(diào)用(smc)將CPU權(quán)限轉(zhuǎn)交給bl31。 該函數(shù)的主要內(nèi)容和相關(guān)注釋如下: ** void bl2_main ( void
    的頭像 發(fā)表于 11-07 16:04 ?706次閱讀

    ATFbl31的啟動(dòng)

    bl2觸發(fā)安全監(jiān)控模式調(diào)用后會(huì)跳轉(zhuǎn)bl31執(zhí)行,bl31最主要的作用是 建立EL3運(yùn)行態(tài)
    的頭像 發(fā)表于 11-07 16:13 ?1183次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl31</b>的啟動(dòng)

    ATFbl31函數(shù)介紹與使用

    runtime_svc_init函數(shù) 該函數(shù)主要用來(lái)建立安全監(jiān)控模式調(diào)用處理函數(shù)的索引表,并執(zhí)行EL3提供的服務(wù)項(xiàng)的初始化操作,獲取TEE OS的入口地址并賦值給bl32_init變量,以備啟動(dòng)
    的頭像 發(fā)表于 11-07 16:23 ?652次閱讀

    ATFbl32的啟動(dòng)方法

    ATFbl32的啟動(dòng) bl31的runtime_svc_init函數(shù)會(huì)初始化OP-TEE對(duì)應(yīng)的服務(wù),通過(guò)調(diào)用該服務(wù)項(xiàng)的初始化函數(shù)來(lái)完成O
    的頭像 發(fā)表于 11-07 16:32 ?633次閱讀
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>32的啟動(dòng)方法

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

    bl31的psci架構(gòu) bl31為內(nèi)核提供了一系列運(yùn)行時(shí)服務(wù),psci作為其標(biāo)準(zhǔn)運(yùn)行時(shí)服務(wù)的一部分,通過(guò)宏DECLARE_RT_SVC注冊(cè)系統(tǒng)
    的頭像 發(fā)表于 12-05 17:33 ?1076次閱讀
    <b class='flag-5'>bl31</b><b class='flag-5'>中</b>的psci架構(gòu)<b class='flag-5'>介紹</b>