Linux 内核 6.6.0 故障错误码与系统影响 --- 完整参考手册
范围 :rasdaemon 关心的所有 trace event + 错误码定义 --- MCE / AER / EDAC / CXL / extlog / non-standard / memory-failure / devlink / block / signal
基线 :Linux kernel 6.6.0(
/work/work/git_code/linux)性质 :内核侧错误码字典 + 严重性 + 系统影响 + 来源溯源(
file:line)
0. 总览:rasdaemon 关心的 14 个 trace event 在内核的来源
| Trace event | 头文件 / 源文件 | 触发点 |
|---|---|---|
mce_record |
include/trace/events/mce.h |
arch/x86/kernel/cpu/mce/core.c |
mc_event |
include/ras/ras_event.h:98-163 |
drivers/edac/edac_mc.c:929 edac_raw_mc_handle_error() |
aer_event |
include/ras/ras_event.h:269-339 |
drivers/pci/pcie/aer.c |
cxl_aer_uncorrectable_error |
drivers/cxl/core/trace.h:51 |
drivers/cxl/core/pci.c |
cxl_aer_correctable_error |
drivers/cxl/core/trace.h:99 |
drivers/cxl/core/pci.c |
cxl_overflow |
drivers/cxl/core/trace.h:127 |
drivers/cxl/core/mbox.c |
cxl_generic_event |
drivers/cxl/core/trace.h:225 |
drivers/cxl/core/mbox.c:863 cxl_event_trace_record() |
cxl_general_media |
drivers/cxl/core/trace.h:315 |
同上 |
cxl_dram |
drivers/cxl/core/trace.h:398 |
同上 |
cxl_memory_module |
drivers/cxl/core/trace.h:547 |
同上 |
cxl_poison |
drivers/cxl/core/trace.h:643 |
drivers/cxl/core/mbox.c |
arm_event |
include/ras/ras_event.h:171-208 |
drivers/ras/ras.c:24 log_arm_hw_error() ← ghes.c:507 |
extlog_mem_event |
include/ras/ras_event.h:27-77 |
drivers/acpi/acpi_extlog.c:178 |
non_standard_event |
include/ras/ras_event.h:219-253 |
drivers/ras/ras.c:17 ← ghes.c:676 |
memory_failure_event |
include/ras/ras_event.h:399-423 |
mm/memory-failure.c:1323 |
signal_generate |
include/trace/events/signal.h:50-80 |
kernel/signal.c |
devlink_health_report |
include/trace/events/devlink.h:81-107 |
net/devlink/health.c |
block_rq_error |
include/trace/events/block.h:165-170 |
block/blk-core.c |
1. MCE --- Machine Check Exception(x86)
1.1 mce_record trace event 字段
include/trace/events/mce.h:12-70 --- 对应 struct mce (arch/x86/include/uapi/asm/mce.h:13-39):
| 字段 | 类型 | 来源 MSR / 寄存器 |
|---|---|---|
cpu |
u32 | m->extcpu |
mcgcap |
u64 | MCGCAP |
mcgstatus |
u64 | MCG_STATUS |
bank |
u8 | 0...63(MCA bank index) |
status |
u64 | MCi_STATUS |
ipid |
u64 | MCA_IPID(SMCA 才有) |
addr |
u64 | MCi_ADDR |
misc |
u64 | MCi_MISC |
synd |
u64 | MCA_SYND(SMCA 才有) |
cs |
u8 | code segment |
ip |
u64 | instruction pointer |
tsc |
u64 | RDTSC |
cpuvendor |
u32 | X86_VENDOR_*(INTEL=0, AMD=2, HYGON=9, ZHAOXIN=11...) |
cpuid |
u32 | CPUID 1.EAX(family/model/stepping) |
walltime |
u64 | m->time(秒) |
socketid |
u32 | CPU socket id |
apicid |
u32 | initial APIC ID |
1.2 MCG_STATUS 位(全局机器检查状态)
arch/x86/include/asm/mce.h:23-27
| 位 | 名称 | 含义 |
|---|---|---|
| 0 | MCG_STATUS_RIPV |
Restart IP valid --- 可在 m->ip 处恢复执行 |
| 1 | MCG_STATUS_EIPV |
Error IP valid --- m->ip 指向出错指令 |
| 2 | MCG_STATUS_MCIP |
Machine Check In Progress --- 软件处理完后必须清零 |
| 3 | MCG_STATUS_LMCES |
LMCE Signaled --- MCE 作为 Local MCE 投递 |
MCG_CAP 特性位 (mce.h:12-21):
| 位 | 名称 | 含义 |
|---|---|---|
| 7:0 | MCG_BANKCNT_MASK |
MCA bank 数量 |
| 8 | MCG_CTL_P |
MCG_CTL 存在 |
| 9 | MCG_EXT_P |
扩展寄存器(MCG_EIP 等) |
| 10 | MCG_CMCI_P |
CMCI 支持 |
| 23:16 | MCG_EXT_CNT_MASK |
扩展寄存器计数 |
| 24 | MCG_SER_P |
Software Error Recovery 支持(UCNA/SRAR) |
| 26 | MCG_ELOG_P |
Extended error log 支持 |
| 27 | MCG_LMCE_P |
Local MCE 支持 |
1.3 MCI_STATUS 位(每 bank MCA 状态)
arch/x86/include/asm/mce.h:32-52
| 位 | 名称 | 含义 | 严重性 |
|---|---|---|---|
| 63 | MCI_STATUS_VAL |
寄存器有效(必先检查) | --- |
| 62 | MCI_STATUS_OVER |
之前的错误被丢弃(溢出) | --- |
| 61 | MCI_STATUS_UC |
Uncorrected error | Uncorrected |
| 60 | MCI_STATUS_EN |
Error enabled(已配置为检测) | --- |
| 59 | MCI_STATUS_MISCV |
MCi_MISC 有效 | --- |
| 58 | MCI_STATUS_ADDRV |
MCi_ADDR 有效 | --- |
| 57 | MCI_STATUS_PCC |
Processor Context Corrupt --- 内核无法继续 | 致命 |
| 56 | MCI_STATUS_S |
Signaled --- MCE 已通过异常/CMCI 投递 | --- |
| 55 | MCI_STATUS_AR |
Action Required --- 软件必须动作(如下线页) | Recoverable w/ action |
| 52:38 | MCI_STATUS_CEC_MASK |
Corrected Error Count(已纠正错误数) | --- |
| 31:16 | MSCOD | Model-Specific Error Code | --- |
| 15:0 | MCACOD | MCA Error Code(bit 12 过滤位忽略) | --- |
AMD 特有位 (mce.h:48-52):
| 位 | 名称 | 含义 |
|---|---|---|
| 55 | MCI_STATUS_TCC |
Task Context Corrupt(MCA 扩展) |
| 53 | MCI_STATUS_SYNDV |
MCi_SYND 有效 |
| 44 | MCI_STATUS_DEFERRED |
未纠正但延迟(无异常;通过 APIC 记录) |
| 43 | MCI_STATUS_POISON |
访问到已被下毒的数据(数据 poisoning / SUCCOR) |
| 40 | MCI_STATUS_SCRUB |
巡检 scrub 期间发现 |
MCACOD 宏 (mce.h:73-80):
| 名称 | 值 | 含义 |
|---|---|---|
MCACOD |
0xefff |
MCACOD 字段掩码 |
MCACOD_SCRUB |
0x00C0 |
Memory scrubbing error(bits 0xC0...0xCF) |
MCACOD_SCRUBMSK |
0xeff0 |
Scrub 掩码(跳过 bit 12) |
MCACOD_L3WB |
0x017A |
L3 explicit writeback 错误 |
MCACOD_DATA |
0x0134 |
Data Load(SRAR) |
MCACOD_INSTR |
0x0150 |
Instruction Fetch(SRAR) |
1.4 MCI_MISC 位
mce.h:82-92
| 宏 | 位 | 含义 |
|---|---|---|
MCI_MISC_ADDR_LSB(m) |
m & 0x3f | Address LSB(亚页位掩码) |
MCI_MISC_ADDR_MODE(m) |
(m>>6) & 7 | Address mode |
MCI_MISC_ADDR_SEGOFF |
0 | Segment offset |
MCI_MISC_ADDR_LINEAR |
1 | Linear |
MCI_MISC_ADDR_PHYS |
2 | Physical(mce_usable_address 使用) |
MCI_MISC_ADDR_MEM |
3 | Memory |
MCI_MISC_ADDR_GENERIC |
7 | Generic |
MCI_ADDR_PHYSADDR |
GENMASK_ULL(phys_bits-1, 0) |
物理地址掩码 |
MCI_CTL2 (mce.h:94-96):
| 位 | 名称 | 含义 |
|---|---|---|
| 30 | MCI_CTL2_CMCI_EN |
CMCI 中断使能 |
| 14:0 | MCI_CTL2_CMCI_THRESHOLD_MASK |
CMCI 阈值 |
1.5 严重性等级 enum severity_level
arch/x86/kernel/cpu/mce/internal.h:11-21
| 值 | 常量 | 含义 |
|---|---|---|
| 0 | MCE_NO_SEVERITY |
无效 / 不启用(!VAL 或 !EN)--- 丢弃 |
| 1 | MCE_DEFERRED_SEVERITY (=MCE_UCNA_SEVERITY) |
延迟错误或 UCNA --- 保留 |
| 2 | MCE_KEEP_SEVERITY |
CE / 非致命 UC --- 保留 |
| 3 | MCE_SOME_SEVERITY |
动作可选但未知 |
| 4 | MCE_AO_SEVERITY |
Action Optional(scrub / L3WB) |
| 5 | MCE_UC_SEVERITY |
Uncorrected 无 AR |
| 6 | MCE_AR_SEVERITY |
Action Required(页必须离线) |
| 7 | MCE_PANIC_SEVERITY |
致命 --- 触发 panic |
1.6 Intel 严重性表(severity.c:38-218)
核心规则(按顺序,首匹配胜):
| 严重性 | 触发条件 | 消息 |
|---|---|---|
| NO | !MCI_STATUS_VAL |
"Invalid" |
| NO | !MCI_STATUS_EN(异常上下文) |
"Not enabled" |
| PANIC | MCI_STATUS_PCC set |
"Processor context corrupt" |
| PANIC | MCG_STATUS_MCIP clear |
"MCIP not set in MCA handler" |
| PANIC | RIPV & EIPV 都清零 | "Neither restart nor error IP" |
| PANIC | RIPV clear in KERNEL/KERNEL_RECOV | "In kernel and no restart IP" |
| KEEP | UC clear | "Corrected error" |
| AO | `MCI_UC_AR | MCACOD_SCRUBMSK==UC |
| AO | `MCI_UC_AR | MCACOD==UC |
| AO | SKX step≥4, banks 13-18, `ADDR | 0x001000c0` |
| UCNA | MCI_UC_SAR == UC(S, AR clear) |
"Uncorrected no action required" |
| PANIC | OVER+UC+AR+!S | "Illegal combination (UCNA with AR=1)" |
| KEEP | S clear in SER mode | "Non signaled machine check" |
| PANIC | OVER+UC+S+AR | "Action required with lost events" |
| KEEP | UC+S+AR+ADDRV, RIPV | "Action required but unaffected thread is continuable" |
| AR | UC+S+AR+ADDRV+MCACOD_DATA, KERNEL_RECOV | "Data load in error recoverable area of kernel" |
| AR | UC+S+AR+ADDRV+MCACOD_DATA, USER | "Data load error in a user process" |
| AR | UC+S+AR+ADDRV+MCACOD_INSTR, USER | "Instruction fetch error in a user process" |
| PANIC | UC+S+AR+ADDRV+MCACOD_DATA, KERNEL | "Data load in unrecoverable area of kernel" |
| PANIC | UC+S+AR+ADDRV+MCACOD_INSTR, KERNEL | "Instruction fetch error in kernel" |
| PANIC | UC+S+AR, no MCACOD | "Action required: unknown MCACOD" |
| SOME | UC+S, no AR | "Action optional: unknown MCACOD" |
| SOME | OVER+UC+S | "Action optional with lost events" |
| PANIC | OVER+UC | "Overflowed uncorrected" |
| PANIC | UC, KERNEL | "Uncorrected in kernel" |
| UC | UC, no AR | "Uncorrected" |
| SOME | catch-all | "No match" |
复合宏(severity.c:67-70):
MCI_UC_S=MCI_STATUS_UC | MCI_STATUS_SMCI_UC_AR=MCI_STATUS_UC | MCI_STATUS_ARMCI_UC_SAR=MCI_STATUS_UC | MCI_STATUS_S | MCI_STATUS_ARMCI_ADDR=MCI_STATUS_ADDRV | MCI_STATUS_MISCV
1.7 AMD 严重性(severity_amd(),severity.c:310-368)
| 检查 | 严重性 | 消息 |
|---|---|---|
MCI_STATUS_PCC |
MCE_PANIC_SEVERITY |
"Processor Context Corrupt" |
MCI_STATUS_DEFERRED |
MCE_DEFERRED_SEVERITY |
--- |
!MCI_STATUS_UC |
MCE_KEEP_SEVERITY |
"Corrected or deferred-by-UC=0" |
OVER && !overflow_recov |
MCE_PANIC_SEVERITY |
"Overflowed uncorrected without MCA Overflow Recovery" |
!succor |
MCE_PANIC_SEVERITY |
"Uncorrected without MCA Recovery" |
error_context == IN_KERNEL |
MCE_PANIC_SEVERITY |
"Uncorrected unrecoverable in kernel context" |
| 默认 | MCE_AR_SEVERITY |
--- |
error_context() (severity.c:274-307):
IN_USER--- cs & 3 == 3IN_KERNEL--- 无 RIPVIN_KERNEL_RECOV--- uaccess/copy with extable fixup,置MCE_IN_KERNEL_RECOV/MCE_IN_KERNEL_COPYIN
1.8 公共函数
| 函数 | 位置 | 行为 |
|---|---|---|
mce_usable_address() |
core.c:462-482 |
UC 无 DEFERRED |
mce_is_correctable() |
core.c:525-537 |
满足 ADDRV && MISCV && LSB≤PAGE_SHIFT && ADDR_MODE==PHYS |
mce_is_memory_error() |
core.c:485-514 |
AMD:SMCA_UMC/UMC_V2 且 XEC=0,或 K8 bank 4 XEC=0x8。Intel:`(status & 0xef80)==BIT(7) |
1.9 AMD SMCA 26 个 bank type
arch/x86/include/asm/mce.h:299-334(enum smca_bank_types):
| 索引 | 名称 | 简名 |
|---|---|---|
| 0 | SMCA_LS |
load_store |
| 1 | SMCA_LS_V2 |
load_store |
| 2 | SMCA_IF |
insn_fetch |
| 3 | SMCA_L2_CACHE |
l2_cache |
| 4 | SMCA_DE |
decode_unit |
| 5 | SMCA_RESERVED |
reserved |
| 6 | SMCA_EX |
execution_unit |
| 7 | SMCA_FP |
floating_point |
| 8 | SMCA_L3_CACHE |
l3_cache |
| 9 | SMCA_CS |
coherent_slave |
| 10 | SMCA_CS_V2 |
coherent_slave |
| 11 | SMCA_PIE |
pie |
| 12 | SMCA_UMC |
umc |
| 13 | SMCA_UMC_V2 |
umc_v2 |
| 14 | SMCA_PB |
param_block |
| 15 | SMCA_PSP |
psp |
| 16 | SMCA_PSP_V2 |
psp |
| 17 | SMCA_SMU |
smu |
| 18 | SMCA_SMU_V2 |
smu |
| 19 | SMCA_MP5 |
mp5 |
| 20 | SMCA_MPDMA |
mpdma |
| 21 | SMCA_NBIO |
nbio |
| 22 | SMCA_PCIE |
pcie |
| 23 | SMCA_PCIE_V2 |
pcie |
| 24 | SMCA_XGMI_PCS |
xgmi_pcs |
| 25 | SMCA_NBIF |
nbif |
| 26 | SMCA_SHUB |
shub |
| 27 | SMCA_SATA |
sata |
| 28 | SMCA_USB |
usb |
| 29 | SMCA_GMI_PCS |
gmi_pcs |
| 30 | SMCA_XGMI_PHY |
xgmi_phy |
| 31 | SMCA_WAFL_PHY |
wafl_phy |
| 32 | SMCA_GMI_PHY |
gmi_phy |
| --- | N_SMCA_BANK_TYPES |
33(sentinel) |
HWID/MCATYPE 映射 (amd.c:160-219):
| Bank | HWID | MCATYPE |
|---|---|---|
SMCA_LS |
0xB0 | 0x0 |
SMCA_LS_V2 |
0xB0 | 0x10 |
SMCA_IF |
0xB0 | 0x1 |
SMCA_L2_CACHE |
0xB0 | 0x2 |
SMCA_DE |
0xB0 | 0x3 |
SMCA_EX |
0xB0 | 0x5 |
SMCA_FP |
0xB0 | 0x6 |
SMCA_CS |
0x2E | 0x0 |
SMCA_PIE |
0x2E | 0x1 |
SMCA_CS_V2 |
0x2E | 0x2 |
SMCA_UMC |
0x96 | 0x0 |
SMCA_UMC_V2 |
0x96 | 0x1 |
SMCA_PB |
0x05 | 0x0 |
SMCA_PSP |
0xFF | 0x0 |
SMCA_PSP_V2 |
0xFF | 0x1 |
SMCA_SMU |
0x01 | 0x0 |
SMCA_SMU_V2 |
0x01 | 0x1 |
SMCA_MP5 |
0x01 | 0x2 |
SMCA_MPDMA |
0x01 | 0x3 |
SMCA_NBIO |
0x18 | 0x0 |
SMCA_PCIE |
0x46 | 0x0 |
SMCA_PCIE_V2 |
0x46 | 0x1 |
SMCA_XGMI_PCS |
0x50 | 0x0 |
SMCA_NBIF |
0x6C | 0x0 |
SMCA_SHUB |
0x80 | 0x0 |
SMCA_SATA |
0xA8 | 0x0 |
SMCA_USB |
0xAA | 0x0 |
SMCA_GMI_PCS |
0x241 | 0x0 |
SMCA_XGMI_PHY |
0x259 | 0x0 |
SMCA_WAFL_PHY |
0x267 | 0x0 |
SMCA_GMI_PHY |
0x269 | 0x0 |
宏:HWID_MCATYPE(hwid, mcatype) = ((hwid) << 16) | (mcatype)(amd.c:74)
MCI_IPID_MCATYPE = 0xFFFF0000MCI_IPID_HWID = 0xFFFMCI_CONFIG_MCAX = 0x1(指示 MCA 扩展)
1.10 AMD 阈值 / 延迟错误位
amd.c:32-56
| 常量 | 值 | 含义 |
|---|---|---|
THRESHOLD_MAX |
0xFFF |
12-bit 最大计数 |
NR_BLOCKS |
5 |
每 bank 最多 MISC block |
INT_TYPE_APIC |
0x00020000 |
中断类型 = APIC LVT |
MASK_VALID_HI |
0x80000000 |
MCi_MISC.high block 有效 |
MASK_CNTP_HI |
0x40000000 |
计数器存在 |
MASK_LOCKED_HI |
0x20000000 |
阈值已锁 |
MASK_LVTOFF_HI |
0x00F00000 |
LVT offset(bits 23:20) |
MASK_COUNT_EN_HI |
0x00080000 |
计数使能 |
MASK_INT_TYPE_HI |
0x00060000 |
中断类型字段 |
MASK_OVERFLOW_HI |
0x00010000 |
溢出位 |
MASK_ERR_COUNT_HI |
0x00000FFF |
错误计数(bits 11:0) |
MASK_BLKPTR_LO |
0xFF000000 |
low word block 指针 |
MCG_XBLK_ADDR |
0xC0000400 |
Extended block 基址 |
MSR_CU_DEF_ERR |
0xC0000410 |
延迟错误配置 MSR |
MASK_DEF_LVTOFF |
0x000000F0 |
延迟 LVT offset |
MASK_DEF_INT_TYPE |
0x00000006 |
延迟中断类型 |
DEF_LVT_OFF |
0x2 |
默认 LVT offset |
DEF_INT_TYPE_APIC |
0x2 |
默认 APIC |
SMCA_THR_LVT_OFF |
0xF000 |
SMCA 阈值 LVT offset |
K8/Family 0x15 bank 4 子块 (amd.c:357-374):
0x00000413→ "dram"0xc0000408→ "ht_links"0xc0000409→ "l3_cache"
1.11 AMD SMCA MSR 地址
arch/x86/include/asm/mce.h:113-132
| MSR | 值 |
|---|---|
MSR_AMD64_SMCA_MC0_CTL |
0xc0002000 |
MSR_AMD64_SMCA_MC0_STATUS |
0xc0002001 |
MSR_AMD64_SMCA_MC0_ADDR |
0xc0002002 |
MSR_AMD64_SMCA_MC0_MISC0 |
0xc0002003 |
MSR_AMD64_SMCA_MC0_CONFIG |
0xc0002004 |
MSR_AMD64_SMCA_MC0_IPID |
0xc0002005 |
MSR_AMD64_SMCA_MC0_SYND |
0xc0002006 |
MSR_AMD64_SMCA_MC0_DESTAT |
0xc0002008(延迟错误状态) |
MSR_AMD64_SMCA_MC0_DEADDR |
0xc0002009(延迟错误地址) |
MSR_AMD64_SMCA_MC0_MISC1 |
0xc000200a |
MSR_AMD64_SMCA_MCx_* |
基址 + 0x10 * x |
MCA_CONFIG 用到的位 (amd.c:274-334):
- bit 32 (high & 0x1) =
McaX--- 启用 SMCA 寄存器布局 - bit 37 (low & 0x20) =
DeferredIntTypeSupported - bits 38:37 =
DeferredIntType(0x1 = APIC) - bit 40 (low & 0x100) =
McaLsbInStatusSupported
1.12 CMCI(Corrected Machine Check Interrupt)
intel.c:66-79 + mce.h:30, 95-96
| 常量 | 值 | 含义 |
|---|---|---|
CMCI_THRESHOLD |
1 | 默认阈值 |
CMCI_POLL_INTERVAL |
30*HZ | 正常轮询间隔 |
CMCI_STORM_INTERVAL |
HZ | 风暴间隔 |
CMCI_STORM_THRESHOLD |
15 | 风暴阈值(每秒事件数) |
CMCI 风暴状态(intel.c:75-79):
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | CMCI_STORM_NONE |
无风暴 |
| 1 | CMCI_STORM_ACTIVE |
风暴中;切到轮询 |
| 2 | CMCI_STORM_SUBSIDED |
风暴结束;即将恢复中断模式 |
MCG_CMCI_P = BIT_ULL(10) --- CMCI 支持位
1.13 mce-inject 操作类型
inject.c:47-61(enum injection_type):
| 值 | 常量 | 触发 |
|---|---|---|
| 0 | SW_INJ |
mce_log(&i_mce) --- 解码 only,安全 |
| 1 | HW_INJ |
int $18 → #MC 异常 --- 真实 MCE,PCC 时 panic |
| 2 | DFR_INT_INJ |
int $DEFERRED_ERROR_VECTOR --- AMD 延迟错误 APIC |
| 3 | THR_INT_INJ |
int $THRESHOLD_APIC_VECTOR --- AMD 阈值 APIC |
| 4 | N_INJ_TYPES |
sentinel |
注入上下文标志(mce.h:98-105):
MCJ_CTX_MASK = 3,MCJ_CTX(flags) = (flags) & 3MCJ_CTX_RANDOM = 0(默认)MCJ_CTX_PROCESS = 1(进程上下文)MCJ_CTX_IRQ = 2(IRQ 上下文)MCJ_NMI_BROADCAST = 0x4MCJ_EXCEPTION = 0x8MCJ_IRQ_BROADCAST = 0x10
Debugfs 文件(inject.c:696-710):status、misc、addr、synd、ipid、bank、flags、cpu、README
1.14 mce.kflags(kernel-only)
mce.h:137-158
| 位 | 名称 | 含义 |
|---|---|---|
| 0 | MCE_HANDLED_CEC |
由 CEC 处理 |
| 1 | MCE_HANDLED_UC |
由 UC handler 处理 |
| 2 | MCE_HANDLED_EXTLOG |
由 Extended Log 处理 |
| 3 | MCE_HANDLED_NFIT |
由 NFIT 处理 |
| 4 | MCE_HANDLED_EDAC |
由 EDAC 处理 |
| 5 | MCE_HANDLED_MCELOG |
由 /dev/mcelog 处理 |
| 6 | MCE_IN_KERNEL_RECOV |
内核可恢复 |
| 7 | MCE_IN_KERNEL_COPYIN |
copy_from_user 期间 |
1.15 mce_notifier_prios
mce.h:176-186(notifier chain 优先级)
| 优先级 | 常量 | 用途 |
|---|---|---|
| 0 | MCE_PRIO_LOWEST |
默认 print-only |
| 1 | MCE_PRIO_MCELOG |
/dev/mcelog 旧设备 |
| 2 | MCE_PRIO_EDAC |
EDAC 子系统 |
| 3 | MCE_PRIO_NFIT |
NVDIMM Firmware Interface |
| 4 | MCE_PRIO_EXTLOG |
Extended error log |
| 5 | MCE_PRIO_UC |
UC handler(页离线) |
| 6 | MCE_PRIO_EARLY |
最早消费方(emit trace_mce_record) |
| 7 | MCE_PRIO_CEC = MCE_PRIO_HIGHEST |
Corrected error collector |
1.16 mcp_flags(轮询标志)
mce.h:256-262
| 标志 | 含义 |
|---|---|
MCP_TIMESTAMP |
读 bank 时盖 TSC |
MCP_UC |
记录 UC 错误 |
MCP_DONTLOG |
清但不记录 |
MCP_QUEUE_LOG |
仅入 genpool(boot 时用) |
1.17 Vendor flags / quirks
internal.h:139-179
| 位 | 名称 | 含义 |
|---|---|---|
| 0 | overflow_recov |
MCA overflow recovery(F15h 00h-0fh 总是有) |
| 1 | succor |
AMD S/W UnCorrectable COntainment & Recovery |
| 2 | smca |
AMD Scalable MCA |
| 3 | zen_ifu_quirk |
Zen IFU poison-consumption EIPV/RIPV bug |
| 4 | amd_threshold |
AMD-style 阈值 bank |
| 5 | p5 |
Pentium family-5 |
| 6 | winchip |
Centaur Winchip C6 |
| 7 | snb_ifu_quirk |
Sandy Bridge IFU EIPV/RIPV bug |
| 8 | skx_repmov_quirk |
Skylake/Cascade/Cooper Lake REP MOVS bug |
1.18 CPU vendor 枚举
arch/x86/include/asm/processor.h:X86_VENDOR_INTEL=0, X86_VENDOR_AMD=2, X86_VENDOR_HYGON=9, X86_VENDOR_CENTAUR=5/8, X86_VENDOR_ZHAOXIN=11, X86_VENDOR_UNKNOWN
1.19 Kernel cmdline MCE 选项
core.c:2238-2290
| 选项 | 效果 |
|---|---|
mce |
启用 Pentium P5 MCE |
mce=off |
禁用全部 MCE |
mce=no_cmci |
禁用 CMCI |
mce=no_lmce |
禁用 LMCE |
mce=dont_log_ce |
不记录 CE |
mce=print_all |
全部 MCE 打到控制台 |
mce=ignore_ce |
禁用 CE 轮询和 CMCI |
mce=bootlog / nobootlog |
启动前日志切换 |
mce=bios_cmci_threshold |
不编程 CMCI 阈值 |
mce=recovery |
强制启用 copy_mc_fragile() |
mce=TOLERANCELEVEL |
monarch 超时(微秒) |
nomce |
mce=off 的别名 |
1.20 其他常量
| 名称 | 值 | 位置 |
|---|---|---|
MAX_NR_BANKS |
64 | mce.h:227 |
MCE_LOG_MIN_LEN |
32 | mce.h:107 |
MCE_LOG_SIGNATURE |
"MACHINECHECK" | mce.h:108 |
MCE_POOLSZ |
2*PAGE_SIZE (8KiB) |
genpool.c:22 |
MCE_OVERFLOW |
0 | mce.h:107 |
NBCFG |
0x44 | inject.c:45 |
/dev/mcelog ioctls(uapi/asm/mce.h:41-43):
MCE_GET_RECORD_LEN=_IOR('M', 1, int)MCE_GET_LOG_LEN=_IOR('M', 2, int)MCE_GETCLEAR_FLAGS=_IOR('M', 3, int)
CPUHP 状态(core.c:2767-2778):
CPUHP_X86_MCE_DEAD= "x86/mce:dead" →mce_cpu_dead()CPUHP_AP_ONLINE_DYN= "x86/mce:online" →mce_cpu_online()
2. PCIe AER
2.1 aer_event trace event 字段
include/ras/ras_event.h:269-339
c
TP_PROTO(const char *dev_name,
const u32 status,
const u8 severity,
const u8 tlp_header_valid,
struct aer_header_log_regs *tlp)
| 字段 | 类型 | 描述 |
|---|---|---|
dev_name |
string | 设备 slot 名([domain:]bus:device.function) |
status |
u32 | Correctable 或 Uncorrectable 寄存器值 |
severity |
u8 | AER_* 枚举值 |
tlp_header_valid |
u8 | 是否捕获到 TLP header |
tlp_header |
u324 | TLP header log 4 个 DWORD |
2.2 AER 严重性枚举
include/linux/aer.h:14-17
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | AER_NONFATAL |
Uncorrected, non-fatal |
| 1 | AER_FATAL |
Uncorrected, fatal |
| 2 | AER_CORRECTABLE |
Corrected |
| 3 | DPC_FATAL |
Fatal via Downstream Port Containment(驱动内部) |
2.3 Correctable Error Status(PCI_ERR_COR_STATUS = 0x10)
include/uapi/linux/pci_regs.h:748-802
| 位 | 掩码 | 名称 | 含义 |
|---|---|---|---|
| 0 | 0x00000001 |
PCI_ERR_COR_RCVR |
Receiver Error(PHY) |
| 6 | 0x00000040 |
PCI_ERR_COR_BAD_TLP |
Bad TLP |
| 7 | 0x00000080 |
PCI_ERR_COR_BAD_DLLP |
Bad DLLP |
| 8 | 0x00000100 |
PCI_ERR_COR_REP_ROLL |
REPLAY_NUM Rollover |
| 12 | 0x00001000 |
PCI_ERR_COR_REP_TIMER |
Replay Timer Timeout |
| 13 | 0x00002000 |
PCI_ERR_COR_ADV_NFAT |
Advisory Non-Fatal |
| 14 | 0x00004000 |
PCI_ERR_COR_INTERNAL |
Corrected Internal |
| 15 | 0x00008000 |
PCI_ERR_COR_LOG_OVER |
Header Log Overflow |
AER_MAX_TYPEOF_COR_ERRS = 16
2.4 Uncorrectable Error Status(PCI_ERR_UNCOR_STATUS = 0x04)
| 位 | 掩码 | 名称 | 含义 |
|---|---|---|---|
| 0 | 0x00000001 |
PCI_ERR_UNC_UND |
Undefined |
| 4 | 0x00000010 |
PCI_ERR_UNC_DLP |
Data Link Protocol Error |
| 5 | 0x00000020 |
PCI_ERR_UNC_SURPDN |
Surprise Down |
| 12 | 0x00001000 |
PCI_ERR_UNC_POISON_TLP |
Poisoned TLP |
| 13 | 0x00002000 |
PCI_ERR_UNC_FCP |
Flow Control Protocol |
| 14 | 0x00004000 |
PCI_ERR_UNC_COMP_TIME |
Completion Timeout |
| 15 | 0x00008000 |
PCI_ERR_UNC_COMP_ABORT |
Completer Abort |
| 16 | 0x00010000 |
PCI_ERR_UNC_UNX_COMP |
Unexpected Completion |
| 17 | 0x00020000 |
PCI_ERR_UNC_RX_OVER |
Receiver Overflow |
| 18 | 0x00040000 |
PCI_ERR_UNC_MALF_TLP |
Malformed TLP |
| 19 | 0x00080000 |
PCI_ERR_UNC_ECRC |
ECRC Error |
| 20 | 0x00100000 |
PCI_ERR_UNC_UNSUP |
Unsupported Request |
| 21 | 0x00200000 |
PCI_ERR_UNC_ACSV |
ACS Violation |
| 22 | 0x00400000 |
PCI_ERR_UNC_INTN |
Uncorrectable Internal |
| 23 | 0x00800000 |
PCI_ERR_UNC_MCBTLP |
MC Blocked TLP |
| 24 | 0x01000000 |
PCI_ERR_UNC_ATOMEG |
AtomicOp Egress Blocked |
| 25 | 0x02000000 |
PCI_ERR_UNC_TLPPRE |
TLP Prefix Blocked |
AER_MAX_TYPEOF_UNCOR_ERRS = 27
2.5 AER Capability 寄存器布局
| 偏移 | 寄存器 |
|---|---|
| 0x04 | PCI_ERR_UNCOR_STATUS |
| 0x08 | PCI_ERR_UNCOR_MASK |
| 0x0c | PCI_ERR_UNCOR_SEVER(bit set = Fatal) |
| 0x10 | PCI_ERR_COR_STATUS |
| 0x14 | PCI_ERR_COR_MASK |
| 0x18 | PCI_ERR_CAP |
| 0x1c | PCI_ERR_HEADER_LOG(16 字节) |
| 0x2c | PCI_ERR_ROOT_COMMAND |
| 0x30 | PCI_ERR_ROOT_STATUS |
| 0x34 | PCI_ERR_ROOT_ERR_SRC |
PCI_ERR_CAP 字段:
0x1fPCI_ERR_CAP_FEP(x)--- First Error Pointer(5-bit)0x20PCI_ERR_CAP_ECRC_GENC--- ECRC Generation Capable0x40PCI_ERR_CAP_ECRC_GENE--- ECRC Generation Enable0x80PCI_ERR_CAP_ECRC_CHKC--- ECRC Check Capable0x100PCI_ERR_CAP_ECRC_CHKE--- ECRC Check Enable
PCI_ERR_ROOT_COMMAND:
0x01PCI_ERR_ROOT_CMD_COR_EN0x02PCI_ERR_ROOT_CMD_NONFATAL_EN0x04PCI_ERR_ROOT_CMD_FATAL_EN
PCI_ERR_ROOT_STATUS:
0x01PCI_ERR_ROOT_COR_RCV0x02PCI_ERR_ROOT_MULTI_COR_RCV0x04PCI_ERR_ROOT_UNCOR_RCV0x08PCI_ERR_ROOT_MULTI_UNCOR_RCV0x10PCI_ERR_ROOT_FIRST_FATAL0x20PCI_ERR_ROOT_NONFATAL_RCV0x40PCI_ERR_ROOT_FATAL_RCV0xf8000000PCI_ERR_ROOT_AER_IRQ
AER_ERR_STATUS_MASK = PCI_ERR_ROOT_UNCOR_RCV | PCI_ERR_ROOT_COR_RCV | PCI_ERR_ROOT_MULTI_COR_RCV | PCI_ERR_ROOT_MULTI_UNCOR_RCV(aer.c:104-107)
PCI_ERR_ROOT_ERR_SRC 解码 (aer.c:101-102):
ERR_COR_ID(d) = d & 0xffffERR_UNCOR_ID(d) = d >> 16
2.6 AER recovery
| 状态 | 触发 |
|---|---|
pci_channel_io_normal |
Non-Fatal → pcie_do_recovery() |
pci_channel_io_frozen |
Fatal → pcie_do_recovery() |
aer_recover_ring = 16 entries(AER_RECOVER_RING_SIZE=16,aer.c:972),由 aer_recover_work_func 处理。aer_root_reset() 选择 FLR(PCI_EXP_TYPE_RC_EC)或 pci_bus_error_reset()(RP / Downstream)。
2.7 Agent / Layer 分类
aer.c:399-432
Agents (4):AER_AGENT_RECEIVER(0), _REQUESTER(1), _COMPLETER(2), _TRANSMITTER(3)
Layers (3):AER_PHYSICAL_LAYER_ERROR(0), _DATA_LINK_LAYER_ERROR(1), _TRANSACTION_LAYER_ERROR(2)
宏:AER_GET_AGENT()、AER_GET_LAYER_ERROR()
2.8 AER_LOG_TLP_MASKS
aer.c:88-93:
c
#define AER_LOG_TLP_MASKS (PCI_ERR_UNC_POISON_TLP | PCI_ERR_UNC_ECRC | \
PCI_ERR_UNC_UNSUP | PCI_ERR_UNC_COMP_ABORT | \
PCI_ERR_UNC_UNX_COMP | PCI_ERR_UNC_MALF_TLP)
2.9 AER_INJECT
drivers/pci/pcie/aer_inject.c
c
struct aer_error_inj {
u8 bus, dev, fn;
u32 uncor_status, cor_status;
u32 header_log0..3;
u32 domain;
};
/dev/aer_inject 字符设备(aer_inject.c:512-516),拦截 pci_ops 写 root port AER 寄存器,触发 root IRQ。
2.10 CPER AER section
include/linux/cper.h:246-253, 509-542
c
struct cper_sec_pcie {
u64 validation_bits; // CPER_PCIE_VALID_AER_INFO = 0x80
u8 aer_info[96]; // uncor_status, uncor_mask, uncor_severity,
// cor_status, cor_mask, cap_control,
// header_log[4], root_command, root_status
// ... other fields
};
cper_severity_to_aer() 映射(aer.c:750-761):
CPER_SEV_RECOVERABLE→AER_NONFATALCPER_SEV_FATAL→AER_FATAL- 其他 →
AER_CORRECTABLE
3. EDAC / Memory Controller
3.1 enum hw_event_mc_err_type
include/linux/edac.h:113-119
| 值 | 名称 | 含义 | 系统影响 |
|---|---|---|---|
| 0 | HW_EVENT_ERR_CORRECTED |
ECC 在硬件中纠正 | 单/多位已纠正;可能触发 page scrub |
| 1 | HW_EVENT_ERR_UNCORRECTED |
未被 ECC 纠正但不致命 | 页被下毒;可能杀进程;数据不可用 |
| 2 | HW_EVENT_ERR_DEFERRED |
数据下毒,非紧急处理 | 预防性下线页 |
| 3 | HW_EVENT_ERR_FATAL |
未恢复的不可纠正错误 | panic / machine check |
| 4 | HW_EVENT_ERR_INFO |
信息性(按 CPER 规范) | 诊断用 |
3.2 enum dev_type(DRAM 设备宽度)
include/linux/edac.h:72-81
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | DEV_UNKNOWN |
未知 |
| 1 | DEV_X1 |
1-bit 数据宽度 |
| 2 | DEV_X2 |
2-bit |
| 3 | DEV_X4 |
4-bit(典型) |
| 4 | DEV_X8 |
8-bit(典型) |
| 5 | DEV_X16 |
16-bit |
| 6 | DEV_X32 |
32-bit |
| 7 | DEV_X64 |
64-bit |
DEV_FLAG_X1...DEV_FLAG_X64 派生位标志(edac.h:83-90)。x4/x8 通常用 EDAC_S4ECD4ED / EDAC_S8ECD8ED 启用 chipkill。
3.3 enum edac_mc_layer_type(层级)
include/linux/edac.h:346-352
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | EDAC_MC_LAYER_BRANCH |
FB-DIMM branch |
| 1 | EDAC_MC_LAYER_CHANNEL |
内存 channel |
| 2 | EDAC_MC_LAYER_SLOT |
DIMM slot |
| 3 | EDAC_MC_LAYER_CHIP_SELECT |
Rank(csrow) |
| 4 | EDAC_MC_LAYER_ALL_MEM |
全部内存(firmware-driven) |
显示名(edac_mc.c:794-800):"branch" / "channel" / "slot" / "csrow" / "memory"
3.4 enum mem_type(DRAM 类型,参考)
include/linux/edac.h:191-221
| 值 | 名称 | 类型 |
|---|---|---|
| 0 | MEM_EMPTY |
--- |
| 1 | MEM_RESERVED |
--- |
| 2 | MEM_UNKNOWN |
--- |
| 3 | MEM_FPM |
~1995 |
| 4 | MEM_EDO |
~1998 |
| 5 | MEM_BEDO |
Burst EDO |
| 6 | MEM_SDR |
SDR SDRAM |
| 7 | MEM_RDR |
Registered SDR |
| 8 | MEM_DDR |
--- |
| 9 | MEM_RDDR |
--- |
| 10 | MEM_RMBS |
Rambus |
| 11 | MEM_DDR2 |
--- |
| 12 | MEM_FB_DDR2 |
Fully-Buffered |
| 13 | MEM_RDDR2 |
--- |
| 14 | MEM_XDR |
Rambus XDR |
| 15 | MEM_DDR3 |
--- |
| 16 | MEM_RDDR3 |
--- |
| 17 | MEM_LRDDR3 |
--- |
| 18 | MEM_LPDDR3 |
--- |
| 19 | MEM_DDR4 |
--- |
| 20 | MEM_RDDR4 |
--- |
| 21 | MEM_LRDDR4 |
--- |
| 22 | MEM_LPDDR4 |
--- |
| 23 | MEM_DDR5 |
--- |
| 24 | MEM_RDDR5 |
--- |
| 25 | MEM_LRDDR5 |
--- |
| 26 | MEM_NVDIMM |
--- |
| 27 | MEM_WIO2 |
--- |
| 28 | MEM_HBM2 |
--- |
3.5 enum edac_type(ECC 能力)
include/linux/edac.h:265-276
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | EDAC_UNKNOWN |
--- |
| 1 | EDAC_NONE |
--- |
| 2 | EDAC_RESERVED |
--- |
| 3 | EDAC_PARITY |
--- |
| 4 | EDAC_EC |
仅检测 |
| 5 | EDAC_SECDED |
单错纠正 + 双错检测 |
| 6 | EDAC_S2ECD2ED |
--- |
| 7 | EDAC_S4ECD4ED |
chipkill x4 |
| 8 | EDAC_S8ECD8ED |
chipkill x8 |
| 9 | EDAC_S16ECD16ED |
chipkill x16 |
3.6 enum scrub_type(scrub 模式)
include/linux/edac.h:301-312:SCRUB_UNKNOWN, SCRUB_NONE, SCRUB_SW_PROG, SCRUB_SW_SRC, SCRUB_SW_PROG_SRC, SCRUB_SW_TUNABLE, SCRUB_HW_PROG, SCRUB_HW_SRC, SCRUB_HW_PROG_SRC, SCRUB_HW_TUNABLE
3.7 EDAC_OPSTATE 状态
include/linux/edac.h:26-29, 326-330
| 值 | 名称 | 含义 |
|---|---|---|
| -1 | EDAC_OPSTATE_INVAL |
无效/未初始化 |
| 0 | EDAC_OPSTATE_POLL |
轮询 |
| 1 | EDAC_OPSTATE_NMI |
NMI |
| 2 | EDAC_OPSTATE_INT |
中断 |
mci->op_state 内部(edac.h:603):0x100 OP_ALLOC, 0x201 OP_RUNNING_POLL, 0x202 OP_RUNNING_INTERRUPT, 0x203 OP_RUNNING_POLL_INTR, 0x300 OP_OFFLINE
3.8 各平台驱动常量
| 平台 | 文件 | 关键常量 |
|---|---|---|
| Skylake | drivers/edac/skx_common.c |
NUM_CHANNELS, NUM_DIMMS;MTR[12:13]=rank, MTR[2:4]=row+12, MTR[0:1]=col+10;标签 "CPU_SrcID#%u_MC#%u_Chan#%u_DIMM#%u" |
| Icelake/SPR | drivers/edac/i10nm_base.c |
I10NM_REVISION "v0.0.6", I10NM_HBM_IMC_MMIO_SIZE=0x9000, I10NM_IS_HBM_PRESENT(reg)=bits[27:30], I10NM_IS_HBM_IMC(reg)=bit 29 |
| SB/IVB/HSW/BDW | drivers/edac/sb_edac.c |
NUM_CHANNELS=6, MAX_DIMMS=3, KNL_MAX_CHAS=38, KNL_MAX_CHANNELS=6, KNL_MAX_EDCS=8;chipset enum:SANDY_BRIDGE, IVY_BRIDGE, HASWELL, BROADWELL, KNIGHTS_LANDING |
| Apollo Lake / Denverton | drivers/edac/pnd2_edac.c |
APL_NUM_CHANNELS=4, DNV_NUM_CHANNELS=2, DNV_MAX_DIMMS=2;PMI ports apl_dports[4]={0x18,0x10,0x11,0x19}, dnv_dports[2]={0x10,0x12} |
| E7520/i3100 | drivers/edac/e752x_edac.c |
E752X_NR_CSROWS=8;chip enum:E7520=0, E7525=1, E7320=2, I3100=3;PCI device IDs: 0x3590/0x3591/0x359E/0x3593/0x3592/0x35B0/0x35B1;err regs: 0x40-0x84 |
| AMD64 | drivers/edac/amd64_edac.c |
DCTs: K8=1, F10h=2, F16h=1, F15h=dynamic;DCT_CFG_SEL F1x10C;DCSB_CS_ENABLE;F10_NB_ARRAY_DRAM(注入) |
| X-Gene | drivers/edac/xgene_edac.c |
MCU_MAX_RANK=8, MCU_RANK_STRIDE=0x40;MCUGECR=0x0110(MCU_GECR_DEMANDUCINTREN_MASK=BIT(0) 等);MCUGESR=0x0114(MCU_GESR_ADDRNOMATCH_ERR_MASK=BIT(7) 等);MCUESRR0=0x0314(MCU_ESRR_MULTUCERR_MASK=BIT(3), BACKUCERR_MASK=BIT(2), DEMANDUCERR_MASK=BIT(1), CERR_MASK=BIT(0)) |
3.9 mc_event trace event 字段
include/ras/ras_event.h:98-163
| 字段 | 类型 | 含义 |
|---|---|---|
error_type |
u32 | HW_EVENT_ERR_* 严重性 |
msg |
string | 人类可读错误消息 |
label |
string | DIMM 标签 |
error_count |
u16 | 错误数 |
mc_index |
u8 | MC 索引 |
top_layer |
s8 | 顶层层级索引 |
middle_layer |
s8 | 中层 |
lower_layer |
s8 | 底层 |
address |
long | 物理地址(page << PAGE_SHIFT | offset) |
grain_bits |
u8 | log2(grain) |
syndrome |
long | ECC 综合征 |
driver_detail |
string | 驱动额外信息 |
4. CXL(Compute Express Link)
4.1 8 个 CXL trace events(v6.6.0,无 cxl_memory_sparing)
| # | Event | 行号 |
|---|---|---|
| 1 | cxl_aer_uncorrectable_error |
drivers/cxl/core/trace.h:51 |
| 2 | cxl_aer_correctable_error |
drivers/cxl/core/trace.h:99 |
| 3 | cxl_overflow |
drivers/cxl/core/trace.h:127 |
| 4 | cxl_generic_event |
drivers/cxl/core/trace.h:225 |
| 5 | cxl_general_media |
drivers/cxl/core/trace.h:315 |
| 6 | cxl_dram |
drivers/cxl/core/trace.h:398 |
| 7 | cxl_memory_module |
drivers/cxl/core/trace.h:547 |
| 8 | cxl_poison |
drivers/cxl/core/trace.h:643 |
4.2 CXL AER Uncorrectable 位
drivers/cxl/core/trace.h:17-31(注意是 CXL_RAS_UC_* 而非 CXL_AER_UE_*)
| 位 | 符号 | 含义 |
|---|---|---|
| 0 | CXL_RAS_UC_CACHE_DATA_PARITY |
Cache data parity |
| 1 | CXL_RAS_UC_CACHE_ADDR_PARITY |
Cache address parity |
| 2 | CXL_RAS_UC_CACHE_BE_PARITY |
Cache byte-enable parity |
| 3 | CXL_RAS_UC_CACHE_DATA_ECC |
Cache data ECC UC |
| 4 | CXL_RAS_UC_MEM_DATA_PARITY |
Memory data parity |
| 5 | CXL_RAS_UC_MEM_ADDR_PARITY |
Memory address parity |
| 6 | CXL_RAS_UC_MEM_BE_PARITY |
Memory byte-enable parity |
| 7 | CXL_RAS_UC_MEM_DATA_ECC |
Memory data ECC UC |
| 8 | CXL_RAS_UC_REINIT_THRESH |
REINIT 阈值 |
| 9 | CXL_RAS_UC_RSVD_ENCODE |
收到未识别编码 |
| 10 | CXL_RAS_UC_POISON |
收到对端 poison |
| 11 | CXL_RAS_UC_RECV_OVERFLOW |
接收方溢出 |
| 14 | CXL_RAS_UC_INTERNAL_ERR |
设备内部错 |
| 15 | CXL_RAS_UC_IDE_TX_ERR |
IDE 发送错 |
| 16 | CXL_RAS_UC_IDE_RX_ERR |
IDE 接收错 |
掩码:cxl.h:130 = GENMASK(16,14) | GENMASK(11,0)。show_uc_errs() 在 trace.h:33-49。
4.3 CXL AER Correctable 位
trace.h:81-87(CXL_RAS_CE_*)
| 位 | 符号 | 含义 |
|---|---|---|
| 0 | CXL_RAS_CE_CACHE_DATA_ECC |
Cache ECC 纠正 |
| 1 | CXL_RAS_CE_MEM_DATA_ECC |
Memory ECC 纠正 |
| 2 | CXL_RAS_CE_CRC_THRESH |
CRC 阈值 |
| 3 | CLX_RAS_CE_RETRY_THRESH (内核拼写错:缺 'X') |
Retry 阈值 |
| 4 | CXL_RAS_CE_CACHE_POISON |
收到 cache poison |
| 5 | CXL_RAS_CE_MEM_POISON |
收到 memory poison |
| 6 | CXL_RAS_CE_PHYS_LAYER_ERR |
PHY 错误 |
掩码:cxl.h:137 = GENMASK(6,0)。show_ce_errs() 在 trace.h:89-97。
4.4 CXL Event Record Type UUIDs(mbox.c:843-861)
| UUID | Type | Trace event | CXL Spec |
|---|---|---|---|
fbcd0a77-c260-417f-85a9-088b1621eba6 |
General Media (GMER) | cxl_general_media |
3.0 §8.2.9.2.1.1 |
601dcbb3-9c06-4eab-b8af-4e9bfb5c9624 |
DRAM (DER) | cxl_dram |
3.0 §8.2.9.2.1.2 |
fe927475-dd59-4339-a586-79bab113b774 |
Memory Module (MMER) | cxl_memory_module |
3.0 §8.2.9.2.1.3 |
| 其他 | Generic | cxl_generic_event |
--- |
4.5 memory_event_type (GMER/DER type)
trace.h:278-285
| 值 | 符号 | 含义 |
|---|---|---|
| 0x00 | CXL_GMER_MEM_EVT_TYPE_ECC_ERROR |
ECC error |
| 0x01 | CXL_GMER_MEM_EVT_TYPE_INV_ADDR |
Invalid address |
| 0x02 | CXL_GMER_MEM_EVT_TYPE_DATA_PATH_ERROR |
Data path error |
(注意:v6.6.0 没有 memory_event_sub_type 枚举)
4.6 transaction_type
trace.h:287-302
| 值 | 符号 | 含义 |
|---|---|---|
| 0x00 | CXL_GMER_TRANS_UNKNOWN |
Unknown |
| 0x01 | CXL_GMER_TRANS_HOST_READ |
Host read |
| 0x02 | CXL_GMER_TRANS_HOST_WRITE |
Host write |
| 0x03 | CXL_GMER_TRANS_HOST_SCAN_MEDIA |
Host scan-media |
| 0x04 | CXL_GMER_TRANS_HOST_INJECT_POISON |
Host inject-poison |
| 0x05 | CXL_GMER_TRANS_INTERNAL_MEDIA_SCRUB |
Internal media scrub |
| 0x06 | CXL_GMER_TRANS_INTERNAL_MEDIA_MANAGEMENT |
Internal media mgmt |
4.7 cxl_event_log_type(严重性)
cxlmem.h:620-626 和 cxl.h:161-170
| 值 | 名称 | 状态寄存器位 |
|---|---|---|
| 0x00 | CXL_EVENT_TYPE_INFO |
CXLDEV_EVENT_STATUS_INFO = BIT(0) |
| 0x01 | CXL_EVENT_TYPE_WARN |
CXLDEV_EVENT_STATUS_WARN = BIT(1) |
| 0x02 | CXL_EVENT_TYPE_FAIL |
CXLDEV_EVENT_STATUS_FAIL = BIT(2) |
| 0x03 | CXL_EVENT_TYPE_FATAL |
CXLDEV_EVENT_STATUS_FATAL = BIT(3) |
| --- | CXLDEV_EVENT_STATUS_ALL |
0x0F(OR) |
| 0x04 | CXL_EVENT_TYPE_MAX |
sentinel |
cxl_event_thread() ISR(pci.c:619)读 32-bit 状态,按设置位触发 Get Event Records mailbox(mbox.c:1023,FATAL→INFO 顺序)。
4.8 DPA Flags
trace.h:255-263
| 符号 | 值 | 含义 |
|---|---|---|
CXL_DPA_FLAGS_MASK |
0x3F |
低 6 位掩码 |
CXL_DPA_MASK |
~CXL_DPA_FLAGS_MASK |
高位 |
CXL_DPA_VOLATILE |
BIT(0) |
易失性 |
CXL_DPA_NOT_REPAIRABLE |
BIT(1) |
不可修复 |
4.9 Event Descriptor Flags
trace.h:269-276
| 符号 | 值 | 含义 |
|---|---|---|
CXL_GMER_EVT_DESC_UNCORECTABLE_EVENT |
BIT(0) |
(内核拼写:UNCORECTABLE) |
CXL_GMER_EVT_DESC_THRESHOLD_EVENT |
BIT(1) |
阈值触发 |
CXL_GMER_EVT_DESC_POISON_LIST_OVERFLOW |
BIT(2) |
poison list 溢出 |
4.10 Health Status Flags (DHI)
trace.h:487-494
| 符号 | 值 | 含义 |
|---|---|---|
CXL_DHI_HS_MAINTENANCE_NEEDED |
BIT(0) |
维护需要 |
CXL_DHI_HS_PERFORMANCE_DEGRADED |
BIT(1) |
性能降级 |
CXL_DHI_HS_HW_REPLACEMENT_NEEDED |
BIT(2) |
硬件需更换 |
(v6.6.0 无 MEM_CAPACITY_DEGRADED)
4.11 Media Status Enum (DHI)
trace.h:496-527
| 值 | 符号 | 含义 |
|---|---|---|
| 0x00 | CXL_DHI_MS_NORMAL |
Normal |
| 0x01 | CXL_DHI_MS_NOT_READY |
Not ready |
| 0x02 | CXL_DHI_MS_WRITE_PERSISTENCY_LOST |
写持久性丢失 |
| 0x03 | CXL_DHI_MS_ALL_DATA_LOST |
全部数据丢失 |
| 0x04 | CXL_DHI_MS_WRITE_PERSISTENCY_LOSS_EVENT_POWER_LOSS |
掉电时持久性丢失 |
| 0x05 | CXL_DHI_MS_WRITE_PERSISTENCY_LOSS_EVENT_SHUTDOWN |
关机时持久性丢失 |
| 0x06 | CXL_DHI_MS_WRITE_PERSISTENCY_LOSS_IMMINENT |
即将丢失 |
| 0x07 | CXL_DHI_MS_WRITE_ALL_DATA_LOSS_EVENT_POWER_LOSS |
掉电时全数据丢失 |
| 0x08 | CXL_DHI_MS_WRITE_ALL_DATA_LOSS_EVENT_SHUTDOWN |
关机时全数据丢失 |
| 0x09 | CXL_DHI_MS_WRITE_ALL_DATA_LOSS_IMMINENT |
即将全数据丢失 |
4.12 DHI Add-Status 位字段
trace.h:529-545
| 符号 | 值 | 含义 |
|---|---|---|
CXL_DHI_AS_NORMAL |
0x0 | Normal |
CXL_DHI_AS_WARNING |
0x1 | Warning |
CXL_DHI_AS_CRITICAL |
0x2 | Critical |
CXL_DHI_AS_LIFE_USED(as) |
as & 0x3 | 寿命 2-bit |
CXL_DHI_AS_DEV_TEMP(as) |
(as & 0xC) >> 2 | 温度 2-bit |
CXL_DHI_AS_COR_VOL_ERR_CNT(as) |
(as & 0x10) >> 4 | 易失性错误 1-bit |
CXL_DHI_AS_COR_PER_ERR_CNT(as) |
(as & 0x20) >> 5 | 持久性错误 1-bit |
4.13 Memory Module Event Types
trace.h:467-480
| 值 | 符号 | 含义 |
|---|---|---|
| 0x00 | CXL_MMER_HEALTH_STATUS_CHANGE |
Health changed |
| 0x01 | CXL_MMER_MEDIA_STATUS_CHANGE |
Media status changed |
| 0x02 | CXL_MMER_LIFE_USED_CHANGE |
寿命阈值跨越 |
| 0x03 | CXL_MMER_TEMP_CHANGE |
温度阈值跨越 |
| 0x04 | CXL_MMER_DATA_PATH_ERROR |
Data path 错误 |
| 0x05 | CXL_MMER_LSA_ERROR |
Label Storage Area 错误 |
Sparing 标志 (v6.6.0 不存在,后加):
HARD_SPARING、QUERY_RESOURCES、DEVICE_INITIATED--- 在更新内核
4.14 Poison List Source Enum
cxlmem.h:778-782
| 值 | 符号 | 含义 |
|---|---|---|
| 0 | CXL_POISON_SOURCE_UNKNOWN |
Unknown |
| 1 | CXL_POISON_SOURCE_EXTERNAL |
External(peer) |
| 2 | CXL_POISON_SOURCE_INTERNAL |
Internal |
| 3 | CXL_POISON_SOURCE_INJECTED |
Injected(host) |
| 7 | CXL_POISON_SOURCE_VENDOR |
Vendor(4-6 保留) |
存储:64-bit poison 地址低 3 位。cxlmem.h:763-764:
CXL_POISON_START_MASK = GENMASK_ULL(63, 6)CXL_POISON_SOURCE_MASK = GENMASK(2, 0)
长度单位:CXL_POISON_LEN_MULT = 64 字节。cxlmem.h:773-775 flags:
CXL_POISON_FLAG_MORE = BIT(0)CXL_POISON_FLAG_OVERFLOW = BIT(1)CXL_POISON_FLAG_SCANNING = BIT(2)CXL_POISON_LIST_MAX = 1024
4.15 Common Event Record Flags(header)
trace.h:165-174
| 符号 | 值 | 含义 |
|---|---|---|
CXL_EVENT_RECORD_FLAG_PERMANENT |
BIT(2) |
永久 |
CXL_EVENT_RECORD_FLAG_MAINT_NEEDED |
BIT(3) |
维护需要 |
CXL_EVENT_RECORD_FLAG_PERF_DEGRADED |
BIT(4) |
性能降级 |
CXL_EVENT_RECORD_FLAG_HW_REPLACE |
BIT(5) |
硬件更换 |
4.16 CXLMDEV Memory Device Status
cxlmem.h:11-32
| 符号 | 值 | 含义 |
|---|---|---|
CXLMDEV_STATUS_OFFSET |
0x0 |
--- |
CXLMDEV_DEV_FATAL |
BIT(0) |
设备致命 |
CXLMDEV_FW_HALT |
BIT(1) |
固件停机 |
CXLMDEV_STATUS_MEDIA_STATUS_MASK |
GENMASK(3,2) |
--- |
CXLMDEV_MS_NOT_READY |
0 | --- |
CXLMDEV_MS_READY |
1 | --- |
CXLMDEV_MS_ERROR |
2 | --- |
CXLMDEV_MS_DISABLED |
3 | --- |
CXLMDEV_MBOX_IF_READY |
BIT(4) |
--- |
CXLMDEV_RESET_NEEDED_MASK |
GENMASK(7,5) |
--- |
CXLMDEV_RESET_NEEDED_NOT |
0 | --- |
CXLMDEV_RESET_NEEDED_COLD |
1 | --- |
CXLMDEV_RESET_NEEDED_WARM |
2 | --- |
CXLMDEV_RESET_NEEDED_HOT |
3 | --- |
CXLMDEV_RESET_NEEDED_CXL |
4 | --- |
CXLMDEV_DEV_FATAL 和 CXLMDEV_FW_HALT 触发 cxl_err()(pci.c:77-80)→ dev_err_ratelimited。
4.17 Mailbox Return Codes(cxlmem.h:142-174)
CMD_CMD_RC_TABLE 30 个 CXL_MBOX_CMD_RC_*:
SUCCESS, BACKGROUND, INPUT, UNSUPPORTED, INTERNAL, RETRY, BUSY, MEDIADISABLED, FWINPROGRESS, FWOOO, FWAUTH, FWSLOT, FWROLLBACK, FWRESET, HANDLE, PADDR(-EFAULT), POISONLMT, MEDIAFAILURE, ABORT, SECURITY, PASSPHRASE, MBUNSUPPORTED, PAYLOADLEN, LOG, INTERRUPTED, FEATUREVERSION, FEATURESELVALUE, FEATURETRANSFERIP, FEATURETRANSFEROOO, RESOURCEEXHAUSTED, EXTLIST
4.18 Mailbox Opcodes for Event(cxlmem.h:493-531)
| Opcode | 符号 | 规范 |
|---|---|---|
0x0100 |
CXL_MBOX_OP_GET_EVENT_RECORD |
3.0 §8.2.9.2.2 |
0x0101 |
CXL_MBOX_OP_CLEAR_EVENT_RECORD |
3.0 §8.2.9.2.3 |
0x0102 |
CXL_MBOX_OP_GET_EVT_INT_POLICY |
3.0 §8.2.9.2.4 |
0x0103 |
CXL_MBOX_OP_SET_EVT_INT_POLICY |
3.0 §8.2.9.2.4 |
0x4300 |
CXL_MBOX_OP_GET_POISON |
3.0 §8.2.9.8.4.1 |
0x4301 |
CXL_MBOX_OP_INJECT_POISON |
3.0 §8.2.9.8.4.2 |
0x4302 |
CXL_MBOX_OP_CLEAR_POISON |
3.0 §8.2.9.8.4.3 |
0x4303 |
CXL_MBOX_OP_GET_SCAN_MEDIA_CAPS |
3.0 |
0x4304 |
CXL_MBOX_OP_SCAN_MEDIA |
3.0(UAPI 标记 deprecated) |
0x4305 |
CXL_MBOX_OP_GET_SCAN_MEDIA |
3.0(UAPI 标记 deprecated) |
0x4400 |
CXL_MBOX_OP_SANITIZE |
3.0 §8.2.9.8.5.1 |
0x4401 |
CXL_MBOX_OP_SECURE_ERASE |
3.0 §8.2.9.8.5.2 |
0x4500-0x4505 |
Security commands | 3.0 |
0x10000 |
CXL_MBOX_OP_MAX |
sentinel |
4.19 Get Event Payload Flags(cxlmem.h:604-615)
| 符号 | 值 |
|---|---|
CXL_GET_EVENT_FLAG_OVERFLOW |
BIT(0) |
CXL_GET_EVENT_FLAG_MORE_RECORDS |
BIT(1) |
c
struct cxl_get_event_payload {
u8 flags;
u8 reserved1;
__le16 overflow_err_count;
__le64 first_overflow_timestamp;
__le64 last_overflow_timestamp;
__le16 record_count;
u8 reserved2[10];
struct cxl_event_record_raw records[];
};
cxl_overflow 事件在 flags & CXL_GET_EVENT_FLAG_OVERFLOW 时发射。
4.20 Event Interrupt Modes(cxlmem.h:213-217)
c
enum cxl_event_int_mode {
CXL_INT_NONE = 0x00,
CXL_INT_MSI_MSIX = 0x01,
CXL_INT_FW = 0x02
};
cxl_event_config_msgnums() (pci.c:677) 硬设 4 个严重性 → CXL_INT_MSI_MSIX。
4.21 PMEM Security State Flags(cxlmem.h:819-824)
| 符号 | 值 | 含义 |
|---|---|---|
CXL_PMEM_SEC_STATE_USER_PASS_SET |
0x01 |
--- |
CXL_PMEM_SEC_STATE_MASTER_PASS_SET |
0x02 |
--- |
CXL_PMEM_SEC_STATE_LOCKED |
0x04 |
--- |
CXL_PMEM_SEC_STATE_FROZEN |
0x08 |
--- |
CXL_PMEM_SEC_STATE_USER_PLIMIT |
0x10 |
--- |
CXL_PMEM_SEC_STATE_MASTER_PLIMIT |
0x20 |
--- |
4.22 DVSEC 标识符(cxlpci.h:15-56)
| ID | 符号 | 规范 |
|---|---|---|
0x1E98 |
PCI_DVSEC_VENDOR_ID_CXL |
CXL 2.0 §8.1 |
| 0 | CXL_DVSEC_PCIE_DEVICE |
2.0 §8.1.3 |
| 2 | CXL_DVSEC_FUNCTION_MAP |
2.0 §8.1.4 |
| 3 | CXL_DVSEC_PORT_EXTENSIONS |
2.0 §8.1.5 |
| 4 | CXL_DVSEC_PORT_GPF |
2.0 §8.1.6 |
| 5 | CXL_DVSEC_DEVICE_GPF |
2.0 §8.1.7 |
| 7 | CXL_DVSEC_PCIE_FLEXBUS_PORT |
2.0 §8.1.8 |
| 8 | CXL_DVSEC_REG_LOCATOR |
2.0 §8.1.9 |
Device DVSEC 控制位:CXL_DVSEC_MEM_CAPABLE=BIT(2), CXL_DVSEC_HDM_COUNT_MASK=GENMASK(5,4), CXL_DVSEC_MEM_ENABLE=BIT(2), CXL_DVSEC_MEM_INFO_VALID=BIT(0), CXL_DVSEC_MEM_ACTIVE=BIT(1)
4.23 RAS 寄存器偏移和掩码(cxl.h:129-145)
| 偏移 | 寄存器 | 掩码 |
|---|---|---|
| 0x0 | CXL_RAS_UNCORRECTABLE_STATUS_OFFSET |
`GENMASK(16,14) |
| 0x4 | CXL_RAS_UNCORRECTABLE_MASK_OFFSET |
`GENMASK(16,14) |
| 0x8 | CXL_RAS_UNCORRECTABLE_SEVERITY_OFFSET |
--- |
| 0xC | CXL_RAS_CORRECTABLE_STATUS_OFFSET |
GENMASK(6,0) |
| 0x10 | CXL_RAS_CORRECTABLE_MASK_OFFSET |
--- |
| 0x14 | CXL_RAS_CAP_CONTROL_OFFSET |
GENMASK(5,0) (FE pointer) |
| 0x18 | CXL_RAS_HEADER_LOG_OFFSET |
--- |
| --- | CXL_RAS_CAPABILITY_LENGTH |
0x58 |
| --- | CXL_HEADERLOG_SIZE |
SZ_512 |
| --- | CXL_HEADERLOG_SIZE_U32 |
SZ_512 / sizeof(u32) |
4.24 Misc
| 名称 | 值 | 位置 |
|---|---|---|
CXL_EVENT_RECORD_DATA_LENGTH |
0x50 |
cxlmem.h:594 |
CXL_EVENT_GEN_MED_COMP_ID_SIZE |
0x10 |
cxlmem.h:645 |
CXL_EVENT_DER_CORRECTION_MASK_SIZE |
0x20 |
cxlmem.h:664 |
CXL_CLEAR_EVENT_MAX_HANDLES |
U8_MAX |
cxlmem.h:639 |
CXL_FW_TRANSFER_ALIGNMENT |
128 | cxlmem.h:323 |
重要 :v6.6.0 内核没有 CXL_1_1 / CXL_2_0 / CXL_3_0 版本宏 --- 硬编码 3.0。
5. extlog(Extended Log)
5.1 extlog_mem_event trace event 字段
include/ras/ras_event.h:27-77,触发:drivers/acpi/acpi_extlog.c:178
| 字段 | 类型 | 含义 |
|---|---|---|
err_seq |
u32 | MCE extlog 错误序号 |
etype |
u8 | CPER 内存 error type,或 ~0(无效) |
sev |
u8 | CPER 严重性 |
pa |
u64 | 错误物理地址,或 ~0ull(无效) |
pa_mask_lsb |
u8 | __ffs64(pa_mask),或 ~0 |
fru_id |
guid_t (16 字节) | FRU GUID |
fru_text |
string (≤20 字符) | FRU 文本 |
data |
cper_mem_err_compact |
压缩的 CPER 内存错误字段 |
6. CPER(Common Platform Error Record)
6.1 cper_severity 枚举
include/linux/cper.h:38-43
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | CPER_SEV_RECOVERABLE |
可恢复 |
| 1 | CPER_SEV_FATAL |
致命 |
| 2 | CPER_SEV_CORRECTED |
已纠正 |
| 3 | CPER_SEV_INFORMATIONAL |
信息性 |
cper_severity_str() 映射(drivers/firmware/efi/cper.c:58-69):
RECOVERABLE→ "recoverable"FATAL→ "fatal"CORRECTED→ "corrected"INFORMATIONAL→ "info"- 其他 → "unknown"
6.2 CPER 内存 error type 字符串
drivers/firmware/efi/cper.c:189-213(mem_err_type_strs[])
| Index | 字符串 | 含义 | 影响 |
|---|---|---|---|
| 0 | "unknown" | Unknown | 不定 |
| 1 | "no error" | Spurious | 无 |
| 2 | "single-bit ECC" | CE 单 bit | 已纠正 |
| 3 | "multi-bit ECC" | UE 多 bit | 页下毒 |
| 4 | "single-symbol chipkill ECC" | 单符号 chipkill | 已纠正 |
| 5 | "multi-symbol chipkill ECC" | 多符号 chipkill 失败 | UE |
| 6 | "master abort" | Bus master abort | 事务中止 |
| 7 | "target abort" | Bus target abort | 事务中止 |
| 8 | "parity error" | Bus parity | 完整性破坏 |
| 9 | "watchdog timeout" | Device watchdog | 事务停滞 |
| 10 | "invalid address" | 非法地址 | UE |
| 11 | "mirror Broken" | 镜像损坏 | 镜像禁用 |
| 12 | "memory sparing" | 备用 rank 激活 | 已纠正 |
| 13 | "scrub corrected error" | 巡检纠错 | 已纠正 |
| 14 | "scrub uncorrected error" | 巡检发现 UE | 页下毒 |
| 15 | "physical memory map-out event" | DIMM map-out | 设备移除 |
6.3 CPER 内存 validation bits
include/linux/cper.h:215-244
| 位 | 名称 | 字段 |
|---|---|---|
| 0x0001 | CPER_MEM_VALID_ERROR_STATUS |
error_status |
| 0x0002 | CPER_MEM_VALID_PA |
physical_addr |
| 0x0004 | CPER_MEM_VALID_PA_MASK |
physical_addr_mask |
| 0x0008 | CPER_MEM_VALID_NODE |
node |
| 0x0010 | CPER_MEM_VALID_CARD |
card |
| 0x0020 | CPER_MEM_VALID_MODULE |
module |
| 0x0040 | CPER_MEM_VALID_BANK |
bank |
| 0x0080 | CPER_MEM_VALID_DEVICE |
device |
| 0x0100 | CPER_MEM_VALID_ROW |
row |
| 0x0200 | CPER_MEM_VALID_COLUMN |
column |
| 0x0400 | CPER_MEM_VALID_BIT_POSITION |
bit_pos |
| 0x0800 | CPER_MEM_VALID_REQUESTOR_ID |
requestor_id |
| 0x1000 | CPER_MEM_VALID_RESPONDER_ID |
responder_id |
| 0x2000 | CPER_MEM_VALID_TARGET_ID |
target_id |
| 0x4000 | CPER_MEM_VALID_ERROR_TYPE |
error_type |
| 0x8000 | CPER_MEM_VALID_RANK_NUMBER |
rank |
| 0x10000 | CPER_MEM_VALID_CARD_HANDLE |
mem_array_handle |
| 0x20000 | CPER_MEM_VALID_MODULE_HANDLE |
mem_dev_handle |
| 0x40000 | CPER_MEM_VALID_ROW_EXT |
Extended row |
| 0x80000 | CPER_MEM_VALID_BANK_GROUP |
Bank group |
| 0x100000 | CPER_MEM_VALID_BANK_ADDRESS |
Bank address |
| 0x200000 | CPER_MEM_VALID_CHIP_ID |
Chip ID |
掩码/位移:
CPER_MEM_EXT_ROW_MASK = 0x3,CPER_MEM_EXT_ROW_SHIFT = 16CPER_MEM_BANK_ADDRESS_MASK = 0xffCPER_MEM_BANK_GROUP_SHIFT = 8CPER_MEM_CHIP_ID_SHIFT = 5
6.4 CPER Section Type GUIDs
include/linux/cper.h:154-200
| GUID | Section Type | 厂商 |
|---|---|---|
9876CCAD-47B4-4bdb-B65E-16F193C4F3DB |
CPER_SEC_PROC_GENERIC |
通用处理器 |
DC3EA0B0-A144-4797-B95B-53FA242B6E1D |
CPER_SEC_PROC_IA |
Intel x86/x64 |
E429FAF1-3CB7-11D4-0BCA-070080C73C88 |
CPER_SEC_PROC_IPF |
Itanium |
E19E3D16-BC11-11E4-9CAAC2051D5D46B0 |
CPER_SEC_PROC_ARM |
ARM |
A5BC1114-6F64-4EDE-B863-3E83ED7C83B1 |
CPER_SEC_PLATFORM_MEM |
Platform memory |
D995E954-BBC1-430F-AD91-B44DCB3C6F35 |
CPER_SEC_PCIE |
PCIe |
81212A96-09ED-4996-94718D729C8E69ED |
CPER_SEC_FW_ERR_REC_REF |
Firmware error record ref |
C5753963-3B84-4095-BF78-EDDAD3F9C9DD |
CPER_SEC_PCI_X_BUS |
PCI/PCI-X bus |
EB5E4685-CA66-4769-B6A2-26068B001326 |
CPER_SEC_PCI_DEV |
PCI component/device |
5B51FEF7-C79D-4434-8F1B-AA62DE3E2C64 |
CPER_SEC_DMAR_GENERIC |
Generic DMAr |
71761D37-32B2-45cd-A7D0-B0FEDD93E8CF |
CPER_SEC_DMAR_VT |
Intel VT-d DMAr |
036F84E1-7F37-428c-A79E-575FDFAA84EC |
CPER_SEC_DMAR_IOMMU |
IOMMU DMAr |
6.5 CPER Section Flags
include/linux/cper.h:123-146
| 标志 | 值 | 含义 |
|---|---|---|
CPER_SEC_VALID_FRU_ID |
0x1 |
--- |
CPER_SEC_VALID_FRU_TEXT |
0x2 |
--- |
CPER_SEC_PRIMARY |
0x0001 |
直接关联错误 |
CPER_SEC_CONTAINMENT_WARNING |
0x0002 |
可能已传播 |
CPER_SEC_RESET |
0x0004 |
组件需重新初始化 |
CPER_SEC_ERROR_THRESHOLD_EXCEEDED |
0x0008 |
错误阈值 |
CPER_SEC_RESOURCE_NOT_ACCESSIBLE |
0x0010 |
查询冲突 |
CPER_SEC_LATENT_ERROR |
0x0020 |
错误已包含但未纠正 |
CPER_SEC_REV |
0x0100 |
--- |
6.6 CPER Record Flags
include/linux/cper.h:97-101
| 标志 | 值 | 含义 |
|---|---|---|
CPER_HW_ERROR_FLAGS_RECOVERED |
0x1 |
错误已恢复 |
CPER_HW_ERROR_FLAGS_PREVERR |
0x2 |
来自上 boot |
CPER_HW_ERROR_FLAGS_SIMULATED |
0x4 |
测试注入 |
6.7 CPER Processor Validation Bits
include/linux/cper.h:201-213
| 位 | 名称 | 字段 |
|---|---|---|
| 0x0001 | CPER_PROC_VALID_TYPE |
proc_type |
| 0x0002 | CPER_PROC_VALID_ISA |
proc_isa |
| 0x0004 | CPER_PROC_VALID_ERROR_TYPE |
proc_error_type |
| 0x0008 | CPER_PROC_VALID_OPERATION |
--- |
| 0x0010 | CPER_PROC_VALID_FLAGS |
--- |
| 0x0020 | CPER_PROC_VALID_LEVEL |
--- |
| 0x0040 | CPER_PROC_VALID_VERSION |
--- |
| 0x0080 | CPER_PROC_VALID_BRAND_INFO |
--- |
| 0x0100 | CPER_PROC_VALID_ID |
--- |
| 0x0200 | CPER_PROC_VALID_TARGET_ADDRESS |
--- |
| 0x0400 | CPER_PROC_VALID_REQUESTOR_ID |
--- |
| 0x0800 | CPER_PROC_VALID_RESPONDER_ID |
--- |
| 0x1000 | CPER_PROC_VALID_IP |
--- |
6.8 CPER PCIe Validation Bits
include/linux/cper.h:246-255
| 位 | 名称 | 字段 |
|---|---|---|
| 0x1 | CPER_PCIE_VALID_PORT_TYPE |
--- |
| 0x2 | CPER_PCIE_VALID_VERSION |
--- |
| 0x4 | CPER_PCIE_VALID_COMMAND_STATUS |
--- |
| 0x8 | CPER_PCIE_VALID_DEVICE_ID |
--- |
| 0x10 | CPER_PCIE_VALID_SERIAL_NUMBER |
--- |
| 0x20 | CPER_PCIE_VALID_BRIDGE_CONTROL_STATUS |
--- |
| 0x40 | CPER_PCIE_VALID_CAPABILITY |
--- |
| 0x80 | CPER_PCIE_VALID_AER_INFO |
aer_info[] populated |
CPER_PCIE_SLOT_SHIFT = 3
6.9 CPER ARM Error Types
include/linux/cper.h:273-315
| 值 | 名称 |
|---|---|
| 0 | CPER_ARM_CACHE_ERROR |
| 1 | CPER_ARM_TLB_ERROR |
| 2 | CPER_ARM_BUS_ERROR |
| 3 | CPER_ARM_VENDOR_ERROR (= CPER_ARM_MAX_TYPE) |
ARM validation bits 和 err_info 字段位移定义在 cper.h:257-315(CPER_ARM_ERR_TRANSACTION_SHIFT=16, OPERATION_SHIFT=18 等)。
6.10 CPER MCE creator / section UUIDs
arch/x86/kernel/cpu/mce/apei.c:127-132
| 名称 | UUID |
|---|---|
CPER_CREATOR_MCE |
75a574e3-5052-4b29-8a8e-be2c6490b89d |
CPER_SECTION_TYPE_MCE |
fe08ffbe-95e4-4be7-bc73-4096044a38fc |
apei_write_mce() (apei.c:144-174) 写 ERST 用 CPER_HW_ERROR_FLAGS_PREVERR | CPER_SEC_PRIMARY | CPER_SEV_FATAL。
6.11 CPER Notification Type GUIDs
include/linux/cper.h:60-91
| 名称 | 含义 |
|---|---|
CPER_NOTIFY_CMC |
Corrected Machine Check |
CPER_NOTIFY_CPE |
Corrected Platform Error |
CPER_NOTIFY_MCE |
Machine Check Exception |
CPER_NOTIFY_PCIE |
PCI Express Error |
CPER_NOTIFY_INIT |
INIT Record(IPF) |
CPER_NOTIFY_NMI |
Non-Maskable Interrupt |
CPER_NOTIFY_BOOT |
BOOT Error Record |
CPER_NOTIFY_DMAR |
DMA Remapping Error |
7. APEI / GHES
7.1 ghes_severity 枚举
include/acpi/ghes.h:51-56
| 值 | 名称 | 含义 | Mapped to MCE.status |
|---|---|---|---|
| 0x0 | GHES_SEV_NO |
无 / 未知 | --- |
| 0x1 | GHES_SEV_CORRECTED |
已纠正 | 无 MCI_STATUS_UC |
| 0x2 | GHES_SEV_RECOVERABLE |
可恢复 | 设 MCI_STATUS_UC(apei.c:53-54) |
| 0x3 | GHES_SEV_PANIC |
致命 / panic | 设 `MCI_STATUS_UC |
GHES_EXITING = 0x0002(ghes.h:16)--- ghes->flags 标记系统退出
CPER → GHES 映射 (ghes.c:291-302):
CPER_SEV_INFORMATIONAL→GHES_SEV_NOCPER_SEV_CORRECTED→GHES_SEV_CORRECTEDCPER_SEV_RECOVERABLE→GHES_SEV_RECOVERABLECPER_SEV_FATAL→GHES_SEV_PANIC
7.2 APEI → MCE 桥
apei_mce_report_mem_error() (apei.c:29-64):
c
status = MCI_STATUS_VAL | MCI_STATUS_EN | MCI_STATUS_ADDRV | MCI_STATUS_MISCV | 0x9f
misc = (MCI_MISC_ADDR_PHYS << 6) | lsb
bank = -1 // synthetic
SMCA:apei_smca_report_x86_error() (apei.c:66-125) 提取 6 个 SMCA 寄存器(MCA_STATUS, MCA_ADDR, MCA_MISC, MCA_CONFIG, MCA_IPID, MCA_SYND)
7.3 APEI HEST Source Types
include/acpi/actbl1.h:1406-1419
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | ACPI_HEST_TYPE_IA32_CHECK |
IA-32 MCE 源 |
| 1 | ACPI_HEST_TYPE_IA32_CORRECTED_CHECK |
IA-32 CMCI |
| 2 | ACPI_HEST_TYPE_IA32_NMI |
IA-32 NMI |
| 6 | ACPI_HEST_TYPE_AER_ROOT_PORT |
PCIe AER root port |
| 7 | ACPI_HEST_TYPE_AER_ENDPOINT |
PCIe AER endpoint |
| 8 | ACPI_HEST_TYPE_AER_BRIDGE |
PCIe AER bridge |
| 9 | ACPI_HEST_TYPE_GENERIC_ERROR |
GHES |
| 10 | ACPI_HEST_TYPE_GENERIC_ERROR_V2 |
GHES v2(read_ack 寄存器) |
| 11 | ACPI_HEST_TYPE_IA32_DEFERRED_CHECK |
IA-32 延迟 MCE |
7.4 APEI HEST Notification Types
include/acpi/actbl1.h:1491-1505
| 值 | 名称 |
|---|---|
| 0 | ACPI_HEST_NOTIFY_POLLED |
| 1 | ACPI_HEST_NOTIFY_EXTERNAL |
| 2 | ACPI_HEST_NOTIFY_LOCAL |
| 3 | ACPI_HEST_NOTIFY_SCI |
| 4 | ACPI_HEST_NOTIFY_NMI |
| 5 | ACPI_HEST_NOTIFY_CMCI(ACPI 5.0) |
| 6 | ACPI_HEST_NOTIFY_MCE(ACPI 5.0) |
| 7 | ACPI_HEST_NOTIFY_GPIO(ACPI 6.0) |
| 8 | ACPI_HEST_NOTIFY_SEA(ACPI 6.1, ARM) |
| 9 | ACPI_HEST_NOTIFY_SEI(ACPI 6.1, ARM) |
| 10 | ACPI_HEST_NOTIFY_GSIV(ACPI 6.1) |
| 11 | ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED(ACPI 6.2) |
8. arm_event trace event
include/ras/ras_event.h:171-208,触发:drivers/ras/ras.c:24 log_arm_hw_error() ← ghes.c:507
| 字段 | 类型 | 含义 |
|---|---|---|
mpidr |
u64 | Multiprocessor Affinity Register |
midr |
u64 | Main ID Register |
running_state |
u32 | PSCI state (bit 0 set) |
psci_state |
u32 | PSCI state |
affinity |
u8 | 亲和性 level |
Validation bits(include/linux/cper.h:257-260):CPER_ARM_VALID_AFFINITY_LEVEL, CPER_ARM_VALID_MPIDR, CPER_ARM_VALID_RUNNING_STATE
9. non_standard_event trace event
include/ras/ras_event.h:219-253,触发:drivers/ras/ras.c:17 ← ghes.c:676
| 字段 | 类型 | 含义 |
|---|---|---|
sec_type[16] |
char 数组 | section type GUID raw bytes |
fru_id[16] |
char 数组 | FRU ID GUID |
fru_text |
string | FRU text |
sev |
u8 | CPER severity |
len |
u32 | raw data 长度 |
buf |
dynamic u8 | raw error data hex dump |
10. signal_generate trace event
include/trace/events/signal.h:50-80
| 字段 | 类型 | 含义 |
|---|---|---|
sig |
int | 信号号 |
errno |
int | siginfo si_errno |
code |
int | siginfo si_code |
comm[] |
char16 | 目标 task comm |
pid |
pid_t | 目标 PID |
group |
int | 1 = 进程组, 0 = 单进程 |
result |
int | TRACE_SIGNAL_* 结果 |
10.1 TRACE_SIGNAL_* 结果码
include/trace/events/signal.h:27-33
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | TRACE_SIGNAL_DELIVERED |
已投递 |
| 1 | TRACE_SIGNAL_IGNORED |
被忽略 |
| 2 | TRACE_SIGNAL_ALREADY_PENDING |
已 pending |
| 3 | TRACE_SIGNAL_OVERFLOW_FAIL |
sigqueue 溢出 |
| 4 | TRACE_SIGNAL_LOSE_INFO |
siginfo 丢失 |
10.2 SIGBUS codes (si_code 值)
include/uapi/asm-generic/siginfo.h:251-258
| 值 | 名称 | 含义 |
|---|---|---|
| 1 | BUS_ADRALN |
地址对齐无效 |
| 2 | BUS_ADRERR |
物理地址不存在 |
| 3 | BUS_OBJERR |
对象特定硬件错误 |
| 4 | BUS_MCEERR_AR |
MCE 硬件错误已消费(action required) |
| 5 | BUS_MCEERR_AO |
MCE 硬件错误已发现但未消费(action optional) |
11. devlink_health_report trace event
include/trace/events/devlink.h:81-107
| 字段 | 类型 | 含义 |
|---|---|---|
bus_name |
string | devlink 设备 bus name |
dev_name |
string | devlink 设备 name |
driver_name |
string | 驱动名 |
reporter_name |
string | health reporter 名 |
msg |
string | 消息字符串 |
11.1 devlink_health_reporter_state 枚举
include/net/devlink.h:714-717
| 值 | 名称 | 含义 |
|---|---|---|
| 0 | DEVLINK_HEALTH_REPORTER_STATE_HEALTHY |
健康 |
| 1 | DEVLINK_HEALTH_REPORTER_STATE_ERROR |
错误状态 |
(v6.6 没有 REPLAYING --- 后加)
12. block_rq_error trace event
include/trace/events/block.h:165-170(继承自 block_rq_completion class 行 105-135)
| 字段 | 类型 | 含义 |
|---|---|---|
dev |
dev_t | 块设备 (MAJOR,MINOR) |
sector |
sector_t | 起始 sector |
nr_sector |
u32 | 512-byte sectors 数 |
error |
int | blk_status_to_errno() 转换的 errno |
rwbs[] |
char | R/W/B/S 标志 |
cmd |
dynamic char | 命令字符串 |
12.1 blk_status_t 枚举(BLK_STS_*)
include/linux/blk_types.h:99-179
| 值 | 名称 | errno | 含义 |
|---|---|---|---|
| 0 | BLK_STS_OK |
0 | Success |
| 1 | BLK_STS_NOTSUPP |
-EOPNOTSUPP | op not supported |
| 2 | BLK_STS_TIMEOUT |
-ETIMEDOUT | timeout |
| 3 | BLK_STS_NOSPC |
-ENOSPC | critical space allocation |
| 4 | BLK_STS_TRANSPORT |
-ENOLINK | recoverable transport |
| 5 | BLK_STS_TARGET |
-EREMOTEIO | critical target |
| 6 | BLK_STS_RESV_CONFLICT |
-EBADE | reservation conflict |
| 7 | BLK_STS_MEDIUM |
-ENODATA | critical medium |
| 8 | BLK_STS_PROTECTION |
-EILSEQ | DIX/PIX protection |
| 9 | BLK_STS_RESOURCE |
-ENOMEM | kernel resource |
| 10 | BLK_STS_IOERR |
-EIO | generic I/O |
| 11 | BLK_STS_DM_REQUEUE |
-EREMCHG | DM internal retry |
| 12 | BLK_STS_AGAIN |
-EAGAIN | nonblocking retry |
| 13 | BLK_STS_DEV_RESOURCE |
-EBUSY | device-specific resource |
| 14 | BLK_STS_ZONE_RESOURCE |
- | zone resource |
| 15 | BLK_STS_ZONE_OPEN_RESOURCE |
-ETOOMANYREFS | too many open zones |
| 16 | BLK_STS_ZONE_ACTIVE_RESOURCE |
-EOVERFLOW | too many active zones |
| 17 | BLK_STS_OFFLINE |
-ENODEV | device offline |
| 18 | BLK_STS_DURATION_LIMIT |
-ETIME | command duration limit exceeded |
13. memory_failure_event trace event
include/ras/ras_event.h:399-423,触发:mm/memory-failure.c:1323
| 字段 | 类型 | 含义 |
|---|---|---|
pfn |
unsigned long | Page Frame Number |
type |
int | enum mf_action_page_type |
result |
int | enum mf_result |
13.1 MF_MSG_* 页面类型
include/linux/mm.h:3917-3938 + include/ras/ras_event.h:356-376
| 值 | 名称 | 字符串 |
|---|---|---|
| 0 | MF_MSG_KERNEL |
"reserved kernel page" |
| 1 | MF_MSG_KERNEL_HIGH_ORDER |
"high-order kernel page" |
| 2 | MF_MSG_SLAB |
"kernel slab page" |
| 3 | MF_MSG_DIFFERENT_COMPOUND |
"different compound page after locking" |
| 4 | MF_MSG_HUGE |
"huge page" |
| 5 | MF_MSG_FREE_HUGE |
"free huge page" |
| 6 | MF_MSG_UNMAP_FAILED |
"unmapping failed page" |
| 7 | MF_MSG_DIRTY_SWAPCACHE |
"dirty swapcache page" |
| 8 | MF_MSG_CLEAN_SWAPCACHE |
"clean swapcache page" |
| 9 | MF_MSG_DIRTY_MLOCKED_LRU |
"dirty mlocked LRU page" |
| 10 | MF_MSG_CLEAN_MLOCKED_LRU |
"clean mlocked LRU page" |
| 11 | MF_MSG_DIRTY_UNEVICTABLE_LRU |
"dirty unevictable LRU page" |
| 12 | MF_MSG_CLEAN_UNEVICTABLE_LRU |
"clean unevictable LRU page" |
| 13 | MF_MSG_DIRTY_LRU |
"dirty LRU page" |
| 14 | MF_MSG_CLEAN_LRU |
"clean LRU page" |
| 15 | MF_MSG_TRUNCATED_LRU |
"already truncated LRU page" |
| 16 | MF_MSG_BUDDY |
"free buddy page" |
| 17 | MF_MSG_DAX |
"dax page" |
| 18 | MF_MSG_UNSPLIT_THP |
"unsplit thp" |
| 19 | MF_MSG_UNKNOWN |
"unknown page" |
13.2 mf_action_result / enum mf_result
include/linux/mm.h:3910-3915
| 值 | 名称 | 字符串 | 含义 |
|---|---|---|---|
| 0 | MF_IGNORED |
"Ignored" | 无法处理 |
| 1 | MF_FAILED |
"Failed" | 处理失败 |
| 2 | MF_DELAYED |
"Delayed" | 稍后处理 |
| 3 | MF_RECOVERED |
"Recovered" | 已恢复 |
13.3 enum mf_flags
include/linux/mm.h:3826-3834
| 位 | 名称 | 含义 |
|---|---|---|
| 1<<0 | MF_COUNT_INCREASED |
refcount 已增加 |
| 1<<1 | MF_ACTION_REQUIRED |
需要动作 |
| 1<<2 | MF_MUST_KILL |
必须杀进程 |
| 1<<3 | MF_SOFT_OFFLINE |
软离线 |
| 1<<4 | MF_UNPOISON |
unpoison 请求 |
| 1<<5 | MF_SW_SIMULATED |
软件模拟注入 |
| 1<<6 | MF_NO_RETRY |
不重试 |
13.4 HWPOISON page flag
include/linux/page-flags.h:
PG_hwpoison(bit 129) --- "hardware poisoned page. Don't touch"__PG_HWPOISON掩码SetPageHWPoison(page)/ClearPageHWPoison(page)/PageHWPoison(page)--- flag opsSetPageHWPoisonTakenOff(page)/ClearPageHWPoisonTakenOff(page)--- 子页跟踪PageHasHWPoisoned(page)--- 复合页检测
13.5 hwpoison-inject 调试接口
mm/hwpoison-inject.c:
- 路径:
/sys/kernel/debug/hwpoison/ - 文件:
corrupt-pfn(调hwpoison_inject()withMF_SW_SIMULATED),unpoison-pfn - 过滤:
corrupt-filter-enable,corrupt-filter-dev-major/-minor,corrupt-filter-flags-mask/-value,corrupt-filter-memcg - 需要
CAP_SYS_ADMIN否则-EPERM;!pfn_valid→-ENXIO - 返回
-EOPNOTSUPP→ 0
14. ERST(APEI Error Record Serialization Table)
include/acpi/apei.h:13-51
ERST 存储原始 cper_record_header blobs(signature = "CPER")。ioctl 接口:
| 名称 | 值 | 含义 |
|---|---|---|
APEI_ERST_INVALID_RECORD_ID |
0xffffffffffffffffULL |
"无 record" sentinel |
APEI_ERST_CLEAR_RECORD |
_IOW('E', 1, u64) |
按 id 清记录 |
APEI_ERST_GET_RECORD_COUNT |
_IOR('E', 2, u32) |
总记录数 |
ERST 没有 "record type" 枚举 --- 格式由 cper_record_header.signature == "CPER" 决定。
15. pstore
include/linux/pstore.h:28-44 + fs/pstore/platform.c:44-54
15.1 enum pstore_type_id
| 值 | 名称 | 字符串 | 含义 |
|---|---|---|---|
| 0 | PSTORE_TYPE_DMESG |
"dmesg" | 内核 log 快照 |
| 1 | PSTORE_TYPE_MCE |
"mce" | MCE 记录 |
| 2 | PSTORE_TYPE_CONSOLE |
"console" | 控制台输出 |
| 3 | PSTORE_TYPE_FTRACE |
"ftrace" | ftrace 环形缓冲 |
| 4 | PSTORE_TYPE_PPC_RTAS |
"rtas" | PowerPC RTAS |
| 5 | PSTORE_TYPE_PPC_OF |
"powerpc-ofw" | PowerPC Open Firmware |
| 6 | PSTORE_TYPE_PPC_COMMON |
"powerpc-common" | PowerPC common |
| 7 | PSTORE_TYPE_PMSG |
"pmsg" | 用户态 pmsg |
| 8 | PSTORE_TYPE_PPC_OPAL |
"powerpc-opal" | PowerPC OPAL |
| 9 | PSTORE_TYPE_MAX |
sentinel | 列表结束 |
15.2 PSTORE_FLAGS_*(frontends,pstore.h:205-208)
| 标志 | 值 |
|---|---|
PSTORE_FLAGS_DMESG |
BIT(0) |
PSTORE_FLAGS_CONSOLE |
BIT(1) |
PSTORE_FLAGS_FTRACE |
BIT(2) |
PSTORE_FLAGS_PMSG |
BIT(3) |
16. 内核侧 → rasdaemon 侧 错误码对照
| 域 | 内核源 | 错误码数 | 在内核的根 |
|---|---|---|---|
| MCE | arch/x86/include/asm/mce.h |
~50 (bits + helpers) | MSR 0xc0002000+ |
| MCE Severity | arch/x86/kernel/cpu/mce/severity.c |
22 rules | 表驱动 |
| AER | include/uapi/linux/pci_regs.h |
8 CE + 16 UE bits | PCI config 0x04/0x10 |
| EDAC | include/linux/edac.h |
5 err_type + 4 层级 + 29 mem_type + 9 edac_type + 9 scrub + 3 op_state | 驱动实现 |
| CXL | drivers/cxl/core/trace.h + cxlmem.h |
15 UC + 7 CE + 16 mailbox + 30 RC + 3 mem_evt + 7 trans + 5 health + 10 media + 8 dev_status | 设备寄存器 |
| extlog | include/ras/ras_event.h |
16 err_type + 4 sev | ACPI 6456 接口 |
| CPER | include/linux/cper.h |
4 sev + 16 mem err_type + 22 mem valid + 12 section type | UEFI spec |
| APEI | include/acpi/ghes.h + actbl1.h |
4 sev + 12 HEST type + 12 HEST notify | ACPI 表 |
| ARM | include/ras/ras_event.h |
4 err type (CPER) | CPER PEI section |
| memory-failure | include/linux/mm.h |
20 MF_MSG + 4 MF result + 7 mf_flags | 内核 |
| hwpoison | include/linux/page-flags.h |
PG_hwpoison 1 bit |
内核 page flag |
| signal | include/trace/events/signal.h + uapi/asm-generic/siginfo.h |
5 result + 5 BUS code | 内核 |
| devlink | include/trace/events/devlink.h + include/net/devlink.h |
2 reporter_state | 内核 |
| block | include/linux/blk_types.h |
19 BLK_STS_* | 内核 |
| ERST | include/acpi/apei.h |
ioctl 3 | ACPI 表 |
| pstore | include/linux/pstore.h |
9 type + 4 flags | 内核 |
总计 :约 400+ 错误码 来自内核源码。
17. 关键文件索引
| 文件 | 行数 | 作用 |
|---|---|---|
arch/x86/include/asm/mce.h |
334 | MCE 状态位 / SMCA enum / MSR 地址 |
arch/x86/include/uapi/asm/mce.h |
43 | struct mce / ioctls |
arch/x86/kernel/cpu/mce/internal.h |
250+ | severity_level / vendor flags / mca_config |
arch/x86/kernel/cpu/mce/core.c |
2800+ | 主分发、severity 决策、CPUHP、cmdline |
arch/x86/kernel/cpu/mce/intel.c |
1000+ | CMCI 实现、Intel filter quirks |
arch/x86/kernel/cpu/mce/amd.c |
800+ | smca_hwid_mcatypes、threshold 处理 |
arch/x86/kernel/cpu/mce/severity.c |
400+ | Intel/AMD 严重性表 |
arch/x86/kernel/cpu/mce/inject.c |
800+ | mce-inject / injection_type |
arch/x86/kernel/cpu/mce/genpool.c |
150+ | MCE_POOLSZ / genpool |
arch/x86/kernel/cpu/mce/apei.c |
200+ | APEI/MCE 桥 |
arch/x86/kernel/cpu/mce/dev-mcelog.c |
380+ | /dev/mcelog |
arch/x86/kernel/cpu/mce/p5.c winchip.c |
100+ | 旧 MCE |
include/trace/events/mce.h |
70 | mce_record trace event |
include/linux/cper.h |
560+ | CPER 全部定义 |
include/acpi/ghes.h |
80+ | GHES_SEV_* / 桥接口 |
include/acpi/apei.h |
80+ | ERST ioctls |
include/acpi/actbl1.h |
1500+ | HEST 表 |
include/uapi/linux/pci_regs.h |
800+ | PCI_ERR_* 位 |
include/linux/aer.h |
50+ | AER severity / 头结构 |
drivers/pci/pcie/aer.c |
1400+ | AER ISR / 恢复 / 分类 |
drivers/pci/pcie/aer_inject.c |
600+ | AER 软件注入 |
drivers/pci/pcie/err.c |
280+ | pcie_do_recovery() |
include/linux/edac.h |
600+ | EDAC 全部 enum / 结构 |
drivers/edac/edac_mc.c |
1300+ | 主分发 |
drivers/edac/skx_common.c i10nm_base.c sb_edac.c |
各 1000-3500 | Intel 各代解码 |
drivers/edac/amd64_edac.c |
3500+ | AMD64 解码 |
drivers/cxl/core/trace.h |
700+ | 8 个 cxl trace events |
drivers/cxl/cxlmem.h |
830+ | mailbox / 事件 / poison |
drivers/cxl/cxl.h |
470+ | RAS 寄存器 / event log type |
drivers/cxl/cxlpci.h |
100+ | DVSEC / regloc type |
drivers/cxl/core/mbox.c |
1200+ | mailbox 分发 |
drivers/cxl/core/memdev.c |
800+ | memdev 驱动 |
drivers/cxl/pci.c |
800+ | CXL.io AER / event ISR |
include/uapi/linux/cxl_mem.h |
50+ | UAPI CXL 命令 |
include/ras/ras_event.h |
430+ | 全部 RAS trace events |
include/linux/mm.h |
4000+ | mf_result / mf_action_page_type / mf_flags |
mm/memory-failure.c |
1500+ | memory_failure / page 处理 |
mm/hwpoison-inject.c |
110+ | debugfs hwpoison 注入 |
include/linux/blk_types.h |
300+ | blk_status_t / REQ_* |
include/trace/events/signal.h |
80+ | signal_generate / TRACE_SIGNAL_* |
include/trace/events/devlink.h |
170+ | devlink_health_* trace events |
include/trace/events/block.h |
200+ | block_rq_error |
include/net/devlink.h |
1000+ | devlink 全部 |
include/linux/pstore.h |
300+ | pstore 全套 |
18. 调试与快速定位
| 问题 | 在哪查 |
|---|---|
| MCE 错误位定义 | arch/x86/include/asm/mce.h |
| MCE 严重性决策 | arch/x86/kernel/cpu/mce/severity.c |
| SMCA bank → HWID 映射 | arch/x86/kernel/cpu/mce/amd.c:160-219 |
| AER 错误位 | include/uapi/linux/pci_regs.h:748-802 |
| AER 严重性映射 | drivers/pci/pcie/aer.c:750-761 (cper_severity_to_aer) |
| EDAC 错误类型字符串 | edac_mc.c:121-136 (mc_event_error_type) |
| CXL 错误位 | drivers/cxl/core/trace.h:17-31 (UC) 81-87 (CE) |
| CXL 事件分发 | drivers/cxl/core/mbox.c:843-861 |
| CPER 内存 err_type 字符串 | drivers/firmware/efi/cper.c:189-213 |
| GHES 桥 | drivers/acpi/apei/ghes.c |
| signal si_code | include/uapi/asm-generic/siginfo.h:251-258 |
| blk_status errno | block/blk-core.c:151-178 (blk_status_to_errno) |
| memory_failure 字符串 | mm/memory-failure.c:870-897 |
| hwpoison 注入 | mm/hwpoison-inject.c |
| ERST ioctl | include/acpi/apei.h:13-51 |
| 测点 | /sys/kernel/debug/tracing/events/<system>/ |
19. 关键事实总结
- rasdaemon 的所有错误码都源于内核 --- 它是消费者,不是定义者
- CPER 规范是通用传输格式 --- 几乎所有硬件平台错误(PEI 段、mem 段、PCIe 段)都用 CPER
- APEI 是固件 → 内核的桥 --- 错误从固件通过 GHES / AER 通知进内核
- 错误严重性在内核决策 --- rasdaemon 看到的
error_type是内核已经分类过的 - 操作恢复由内核完成 --- rasdaemon 只观察;少量 EDAC PFA 写 sysfs 是例外
- SMCA 26 类 bank --- 通过
(HWID, MCATYPE)二元组路由 - CXL v6.6.0 没有 sparing 事件 --- 后加在更新内核
- CXL 内核宏用
CXL_RAS_UC_*/CXL_RAS_CE_*命名 --- 不是CXL_AER_UE_* - arm_event 仅解 PEI 段 --- 不解 SMMU/GIC/CCI/CCN 专用段
- hwpoison 是 page flag 而非 enum --- 配合 mf_action_page_type 字符串一起用