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

    文章

    10446

    浏览量

    206575
  • SMP
    SMP
    +关注

    关注

    0

    文章

    68

    浏览量

    19450
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • 设备树
    +关注

    关注

    0

    文章

    35

    浏览量

    3045
收藏 人收藏

    评论

    相关推荐

    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

    地球引力位函数在流处理器上的实现与分析

    地球引力位函数在流处理器上的实现与分析处理器是新型高性能微处理器的代表之一。该文通过分析I
    发表于 03-30 10:31 29次下载

    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次下载

    静态代码块、构造代码块、构造函数及普通代码块的执行顺序

    在Java中,静态代码块、构造代码块、构造函数、普通代码块的执行顺序是一个笔试的考点,通过这篇文章希望大家能彻底了解它们之间的执行顺序。 1、静态
    的头像 发表于 10-09 15:40 434次阅读
    静态<b class='flag-5'>代码</b>块、构造<b class='flag-5'>代码</b>块、构造<b class='flag-5'>函数</b>及普通<b class='flag-5'>代码</b>块的执行顺序

    psci接口规范介绍

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

    内核中的psci驱动是什么

    内核中的psci架构 内核psci软件架构包含psci驱动和每个cpu的cpu_ops回调函数实现两部分。 其中psci驱动实现了驱动初始化
    的头像 发表于 12-05 16:58 232次阅读
    内核中的<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 297次阅读

    bl31中的psci架构介绍

    std_svc_setup会在bl31启动流程中被调用,以用于初始化该服务相关的配置。而std_svc_smc_handler为其smc异常处理函数,当内核通过psci接口调用相关服务时,最终将由该
    的头像 发表于 12-05 17:33 371次阅读
    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 274次阅读