ARMV8 RK3399 u-boot TPL启动流程分析 --start.S

上电后运行的第一支文件:arch/arm/cpu/armv8/start.S

CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK=1

#include <asm/arch/boot0.h>

跳转到 arch/arm/include/asm/arch-rockchip/boot0.h

CONFIG_SPL_BUILD=1

b 1f

ROCKCHIP_EARLYRETURN_TO_BROM=no

TINY_FRAMEWORK=no

b reset

reset 位于 arch/arm/cpu/armv8/start.S

b save_boot_params

save_boot_params 位于arch/arm/mach-rockchip/bootrom.c

Rockchip BROM 有设置stackpointer, 此处可以正常运行c code

  1. ret = setjmp(brom_ctx);

setjmp 位于arch/arm/lib/setjmp_aarch64.S

该函数将regs 保存到brom_ctx, 注意

a.此处需将brom_ctx强制声明为data section, bss 还未初始化,初始化时会将其清掉

b. 保存的LR等于save_boot_params的返回地址,即save_boot_params_ret

c. mov x0, #0 => ret 等于0

  1. check_back_to_brom_dnl_flag

CONFIG_ROCKCHIP_BOOT_MODE_REG 0xff320300

BROM_BOOTSOURCE_ID_ADDR = no

return false

goto save_boot_params_ret

  1. 设置中断向量相关,根据当前EL级别跳转到3,2,1

CONFIG_POSITION_INDEPENDENT=n

CONFIG_SYS_RESET_SCTRL=n

复制代码
	adr	x0, vectors
	switch_el x1, 3f, 2f, 1f
3:	msr	vbar_el3, x0
	mrs	x0, scr_el3
	orr	x0, x0, #0xf			/* SCR_EL3.NS|IRQ|FIQ|EA */
	msr	scr_el3, x0
	msr	cptr_el3, xzr			/* Enable FP/SIMD */
#ifdef COUNTER_FREQUENCY
	ldr	x0, =COUNTER_FREQUENCY
	msr	cntfrq_el0, x0			/* Initialize CNTFRQ */
#endif
	b	0f

4 cache 相关设置

CONFIG_SYS_ICACHE_OFF=n

复制代码
    mov x1, #CR_I
	switch_el x2, 3f, 2f, 1f
3:	mrs	x0, sctlr_el3
	orr	x0, x0, x1
	msr	sctlr_el3, x0
#ifndef CONFIG_SUPPORT_USBPLUG
	msr	daifclr, #4			/* Enable SError. SCR_EL3.EA=1 was already set in start.S */
#endif
	b	0f

    ...

0:
	isb

5 SMP 相关设置

CONFIG_ARMV8_SET_SMPEN=n, 跳过这段

6

/* Apply ARM core specific erratas */

bl apply_core_errata //arm 相关errata, 暂不具体分析

/* Processor specific initialization */

bl lowlevel_init //RK3399 没有相关定义,使用start.S 中的weak function

CONFIG_IRQ=1

CONFIG_GICV3=1

7 如下都是n, 跳过分析

CONFIG_ARMV8_SPIN_TABLE=n

CONFIG_ARMV8_MULTIENTRY=n

CONFIG_ARM_SMP=n

8

master_cpu:

bl _main //至此跳转到arch/arm/lib/crt0.S,

相关推荐
三体世界2 小时前
Mysql基本使用语句(一)
linux·开发语言·数据库·c++·sql·mysql·主键
TT-Kun2 小时前
Linux 上手 UDP Socket 程序编写(含完整具体demo)
linux·计算机网络·udp
一川风絮千片雪2 小时前
【环境配置】Linux/Ubuntu24.04 无图形界面安装显卡驱动
linux·运维·服务器
Danileaf_Guo3 小时前
Ubuntu 18.04快速配置WireGuard互联
linux·运维·服务器·ubuntu
快乐就是哈哈哈3 小时前
从零部署 MySQL 数据库:Linux 安装与防火墙策略全解析
linux·mysql
koboides4 小时前
我的第一个开源项目-jenkins集成k8s项目
linux·运维·云原生·容器·kubernetes·jenkins
yuxb735 小时前
Ansible 基础到实操笔记
linux·笔记·ansible
檀越剑指大厂7 小时前
【Linux系列】服务器 IP 地址查询
linux·服务器·tcp/ip
十五年专注C++开发8 小时前
CMake进阶: externalproject_add用于在构建阶段下载、配置、构建和安装外部项目
linux·c++·windows·cmake·自动化构建
Skylar_.8 小时前
嵌入式 - Linux软件编程:进程
java·linux·服务器