處理函數(shù)根據(jù)funid來決定服務(wù),可以看到PSCI_CPU_ON_AARCH64為0xc4000003,這正是設(shè)備樹中填寫的cpu_on屬性的id,會委托psci_cpu_on來執(zhí)行核上電任務(wù)。下面分析是重點:!!!
- >psci_cpu_on() //lib/psci/psci_main.c
- >psci_validate_entry_point() //驗證入口地址有效性并 保存入口點到一個結(jié)構(gòu)ep中
- >psci_cpu_on_start(target_cpu, &ep) //ep入口地址
- >psci_plat_pm_ops- >pwr_domain_on(target_cpu)
- >qemu_pwr_domain_on //實現(xiàn)核上電(平臺實現(xiàn))
/* Store the re-entry information for the non-secure world. */
- >cm_init_context_by_index() //重點:會通過cpu的編號找到 cpu上下文(cpu_context_t),存在cpu寄存器的值,異常返回的時候?qū)憣懙綄?yīng)的寄存器中,然后eret,舊返回到了el1!!!
- >cm_setup_context() //設(shè)置cpu上下文
- > write_ctx_reg(state, CTX_SCR_EL3, scr_el3); //lib/el3_runtime/aarch64/context_mgmt.c
write_ctx_reg(state, CTX_ELR_EL3, ep- >pc); //注:異常返回時執(zhí)行此地址 于是完成了cpu的啟動!!!
write_ctx_reg(state, CTX_SPSR_EL3, ep- >spsr);
psci_cpu_on主要完成開核的工作 ,然后會設(shè)置一些異常返回后寄存器的值(eg:從el1 -> el3 -> el1),重點關(guān)注 ep->pc寫到cpu_context結(jié)構(gòu)的CTX_ELR_EL3偏移處(從處理器啟動后會從這個地址取指執(zhí)行)。
實際上, 所有的從處理器啟動后都會從bl31_warm_entrypoint開始執(zhí)行 ,在plat_setup_psci_ops中會設(shè)置(每個平臺都有自己的啟動地址寄存器,通過寫這個寄存器來獲得上電后執(zhí)行的指令地址)。
大致說一下:主處理器通過smc進(jìn)入el3請求開核服務(wù),atf中會響應(yīng)這種請求, 通過平臺的開核操作來啟動從處理器并且設(shè)置從處理的一些寄存器eg:scr_el3、spsr_el3、elr_el3,然后主處理器,恢復(fù)現(xiàn)場,eret再次回到el1 ,
而處理器開核之后會從bl31_warm_entrypoint開始執(zhí)行,最后通過el3_exit返回到el1的elr_el3設(shè)置的地址。
分析到這atf的分析到此為止,atf中主要是響應(yīng)內(nèi)核的snc的請求,然后做開核處理,也就是實際的開核動作,但是從處理器最后還是要回到內(nèi)核中執(zhí)行
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211763 -
SMP
+關(guān)注
關(guān)注
0文章
74瀏覽量
19665 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62618 -
設(shè)備樹
+關(guān)注
關(guān)注
0文章
38瀏覽量
3124
發(fā)布評論請先 登錄
相關(guān)推薦
評論