本文档描述了在Trusted Firmware-A(TF-A)中处理CPU重置的框架的高级设计。它还描述了平台集成商如何在一定程度上根据系统配置定制此代码,从而简化和优化引导流程。

本文档应与固件设计文档一起使用,该文档提供了有关重置代码的更多实施细节,特别是针对冷启动路径。

一般重置代码流程

默认情况下,TF-A重置代码在BL1中实现。下图说明了这一点:

X86 default Reset Code

此图显示了未优化的默认重置流程。根据系统配置,这些步骤中的一些可能是不必要的。以下各节通过指示哪些构建选项排除哪些步骤来指导平台集成商,具体取决于平台的能力。

Note:

如果将BL31用作TF-A入口点而不是BL1,则上图仍然相关,因为在这种情况下,所有这些操作都将发生在BL31中。有关详细信息,请参阅第6节“使用BL31入口点作为重置地址”。

可编程CPU复位地址

默认情况下,TF-A假定CPU重置地址不可编程。因此,无论何时重置,所有CPU都从同一地址(通常为地址0)开始。然后需要进一步的逻辑来确定是冷启动还是热启动以将CPU引导到正确的执行路径。

如果重置向量地址(反映在重置向量基地址寄存器RVBAR_EL3中)是可编程的,则可以使每个CPU在冷重置和热重置时直接从正确的地址启动。因此,可以跳过启动类型检测,导致以下启动流程:

Reset Code No Boot Type Check

要启用此引导流,请使用PROGRAMMABLE_RESET_ADDRESS=1编译TF-A。此选项仅影响TF-A重置图像,默认情况下为BL1,如果reset_TO_BL31=1,则为BL31。

在FVP和Juno平台上,重置向量地址都是不可编程的,因此两个端口都使用PROGRAMABLE_reset_ADRESS=0。

在单个CPU上冷启动

默认情况下,TF-A假设可能会释放几个CPU而不进行重置。因此,冷启动代码必须仲裁对CPU之间共享的硬件资源的访问。 这是通过将其中一个CPU指定为主CPU来完成的,主CPU负责初始化共享硬件并与其他CPU协调引导流程。

如果平台保证只启动一个CPU,则不需要仲裁。主/辅CPU本身的概念不再适用。这将导致以下引导流:

Reset Code No CPU Check

要启用此引导流,请使用COLD_BOOT_SINGLE_CPU=1 Compile TF-A。此选项仅影响TF-A重置图像,默认情况下为BL1。如果RESET_TO_BL31=1,则为BL31。

在FVP和Juno平台上,虽然默认情况下只有一个内核启动,但有一些特定于平台的方法可以释放任意数量的内核。因此,COLD用于两个平台端口_BOOT_SINGLE_CPU=0

可编程CPU重置地址,单CPU冷启动

显然,在具有可编程CPU重置地址并释放单个CPU重置的平台上,可以将两种优化结合起来。这将导致以下引导流:

Reset Code No Check

要启用此引导流,请使用COLD_BOOT_SINGLE_CPU=1和PROGRAMMABLE_RESET_ADDRESS=1编译TF-A。这些选项仅影响TF-A重置图像,默认情况下为BL1,如果RESET_TO_BL31=1,则为BL31。

使用BL31入口点作为重置地址

在某些平台上,应用程序处理器的运行时固件(BL3x映像)由SoC上的安全系统处理器上运行的某些固件加载,而不是由主应用程序处理器上的BL1和BL2加载。对于这种类型的SoC,期望应用处理器总是复位到BL31,这消除了对BL1和BL2的需要。

TF-A提供了一个构建时选项RESET_TO_BL31,该选项包括BL31入口点中的一些附加逻辑,以支持该用例。在此配置中,平台的受信任引导固件必须确保在应用程序处理器通电之前,BL31加载到其运行时地址,该地址必须与CPU的RVBAR_EL3重置矢量基地址匹配。此外,平台软件负责加载所需的其他BL3x映像,并向BL31提供这些映像的入口点信息。加载这些映像可以通过可信引导固件或BL31中的平台代码完成。

尽管Arm FVP平台不支持在运行时动态编程重置基址,但可以在启动时设置RVBAR_EL3寄存器的初始值。此功能仅在基本FVP上提供。

它允许Arm FVP端口支持RESET_to_BL31配置,在这种情况下,BL31.bin映像必须加载到Trusted SRAM中的运行地址,并且所有CPU重置向量都从默认0x0更改为该运行地址。有关以这种方式运行FVP模型的详细信息,请参阅Arm Fixed Virtual Platforms(FVP)。

虽然从技术上讲,可以在SCP固件中使用正确的支持对重置基址进行编程,但目前尚未实现,因此Juno端口不支持reset_to_BL31配置。

RESET_TO_BL31配置需要对BL31功能进行一些添加和更改:

引导路径的确定

在此配置中,BL31使用与上述BL1相同的重置框架和代码。因此,它以同样的方式受到PROGRAMABLE_RESET_ADDRESS和COLD_BOOT_SINGLE_CPU构建选项的影响。

在默认的、未优化的BL31重置流程中,在热启动时,CPU通过平台定义的机制被引导到PSCI实现。在冷启动时,平台必须将任何辅助CPU置于安全状态,同时主CPU执行修改的BL31初始化,如下所述。

平台初始化

在这种配置中,当CPU复位到BL31时,前一个引导阶段应该没有可以在寄存器中传递的参数。相反,BL31中的平台代码需要知道或能够确定BL32(如果需要)和BL33图像的位置,并响应BL31_plat_get_next_image_ep_info()函数提供该信息。

Note:

配置RESET_TO_BL31的某些平台可能仍然能够接收寄存器中的参数,这取决于它们的实际引导顺序。在这些情况下,除了RESET_to_BL31之外,这些平台还应设置RESET_to-BL31_WITH_PARAMS,以避免输入寄存器在进入BL31之前归零。

此外,平台软件负责执行任何安全初始化,例如编程TrustZone地址空间控制器。这可以通过可信引导固件或BL31中的平台代码完成。