概述
飞腾S5000C处理器支持双BIOS镜像(Dual BIOS)功能,通过SE_RECOVERY硬件引脚和Reset Source状态寄存器实现主备镜像的切换。当主BIOS镜像损坏时,可以通过硬件触发方式切换到备份镜像启动,提高系统可靠性。
一、硬件机制
1.1 Reset Source状态寄存器
S5000C芯片内部集成了一个 Reset Source硬件状态寄存器 ,用于记录芯片复位的原因。该寄存器由芯片硬件自动设置,软件通过SMC(Secure Monitor Call)调用读取。
Reset Source取值定义:
值 含义 说明 0x01 PowerOn Reset 上电复位 0x04 SoftWare Warm Reset 软件热复位 0x05 Recover SE_RECOVERY 恢复模式 0x80 Watchdog Reset 看门狗复位 0x100 PII Reset PLL 复位 0xAA S3 Reset S3 休眠恢复 0xA9 Standby Reset 待机恢复
1.2 SE_RECOVERY引脚
SE_RECOVERY是S5000C芯片的一个 硬件配置引脚 ,在芯片复位时刻被采样:
正常状态(高电平) :芯片按正常流程启动,Reset Source = 0x01或0x04
拉低状态 :芯片进入Recover模式,Reset Source = 0x05 重要 :SE_RECOVERY引脚的状态只在 复位时刻 被采样,因此需要先拉低该引脚,然后触发芯片复位。
二、固件打包机制
2.1 Pack工具配置
在 s5000c_pack-V1.30 打包工具中,通过Kconfig配置启用双镜像功能:
config RECOVER_ENABLE bool "recover enable" default n if RECOVER_ENABLE menu "recover config" config RECOVER_BL33 hex "config bl33 recover address" default 0x800000 config RECOVER_BL32 hex "config bl32 recover address" default 0xc00000 endmenu endif
bl33_recovery的地址在0x800000
bl32_recovery的地址在0xc00000
2.2 镜像存放位置
双镜像文件存放结构:
s5000c_pack-V1.30/ ├── pbf_bin/v1_30/ # ATF编译生成的默认镜像 │ ├── bl33.bin │ └── bl33_recover.bin └── ...
2.3 Flash地址布局
打包后的固件在SPI Flash中的布局:
镜像 Flash 偏移地址 大小 说明 BL1 (Boot ROM) 0x000000 – 启动代码 FIP (BL2/BL31) – – ARM Trusted Firmware BL33 (主镜像) 0x500000 (5MB) 根据实际 正常启动的 UEFI BL33_RECOVER 0x800000 (8MB) 根据实际 备份 UEFI 镜像 BL32/BL32_RECOVER 0xb00000 (11MB) 根据实际 TEE 镜像(可选)
三、启动流程
3.1 正常启动流程
芯片上电/复位 ↓ 硬件采样SE_RECOVERY引脚 = 高电平 ↓ Reset Source = 0x01 (PowerOn) 或 0x04 (Soft Reset) ↓ BL1 (Boot ROM) 运行 ↓ 读取Reset Source = 0x01/0x04 ↓ 从Flash 0x500000加载BL33 (主镜像) ↓ 启动正常UEFI
3.2 Recovery启动流程
外部拉低SE_RECOVERY引脚 ↓ 触发芯片复位(上电或软复位) ↓ 硬件采样SE_RECOVERY引脚 = 低电平 ↓ Reset Source = 0x05 (Recover) ↓ BL1 (Boot ROM) 运行 ↓ 读取Reset Source = 0x05 ↓ 从Flash 0x800000加载BL33_RECOVER (备份镜像) ↓ 启动备份UEFI
四、软件实现
4.1 UEFI中获取Reset Source
在UEFI代码中,通过PSSI库获取Reset Source:
// PssiLib.c UINT32 PssiGetResetSource (VOID) { ARM_SMC_ARGS ArmSmcArgs; ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS)); ArmSmcArgs.Arg0 = PSSI_GET_RST_SOURCE; // SMC调用号: 0xC2000F01 ArmCallSmc (&ArmSmcArgs); // 返回值即为Reset Source // 0x01=PowerOn, 0x04=SoftReset, 0x05=Recover... return ArmSmcArgs.Arg0; }
4.2 Boot Mode设置
UEFI根据Reset Source设置Boot Mode:
// PlatformPei.c EFI_BOOT_MODE BootMode; // 获取硬件复位源 RstSource = GetResetSource(); DEBUG ((DEBUG_INFO, "Check reset source : 0x%x\n", RstSource)); // 设置UEFI Boot Mode Status = PeiServicesSetBootMode (ArmPlatformGetBootMode ()); Status = PeiServicesGetBootMode (&BootMode); // 如果是Recover模式,安装Recovery Boot Mode PPI if (BootMode == BOOT_IN_RECOVERY_MODE) { Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode); }
4.3 打包脚本处理
在 theone 打包脚本中,双镜像的处理逻辑:
# 固件定义 BL33=bl33.bin # 主镜像 BL33_RECOVER=bl33_recover.bin # 备份镜像 # 地址配置 bl33_base=0x500000 # 主镜像地址 bl33_recover_addr=0x800000 # 备份镜像地址 # 如果启用recover功能 if [ "$recover_enable" = "y" ];then # 创建recover镜像证书 echo "create bl33 recover info" bl33_size=$(wc -c $BL33_RECOVER | awk '{print $1}') my_scripts/cert_info.sh $bl33_recover_addr $bl33_size bl33_info. bin dd if=bl33_info.bin of=$INFO bs=16 seek=1 conv=notrunc fi
bl33.bin bl33_recover.bin放到pbf_bin文件夹里
五、实际应用场景
5.1 主BIOS损坏恢复
场景 :主BIOS镜像(0x500000)损坏,系统无法正常启动
恢复步骤 :
硬件设计中将SE_RECOVERY引脚连接到跳线或按钮
用户短接SE_RECOVERY引脚到地(拉低)
按下复位按钮或重新上电
芯片检测到Reset Source = 0x05
自动从0x800000加载备份BIOS启动
进入系统后修复主BIOS镜像
5.2 BIOS升级失败恢复
场景 :BIOS升级过程中断电,导致主镜像损坏
恢复机制 :
备份镜像保持不变
通过SE_RECOVERY触发恢复模式
使用备份镜像启动后重新升级
六、总结
飞腾S5000C的SE_RECOVERY双BIOS镜像机制通过 硬件引脚 + 状态寄存器 + 固件支持 实现了可靠的故障恢复能力:
硬件层 :SE_RECOVERY引脚在复位时刻被采样,Reset Source寄存器记录复位原因
固件层 :BL1根据Reset Source决定从哪个Flash地址加载BL33镜像
工具层 :Pack工具支持双镜像打包,配置备份镜像地址
应用层 :UEFI可检测Recovery模式,执行不同的初始化流程 这种设计确保了即使主BIOS镜像损坏,系统仍可以通过硬件触发方式从备份镜像启动,大大提高了系统的可靠性和可维护性。
七、flash xip启动注意事项
Nor Flash XIP 直接执行时,要求 Flash 硬件总线地址等于 SYS_TEXT_BASE ,目的是让代码硬编码的链接地址和 CPU 实际取指地址一致,不用拷贝;
bl33.bin和bl33_recovery.bin的SYS_TEXT_BASE地址要根据pack实际使用地址进行修改。否则会报”Synchronous Abort” handler错误。