ATF(Arm Trusted Firmware)/TF-A Chapter 02 BL1-ROMCode - Continued(2)

第二章目录:

Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode

Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode - Continued(1)

Chapter 02.TF-A(Arm Trusted Firmware, ATF ) BL1-ROMCode - Continued(2) (本文)

下一章:

Chapter 03.TF-A(Arm Trusted Firmware, ATF ) Chain of Trust (CoT)


继续BL1-ROMCode 的说明。

我们看下firmware desgin对BL2 load and execute的描述:

In the normal boot flow, BL1 execution continues as follows:

    BL1 prints the following string from the primary CPU to indicate successful execution of the BL1 stage:

    "Booting Trusted Firmware"

    BL1 loads a BL2 raw binary image from platform storage, at a platform-specific base address. Prior to the load, BL1 invokes bl1_plat_handle_pre_image_load() which allows the platform to update or use the image information. If the BL2 image file is not present or if there is not enough free trusted SRAM the following error message is printed:

    "Failed to load BL2 firmware."

    BL1 invokes bl1_plat_handle_post_image_load() which again is intended for platforms to take further action after image load. This function must populate the necessary arguments for BL2, which may also include the memory layout. Further description of the memory layout can be found later in this document.

    BL1 passes control to the BL2 image at Secure EL1 (for AArch64) or at Secure SVC mode (for AArch32), starting from its load address.

指的注意的是,arm设计的一个方案是BL2在EL1上运行(另一个方案是在EL3)BL1将控制权交给secure EL1(AArch64)或安全SVC模式(AArch32)的BL2image,从其加载地址开始。

bl1_load_bl2与之前的bl1_platform_setup->arm_bl1_platform_setup->arm_load_tb_fw_config->load_auth_image流程类似:

  1. 获取image_desc
  2. pre-load-image
  3. load_auth_image
  4. bl1_plat_handle_post_image_load

首先bl1_plat_get_image_desc返回的是BL2的static desc

接着pre-load-image:

bl1_plat_handle_pre_image_load直接返回0,需要的话自己实现替换这个函数

load_auth_image,load bl2到sram

最后bl1_plat_handle_post_image_load

Porting guide中:

Plat/common/plat_common.c

80~95行,和之前load方法相同,不在描述,重点是bl1_plat_sec_mem_layout(plat/arm/common/arm_bl1_setup.c)

  1. 一个weak实现
  2. 只在cold boot时调用此函数。
  3. 它在enable MMU和D-cache的情况下执行。
  4. 此函数返回的指针必须指向包含BL1阶段的安全RAM的范围和可用性的meminfo结构。
  5. BL1使用此信息将BL2映像加载到安全RAM中。 BL1还填充了一个类似的结构,告诉BL2可供自己使用的内存范围。

代码中直接返回一个静态结构体变量:

 

回忆在bl_entrypoint.s的bl_entrypoint,43行调用的bl1_early_platform_setup->arm_bl1_early_platform_setup

回到bl1_plat_handle_post_image_load:

bl1_calc_bl2_mem_layout看计算bl2 layout,并按照arm约定的参数将bl2_tzram地址保存到arg1

bl2_mem_layout->total_size= 40000 -1000-b000=256k-4k-44k

bl2_mem_layout->total_base= 0400 0000 +1000

红色部分为bl2可用的sram大小

 

返回到bl1_main<-bl1_load_bl2<-bl1_plat_handle_post_image_load

 

bl1_prepare_next_image(bl1/aarch64/bl1_context_mgmt.c,41行)主要是设置Secure/Non-Secure 和EL的信息给next_bl_ep-,等进入bl2前设置

这里id传进来的bl2的id,87行,h.attr为SECURE | EXECUTABLE

73行,security _statewei==secure为true

将spsr保存到next_bl_sp->spsr(image_desc->ep_info->spsr)中,内容为:

  1. M[4]=0 ,exception taken from aarch64
  2. N[3:]=0b0100,进入当前el之前的状态来自el1t的aarch64
  3. FIQ,IRQ_,ABT,DBG exception被mask

在执行:

空函数,看看porting guide怎么说的:

继续,

92行,初始化上下文管理,为退出el3做准备

Ctx为bl1_cpu_context_ptr[2]指针,一个指向安全,一个非安全
cm_setup_context:
首次使用前初始化ctx,设置entry_point_info结构指定的初始入口点状态。
EE和ST属性用于为新执行上下文配置endianess和安全计时器可用性。
为入口调用cm_prepare_el3_exit()和el3_exit()准备寄存器状态。 对于Secure-EL1,cm_prepare_el3_exit()等效于cm_e1_sysreg_context_restore()。
看代码:

描述的很清楚,先恢复默认值:

SCR:清NS, EL0 and EL1 are in Secure state。

清RW, bit [10,Lower levels are all AArch32

清FIQ, bit [2]和IRQ, bit [1],When executing at Exception levels below EL3, physical FIQ&IRQ interrupts are not taken to EL3

清ST, bit [11],Secure EL1 using AArch64 accesses to the CNTPS_TVAL_EL1, CNTPS_CTL_EL1, and CNTPS_CVAL_EL1 are trapped to EL3.

清HCE, bit [8],0 HVC instructions are UNDEFINED at EL3, EL2, and Non-secure EL1, and any resulting exception is taken from the current Exception level to the current Exception level.

再设置:SCR_RW_BIT,The next lower level is AArch64.

前面代码分析过,SCR_EL3在宏el3_arch_init_common中的复位序列期间初始化。此代码修改影响下一个EL的SCR_EL3字段。回忆一下.macro el3_entrypoint_common代码,

已经把EL3上的一些寄存器污染了,需要reset下,然后根据SPSR_EL3的状态以及下一个EL的安全状态和入口点属性更新为所需的值。

注释写的很清楚:

HANDLE_EA_EL3_FIRST=0,FAULT_INJECTION_SUPPORT=0,没有定义IMAGE_BL31忽略部分代码

给sctlr变量赋值,用于后续设置sctlr_el1寄存器:

给 bit29,28,23,22,20,11置位(SCTLR_EL1_RES1展开后)

Bit29,28,23,22,2011在ARMv8.1 and ARMv8.0中保留

保存actlr到ctx。 ACTLR_EL1, Auxiliary Control Register (EL1)为IMPLEMENTATION DEFINED,应该是Soc厂商IMPLEMENTATION

初始化PMCR_EL0, Performance Monitors Control Register

回到bl1_prepare_next_image,执行cm_prepare_el3_exit:

  1. 准备CPU系统寄存器,以便首次进入安全或正常的世界
  2. 如果在EL2(aarch64)或hyp模式(aarch32)下执行,则初始化SCTLR_EL2
  3. 如果请求执行非安全EL1(aarch64)或svc模式(aarch32),并且CPU支持EL2,则通过配置所有必需的EL2寄存器来禁用EL2。
  4. 对于所有入口,EL1寄存器是从cpu_context初始化的

这里直接看代码。

直接跳过non_secure的情况

cm_el1_sysregs_context_restore(lib/el3_runtime/aarch64/conntext_mgmt.c,485行)

调用el1_sysregs_context_restore(lib/el3_runtime/aarch64/conntext.S,119行)

这个函数严格遵循AArch64 PCS,使用x9-x17(临时调用者保存的寄存器)来恢复EL1系统寄存器上下文。 它假定'x0'指向'el1_sys_regs'结构,从中恢复寄存器上下文。

cm_set_next_context:

这个函数用于读写用于异常返回的上下文,初始化SP_EL3为指向为所需安全状态设置的“cpu_context”的指针:

执行完,返回bl1_prepare_next_image:

返回bl1_main,返回到bl1_entrypoint

bl1_entrypoint:

退出EL3:lib/el3_runtime/aarch64/context.S,386行

分析下el3_exit代码,el3_exit在多个bl阶段都会用到

首先,这个函数假定SP_EL3指向一个有效的ctx保存secure 状态下的bl2相关寄存器值

El3_exit主要工作:

  1. 保存当前的SP_EL0,即将用于处理下一个SMC的EL3运行时堆栈。 然后切换到SP_EL3
  2. 在ERET之前恢复SPSR_EL3,ELR_EL3和SCR_EL3
  3. 恢复保存的gp寄存器并返回EL1

对于执行ATF BLX ,总是通过ERET(异常返回)指令执行下一阶段的BLx。而执行RERT指令所在的BLx,在ARM的设计思想(ARM的Trust Boot规范)里,总是由Secure EL状态执行,基本上就是在EL3上执行。

而对于加载BLx,加载本身不涉及到安全,而且会使用外设和外部memory,则可以在Non-Secure EL上加载。

所以,ARM ATF(这套代码其实主要是linaro写的,你会发现ATF和OPTEE的设计思路,函数命名,调用实现方式都是类似的),加载在运行在Non-Secure EL的Blx上执行,跳转是运行在Secure EL的Blx上执行。例如,BL1(EL3)跳到BL2(NS-EL1),BL2加载BL31,BL32,BL33,甚至是kernel,通过SMC指令陷入到EL3,此时EL3上异常入口还是在BL1上设置的,自然就返回到BL1上处理。BL1通过传递的EP info等参数,配置SCR,SPSR等寄存器,执行RERT,就返回到了下一阶段的BLx上,开始执行代码。

在EL3上执行的BL主要有两个:BL1和BL31。当然,BL2也有BL2 AT EL3这种形式的存在,这主要是给那些ROMCODE(BL1)不符合trust boot规范的厂商准备的。

所以,ATF在设计上充分考虑了各个SoC厂家的可移植性,可能也是出于推行Trust boot规范和atf的考虑,基本上只要厂家愿意投入时间和人力,都可以很好porting到ATF上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 学习对象在全民造车、造芯的大时代,在努力去解决卡脖子的时代,ASIC硬件、SOC底层软件、Linux Kernel等操作系统软件(内核/驱动)、软硬件方面的系统架构师等的岗位需求也越来越明显,社会一直都是非常缺人的,缺的是核心的那一小撮、领头的那一小撮,社会所缺的更是能够软硬件融合的那一小撮人……总之,要想在这个时代,站稳自己的脚跟,能够在大公司或行业上拥有一席之地,就必需深入学习底层技术原理,核心技术才是您的看家本领。本课程设计之初,主要针对SOC底层软件开发的者、系统开发者,或者励志成为这样的人。既适合资深/高级工程师来查缺补漏,又适合初级工程师入门。(理论上该课程和ASIC硬件电路设计无关,该课程偏软件,但事实购买该课程的做ASIC的同学已然超过了15%)适用人群1、芯片开发者(包括底层软件、或做ASIC硬件的)。不限行业,例如车、云、物联网、移动端等领域;2、汽车行业开发者(主机厂、tier1、SOC厂家、各级供应商);3、嵌入式开发者、kernel开发者、驱动、软件工程师;4、学生。既适合学生从入门到精通,也适合资深工程师查缺补漏;您的收益:1、全体系的掌握ARMv8/ARMv9的核心知识点(ARM基础、异常中断GIC、MMU/Cache、architecture...);2、掌握ARM架构、掌握SOC架构、掌握常规IP(gic、smmu、timer、AXI/ACE/CHI、TZC400...);3、快速熟悉常规系统软件(bootrom、spl、ATF、TEE、bootloader、kernel...), Secureboot安全启动...4、技术水平提升N个level, 掌握快速的学习方法;# 学习什么在ARM蓬勃发展的年代,不仅仅涉及到物联网IOT、移动领域(如手机)、汽车电子领域,现在还涉及到PC、服务器的,简直就是各行各业。ARMv8出来已经有10年了,ARMv9也2年时间了。在技术不断更新迭代的背景下,此时再去学习十五年前的ARMv7、二十年前的ARMv5/v6显然不是明智的选择。本课程主要基于当前最新的架构,ARMv8的aarch64和ARMv9,如涉及具体的ARM Core IP主要还是以最新的ARM Core IP为主,软件架构也是以当前最主流的/未来所趋势的架构来讲解。以下也给大家列举初了一个ARM产品的timeline的总结(在本课程中有着大量的这种总结),从这张图中,您是可以清晰的看到本课程拥有独具一格的风格、拥有全网最新(且唯一)的资料总结或学习路线。# 本课程大纲和规划(课程持续更新中,课程总量统计:2022/10/02  当前是 61节课, 22小时)第一章:主要是快速学习: ARM简介、指令集、寄存器总结等。第二章:本系列视频的一大亮点,系统全面地讲解了arm异常中断gic等相关的软硬件知识,本人一直在倡导“学arm安全其实就是学arm架构,学arm架构其实就是学习arm的异常和中断”,异常中断是领着你进入架构的入门,是让你变成系统软硬件架构师的必走之路。第三章:安全专题,这也是本视频最核心的东西。因为你无论买书还是看博客等,你都很难找到讲解安全的教程,这里就是有和无的区别。本人系统的整理的安全的知识,带领你快速入门。第四章:mmu专题,透过事务看本质的讲解,白话式的演讲。在所有模块中,mmu也算是相对较简单模块。相信人人听得懂,人人学得会。第五章:cache专题,一切追求实事求是,不人云亦云,一切知识点都有迹可循,推翻了网络的很多观念。在众多模块中,cache算是一个比较难的模块。了解了cache后,才能算真正了解系统的软硬件架构。第六章:虚拟化,本人不擅长,会啥就随便讲点啥。(以后学会了再来补)第七章:architecture,就是零散和零碎的系统架构知识,如exclusive、arch timer、reset、系统启动、SOC设计、AMBA/AXI/ACE、DSU、WFE/WFI这样的。第八章: 新增的ARMv9 CCA/RME安全架构专题第九章:主要放置一些直播课。# 课程收益1、知道我学习什么,我要怎么去学习,从此之后有了一个明确的学习路线。2、认识一些共同目标的人,相互讨论问题,共同进步。勤学、共学、助学。3、ARM不再神秘,SOC不在神秘,让您短期内就能cover住全局4、熟悉ARM Architecture架构知识5、熟悉SOC架构知识6、熟悉主流的系统软件框架7、熟悉各项硬件原理和机制,如异常中断、MMU、cache、TLB、VMSA、Trustzone6、深入了解当前的系统架构、软硬件架构,能够看懂这些大家,将来也能够自己设计。7、熟悉系统的启动流程、Secureboot等8、熟悉各类标准和规范9、能够进入芯片厂商干活、能够在非芯片产生成为技术担当。10、学习资料的获取方法,会看11500多页的ARM手册,会看数以百计的ARM各项参考手册。 本课程会持续更新。也希望通过本课程的学习,能够让大家的ARMv8/ARMv9开发技术能有质的飞越,能找到自己心仪的工作。在购买之前,也建议大家看一看第一章第一节的课程介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值