高通Android UEFI XBL 代码流程分析
背景
之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构。
所以需要对这块比较新的技术进行学习。在学习之前,有必要了解一下高通UEFI启动流程。
参考文档:80_P2484_117_B_UEFI_With_XBL_On_MSM8998_SDM660_SDM
总览
先来看下SDM660芯片冷启动的流程。可以看出,在设备上电后,先跑的是 APPS PBL,接着运行XBL SEC、XBL Loader,通过Loader引出XBL CORE APPSBL,最后进入HLOS。
我们来看下这几个涉及的模块大概功能:
1、Application primary boot loader (APPS PBL)
PBL 启动时,CPU只开启了第一个核心 CPU Core 0,运行固件在ROM中,这部分是高通写死在芯片中的固件,外部开发人员是无法修改这部份的。
主要功能为:
(1)系统安全环境的初始化,以确保后续的XBL中的APPS 能够正常运行。
(2)根据boot gpio的配置选择从什么设备启动操作系统(如 Nand,USB等)。
(3)通过检测GPIO判断是否进入Emergency Download mode,用户可以通过FILE来下载完整的系统镜像。
(4)通过L2 TCM来加载XBL1 ELF,OCIMEM 和 RPM CodeRAM 代码。
2、Extensible boot loader (XBL)
从XBL开始,跑的就是我们编译下载进eMMC/UFS的系统镜像了,在XBL中主要是初始化相关的硬件环境,及代码安全环境。
(1)初始化 Buses、DDR、Clocks、CDT,启动QSEE,QHEE,RPM_FW, XBL core images。
(2)使能memory dump through USB and Sahara(系统死机时memory dump),看门狗,RAM dump to SD support等功能。
(3)初始化 USB驱动,USB充电功能,温升检测,PMIC驱动初始化,和 DDR training模块。
3、XBL core (UEFI or LK,ABL)
XBL core,就是之前的bootloader,主要功能就是初始化display驱动,提供fastboot功能,引导进入HLOS kernel操作系统。
注意,在ABL中,同样也只有CPU Core0在工作,其他的CPU核以是在进入HLOS Kernel后才开始初始化启用的。
本文中,我们重点关注的是Extensible boot loader (XBL),主要来学学UEFI XBL架构,及UEFI XBL代码流程。
一、UEFI XBL
代码目录分析
UEFI XBL代码路径位于:BOOT.XF.1.4\boot_images\
# BOOT.XF.1.4\boot_images
ArmPkg----> ARM 架构相关的Protocols
ArmPlatformPkg----> ARM 开发板相关的UEFI代码
BaseTools----> 编译EDK和EDK2相关的工具,如
EmbeddedPkg---->
FatPkg
IntelFrameworkModulePkg
IntelFrameworkPkg
MdeModulePkg
MdePkg
QcomPkg----> 高通定制的相关pkg,如display和usb充电都在里面
ShellPkg----> UEFI shell 环境
UEFI代码运行流程
从图中可以看出,UEFI代码运行流程为:
SEC(安全验证)--->PEI(EFI前期初始化)--->DXE(驱动执行环境)--->BDS(启动设备选择)--->UEFI Loader(操作系统加载前期)--->RT(Run Time)。
接下来,我们根据这个流程来分析下UEFI代码。
SEC (安全验证)
SEC的汇编代码入口位于:
BOOT.XF.1.4\boot_images\QcomPkg\XBLCore\AARCH64\ModuleEntryPoint.masm的 _ModuleEntryPoint中
入口汇编代码分析
分析看看ModuleEntryPoint.masm 这个文件
该汇编代码中,主要工作为:
1、关闭所有中断
2、关闭MMU和Caches
3、关闭TLB缓存表
4、获得当前运行的安全环境:EL1、EL2、EL3
5、初始化ELX 安全环境
6、使能 Cache
7、初始化栈
8、调用 CEntryPoint,传参 _StackBase(0x80C00000)、_StackSize(0x00040000)
#inc