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