那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

bl31中的psci架構介紹

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

bl31中的psci架構

bl31為內核提供了一系列運行時服務,psci作為其標準運行時服務的一部分,通過宏DECLARE_RT_SVC注冊到系統中。其相應的定義如下:

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啟動流程中被調用,以用于初始化該服務相關的配置。而std_svc_smc_handler為其smc異常處理函數,當內核通過psci接口調用相關服務時,最終將由該函數執行實際的處理流程。
圖片

上圖為psci初始化相關的流程,它主要包含內容:(1)前面我們已經介紹過power domain相關的背景,即psci需要協調不同層級的power domain狀態,因此其必須要了解系統的power domain配置情況。以上流程中紅色虛線框的部分主要就是用于初始化系統的power domain拓撲及其狀態

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

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操作相應的異常處理流程:

圖片
即其會根據function id的值,分別執行相應的電源管理服務,如啟動cpu時會調用psci_cpu_on函數,重啟系統時會調用psci_system_rest函數等。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40422
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10902

    瀏覽量

    213007
  • SMP
    SMP
    +關注

    關注

    0

    文章

    76

    瀏覽量

    19746
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    如何讓BL31的調試信息輸出到S32R45的uart?

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

    BL31未在Kirkstone上加載的原因?

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

    ATFbl2的啟動

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

    ATF如何用函數完成bl2的啟動

    bl31加載到內存后會觸發安全監控模式調用(smc)將CPU權限轉交給bl31。 該函數的主要內容和相關注釋如下: ** void bl2_main ( void
    的頭像 發表于 11-07 16:04 ?763次閱讀

    ATFbl2到bl31的跳轉介紹

    bl2到bl31的跳轉 在bl2_main函數中最終會調用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next_bl
    的頭像 發表于 11-07 16:09 ?1050次閱讀

    ATFbl31的啟動

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

    ATFbl31函數介紹與使用

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

    Bl31斷處理流程概述

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

    psci接口規范介紹

    由于psci是由linux內核調用bl31的安全服務,實現cpu電源管理功能的。因此其軟件架構包含三個部分: (1)內核與bl31之間的調
    的頭像 發表于 12-05 16:53 ?1025次閱讀

    內核psci驅動是什么

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

    內核psci架構cpu_ops接口

    cpu_ops接口 驅動初始化完成后,cpu的cpu_ops就可以調用這些回調實現psci功能的調用。如下所示,當devicetreecpu的enable-method設置為psci時,該cpu
    的頭像 發表于 12-05 17:25 ?769次閱讀

    PSCI處理函數代碼分析

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

    armv8 u-boot的啟動介紹

    先看arm官網提供的一張圖: 上圖詳細概括了arm官方推薦的armv8的啟動層次結構: 官方將啟動分為了BL1,BL2,BL31,BL32,BL
    的頭像 發表于 12-07 11:09 ?2445次閱讀
    armv8 u-boot的啟動<b class='flag-5'>介紹</b>
    百家乐官网傻瓜式投注法| 威尼斯人娱乐城开户| 澳门百家乐官网群官网| 大发888新址 | 金昌市| 香港六合彩网址| 豪门国际娱乐| 百家乐电影网| 星级百家乐技巧| 现场百家乐官网机| 百家乐官网游戏模拟| 百家乐官网庄闲必胜手段| 聚宝盆百家乐的玩法技巧和规则| 百家乐论坛在线提供| 百家乐官网都是什么人玩的| 网上百家乐官网试玩网址| 百家乐官网下载| 澳门百家乐有赢钱的吗| 电子百家乐博彩正网| 百家乐群boaicai| 百家乐赌博在线娱乐| 百家乐娱乐平台真人娱乐平台| 太阳城百家乐怎样开户| 澳门百家乐赌技术| 线上百家乐官网平玩法| KK百家乐官网的玩法技巧和规则| 百家乐官网真人娱乐平台| 至尊百家乐官网奇热网| 百家乐官网筹码样式| 中宁县| 威尼斯人娱乐场骗人| 百家乐官网赌博详解| 奈曼旗| 欢乐谷娱乐城官网| 金杯百家乐的玩法技巧和规则| 百家乐哪条路好| 百家乐官网三国| 百家乐官网路纸发表区| 皇冠体育网| sz新全讯网xb112| 百家乐桌布|