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

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

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

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

麥辣雞腿堡 ? 來源:TrustZone ? 作者:Hcoco ? 2023-12-05 17:33 ? 次閱讀

bl31中的psci架構(gòu)

bl31為內(nèi)核提供了一系列運行時服務(wù),psci作為其標(biāo)準(zhǔn)運行時服務(wù)的一部分,通過宏DECLARE_RT_SVC注冊到系統(tǒng)中。其相應(yīng)的定義如下:

DECLARE_RT_SVC(
		std_svc,

		OEN_STD_START,
		OEN_STD_END,
		SMC_TYPE_FAST,
		std_svc_setup,
		std_svc_smc_handler
)

其中std_svc_setup會在bl31啟動流程中被調(diào)用,以用于初始化該服務(wù)相關(guān)的配置。而std_svc_smc_handler為其smc異常處理函數(shù),當(dāng)內(nèi)核通過psci接口調(diào)用相關(guān)服務(wù)時,最終將由該函數(shù)執(zhí)行實際的處理流程。
圖片

上圖為psci初始化相關(guān)的流程,它主要包含內(nèi)容:(1)前面我們已經(jīng)介紹過power domain相關(guān)的背景,即psci需要協(xié)調(diào)不同層級的power domain狀態(tài),因此其必須要了解系統(tǒng)的power domain配置情況。以上流程中紅色虛線框的部分主要就是用于初始化系統(tǒng)的power domain拓?fù)浼捌錉顟B(tài)

(2)由于psci在執(zhí)行電源相關(guān)接口時,最終需要操作實際的硬件。而它們是與架構(gòu)相關(guān)的,因此其操作函數(shù)最終需要注冊到平臺相關(guān)的回調(diào)中。plat_setup_psci_ops即用于注冊特定平臺的psci_ops回調(diào),其格式如下:

typedef struct plat_psci_ops {
	void (*cpu_standby)(plat_local_state_t cpu_state);
	int (*pwr_domain_on)(u_register_t mpidr);
	void (*pwr_domain_off)(const psci_power_state_t *target_state);
	void (*pwr_domain_suspend_pwrdown_early)(
				const psci_power_state_t *target_state);
	void (*pwr_domain_suspend)(const psci_power_state_t *target_state);
	void (*pwr_domain_on_finish)(const psci_power_state_t *target_state);
	void (*pwr_domain_on_finish_late)(
				const psci_power_state_t *target_state);
	void (*pwr_domain_suspend_finish)(
				const psci_power_state_t *target_state);
	void __dead2 (*pwr_domain_pwr_down_wfi)(
				const psci_power_state_t *target_state);
	void __dead2 (*system_off)(void);
	void __dead2 (*system_reset)(void);
	int (*validate_power_state)(unsigned int power_state,
				    psci_power_state_t *req_state);
	int (*validate_ns_entrypoint)(uintptr_t ns_entrypoint);
	void (*get_sys_suspend_power_state)(
				    psci_power_state_t *req_state);
	int (*get_pwr_lvl_state_idx)(plat_local_state_t pwr_domain_state,
				    int pwrlvl);
	int (*translate_power_state_by_mpidr)(u_register_t mpidr,
				    unsigned int power_state,
				    psci_power_state_t *output_state);
	int (*get_node_hw_state)(u_register_t mpidr, unsigned int power_level);
	int (*mem_protect_chk)(uintptr_t base, u_register_t length);
	int (*read_mem_protect)(int *val);
	int (*write_mem_protect)(int val);
	int (*system_reset2)(int is_vendor,
				int reset_type, u_register_t cookie);
}

最后我們再看一下psci操作相應(yīng)的異常處理流程:

圖片
即其會根據(jù)function id的值,分別執(zhí)行相應(yīng)的電源管理服務(wù),如啟動cpu時會調(diào)用psci_cpu_on函數(shù),重啟系統(tǒng)時會調(diào)用psci_system_rest函數(shù)等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40290
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10863

    瀏覽量

    211763
  • SMP
    SMP
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    19665
收藏 人收藏

    評論

    相關(guān)推薦

    可編程CPU重置地址,單CPU冷啟動配置

    如果將BL31用作TF-A入口點而不是BL1,則上圖仍然相關(guān),因為在這種情況下,所有這些操作都將發(fā)生在BL31。有關(guān)詳細(xì)信息,請參閱第6節(jié)“使用B
    發(fā)表于 12-02 11:00 ?1107次閱讀
    可編程CPU重置地址,單CPU冷啟動配置

    基于armv8架構(gòu)對u-boot進(jìn)行啟動流程分析(一)

    Linux kernel;啟動BL1,BL2,BL31,BL32則是一個完整的ATF信任鏈建立流程(ARM Trusted Firmware),像常見的
    發(fā)表于 05-23 15:59

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

    我用“DEBUG=1”構(gòu)建 ATF 映像,uart 可以顯示 BL2 的調(diào)試信息,但沒有顯示 BL31 的調(diào)試信息。 為什么?BL2到BL31,是不是又設(shè)置了控制臺?如何讓
    發(fā)表于 04-11 08:20

    BL31未在Kirkstone上加載的原因?

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

    ATFbl2的啟動

    bl2_entrypoint函數(shù)最終會觸發(fā)安全監(jiān)控模式調(diào)用(smc) ,通知bl1將CPU的控制權(quán)限轉(zhuǎn)交給bl31,然后執(zhí)行bl31。 該函數(shù)會執(zhí)行 ? 平臺相關(guān)的初始化、 ? 獲取
    的頭像 發(fā)表于 11-07 15:59 ?818次閱讀
    ATF<b class='flag-5'>中</b><b class='flag-5'>bl</b>2的啟動

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

    bl31加載到內(nèi)存后會觸發(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 ?704次閱讀

    ATFbl2到bl31的跳轉(zhuǎn)介紹

    bl2到bl31的跳轉(zhuǎn) 在bl2_main函數(shù)中最終會調(diào)用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
    的頭像 發(fā)表于 11-07 16:09 ?962次閱讀

    ATFbl31的啟動

    bl2觸發(fā)安全監(jiān)控模式調(diào)用后會跳轉(zhuǎn)到bl31執(zhí)行,bl31最主要的作用是 建立EL3運行態(tài)的軟件配置 , 在該階段會完成各種類型的安全
    的頭像 發(fā)表于 11-07 16:13 ?1183次閱讀
    ATF<b class='flag-5'>中</b><b class='flag-5'>bl31</b>的啟動

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

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

    Bl31斷處理流程概述

    aarch64架構(gòu),在每個異常等級下都包含了四張異常等級表。 bl31的異常向量表定義在runtime_exceptions.S,其與下圖的定義一致
    的頭像 發(fā)表于 11-07 17:43 ?640次閱讀
    <b class='flag-5'>Bl31</b><b class='flag-5'>中</b>斷處理流程概述

    psci接口規(guī)范介紹

    由于psci是由linux內(nèi)核調(diào)用bl31的安全服務(wù),實現(xiàn)cpu電源管理功能的。因此其軟件架構(gòu)包含三個部分: (1)內(nèi)核與bl31之間的調(diào)
    的頭像 發(fā)表于 12-05 16:53 ?950次閱讀

    內(nèi)核psci驅(qū)動是什么

    "; ( 2 ) } (1)用于指定psci版本 (2)根據(jù)該pscibl31處理還是hypervisor處理,可以指定其對應(yīng)的陷入方式。若由bl31處理為smc,若由hypervi
    的頭像 發(fā)表于 12-05 16:58 ?740次閱讀
    內(nèi)核<b class='flag-5'>中</b>的<b class='flag-5'>psci</b>驅(qū)動是什么

    內(nèi)核psci架構(gòu)cpu_ops接口

    cpu_ops接口 驅(qū)動初始化完成后,cpu的cpu_ops就可以調(diào)用這些回調(diào)實現(xiàn)psci功能的調(diào)用。如下所示,當(dāng)devicetreecpu的enable-method設(shè)置為psci時,該cpu
    的頭像 發(fā)表于 12-05 17:25 ?703次閱讀

    PSCI處理函數(shù)代碼分析

    處理函數(shù)根據(jù)funid來決定服務(wù),可以看到PSCI_CPU_ON_AARCH64為0xc4000003,這正是設(shè)備樹填寫的cpu_on屬性的id,會委托psci_cpu_on來執(zhí)行核上電任務(wù)。下面
    的頭像 發(fā)表于 12-05 18:08 ?934次閱讀

    armv8 u-boot的啟動介紹

    先看arm官網(wǎng)提供的一張圖: 上圖詳細(xì)概括了arm官方推薦的armv8的啟動層次結(jié)構(gòu): 官方將啟動分為了BL1,BL2,BL31,BL32,BL
    的頭像 發(fā)表于 12-07 11:09 ?2214次閱讀
    armv8 u-boot的啟動<b class='flag-5'>介紹</b>