15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

【飞腾】S5000C处理器SE_RECOVERY双BIOS镜像机制分析

概述

飞腾S5000C处理器支持双BIOS镜像(Dual BIOS)功能,通过SE_RECOVERY硬件引脚和Reset Source状态寄存器实现主备镜像的切换。当主BIOS镜像损坏时,可以通过硬件触发方式切换到备份镜像启动,提高系统可靠性。

一、硬件机制

1.1 Reset Source状态寄存器

S5000C芯片内部集成了一个 Reset Source硬件状态寄存器 ,用于记录芯片复位的原因。该寄存器由芯片硬件自动设置,软件通过SMC(Secure Monitor Call)调用读取。

Reset Source取值定义:

含义说明
0x01PowerOn Reset上电复位
0x04SoftWare Warm Reset软件热复位
0x05RecoverSE_RECOVERY 恢复模式
0x80Watchdog Reset看门狗复位
0x100PII ResetPLL 复位
0xAAS3 ResetS3 休眠恢复
0xA9Standby 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_RECOVER0x800000 (8MB)根据实际备份 UEFI 镜像
BL32/BL32_RECOVER0xb00000 (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)损坏,系统无法正常启动

恢复步骤 :

  1. 硬件设计中将SE_RECOVERY引脚连接到跳线或按钮
  2. 用户短接SE_RECOVERY引脚到地(拉低)
  3. 按下复位按钮或重新上电
  4. 芯片检测到Reset Source = 0x05
  5. 自动从0x800000加载备份BIOS启动
  6. 进入系统后修复主BIOS镜像

5.2 BIOS升级失败恢复

场景 :BIOS升级过程中断电,导致主镜像损坏

恢复机制 :

  • 备份镜像保持不变
  • 通过SE_RECOVERY触发恢复模式
  • 使用备份镜像启动后重新升级

六、总结

飞腾S5000C的SE_RECOVERY双BIOS镜像机制通过 硬件引脚 + 状态寄存器 + 固件支持 实现了可靠的故障恢复能力:

  1. 硬件层 :SE_RECOVERY引脚在复位时刻被采样,Reset Source寄存器记录复位原因
  2. 固件层 :BL1根据Reset Source决定从哪个Flash地址加载BL33镜像
  3. 工具层 :Pack工具支持双镜像打包,配置备份镜像地址
  4. 应用层 :UEFI可检测Recovery模式,执行不同的初始化流程
    这种设计确保了即使主BIOS镜像损坏,系统仍可以通过硬件触发方式从备份镜像启动,大大提高了系统的可靠性和可维护性。
anyShare分享到:
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。
stormwind

发表评论