嵌入式开发论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 140|回复: 0

4. ATF(ARM Trusted firmware)启动---bl2到bl31的跳转

[复制链接]

59

主题

64

帖子

255

积分

版主

Rank: 7Rank: 7Rank: 7

积分
255
发表于 2018-11-29 18:18:37 | 显示全部楼层 |阅读模式

在bl2_main函数中的最后一句是:
smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0);
  该函数将触发smc操作,而smc的handle在bl1阶段的时候被指定,调用该函数的时候带入command ID是BL1_SMC_RUN_IMAGE,故执行该函数之后,系统将跳转到中断处理函数:smc_handler64继续执行。该函数定义在bl1/aarch64/bl1_exception.S文件中,内容如下:

  1. <pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;cpp&quot;,&quot;code&quot;:&quot;func smc_handler64\n\n\t/* ----------------------------------------------\n\t * Detect if this is a RUN_IMAGE or other SMC.\n\t * ----------------------------------------------\n\t */\n/* 判定触发smc操作时带入的参数是否是跳转执行image的操作 */\n\tmov\tx30, #BL1_SMC_RUN_IMAGE\t//将BL1_SMC_RUN_IMAGE的值保存到x30\n\tcmp\tx30, x0\t//比较x30与x0的值\n\tb.ne\tsmc_handler\t//如果x30与x0不同则认为是普通类型的异常,进入到smc_handler进行处理\n\n\t/* ------------------------------------------------\n\t * Make sure only Secure world reaches here.\n\t * ------------------------------------------------\n\t */\n\tmrs\tx30, scr_el3\t//获取scr寄存器的值\n\ttst\tx30, #SCR_NS_BIT\t//比较scr寄存器中的NS位与SCR_NS_BIT是否相等\n\tb.ne\tunexpected_sync_exception\t//如果当前NS位为非安全位,则证明不合法,产生异常\n\n\t/* ----------------------------------------------\n\t * Handling RUN_IMAGE SMC. First switch back to\n\t * SP_EL0 for the C runtime stack.\n\t * ----------------------------------------------\n\t */\n\tldr\tx30, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]\t/获取offset和sp的值\n\tmsr\tspsel, #0\t//清空spsel中的值\n\tmov\tsp, x30\t//保存x30的值到sp寄存器,用于返回\n\n\t/* ---------------------------------------------------------------------\n\t * Pass EL3 control to next BL image.\n\t * Here it expects X1 with the address of a entry_point_info_t\n\t * structure describing the next BL image entrypoint.\n\t * ---------------------------------------------------------------------\n\t */\n\tmov\tx20, x1\t//将x1中的数据保存到x20中\n\n\tmov\tx0, x20\t//将x20的数据保存到x0中\n\tbl\tbl1_print_next_bl_ep_info\t//打印出bl3x镜像文件信息\n\n\tldp\tx0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]\t//将传入的参数和bl3x入口函数PC指针\n\tmsr\telr_el3, x0\t\n\tmsr\tspsr_el3, x1\n\tubfx\tx0, x1, #MODE_EL_SHIFT, #2\t//设定cortex模式\n\tcmp\tx0, #MODE_EL3\t//比较x0寄存器中的值是否为MODE_EL3\n\tb.ne\tunexpected_sync_exception\t//如果x0中不是MODE_EL3则产生异常\n\n\tbl\tdisable_mmu_icache_el3\t//禁止MMU的指令cache\n\ttlbi\talle3\n\n#if SPIN_ON_BL1_EXIT\n\tbl\tprint_debug_loop_message\ndebug_loop:\n\tb\tdebug_loop\n#endif\n\tmov\tx0, x20\n\tbl\tbl1_plat_prepare_exit/\n* 设定返回参数 */\n\tldp\tx6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x30)]\n\tldp\tx4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x20)]\n\tldp\tx2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x10)]\n\tldp\tx0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + 0x0)]\n\teret\t//跳转到bl3x执行\nendfunc smc_handler64&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-cpp hljs">func smc_handler64

  2.         <span class="hljs-comment">/* ----------------------------------------------
  3.          * Detect if this is a RUN_IMAGE or other SMC.
  4.          * ----------------------------------------------
  5.          */</span>
  6. <span class="hljs-comment">/* 判定触发smc操作时带入的参数是否是跳转执行image的操作 */</span>
  7.         mov        x30, #BL1_SMC_RUN_IMAGE        <span class="hljs-comment">//将BL1_SMC_RUN_IMAGE的值保存到x30</span>
  8.         cmp        x30, x0        <span class="hljs-comment">//比较x30与x0的值</span>
  9.         b.ne        smc_handler        <span class="hljs-comment">//如果x30与x0不同则认为是普通类型的异常,进入到smc_handler进行处理</span>

  10.         <span class="hljs-comment">/* ------------------------------------------------
  11.          * Make sure only Secure world reaches here.
  12.          * ------------------------------------------------
  13.          */</span>
  14.         mrs        x30, scr_el3        <span class="hljs-comment">//获取scr寄存器的值</span>
  15.         tst        x30, #SCR_NS_BIT        <span class="hljs-comment">//比较scr寄存器中的NS位与SCR_NS_BIT是否相等</span>
  16.         b.ne        unexpected_sync_exception        <span class="hljs-comment">//如果当前NS位为非安全位,则证明不合法,产生异常</span>

  17.         <span class="hljs-comment">/* ----------------------------------------------
  18.          * Handling RUN_IMAGE SMC. First switch back to
  19.          * SP_EL0 for the C runtime stack.
  20.          * ----------------------------------------------
  21.          */</span>
  22.         ldr        x30, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]        /获取offset和sp的值
  23.         msr        spsel, #<span class="hljs-number">0</span>        <span class="hljs-comment">//清空spsel中的值</span>
  24.         mov        sp, x30        <span class="hljs-comment">//保存x30的值到sp寄存器,用于返回</span>

  25.         <span class="hljs-comment">/* ---------------------------------------------------------------------
  26.          * Pass EL3 control to next BL image.
  27.          * Here it expects X1 with the address of a entry_point_info_t
  28.          * structure describing the next BL image entrypoint.
  29.          * ---------------------------------------------------------------------
  30.          */</span>
  31.         mov        x20, x1        <span class="hljs-comment">//将x1中的数据保存到x20中</span>

  32.         mov        x0, x20        <span class="hljs-comment">//将x20的数据保存到x0中</span>
  33.         bl        bl1_print_next_bl_ep_info        <span class="hljs-comment">//打印出bl3x镜像文件信息</span>

  34.         ldp        x0, x1, [x20, #ENTRY_POINT_INFO_PC_OFFSET]        <span class="hljs-comment">//将传入的参数和bl3x入口函数PC指针</span>
  35.         msr        elr_el3, x0       
  36.         msr        spsr_el3, x1
  37.         ubfx        x0, x1, #MODE_EL_SHIFT, #<span class="hljs-number">2</span>        <span class="hljs-comment">//设定cortex模式</span>
  38.         cmp        x0, #MODE_EL3        <span class="hljs-comment">//比较x0寄存器中的值是否为MODE_EL3</span>
  39.         b.ne        unexpected_sync_exception        <span class="hljs-comment">//如果x0中不是MODE_EL3则产生异常</span>

  40.         bl        disable_mmu_icache_el3        <span class="hljs-comment">//禁止MMU的指令cache</span>
  41.         tlbi        alle3

  42. <span class="hljs-meta">#<span class="hljs-meta-keyword">if</span> SPIN_ON_BL1_EXIT</span>
  43.         bl        print_debug_loop_message
  44. debug_loop:
  45.         b        debug_loop
  46. <span class="hljs-meta">#<span class="hljs-meta-keyword">endif</span></span>
  47.         mov        x0, x20
  48.         bl        bl1_plat_prepare_exit/
  49. * 设定返回参数 */
  50.         ldp        x6, x7, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + <span class="hljs-number">0x30</span>)]
  51.         ldp        x4, x5, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + <span class="hljs-number">0x20</span>)]
  52.         ldp        x2, x3, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + <span class="hljs-number">0x10</span>)]
  53.         ldp        x0, x1, [x20, #(ENTRY_POINT_INFO_ARGS_OFFSET + <span class="hljs-number">0x0</span>)]
  54.         eret        <span class="hljs-comment">//跳转到bl3x执行</span>
  55. endfunc smc_handler64</code></pre><span class="cke_reset cke_widget_drag_handler_container" style="background:rgba(220,220,220,0.5);background-image:url(https://csdnimg.cn/release/blog_editor_html/release1.3.3/ckeditor/plugins/widget/images/handle.png)"><img class="cke_reset cke_widget_drag_handler" data-cke-widget-drag-handler="1" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" width="15" title="点击并拖拽以移动" height="15" role="presentation"></span>
复制代码















回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|TEE and Virtualization

GMT+8, 2019-5-24 07:15 , Processed in 0.135458 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表