概述
飞腾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镜像损坏,系统仍可以通过硬件触发方式从备份镜像启动,大大提高了系统的可靠性和可维护性。