Ras 通常包括内存 PCIE CPU的错误,其中错误的汇报可通过APEI Table去进行汇报
ACPI Platform Error Interfaces (APEI)
此table的作用是提供Hardware error的相关信息给系统,Firmware与系统沟 通桥梁
APEI consists of four separate tables:
• Error Record Serialization Table (ERST)
• Boot Error Record Table (BERT)
• Hardware Error Source Table (HEST)
• Error Injection Table (EINJ)
硬件错误源是向OSPM发出错误警报的任何硬件单元。硬件错误源的例子如下:
- 处理器机器检查异常(例如,mc#)
- 芯片组错误消息信号(例如,SCI, SMI)
- I/O总线错误报告(例如,PCI Express根端口错误中断)
- I/O设备错误
Hardware Error Source Table (HEST) Hest 包含系统下错误汇报Table,包含内存PCIE和CPU的错误结构体,用于OSPM和BIOS的错误传递解析
Hardware Error Source Table provides the platform firmware a way to describe a
system’s hardware error sources to OSPM.
HEST提供以下table给OS做配置:
• IA-32 Architecture Machine Check Exception
• IA-32 Architecture Corrected Machine Check
• PCI Express Root Port AER Structure
• PCI Express Device AER Structure
• PCI Express Bridge AER Structure
HEST提供以下table用来report硬件错误:
• Generic Hardware Error Source
Table是通过Type和SourceId进行区分
//
#define EFI_ACPI_6_2_IA32_ARCHITECTURE_MACHINE_CHECK_EXCEPTION 0x00
#define EFI_ACPI_6_2_IA32_ARCHITECTURE_CORRECTED_MACHINE_CHECK 0x01
#define EFI_ACPI_6_2_IA32_ARCHITECTURE_NMI_ERROR 0x02
#define EFI_ACPI_6_2_PCI_EXPRESS_ROOT_PORT_AER 0x06
#define EFI_ACPI_6_2_PCI_EXPRESS_DEVICE_AER 0x07
#define EFI_ACPI_6_2_PCI_EXPRESS_BRIDGE_AER 0x08
#define EFI_ACPI_6_2_GENERIC_HARDWARE_ERROR 0x09
#define EFI_ACPI_6_2_GENERIC_HARDWARE_ERROR_VERSION_2 0x0A
#define EFI_ACPI_6_2_IA32_ARCHITECTURE_DEFERRED_MACHINE_CHECK 0x0B
简单列举HEST相关的结构体,包括多种类型错误的结构体
HEST中常用到的 Type9
///
/// Generic Hardware Error Source Structure Definition
///
typedef struct {
UINT16 Type;
UINT16 SourceId;
UINT16 RelatedSourceId;
UINT8 Flags;
UINT8 Enabled;
UINT32 NumberOfRecordsToPreAllocate;
UINT32 MaxSectionsPerRecord;
UINT32 MaxRawDataLength;
EFI_ACPI_6_0_GENERIC_ADDRESS_STRUCTURE ErrorStatusAddress;
EFI_ACPI_6_0_HARDWARE_ERROR_NOTIFICATION_STRUCTURE NotificationStructure;
UINT32 ErrorStatusBlockLength;
} EFI_ACPI_6_0_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE;
GHES中是可以包含多个错误入口
系统下ACPI Table的解析
OS路径: /sys/firmware/acpi/table
工具IASL 可使用apt-get install iasl 安装
使用命令iasl -d XXX 生成XXX.dsl
1列举几个HEST table中的小表
(1)EFI_ACPI_6_2_IA32_ARCHITECTURE_MACHINE_CHECK_EXCEPTION type 0
(2)EFI_ACPI_6_2_IA32_ARCHITECTURE_CORRECTED_MACHINE_CHECK type=1
(3)最常用的是Type9 EFI_ACPI_6_2_GENERIC_HARDWARE_ERROR
内存 CPU PCIE 都可以通过Type9类型汇报 ,通过Source ID区分报错类型
1.PCIE 的RAS 流程
(1)BIOS中添加GHES 的Table,PCIE 主要包括两种常用类型错误Dev段和Root端的错误以及UCE CE
Source id通常包括:
PCIE_DEVICE_SOURCE_ID (0x101)
#define PCIE_BRIDGE_SOURCE_ID (0x102)
#define PCIE_RP_GHES_CORR_SRC_ID (0x200)
#define PCIE_RP_GHES_UNCORR_SRC_ID (0x201)
#define PCIE_DEV_GHES_CORR_SRC_ID (0x202)
#define PCIE_DEV_GHES_UNCORR_SRC_ID (0x203)
#define PCIE_BRIDGE_GHES_CORR_SRC_ID (0x204)
#define PCIE_BRIDGE_GHES_UNCORR_SRC_ID (0x205)
(2)注册相关的SMI
1.注册SMI ApuRasDispatch gFchSmmApuRasDispatchProtocolGuid,当PCIE产生错误,CPU的寄存器会存在错误状态,IOHCRAS会有错误的信息,同时会产生SMI的中断,BIOS会读取错误信息同时去扫描PCIE 的配置空间AER Capbility的错误状态填写到APEI HEST GHES type9中对应的PCIE错误结构体,同时汇报ipmi 错误到BMC和清除错NBIO Global Status误状态,AER 错误可以OS 清除
Status = gSmst->SmmInstallProtocolInterface (
&FchSmmDispatcherHandle,
FchProtocolListRas[0].Guid,
EFI_NATIVE_INTERFACE,
FchProtocolListRas[0].Interface
FchSmmApuRasDispatchRegister()
Status = ApuRasDispatch->Register (
HygonApuRasDispatch,
HygonNbioRasSmiCallback,
&ApuRasRegisterContext,
&ApuRasHandle
);
///
/// RAS SMI Node
///
typedef struct _FCH_SMM_APURAS_NODE {
EFI_HANDLE DispatchHandle; ///< Dispatch Hangle
FCH_SMM_APURAS_REGISTER_CONTEXT Context; ///< Register context
FCH_SMM_APURAS_HANDLER_ENTRY_POINT CallBackFunction; ///< SMM handler entry point
struct _FCH_SMM_APURAS_NODE *FchApuRasNodePtr; ///< pointer to next node
} FCH_SMM_APURAS_NODE;
typedef struct {
UINT8 Socket; ///< Socket number
UINT8 LogicalDie; ///< Logical Die Id
UINT8 IohubPhysicalDie; ///< Iohub physical Die Id
UINT8 Rb; ///< Root bridge number
UINT8 Bus; ///< Bus number
UINT8 Order; ///< Priority 0-Highest (reserved), 0xFF-Lowest (reserved)
} FCH_SMM_APURAS_REGISTER_CONTEXT;
NbioRasSmiCallback
Error 状态:
NBIO Global Status Lo
NBIO Global Status Hi
(3)OS下错误解析,对于Root端的错误会记录一条GHES的错误表,当错误为Dev端,有PCIE设备可以有多个Bus:dev:fuc 会在每个fun产生错误状态这时候会记录多条报错信息
2.内存ECC的RAS 流程
(1)BIOS添加GHES的Table
Source id 0x500
(2)内存的smi注错,gFchSmmSwDispatch2Protoco 常用的software smi 的Dispatch,触发方式向SMI port 写如对应的SwValue
SMIcmdPort可通过查看ACPI FACP table查看通常为0xB2 0xB0
(3)SMI的产生可通过向IO端口0xB0写入SwValue=0x80 触发对应的callback,硬件上会通过MCA的status overflow产生中断。
MCA BANK:
每一个错误报告的bank都同处理器中一个特定的硬件单元(或一组硬件单元)相关联。
使用RDMSR或WRMSR来对这些寄存器进行读写。
全局相关的寄存器组定义了如何开启 MCA 的能力。
每一个BANK则具体对应一类错误源,如 CPU,MEMORY,CACHE,CHIPSET 等等。
每一个BANK都可以进行单独的控制,这样软件就能够针对每一个BANK使用特定的方式进行处理。
内存的MCA BANK
如果VAL(vaild flag)被设置了,那么每一个 IA32_MCi_STATUS MSR都包含了一个machine-check error的相关信息。
软件通过显式地写入全0来清除 IA32_MCi_STATUS MSRs。对任何位写入1将会导致#GP.
(3)MCA_STATUS_XX产生 错误状态并且over则会产生SMI ,BIOS会去扫描每个MCA bank定位到错误的寄存器,可以读到错误地址,然后解析地址汇报错误信息填写到GHES 内存结构体中
(4) OS下去检测到错误Table 状态打印dmesg 信息,Fru_text定位到错误内存槽位
3.CPU的RAS 流程
(1)BIOS中添加GHES 的Table source id 0x1000
(2)注册SMI gFchSmmSwDispatch2ProtocolGuid //和内存SMI 是一个SMM Dispatch SWVALUE=0x84
• Error Injection Table (EINJ) 注错 Table
系统下CPU的注错:使用EINJ
CPU 的mca bank
(3) os下的Hard ware error信息 BIOS触发smi 后去填写对应结构体
后续梳理BERT 和OS 解析详细流程