18.3.2. ACPI 错误源
硬件错误源描述了一种标准化机制,平台可使用该机制来描述其错误源。使用此接口是平台描述其错误源的首选方式,因为它独立于平台和处理器体系结构,并允许平台描述与错误源相关的运行参数。
此机制允许平台详细描述错误源;在必要时向 OSPM 传达运行参数(即严重性级别、屏蔽位和阈值)。它还允许平台报告那些 OSPM 通常不会实现支持的错误源(例如,芯片组特定错误寄存器)。
硬件错误源表 (HEST) 为平台固件提供了一种向 OSPM 描述系统硬件错误源的方法。HEST 格式如下表所示。
表 18.2 硬件错误源表 (HEST)
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| Header Signature | 4 | 0 | “HEST”。硬件错误源表的签名。 |
| Length | 4 | 4 | 整个 HEST 的长度,以字节计。整个表必须是连续的。 |
| Revision | 1 | 8 | 1 |
| Checksum | 1 | 9 | 整个表的总和必须为零。 |
| OEMID | 6 | 10 | OEM ID。 |
| OEM Table ID | 8 | 16 | 制造商模型 ID。 |
| OEM Revision | 4 | 24 | 针对所提供 OEM 表 ID 的 HEST 的 OEM 修订版本。 |
| Creator ID | 4 | 28 | 创建该表的工具的供应商 ID。 |
| Creator Revision | 4 | 32 | 创建该表的工具的修订版本。 |
| Error Source Count | 4 | 36 | 错误源描述符的数量。 |
| Error Source Structure[n] |
| 40 | 一系列错误源描述符项。
注
错误源类型 3、4 和 5 由于遗留原因被保留,且不得使用。
以下各节详细说明了每一种特定的错误源描述符。
18.3.2.1. IA-32 体系结构机器检查异常
实现 IA-32 指令集体系结构的处理器采用机器检查异常机制,以向 OSPM 警示存在未纠正的硬件错误条件。此表中的信息由 OSPM 用于为系统中的每个处理器配置机器检查异常机制。
HEST 中只允许一个此类型的项。OSPM 将此项中指定的信息应用于所有处理器。
表 18.3 IA-32 体系结构机器检查异常结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 0 - IA-32 架构机器检查异常结构。 |
| 源 ID | 2 | 2 | 此值用于在平台报告的其他错误源中唯一标识该错误源。 |
| 保留 | 2 | 4 | 保留。 |
| 标志 | 1 | 6 | 位 [0] - FIRMWARE_FIRST:如果置位,该位向 OSPM 指示系统固件将首先处理来自此源的错误。位 [2] - GHES_ASSIST:如果置位,该位指示尽管 OSPM 负责直接处理该错误(如同未设置 FIRMWARE_FIRST 时的预期一样),系统固件仍可在硬件报告的错误上下文中报告附加信息。附加信息将在具有匹配相关源 ID 的通用硬件错误源结构中报告。参见第 18.7 节、GHES_ASSIST 错误报告。注意:如果设置了 FIRMWARE_FIRST,则该位为保留。所有其他位均为保留。 |
| 已启用 | 1 | 7 | 指定是否启用 MCE。如果设置为 1,则此字段表示应启用该错误源。如果设置为 0,则此字段表示不应启用该错误源。 |
| 预分配的记录数量 | 4 | 8 | 指示要为该错误源预分配的错误记录数量。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。 |
| 全局能力初始化数据 | 8 | 16 | 指示机器检查全局能力寄存器的值。 |
| 全局控制初始化数据 | 8 | 24 | 指示要写入机器检查全局控制寄存器的值。 |
| 硬件 Bank 数量 | 1 | 32 | 指示硬件错误报告库的数量。 |
| 保留 | 7 | 33 | 保留。 |
| 机器检查 Bank 结构[n] |
| 40 | 由 IA-32 架构机器检查 Bank 结构 定义的机器检查 Bank 结构列表
18.3.2.1.1. IA-32 架构机器检查 Bank 结构
此表描述特定 IA-32 架构机器检查硬件错误库的属性。
表 18.4 IA-32 架构机器检查错误库结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| Bank 编号 | 1 | 0 | 从零开始的索引,用于标识机器检查错误库。 |
| 初始化时清除状态 | 1 | 1 | 如果置位,表示该机器检查库中的状态信息应在系统初始化期间按如下方式清除:0 - 清除 1 - 不清除 |
| 状态数据格式 | 1 | 2 | 标识状态寄存器中数据的格式:0 - IA-32 MCA 1 - Intel® 64 MCA 2 - AMD64MCA 所有其他值均为保留 |
| 保留 | 1 | 3 | 保留。 |
| 控制寄存器 MSR 地址 | 4 | 4 | 硬件库的控制 MSR 的地址。如果为零则忽略。 |
| 控制初始化数据 | 8 | 8 | 这是 OSPM 将编程到机器检查库控制寄存器中的值。 |
| 状态寄存器 MSR 地址 | 4 | 16 | 硬件库的 MCi_STAT MSR 的地址。如果为零则忽略。 |
| 地址寄存器 MSR 地址 | 4 | 20 | 硬件库的 MCi_ADDR MSR 的地址。如果为零则忽略。 |
| 杂项寄存器 MSR 地址 | 4 | 24 | 硬件库的 MCi_MISC MSR 的地址。如果为零则忽略。 |
18.3.2.2. IA-32 架构已更正机器检查
实现 IA-32 指令集架构的处理器可以向 OSPM 报告已更正的处理器错误。此表中的信息使平台固件能够向 OSPM 传达已更正处理器错误报告机制的关键参数,包括是否应启用 CMC 处理。
HEST 中仅允许有一个此类型的条目。OSPM 将此条目中指定的信息应用于所有处理器。
表 18.5 IA-32 架构已更正机器检查结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 1 - IA-32 架构已更正机器检查结构。 |
| 源 ID | 2 | 2 | 唯一标识该错误源。 |
| 保留 | 2 | 4 | 保留 |
| 标志 | 1 | 6 | 位 [0] - FIRMWARE_FIRST:如果置位,该位向 OSPM 指示系统固件将首先处理来自此源的错误。位 [2] - GHES_ASSIST:如果置位,该位指示尽管 OSPM 负责直接处理该错误(如同未设置 FIRMWARE_FIRST 时的预期一样),系统固件仍可在硬件报告的错误上下文中报告附加信息。附加信息将在具有匹配相关源 ID 的通用硬件错误源结构中报告。参见第 18.7 节、GHES_ASSIST 错误报告。注意:如果设置了 FIRMWARE_FIRST,则该位为保留。所有其他位都必须设置为零。 |
| 已启用 | 1 | 7 | 如果该字段值为 1,表示应启用该错误源。如果该字段值为 0,表示不应启用该错误源。如果在标志字段中设置了 FIRMWARE_FIRST,则 OSPM 忽略已启用字段。 |
| 预分配的记录数量 | 4 | 8 | 指示要为该错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 通知结构 | 28 | 16 | 如“硬件错误通知结构”中定义的硬件错误通知结构。 |
| 硬件 Bank 数量 | 1 | 44 | 硬件错误报告库的数量。 |
| 保留 | 3 | 45 | 保留。 |
| 机器检查 Bank 结构[n] |
| 48 | 在 IA-32 架构机器检查 Bank 结构 中定义的机器检查 Bank 结构列表。
18.3.2.3. IA-32 架构不可屏蔽中断
未更正的平台错误通常使用不可屏蔽中断(NMI)向量(例如,INT 2)进行报告。此表允许平台固件传达有关 NMI 错误条件的配置和处理参数。
HEST 中仅允许有一个此类型的条目。
表 18.6 IA-32 架构 NMI 错误结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 2 - IA-32 架构 NMI 结构。 |
| 源 ID | 2 | 2 | 唯一标识该错误源。 |
| 保留 | 4 | 4 | 必须为零。 |
| 预分配的记录数量 | 4 | 8 | 指示要为该错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 最大原始数据长度 | 4 | 16 | NMI 错误数据的字节大小。 |
18.3.2.4. PCI Express Root Port AER 结构
PCI Express(PCIe)Root Port 可以实现 PCIe 高级错误报告(AER)支持。此表包含平台固件为在给定 Root Port 上配置 AER 支持而提供给 OSPM 的信息。
如果所有条目中都没有设置 GLOBAL 标志,则 HEST 可为每个 PCI Express Root Port 包含一个此类型的条目。如果设置了 GLOBAL 标志,则只能有一个此类型的条目,并且该条目中包含的信息将应用于所有 PCIe Root Port。
表 18.7 PCI Express Root Port AER 结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 6 - AER Root Port。 |
| 源 ID | 2 | 2 | 唯一标识该错误源。 |
| 保留 | 2 | 4 | 保留。 |
| 标志 | 1 | 6 | 位 [0] - FIRMWARE_FIRST:如果置位,该位向 OSPM 指示系统固件将首先处理来自此源的错误。此标志既不授予也不拒绝对 AER 寄存器的访问。OSPM 应评估 PCI 层级结构的 _OSC 以确定 AER 寄存器所有权。位 [1] - GLOBAL:如果置位,表示此结构中包含的设置全局适用于所有 PCI Express 设备。所有其他位都必须设置为零。 |
| 已启用 | 1 | 7 | 如果该字段值为 1,表示应启用该错误源。如果该字段值为 0,表示不应启用该错误源。如果在标志字段中设置了 FIRMWARE_FIRST,则 OSPM 忽略已启用字段。 |
| 预分配的记录数量 | 4 | 8 | 指示要为该错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 总线 | 4 | 16 | 标识 Root Port 的 PCI Bus 和 Segment。Bus 编码在位 [7:0] 中。对于公开多个 PCI 段组的系统,段编号编码在位 [23:8] 中,位 [31-24] 必须为零。对于不公开多个 PCI 段组的系统,位 [31:8] 必须为零。如果指定了 GLOBAL 标志,则忽略此字段。 |
| 设备 | 2 | 20 | 标识 Root Port 的 PCI 设备号。如果指定了 GLOBAL 标志,则忽略此字段。 |
| 功能 | 2 | 22 | 标识 Root Port 的 PCI 功能号。如果指定了 GLOBAL 标志,则忽略此字段。 |
| 设备控制 | 2 | 24 | 用于初始化设备的设备控制位。 |
| 保留 | 2 | 26 | 必须为零。 |
| 不可更正错误屏蔽 | 4 | 28 | 要写入 Root Port 的不可更正错误屏蔽寄存器的值。 |
| 不可更正错误严重性 | 4 | 32 | 要写入 Root Port 的不可更正错误严重性寄存器的值。 |
| 可更正错误屏蔽 | 4 | 36 | 要写入 Root Port 的可更正错误屏蔽寄存器的值。 |
| 高级错误能力和控制 | 4 | 40 | 要写入 Root Port 的高级错误能力和控制寄存器的值。 |
| Root Error Command | 4 | 44 | 要写入 Root Port 的 Root Error Command 寄存器的值。 |
注意
对于 PCI Express 高级错误报告(AER)资源,AER 寄存器的所有权和控制由对 PCI _OSC() 方法的求值来确定,如 PCI Firmware Specification 的最新修订版中所述。标志字段中的 FIRMWARE_FIRST 位不用于授予或拒绝对该结构所描述的 PCI Express 设备中的 AER 寄存器的访问。
18.3.2.5. PCI Express Device AER 结构
PCI Express 设备可以实现 AER 支持。此表包含平台固件为在给定 PCI Express 设备上配置 AER 支持而提供给 OSPM 的信息。
如果所有条目中都没有设置 GLOBAL 标志,则 HEST 可为每个 PCI Express 端点设备包含一个此类型的条目。如果设置了 GLOBAL 标志,则只能有一个此类型的条目,并且该条目中包含的信息将应用于所有 PCI Express 端点设备。
表 18.8 PCI Express Device AER 结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 7 - AER 端点。 |
| 源 ID | 2 | 2 | 唯一标识该错误源。 |
| 保留 | 2 | 4 | 保留。 |
| 标志 | 1 | 6 | 位 [0] - FIRMWARE_FIRST:如果置位,该位向 OSPM 指示系统固件将首先处理来自该源的错误。该标志既不授予也不拒绝对 AER 寄存器的访问。OSPM 应对 PCI 层次结构求值 _OSC 以确定 AER 寄存器所有权。位 [1] - GLOBAL:如果置位,表示该结构中包含的设置全局适用于所有 PCI Express 设备。所有其他位都必须置零。 |
| 已启用 | 1 | 7 | 如果该字段值为 1,表示应启用该错误源。如果该字段值为 0,表示不应启用该错误源。如果在标志字段中设置了 FIRMWARE_FIRST,则 OSPM 忽略已启用字段。 |
| 预分配的记录数 | 4 | 8 | 指示为该错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 总线 | 4 | 16 | 标识设备的 PCI 总线和段。总线编码在位 [7:0] 中。对于公开多个 PCI 段组的系统,段号编码在位 [23:8] 中,且位 [31:24] 必须为零。对于不公开多个 PCI 段组的系统,位 8-31 必须为零。如果指定了 GLOBAL 标志,则忽略该字段。 |
| 设备 | 2 | 20 | 标识设备的 PCI 设备号。如果指定了 GLOBAL 标志,则忽略该字段。 |
| 功能 | 2 | 22 | 标识设备的 PCI 功能号。如果指定了 GLOBAL 标志,则忽略该字段。 |
| 设备控制 | 2 | 24 | 用于初始化设备的设备控制位。 |
| 保留 | 2 | 26 | 必须为零。 |
| 不可校正错误屏蔽 | 4 | 28 | 要写入根端口的不可校正错误屏蔽寄存器的值。 |
| 不可校正错误严重性 | 4 | 32 | 要写入根端口的不可校正错误严重性寄存器的值。 |
| 可校正错误屏蔽 | 4 | 36 | 要写入根端口的可校正错误屏蔽寄存器的值。 |
| 高级错误能力和控制 | 4 | 40 | 要写入根端口的高级错误能力和控制寄存器的值。 |
注
对于 PCI Express 高级错误报告(AER)资源,AER 寄存器的所有权和控制由对 PCI _OSC() 方法的求值来确定,如 PCI 固件规范的最新修订版所述。Flags 字段中的 FIRMWARE_FIRST 位并不用于授予或拒绝对结构所描述的 PCI Express 设备中的 AER 寄存器的访问。
18.3.2.6. PCI Express/PCI-X 桥 AER 结构
实现 AER 支持的 PCI Express/PCI-X 桥实现了用于控制错误如何跨桥报告的字段。
如果所有条目中都没有设置 GLOBAL 标志,则 HEST 可以为每个 PCI Express/PCI-X 桥包含一个此类型的条目。如果设置了 GLOBAL 标志,则此类型只能有一个条目,并且该条目中包含的信息将应用于所有 PCI Express/ PCI-X 桥。
表 18.9 PCI Express/PCI-X 桥 AER 结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 8 - AER 桥。 |
| 源 ID | 2 | 2 | 唯一标识该错误源。 |
| 保留 | 2 | 4 | 保留。 |
| 标志 | 1 | 6 | 位 [0] - FIRMWARE_FIRST:如果置位,该位向 OSPM 指示系统固件将首先处理来自该源的错误。该标志既不授予也不拒绝对 AER 寄存器的访问。OSPM 应对 PCI 层次结构求值 _OSC 以确定 AER 寄存器所有权。位 [1] - GLOBAL:如果置位,表示该结构中包含的设置全局适用于所有 PCI Express 设备。所有其他位都必须置零。 |
| 已启用 | 1 | 7 | 如果该字段值为 1,表示应启用该错误源。如果该字段值为 0,表示不应启用该错误源。如果在标志字段中设置了 FIRMWARE_FIRST,则 OSPM 忽略已启用字段。 |
| 预分配的记录数 | 4 | 8 | 指示为该错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 总线 | 4 | 16 | 标识桥的 PCI 总线和段。总线编码在位 [7:0] 中。对于公开多个 PCI 段组的系统,段号编码在位 [23:8] 中,且位 [31:24] 必须为零。对于不公开多个 PCI 段组的系统,位 8-31 必须为零。如果指定了 GLOBAL 标志,则忽略该字段。 |
| 设备 | 2 | 20 | 标识桥的 PCI 设备号。如果指定了 GLOBAL 标志,则忽略该字段。 |
| 功能 | 2 | 22 | 标识桥的 PCI 功能号。如果指定了 GLOBAL 标志,则忽略该字段。 |
| 设备控制 | 2 | 24 | 用于初始化设备的设备控制位。 |
| 保留 | 2 | 26 | 该值必须为零。 |
| 不可校正错误屏蔽 | 4 | 28 | 要写入桥的不可校正错误屏蔽寄存器的值。 |
| 不可校正错误严重性 | 4 | 32 | 要写入桥的不可校正错误严重性寄存器的值。 |
| 可校正错误屏蔽 | 4 | 36 | 要写入桥的可校正错误屏蔽寄存器的值。 |
| 高级错误能力和控制 | 4 | 40 | 要写入桥的高级错误能力和控制寄存器的值。 |
| 辅助不可校正错误屏蔽 | 4 | 44 | 要写入桥的辅助不可校正错误屏蔽寄存器的值。 |
| 辅助不可校正错误严重性 | 4 | 48 | 要写入桥的辅助不可校正错误严重性寄存器的值。 |
| 辅助高级能力和控制 | 4 | 52 | 要写入桥的辅助高级能力和控制寄存器的值。 |
注
对于 PCI Express 高级错误报告(AER)资源,AER 寄存器的所有权和控制由对 PCI _OSC() 方法的求值来确定,如 PCI 固件规范的最新修订版所述。Flags 字段中的 FIRMWARE_FIRST 位并不用于授予或拒绝对结构所描述的 PCI Express 设备中的 AER 寄存器的访问。
18.3.2.7. 通用硬件错误源
平台可以使用通用硬件错误源结构向 OSPM 描述一个通用硬件错误源。通用硬件错误源是指使用非标准通知机制向 OSPM 通知错误存在,或者报告以非标准格式编码的错误信息的错误源。
使用通用硬件错误源结构中的信息,OSPM 配置错误处理程序,从错误状态块读取错误数据——这是平台预留用于记录错误状态信息的一段内存范围。
由于通用硬件错误源是非标准的,OSPM 不实现用于配置和控制操作的内建支持。该错误源必须由系统固件在启动期间进行配置。
某些平台可能会描述具有不同通知类型的多个通用硬件错误源结构,如表 18.10 所定义。例如,平台可以描述一个用于处理同步错误(例如 MCE 或 SEA)的错误源,以及第二个用于处理异步错误(例如 SCI 或 External Interrupt)的错误源。
表 18.10 通用硬件错误源结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 9 - 通用硬件错误源结构。 |
| 源 ID | 2 | 2 | 唯一标识该错误源。 |
| 相关源 ID | 2 | 4 | 该字段表示一个备用错误源的 Source ID,对于该备用错误源,平台:(a) 要求 Firmware-First 处理(备用错误源上设置了 FIMWARE_FIRST 标志)。参见第 18.4 节。(b) 在硬件报告的错误上下文中提供附加信息(备用错误源上设置了 GHES_ASSIST 标志)。参见第 18.7 节。如果该通用错误源不表示备用源,则该字段必须设置为 0xFFFF。 |
| 标志 | 1 | 6 | 保留。 |
| 已启用 | 1 | 7 | 如果该字段值为 1,表示应启用该错误源。如果该字段值为 0,表示不应启用该错误源。 |
| 预分配的记录数 | 4 | 8 | 指示为该错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于该错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 最大原始数据长度 | 4 | 16 | 指示该错误源记录的错误数据的字节大小。 |
| 错误状态地址 | 12 | 20 | 如第 5.2.3.2 节所定义的 Generic Address Structure。该字段指定一个寄存器的位置,该寄存器包含保存该错误源错误状态数据的内存块的物理地址。该内存范围必须位于固件保留内存中。OSPM 将该范围映射到系统地址空间中,并从映射后的地址读取错误状态信息。 |
| 通知结构 | 28 | 32 | 如表 18.14 所定义的 Hardware Error Notification Structure。该结构指定该错误源如何通知 OSPM 已发生错误。 |
| 错误状态块长度 | 4 | 60 | 标识错误状态数据块的字节长度。 |
错误状态地址字段指定一个 8 字节内存映射寄存器的位置,该寄存器保存错误状态块的物理地址。该错误状态块必须位于向 OSPM 报告为固件保留的一段内存范围中。OSPM 将错误状态缓冲区映射到系统地址空间中,以便读取错误数据。
18.3.2.7.1. 通用错误数据
错误状态块包含给定通用错误源的错误状态信息。OSPM 提供一个错误处理程序,根据特定操作系统的需要,将一个或多个此类块格式化。
通用错误状态块包括两级信息。顶层是下表定义的 Generic Error Status Block 结构。下一层是一个或多个 Generic Error Data Entry 结构,定义见下方第二个表。
表 18.11 通用错误状态块
| 字段 | 字节长度 | 字节偏移 | 说明 |
|---|---|---|---|
| Block Status | 4 | 0 | 指示错误包中报告的错误信息类型:位 [0] - 不可校正错误有效:如果置为一,表示存在不可校正错误状态。位 [1] - 可校正错误有效:如果置为一,表示存在可校正错误状态。位 [2] - 多个不可校正错误:如果置为一,表示已检测到一个以上的不可校正错误。位 [3] - 多个可校正错误:如果置为一,表示已检测到一个以上的可校正错误。位 [13:4] - 错误数据项计数:该值指示在数据部分中找到的错误数据项数量。位 [31:14] - 保留 |
| Raw Data Offset | 4 | 4 | 从 Error Status Block 起始处到原始错误数据的字节偏移。原始数据必须位于所有通用错误数据项之后。 |
| Raw Data Length | 4 | 8 | 原始错误数据的字节长度。 |
| Data Length | 4 | 12 | 通用错误数据的字节长度。 |
| Error Severity | 4 | 16 | 标识所报告错误的严重性:0 - 可恢复 1 - 致命 2 - 已校正 3 - 无。注:这是整个事件的错误严重性。每个通用错误数据项也包括其自身的 Error Severity 字段。 |
| Generic Error Data Entries | Data Length | 20 | 此字段中包含的信息是零个或多个通用错误数据项的集合。 |
可以在 Generic Error Status Block 结构的 Generic Error Data Entries 字段中记录一个或多个通用错误数据项结构。这使平台能够为与给定错误事件相关的多个硬件组件累积信息。例如,如果通用错误源表示发生在 PCI Express / PCI-X Bridge 次级侧某设备上的错误,则记录来自 PCI Express Bridge 和 PCI-X 设备的错误信息会很有用。利用两个通用错误数据项结构即可实现这一点——见下文表 18.12。
有关下表所描述字段的更多细节,请参见 UEFI Specification 附录中“通用平台错误记录”的节描述符定义。
表 18.12 通用错误数据项
| 字段 | 字节长度 | 字节偏移 | 说明 |
|---|---|---|---|
| Section Type | 16 | 0 | 标识此项中错误数据的类型。参见 UEFI Specification 中节描述符的 Section Type 字段。 |
| Error Severity | 4 | 16 | 标识所报告错误的严重性。0 - 可恢复 1 - 致命 2 - 已校正 3 - 无 |
| Revision | 2 | 20 | 修订号为 0x300。参见 UEFI Specification 中节描述符的 Revision 字段。 |
| Validation Bits | 1 | 22 | 标识某些字段是否填充了有效数据。此字段指示以下字段的有效性:位 0 - 如果为 1,则 FRUId 字段包含有效信息。位 1 - 如果为 1,则 FRUString FRU Text 字段包含有效信息。位 2 - 如果为 1,则 TimeStamp 字段包含有效信息。位 7:3 - 保留,必须为零。 |
| Flags | 1 | 23 | 描述错误数据的标志。参见 UEFI Specification 附录标题为 “Common Platform Error Record” 的 Flags 字段。 |
| Error Data Length | 4 | 24 | 通用错误数据的字节长度。Data Length 为零是有效的。例如,这可用于固件优先错误处理,其中平台使用 NMI 向 OSPM 报告错误。 |
| FRU Id | 16 | 28 | 标识现场可更换单元。参见 UEFI Specification 附录标题为 “Common Platform Error Record” 的 FRU Id 字段。 |
| FRU Text | 20 | 44 | 描述现场可更换单元的文本字段。参见 UEFI Specification 附录标题为 “Common Platform Error Record” 的 FRU Text 字段。 |
| Timestamp | 8 | 64 | 如果根据 validation bits 字段被标记为有效,则该字段对应于系统软件收集错误信息时的时间,而不一定表示错误事件发生的时间。该时间戳包含 BCD 格式的本地时间。参见 EFI Specification 附录标题为 “Common Platform Error Record “ 的错误记录头部分中的 Timestamp 字段。 |
| Data | Error Data Length | 64 | 通用错误数据。此字段中包含的信息必须匹配 UEFI Specification 附录“Common Platform Error Record”中定义的某一种错误记录节类型。 |
18.3.2.7.2. 用于通用错误源的事件通知
对于已校正错误,建议使用事件通知,因为处理错误报告的延迟对于系统正常运行并不关键。事件通知的实现要求平台在 ACPI 命名空间中定义一个 PNP ID 为 PNP0C33 的设备,称为错误设备。该设备用于通知 OSPM 某个通用错误源正在报告错误。由于多个通用错误源都可以使用事件通知,因此 OSPM 有责任扫描这些通用错误源的列表,并检查块状态字段(Generic Error Status Block),以识别报告错误的源。
平台负责提供一个控制方法,该方法对错误设备(PNP0C33)发出 NOTIFY,通知代码类型为 0x80。
对于传统 ACPI 平台,事件信号遵循将匹配的控制方法排队执行中描述的模型。平台为错误通知实现一个通用事件(GPE),并且该 GPE 具有关联的控制方法。
错误通知的 GPE 控制方法示例如下:
Method (\_GPE._L08) { // GPE 8 level error notification
Notify (error_device, 0x80)
}
对于 HW-reduced ACPI 平台,事件信号遵循GPIO 发信号的 ACPI 事件和中断发信号的 ACPI 事件中描述的模型。平台通过中断或 GPIO 引脚实现错误事件通知。在这两种情况下,它们都与一个 _EVT 控制方法相关联。
基于 GPIO 的错误通知的 _EVT 控制方法示例如下:
Method (\_EVT) { // GPIO pin 300 error notification
Switch (Arg1) {
Case (300) {
Notify (error_device, 0x80)
}
}
}
当平台使用事件通知时,整体流程如下:
平台使用 Generic Hardware Error Source Structure 和 Generic Error Status Block 中的格式,将带有事件作为通知方法的错误源进行枚举。
平台向 OSPM 提供一个错误设备,PNP ID 为 PNP0C33
当平台准备报告错误时,平台填充错误状态块,包括块状态字段(Generic Error Status Block)。
传统 ACPI 平台使用 SCI 在适当的 GPE 上发出错误信号:
OSPM 按照将匹配的控制方法排队执行中的说明,求值与该事件关联的 GPE 控制方法
OSPM 通过检查所有使用 SCI 通用通知类型的通用错误源的错误状态块,来识别报告该错误的源,并响应此通知
硬件精简 ACPI 平台使用 GPIO 中断或在通用事件设备下声明的其他中断发出错误信号(中断发信号的 ACPI 事件)。对于 GPIO 发信号事件,由 _AEI 对象列出相应的 GPIO 引脚;对于中断发信号事件,则使用 _CRS 对象列出中断:
OSPM 按照处理 GPIO 发信号事件的事件方法和处理中断发信号事件的事件方法中的说明,求值与该事件关联的控制方法。
OSPM 通过检查所有使用 GPIO 发信号通知或中断发信号通知类型的通用错误源的错误状态块,来识别报告该错误的源,并响应此通知。
18.3.2.8. 通用硬件错误源版本 2(GHESv2 - Type 10)
这是对 Generic Hardware Error source 结构(第 18.3.2.7 节)的扩展,用于依赖 RAS 控制器生成通用错误记录的硬件精简平台。RAS 控制器可以是硬件实体或固件实体,并且可以与 OS 并行执行(例如,RAS 控制器可以是在独立微控制器上运行的固件,或者也可以是运行在某个应用处理器上的平台固件)。具有 RAS 控制器的平台必须防止对 Error Status Block 的并发访问(即,在 OS 完成读取之前,RAS 控制器不得覆盖 Error Status Block)。下表提供了 RAS 控制器可能如何与 OS 交互的高级示例。

图 18.1 带外部 RAS 控制器的 APEI 错误流示例
对于 GHESv2 错误源,OSPM 必须通过写入 GHESv2 结构中列出的“Read Ack Register”来确认已使用 Error Status Block(如下表所述)。对于描述多个 Generic Hardware Error Source 的平台,平台必须为每个错误源的 Error Status Block 提供唯一的内存区域。
表 18.13 通用硬件错误源版本 2(GHESv2)结构
| 名称 | 字节长度 | 字节偏移 | 说明 |
|---|---|---|---|
| Type | 2 | 0 | 10 - 通用硬件错误源(版本 2)结构 |
| Table 18.10 中的等效字段 | 62 | 2 | 与表 18.10 中的字段格式相同,从 Source Id 开始,到 Error Status Block Length 结束(含)。 |
| Read Ack Register | 12 | 64 | 如表 18.10 中定义的 Generic Address Structure。此字段指定 Read Ack Register 的位置,用于通知 RAS 控制器 OSPM 已处理完 Error Status Block。OSPM 写入 Read Ack Write 指定的位,同时保留 Read Ack Preserve 指定的位。 |
| Read Ack Preserve | 8 | 76 | 包含写入 Read Ack register 时要保留的位掩码。 |
| Read Ack Write | 8 | 84 | 包含写入 Read Ack register 时要置位的位掩码。 |
一旦从特定 GHESv2 错误源检测到错误,OS 必须执行以下步骤:
OSPM 检测到错误(通过中断/异常或轮询块状态)
OSPM 复制错误状态块
OSPM 清除错误状态块的块状态字段
OSPM 通过 Read Ack register 确认该错误。例如:
OSPM 读取 Read Ack register –> X
OSPM 写入 –> (( X & ReadAckPreserve) | ReadAckWrite)
18.3.2.9. 硬件错误通知
此表描述了与硬件错误源关联的通知机制。
表 18.14 硬件错误通知结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 1 | 0 | 标识通知类型:0 - 轮询 1 - 外部中断 2 - 本地中断 3 - SCI 4 - NMI 5 - CMCI 6 - MCE 7 - GPIO 信号 8 - ARMv8 SEA 9 - ARMv8 SEI 10 - 外部中断 - GSIV 11 - 软件委托异常 - 请参见 ACPI 相关文档链接(http://uefi.org/acpi)中标题为“SDEI 规范”的内容。所有其他值均保留 |
| 长度 | 1 | 1 | 该结构的总长度(以字节为单位)。 |
| 配置写使能 | 2 | 2 | 此字段指示配置参数是否可以由 OSPM 修改。如果与关联参数对应的位被设置,则该参数可由 OSPM 写入:位 [0]:类型 位 [1]:轮询间隔 位 [2]:切换到轮询阈值数值 位 [3]:切换到轮询阈值窗口 位 [4]:错误阈值数值 位 [5]:错误阈值窗口 所有其他位均保留。 |
| 轮询间隔 | 4 | 4 | 指示 OSPM 应使用的轮询间隔(毫秒),以定期检查错误源是否存在错误状态。 |
| 向量 | 4 | 8 | 中断向量。对于类型 10“外部中断 - GSIV”,此字段指定由错误源触发的 GSIV。 |
| 切换到轮询阈值数值 | 4 | 12 | 在 OSPM 将错误源切换到轮询模式之前,必须在切换到轮询阈值时间间隔内发生的错误中断次数。 |
| 切换到轮询阈值窗口 | 4 | 16 | 指示在 OSPM 将错误源切换到轮询模式之前,必须在其中发生切换到轮询阈值数值个中断的时间间隔(毫秒)。 |
| 错误阈值数值 | 4 | 20 | 指示在 OSPM 将该事件作为错误状态处理之前,必须在错误阈值时间间隔内发生的错误事件数。 |
| 错误阈值窗口 | 4 | 24 | 指示在 OSPM 将该事件作为错误状态处理之前,错误阈值数值个错误必须在其中发生的时间间隔(毫秒)。 |
18.3.2.10. IA-32 架构延迟机器检查
实现 IA-32 指令集架构的处理器可以向 OSPM 报告延迟错误。这些错误表明数据已损坏但尚未被使用。此表中的信息使平台固件能够向 OSPM 传达延迟处理器错误报告机制的关键参数,包括是否应启用延迟机器检查(DMC)处理。
HEST 中仅允许有一个此类型的条目。OSPM 将此条目中指定的信息应用于所有处理器。
表 18.15 IA-32 架构延迟机器检查结构
| 字段 | 字节长度 | 字节偏移 | 描述 |
|---|---|---|---|
| 类型 | 2 | 0 | 11 - IA-32 架构延迟机器检查结构。 |
| 源 ID | 2 | 2 | 此值用于在平台报告的其他错误源中唯一标识此错误源。 |
| 保留 | 2 | 4 | 保留。 |
| 标志 | 1 | 6 | 位 [0] - FIRMWARE_FIRST:如果置位,此位向 OSPM 指示系统固件将首先处理来自该源的错误。位 [2] - GHES_ASSIST:如果置位,此位指示尽管 OSPM 负责直接处理该错误(如同在未设置 FIRMWARE_FIRST 时所预期的那样),系统固件仍可以在硬件报告的错误上下文中报告附加信息。附加信息在具有匹配相关源 ID 的通用硬件错误源结构中报告。参见第 18.7 节、GHES_ASSIST 错误报告。注意:如果设置了 FIRMWARE_FIRST,则此位保留。所有其他位必须设为零。 |
| 已启用 | 1 | 7 | 如果该字段值为 1,表示应启用此错误源。如果该字段值为 0,表示不应启用该错误源。如果在 flags 字段中设置了 FIRMWARE_FIRST,则 OSPM 忽略 Enabled 字段。 |
| 要预分配的记录数 | 4 | 8 | 指示要为此错误源预分配的错误记录数量。必须 >= 1。 |
| 每条记录的最大节数 | 4 | 12 | 指示由于此错误源报告的错误而创建的错误记录中包含的错误节的最大数量。必须 >= 1。 |
| 通知结构 | 28 | 16 | 硬件错误通知结构,如表 18.14 所定义。 |
| 硬件库数量 | 1 | 44 | 指示硬件错误报告库的数量。 |
| 保留 | 3 | 45 | 保留。 |
| 机器检查库结构[n] |
| 48 | IA-32 架构机器检查库结构 中定义的 Machine Check Bank 结构列表。