文章目录
1. opensbi流程
opensbi第一条执行的指令是从_start开始(firmware/fw_base.S).代码如下
_start:
/* Find preferred boot HART id */
MOV_3R s0, a0, s1, a1, s2, a2
call fw_boot_hart /*fw_boot_hart调用成功,则返回hart id,否则返回-1,在单步调试中,发现fw_boot_hart一般返回的就是hart id,即放在a0寄存器中*/
add a6, a0, zero /*将a0的复制给a6*/
MOV_3R a0, s0, a1, s1, a2, s2
li a7, -1
/*只有执行fw_boot_hart返回-1时,才会跳转到_try_lottery,否则都只有作为热启动的hart*/
beq a6, a7, _try_lottery
/* Jump to relocation wait loop if we are not boot hart */
bne a0, a6, _wait_relocate_copy_done
.....
在spl跳转到opensbi执行的时候,携带了三个参数,分别保存在a0,a1,a2,三个参数的含义:hartid、fdt地址(u-boot的dtb文件)和struct fw_dynamic_info结构体地址
FW_DYNAMIC固件在运行时从上一个引导阶