psci_setup //lib/psci/psci_setup.c - >plat_setup_psci_ops //設(shè)置平臺(tái)的psci操作 調(diào)用平臺(tái)的plat_setup_psci_ops函數(shù)去設(shè)置psci操作 eg:qemu平臺(tái) - >*psci_ops = 208 static const plat_psci_ops_t plat_qemu_psci_pm_ops = { 209 .cpu_standby = qemu_cpu_standby, 210 .pwr_domain_on = qemu_pwr_domain_on, 211 .pwr_domain_off = qemu_pwr_domain_off, 212 .pwr_domain_suspend = qemu_pwr_domain_suspend, 213 .pwr_domain_on_finish = qemu_pwr_domain_on_finish," />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

SMP多核啟動(dòng)PSCI代碼示例

麥辣雞腿堡 ? 來(lái)源:TrustZone ? 作者:Hcoco ? 2023-12-05 17:45 ? 次閱讀

1、std_svc_setup (主要關(guān)注設(shè)置psci操作集)--有服務(wù)

std_svc_setup  //services/std_svc/std_svc_setup.c
- >psci_setup //lib/psci/psci_setup.c
 - >plat_setup_psci_ops   //設(shè)置平臺(tái)的psci操作    調(diào)用平臺(tái)的plat_setup_psci_ops函數(shù)去設(shè)置psci操作 eg:qemu平臺(tái)
  - >*psci_ops = &plat_qemu_psci_pm_ops;
   208 static const plat_psci_ops_t plat_qemu_psci_pm_ops = {
    209         .cpu_standby = qemu_cpu_standby,
    210         .pwr_domain_on = qemu_pwr_domain_on,
    211         .pwr_domain_off = qemu_pwr_domain_off, 
    212         .pwr_domain_suspend = qemu_pwr_domain_suspend,
    213         .pwr_domain_on_finish = qemu_pwr_domain_on_finish,
    214         .pwr_domain_suspend_finish = qemu_pwr_domain_suspend_finish,
    215         .system_off = qemu_system_off,
    216         .system_reset = qemu_system_reset, 
    217         .validate_power_state = qemu_validate_power_state,
    218         .validate_ns_entrypoint = qemu_validate_ns_entrypoint
    219 };

在遍歷每一個(gè)注冊(cè)的運(yùn)行時(shí)服務(wù)的時(shí)候,會(huì)導(dǎo)致std_svc_setup調(diào)用,其中會(huì)做psci操作集的設(shè)置,操作集中我們可以看到對(duì)核電源的管理的接口如:核上電,下電,掛起等,我們主要關(guān)注上電 .pwr_domain_on = qemu_pwr_domain_on,這個(gè)接口當(dāng)我們主處理器boot從處理器的時(shí)候會(huì)用到。

2、運(yùn)行時(shí)服務(wù)觸發(fā)和處理--來(lái)請(qǐng)求

smc指令觸發(fā)進(jìn)入el3異常向量表:

runtime_exceptions  //el3的異常向量表
- >sync_exception_aarch64
- >handle_sync_exception
- >smc_handler64
- >   |* Populate the parameters for the SMC handler.
          |* We already have x0-x4 in place. x5 will point to a cookie (not used
          |* now). x6 will point to the context structure (SP_EL3) and x7 will
          |* contain flags we need to pass to the handler Hence save x5-x7.
          |*
          |* Note: x4 only needs to be preserved for AArch32 callers but we do it
          |*       for AArch64 callers as well for convenience
       |*/
         stp     x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]  //保存x4-x7到棧
         stp     x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6]

       /* Save rest of the gpregs and sp_el0*/
         save_x18_to_x29_sp_el0

       mov     x5, xzr  //x5清零
       mov     x6, sp //sp保存在x6

       /* Get the unique owning entity number */ //獲得唯一的入口編號(hào)
         ubfx    x16, x0, #FUNCID_OEN_SHIFT, #FUNCID_OEN_WIDTH
         ubfx    x15, x0, #FUNCID_TYPE_SHIFT, #FUNCID_TYPE_WIDTH
         orr     x16, x16, x15, lsl #FUNCID_OEN_WIDTH

         adr     x11, (__RT_SVC_DESCS_START__ + RT_SVC_DESC_HANDLE)

       /* Load descriptor index from array of indices */
         adr     x14, rt_svc_descs_indices  //獲得服務(wù)描述 標(biāo)識(shí)數(shù)組
         ldrb    w15, [x14, x16] //根據(jù)唯一的入口編號(hào) 找到處理函數(shù)的 地址
       /*
       |* Restore the saved C runtime stack value which will become the new
       |* SP_EL0 i.e. EL3 runtime stack. It was saved in the 'cpu_context'
       |* structure prior to the last ERET from EL3.
       |*/
         ldr     x12, [x6, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]

       /*
       |* Any index greater than 127 is invalid. Check bit 7 for
       |* a valid index
       |*/
         tbnz    w15, 7, smc_unknown

       /* Switch to SP_EL0 */
         msr     spsel, #0  

          /*
          |* Get the descriptor using the index
          |* x11 = (base + off), x15 = index
          |*
          |* handler = (base + off) + (index < < log2(size))
       |*/
       lsl     w10, w15, #RT_SVC_SIZE_LOG2
         ldr     x15, [x11, w10, uxtw]

       /*
       |* Save the SPSR_EL3, ELR_EL3, & SCR_EL3 in case there is a world
       |* switch during SMC handling.
       |* TODO: Revisit if all system registers can be saved later.
       |*/
   mrs     x16, spsr_el3 //spsr_el3保存在x16
    mrs     x17, elr_el3 //elr_el3保存在x17
   mrs     x18, scr_el3  //scr_el3保存在x18
         stp     x16, x17, [x6, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]  /  x16, x17/保存在棧
       str     x18, [x6, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] //x18保存到棧

       /* Copy SCR_EL3.NS bit to the flag to indicate caller's security */
         bfi     x7, x18, #0, #1

       mov     sp, x12 

       /*
       |* Call the Secure Monitor Call handler and then drop directly into
       |* el3_exit() which will program any remaining architectural state
       |* prior to issuing the ERET to the desired lower EL.
       |*/
#if DEBUG
         cbz     x15, rt_svc_fw_critical_error
#endif
         blr     x15  //跳轉(zhuǎn)到處理函數(shù)

         b       el3_exit  //從el3退出  會(huì)eret 回到el1 (后面會(huì)講到)

3、找到對(duì)應(yīng)handler--請(qǐng)求匹配處理函數(shù)

上面其實(shí)主要的是找到服務(wù)例程,然后跳轉(zhuǎn)執(zhí)行 下面是跳轉(zhuǎn)的處理函數(shù):

std_svc_smc_handler  //services/std_svc/std_svc_setup.c
- >ret = psci_smc_handler(smc_fid, x1, x2, x3, x4,
                  |   cookie, handle, flags)
                  ...
 480         } else {
481                 /* 64-bit PSCI function */
  482 
  483                 switch (smc_fid) {
  484                 case PSCI_CPU_SUSPEND_AARCH64:
  485                         ret = (u_register_t)
  486                                 psci_cpu_suspend((unsigned int)x1, x2, x3);
  487                         break;
  488 
  489                 case PSCI_CPU_ON_AARCH64:
  490                         ret = (u_register_t)psci_cpu_on(x1, x2, x3);
  491                         break;
  492 
...
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10804

    瀏覽量

    210829
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8958

    瀏覽量

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

    關(guān)注

    0

    文章

    71

    瀏覽量

    19614
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)示例

    對(duì)應(yīng)CPU的SMP功能:2.1 核啟動(dòng)加載目前的啟動(dòng)順序是,系統(tǒng)默認(rèn)開(kāi)始啟動(dòng)0核,在0核的主任務(wù)入口內(nèi)啟動(dòng)其他核的加載,使其都進(jìn)入任務(wù)調(diào)度,
    發(fā)表于 05-15 12:45

    ARM電源管理中的PSCI是什么意思呢

    ;PSCI_STAT_RESIDENCY:此API返回自冷啟動(dòng)后平臺(tái)處于某個(gè)電源狀態(tài)的時(shí)間;PSCI_STAT_COUNT:此API返回自冷啟動(dòng)后平臺(tái)使用某個(gè)電源狀態(tài)的次數(shù);這些API
    發(fā)表于 04-02 09:45

    記錄學(xué)習(xí)ARM Linux的多核啟動(dòng)過(guò)程

    1.概述本文主要是記錄學(xué)習(xí)Linux的多核啟動(dòng)的過(guò)程,對(duì)學(xué)習(xí)過(guò)程進(jìn)行總結(jié),以便進(jìn)行后續(xù)回顧。平臺(tái):ARM Vexpress內(nèi)核版本:linux-4.92.smp_operations初始化系統(tǒng)
    發(fā)表于 05-25 10:43

    ARM64 SMP多核啟動(dòng)相關(guān)資料推薦(下)

    2、psci方式多核啟動(dòng)描述上面說(shuō)了pin-table的多核啟動(dòng)方式,看似很繁瑣,實(shí)際上并不復(fù)雜,無(wú)外乎主處理器喚醒從處理器到指定地址上去執(zhí)
    發(fā)表于 06-06 17:11

    介紹在ARM64架構(gòu)下啟動(dòng)多核的兩種方式

    psci 兩種方式,下面針對(duì)這兩種啟動(dòng)流程進(jìn)行分析。代碼版本boot-wrapper-aarch64 version
    發(fā)表于 06-13 18:23

    ARM64 SMP多核啟動(dòng)(上)—spin-table

    一般嵌入式系統(tǒng)使用的都是對(duì)稱多處理器(Symmetric Multi-Processor, SMP)系統(tǒng),包含了多個(gè)cpu, 這幾個(gè)cpu都是相同的處理器,如4核Contex-A53。
    發(fā)表于 06-09 14:28 ?949次閱讀
    ARM64 <b class='flag-5'>SMP</b><b class='flag-5'>多核</b><b class='flag-5'>啟動(dòng)</b>(上)—spin-table

    ARM64 SMP多核啟動(dòng)(下)—PSCI

    上面說(shuō)了pin-table的多核啟動(dòng)方式,看似很繁瑣,實(shí)際上并不復(fù)雜,無(wú)外乎主處理器喚醒從處理器到指定地址上去執(zhí)行指令
    發(fā)表于 06-09 14:31 ?662次閱讀
    ARM64 <b class='flag-5'>SMP</b><b class='flag-5'>多核</b><b class='flag-5'>啟動(dòng)</b>(下)—<b class='flag-5'>PSCI</b>

    多核CPU的啟動(dòng)方式

    工作中遇到的多核 ARM CPU 越來(lái)越多,總結(jié)分享一些多核啟動(dòng)的知識(shí),希望能幫助更多小伙伴。 在 ARM64 架構(gòu)下如果想要啟動(dòng)多核,有
    的頭像 發(fā)表于 06-22 10:04 ?2029次閱讀

    SMP是什么?多核芯片(SMP)的啟動(dòng)方法

    SMP 英文為Symmetric Multi-Processing ,是對(duì)稱多處理結(jié)構(gòu)的簡(jiǎn)稱,是指在一個(gè)計(jì)算機(jī)上匯集了一組處理器(多CPU),各CPU之間共享內(nèi)存子系統(tǒng)以及總線結(jié)構(gòu),一個(gè)服務(wù)器系統(tǒng)可以同時(shí)運(yùn)行多個(gè)處理器,并共享內(nèi)存和其他的主機(jī)資源。
    的頭像 發(fā)表于 07-26 09:26 ?1.7w次閱讀
    <b class='flag-5'>SMP</b>是什么?<b class='flag-5'>多核</b>芯片(<b class='flag-5'>SMP</b>)的<b class='flag-5'>啟動(dòng)</b>方法

    SMP是什么 啟動(dòng)方式介紹

    ,一個(gè)服務(wù)器系統(tǒng)可以同時(shí)運(yùn)行多個(gè)處理器,并共享內(nèi)存和其他的主機(jī)資源。 CMP 英文為Chip multiprocessors,指的是單芯片多處理器,也指多核心。其思想是將大規(guī)模并行處理器中的SMP集成到同一芯片內(nèi),各個(gè)處理器并行執(zhí)行不同的進(jìn)程。 (1)CPU數(shù):獨(dú)立的中央
    的頭像 發(fā)表于 12-05 15:23 ?1705次閱讀

    SMP多核啟動(dòng)cpu操作函數(shù)

    其中spin-table啟動(dòng)方式的回調(diào)如下: const struct cpu_operations smp_spin_table_ops = {.name= "spin-table
    的頭像 發(fā)表于 12-05 16:04 ?666次閱讀
    <b class='flag-5'>SMP</b><b class='flag-5'>多核</b><b class='flag-5'>啟動(dòng)</b>cpu操作函數(shù)

    psci接口規(guī)范介紹

    hotplug (3)secondary cpu啟動(dòng) (4)系統(tǒng)的shutdown和reset psci接口規(guī)定了命令對(duì)應(yīng)的function_id、接口的輸入?yún)?shù)
    的頭像 發(fā)表于 12-05 16:53 ?835次閱讀

    內(nèi)核中的psci驅(qū)動(dòng)是什么

    內(nèi)核中的psci架構(gòu) 內(nèi)核psci軟件架構(gòu)包含psci驅(qū)動(dòng)和每個(gè)cpu的cpu_ops回調(diào)函數(shù)實(shí)現(xiàn)兩部分。 其中psci驅(qū)動(dòng)實(shí)現(xiàn)了驅(qū)動(dòng)初始化和psc
    的頭像 發(fā)表于 12-05 16:58 ?640次閱讀
    內(nèi)核中的<b class='flag-5'>psci</b>驅(qū)動(dòng)是什么

    SMP多核secondary cpu啟動(dòng)流程

    secondary cpu啟動(dòng) 由于psci方式啟動(dòng)secondary cpu的流程,除了其所執(zhí)行的cpu_ops不同之外,其它流程與spin-table方式是相同的,因此我們這里只給出執(zhí)行流程圖
    的頭像 發(fā)表于 12-05 17:41 ?729次閱讀
    <b class='flag-5'>SMP</b><b class='flag-5'>多核</b>secondary cpu<b class='flag-5'>啟動(dòng)</b>流程

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

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