ARM32的OP-TEE與ARM64的OP-TEE啟動過程大致相同。ARM64的OP-TEE的_start函數(shù)定義在generic_entry_a64.S文件中,而且該函數(shù)不像ARM32位系統(tǒng)一樣會進(jìn)入reset中去執(zhí)行OP-TEE啟動,而是直接在_start函數(shù)中就完成整個啟動過程,
在進(jìn)行初始化操作之前會注冊一個異常向量表,該異常向量表會在喚醒從核階段被使用,當(dāng)主核通知喚醒從核時,從核會查找該異常向量表,然后命中對應(yīng)的處理函數(shù)并執(zhí)行從核的啟動操作。
ARM64的OP-TEE的啟動過程與ARM32的OP-TEE的啟動過程幾乎一樣。ARM64位系統(tǒng)的_start函數(shù)內(nèi)容說明如下:
FUNC _start , :
mov x19, x0 //保存paged_table的地址到x19中
mov x20, x2 //保存device tree的地址到x20中
adr x0, reset_vect_table //獲取異常向量表的地址
msr vbar_el1, x0 //將異常向量表的地址寫入VBAR寄存器中
isb
//設(shè)置系統(tǒng)控制寄存器,禁止cache等操作
mrs x0, sctlr_el1
mov x1, #(SCTLR_I | SCTLR_A | SCTLR_SA)
orr x0, x0, x1
msr sctlr_el1, x0
isb
//復(fù)制OP-TEE鏡像中的init部分到內(nèi)存中
copy_init:
ldp x3, x4, [x1], #16
stp x3, x4, [x0], #16
cmp x0, x2
b.lt copy_init
msr daifclr, #DAIFBIT_ABT //使能異常處理
adr x0, __text_start //將__text_start的地址保存到x0中
adrp x1, __end //將_end的地址保存到x1中
add x1, x1, :lo12:__end
sub x1, x1, x0
bl inv_dcache_range //關(guān)閉數(shù)據(jù)cache
bl console_init //初始化console
bl core_init_mmu_map //初始化MMU的頁表
bl core_init_mmu_regs //將MMU的頁表信息寫入TTBRx寄存器中
bl cpu_mmu_enable //使能MMU
bl cpu_mmu_enable_icache //使能MMU的指令cache
bl cpu_mmu_enable_dcache //使能MMU的數(shù)據(jù)cache
mov x0, x19 //將paged_table的地址保存到x0中
mov x1, #-1
mov x2, x20 //將device tree的地址保存到x2中
//使用device tree和paged_table作為參數(shù)開始OP-TEE的啟動
bl generic_boot_init_primary
mov x19, x0
adr x0, __text_start
add x1, x1, :lo12:__end
sub x1, x1, x0
bl flush_dcache_range //刷新數(shù)據(jù)cache
bl thread_clr_boot_thread //清空系統(tǒng)線程的狀態(tài)
mov x1, x19
//將TEESMC_OPTEED_RETURN_ENTRY_DONE保存到x0
mov x0, #TEESMC_OPTEED_RETURN_ENTRY_DONE
smc #0 //調(diào)用SMC切換到normal world狀態(tài)
b . /* SMC不應(yīng)該有返回操作 */
END_FUNC _start
-
ARM
+關(guān)注
關(guān)注
134文章
9084瀏覽量
367380 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
TEE
+關(guān)注
關(guān)注
0文章
29瀏覽量
10256
發(fā)布評論請先 登錄
相關(guān)推薦
評論