0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PSCI处理函数代码分析

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-12-05 18:08 次阅读

处理函数根据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
    cpu
    +关注

    关注

    68

    文章

    10854

    浏览量

    211585
  • SMP
    SMP
    +关注

    关注

    0

    文章

    74

    浏览量

    19654
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62573
  • 设备树
    +关注

    关注

    0

    文章

    38

    浏览量

    3116
收藏 人收藏

    评论

    相关推荐

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

    新的中断不会再发给该处理器核;反过来,如果处理器核重新上电,要在OS调度器中加载该处理器的信息,并且需要重新配置中断寄存器。而CPUIdle就没有加载/移除的需要。从上图可以看出来,PSCI
    发表于 04-02 09:45

    2160处理器支持VHE吗?

    ] CPU15: 关闭 [ 94.403035] psci: CPU15 被杀死。 [94.417654]再见! 然后控制台没有输出,看了kexec代码后,我有一些疑问: 1. 2160处理器支持VHE吗?我
    发表于 06-08 07:21

    ESAM接口函数代码

    ESAM接口函数代码 ESAM接口函数说是用子程序的代码
    发表于 08-18 16:51 65次下载

    华清远见FPGA代码-使用函数实现简单的八位处理

    华清远见FPGA代码-使用函数实现简单的八位处理
    发表于 10-27 18:07 4次下载

    ARM处理器的启动代码分析与设计

    ARM处理器的启动代码分析与设计
    发表于 09-25 08:27 12次下载
    ARM<b class='flag-5'>处理</b>器的启动<b class='flag-5'>代码</b>的<b class='flag-5'>分析</b>与设计

    用于MPLAB X IDE代码性能分析插件的工作原理和代码性能分析参考

    MPLAB X IDE提供收集有关C代码函数函数级性能分析(Function Level Profiling, FLP)数据的功能。但是,该数据无法在未安装MPLAB X IDE插件
    发表于 06-11 04:28 11次下载
    用于MPLAB X IDE<b class='flag-5'>代码</b>性能<b class='flag-5'>分析</b>插件的工作原理和<b class='flag-5'>代码</b>性能<b class='flag-5'>分析</b>参考

    MATLAB图像处理工具箱的函数介绍和图像处理分析的技术实现分析

    介绍了MATLAB 图像处理工具箱中的函数, 给出了图像处理分析的技术实现, 如用空域法进行图像增强, 通过形态学方法进行图像特征抽取与分析
    发表于 10-30 16:30 10次下载
    MATLAB图像<b class='flag-5'>处理</b>工具箱的<b class='flag-5'>函数</b>介绍和图像<b class='flag-5'>处理</b>与<b class='flag-5'>分析</b>的技术实现<b class='flag-5'>分析</b>

    用于MPLABX IDE的代码性能分析插件

    MPLAB X IDE提供收集有关C代码函数函数级性能分析(Function Level Profiling,FLP)数据的功能。但是,该数据无法在未安装MPLAB X IDE插件—
    发表于 05-12 10:38 15次下载

    使用Arduino函数简化代码

    组织扩展代码的一种出色技术是使用函数,即可以根据需要从程序的其他部分(例如通过主循环)调用的代码片段。
    的头像 发表于 08-16 09:23 1919次阅读
    使用Arduino<b class='flag-5'>函数</b>简化<b class='flag-5'>代码</b>

    psci电源管理接口可以用于什么场景

    psci是arm提供的一套电源管理接口,当前一共包含0.1、0.2和1.0三个版本。它可被用于以下场景:(1)cpu的idle管理 (2)cpu hotplug以及secondary cpu启动
    的头像 发表于 12-05 16:28 553次阅读

    psci接口规范介绍

    由于psci是由linux内核调用bl31中的安全服务,实现cpu电源管理功能的。因此其软件架构包含三个部分: (1)内核与bl31之间的调用接口规范 (2)内核中的架构 (3)bl31中的架构
    的头像 发表于 12-05 16:53 922次阅读

    内核中的psci驱动是什么

    内核中的psci架构 内核psci软件架构包含psci驱动和每个cpu的cpu_ops回调函数实现两部分。 其中psci驱动实现了驱动初始化
    的头像 发表于 12-05 16:58 720次阅读
    内核中的<b class='flag-5'>psci</b>驱动是什么

    内核中的psci架构cpu_ops接口

    cpu_ops接口 驱动初始化完成后,cpu的cpu_ops就可以调用这些回调实现psci功能的调用。如下所示,当devicetree中cpu的enable-method设置为psci时,该cpu
    的头像 发表于 12-05 17:25 692次阅读

    bl31中的psci架构介绍

    std_svc_setup会在bl31启动流程中被调用,以用于初始化该服务相关的配置。而std_svc_smc_handler为其smc异常处理函数,当内核通过psci接口调用相关服务时,最终将由该
    的头像 发表于 12-05 17:33 1062次阅读
    bl31中的<b class='flag-5'>psci</b>架构介绍

    SMP多核启动PSCI代码示例

    _setup //lib/psci/psci_setup.c - >plat_setup_psci_ops //设置平台的psci操作 调用平台的plat_setup_
    的头像 发表于 12-05 17:45 691次阅读