RAS--APEI 报错解析流程(1)

7 篇文章 0 订阅

RAS--APEI 报错解析流程(2)

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 解析详细流程  

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RAS-3072(也称为RSA-3072)是一种非对称加密算法,用于加密和解密数据。以下是使用 C++ 实现 RAS-3072 加密和解密的基本步骤: 1. 生成公钥和私钥 首先,需要生成一个公钥和一个私钥对。公钥用于加密数据,私钥用于解密数据。生成公钥和私钥的步骤如下: - 选择两个大素数 p 和 q,使得它们的积 N = p * q 非常大(通常在几千位以上)。 - 计算欧拉函数 φ(N) = (p-1) * (q-1)。 - 选择一个小于 φ(N) 且与 φ(N) 互质的整数 e,它将作为公钥的一部分。 - 计算 e 的模反元素 d,它将作为私钥的一部分。d 满足以下条件:d * e ≡ 1 (mod φ(N))。 2. 加密数据 一旦公钥和私钥被生成,就可以使用公钥来加密数据。加密的步骤如下: - 将要加密的数据转换为一个整数 m,该整数应小于 N。 - 计算 c ≡ m^e (mod N),其中 e 是公钥中的指数。得到的 c 是加密后的数据。 3. 解密数据 一旦加密的数据需要被解密,就可以使用私钥来解密数据。解密的步骤如下: - 将加密后的数据 c 转换为一个整数。 - 计算 m ≡ c^d (mod N),其中 d 是私钥中的指数。得到的 m 是解密后的数据。 下面是使用 C++ 实现 RAS-3072 加密和解密的示例代码: ```cpp #include <iostream> #include <vector> #include <random> #include <chrono> #include <gmpxx.h> using namespace std; // 生成随机大素数 mpz_class generate_prime(int num_bits) { random_device rd; mt19937 gen(rd()); uniform_int_distribution<mpz_class> dist(mpz_class(1) << (num_bits-1), mpz_class(1) << num_bits); while (true) { auto p = dist(gen); if (mpz_probab_prime_p(p.get_mpz_t(), 25) > 0) { return p; } } } // 生成公钥和私钥 void generate_key(mpz_class& N, mpz_class& e, mpz_class& d, int num_bits) { auto p = generate_prime(num_bits); auto q = generate_prime(num_bits); N = p * q; mpz_class phi = (p - 1) * (q - 1); while (true) { e = generate_prime(num_bits); if (gcd(e, phi) == 1) { break; } } mpz_invert(d.get_mpz_t(), e.get_mpz_t(), phi.get_mpz_t()); } // 加密数据 mpz_class encrypt(mpz_class m, mpz_class N, mpz_class e) { mpz_class c; mpz_powm(c.get_mpz_t(), m.get_mpz_t(), e.get_mpz_t(), N.get_mpz_t()); return c; } // 解密数据 mpz_class decrypt(mpz_class c, mpz_class N, mpz_class d) { mpz_class m; mpz_powm(m.get_mpz_t(), c.get_mpz_t(), d.get_mpz_t(), N.get_mpz_t()); return m; } int main() { // 生成公钥和私钥 mpz_class N, e, d; generate_key(N, e, d, 3072); // 要加密的数据 string plaintext = "Hello, world!"; mpz_class m(plaintext.c_str()); // 加密数据 auto c = encrypt(m, N, e); cout << "Encrypted: " << c.get_str() << endl; // 解密数据 auto decrypted = decrypt(c, N, d); cout << "Decrypted: " << decrypted.get_str() << endl; return 0; } ``` 需要注意的是,RAS-3072 是一种非常复杂的加密算法,实现起来也比较复杂。如果需要使用加密算法来保护敏感数据,请务必仔细考虑安全性和实现细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值