linux-kernel-fault-codes

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:17ghes.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_CTL2mce.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_S
  • MCI_UC_AR = MCI_STATUS_UC | MCI_STATUS_AR
  • MCI_UC_SAR = MCI_STATUS_UC | MCI_STATUS_S | MCI_STATUS_AR
  • MCI_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 == 3
  • IN_KERNEL --- 无 RIPV
  • IN_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-334enum 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 = 0xFFFF0000
  • MCI_IPID_HWID = 0xFFF
  • MCI_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-61enum 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) & 3
  • MCJ_CTX_RANDOM = 0(默认)
  • MCJ_CTX_PROCESS = 1(进程上下文)
  • MCJ_CTX_IRQ = 2(IRQ 上下文)
  • MCJ_NMI_BROADCAST = 0x4
  • MCJ_EXCEPTION = 0x8
  • MCJ_IRQ_BROADCAST = 0x10

Debugfs 文件(inject.c:696-710):statusmiscaddrsyndipidbankflagscpuREADME

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.hX86_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 字段

  • 0x1f PCI_ERR_CAP_FEP(x) --- First Error Pointer(5-bit)
  • 0x20 PCI_ERR_CAP_ECRC_GENC --- ECRC Generation Capable
  • 0x40 PCI_ERR_CAP_ECRC_GENE --- ECRC Generation Enable
  • 0x80 PCI_ERR_CAP_ECRC_CHKC --- ECRC Check Capable
  • 0x100 PCI_ERR_CAP_ECRC_CHKE --- ECRC Check Enable

PCI_ERR_ROOT_COMMAND

  • 0x01 PCI_ERR_ROOT_CMD_COR_EN
  • 0x02 PCI_ERR_ROOT_CMD_NONFATAL_EN
  • 0x04 PCI_ERR_ROOT_CMD_FATAL_EN

PCI_ERR_ROOT_STATUS

  • 0x01 PCI_ERR_ROOT_COR_RCV
  • 0x02 PCI_ERR_ROOT_MULTI_COR_RCV
  • 0x04 PCI_ERR_ROOT_UNCOR_RCV
  • 0x08 PCI_ERR_ROOT_MULTI_UNCOR_RCV
  • 0x10 PCI_ERR_ROOT_FIRST_FATAL
  • 0x20 PCI_ERR_ROOT_NONFATAL_RCV
  • 0x40 PCI_ERR_ROOT_FATAL_RCV
  • 0xf8000000 PCI_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_RCVaer.c:104-107

PCI_ERR_ROOT_ERR_SRC 解码aer.c:101-102):

  • ERR_COR_ID(d) = d & 0xffff
  • ERR_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=16aer.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_RECOVERABLEAER_NONFATAL
  • CPER_SEV_FATALAER_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-312SCRUB_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_DIMMSMTR[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_ENABLEF10_NB_ARRAY_DRAM(注入)
X-Gene drivers/edac/xgene_edac.c MCU_MAX_RANK=8, MCU_RANK_STRIDE=0x40MCUGECR=0x0110MCU_GECR_DEMANDUCINTREN_MASK=BIT(0) 等);MCUGESR=0x0114MCU_GESR_ADDRNOMATCH_ERR_MASK=BIT(7) 等);MCUESRR0=0x0314MCU_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-87CXL_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-626cxl.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_SPARINGQUERY_RESOURCESDEVICE_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_FATALCXLMDEV_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-213mem_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 = 0x3CPER_MEM_EXT_ROW_SHIFT = 16
  • CPER_MEM_BANK_ADDRESS_MASK = 0xff
  • CPER_MEM_BANK_GROUP_SHIFT = 8
  • CPER_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-315CPER_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_UCapei.c:53-54
0x3 GHES_SEV_PANIC 致命 / panic 设 `MCI_STATUS_UC

GHES_EXITING = 0x0002ghes.h:16)--- ghes->flags 标记系统退出

CPER → GHES 映射ghes.c:291-302):

  • CPER_SEV_INFORMATIONALGHES_SEV_NO
  • CPER_SEV_CORRECTEDGHES_SEV_CORRECTED
  • CPER_SEV_RECOVERABLEGHES_SEV_RECOVERABLE
  • CPER_SEV_FATALGHES_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:17ghes.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)

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 消息字符串

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 ops
  • SetPageHWPoisonTakenOff(page) / ClearPageHWPoisonTakenOff(page) --- 子页跟踪
  • PageHasHWPoisoned(page) --- 复合页检测

13.5 hwpoison-inject 调试接口

mm/hwpoison-inject.c

  • 路径:/sys/kernel/debug/hwpoison/
  • 文件:corrupt-pfn(调 hwpoison_inject() with MF_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. 关键事实总结

  1. rasdaemon 的所有错误码都源于内核 --- 它是消费者,不是定义者
  2. CPER 规范是通用传输格式 --- 几乎所有硬件平台错误(PEI 段、mem 段、PCIe 段)都用 CPER
  3. APEI 是固件 → 内核的桥 --- 错误从固件通过 GHES / AER 通知进内核
  4. 错误严重性在内核决策 --- rasdaemon 看到的 error_type 是内核已经分类过的
  5. 操作恢复由内核完成 --- rasdaemon 只观察;少量 EDAC PFA 写 sysfs 是例外
  6. SMCA 26 类 bank --- 通过 (HWID, MCATYPE) 二元组路由
  7. CXL v6.6.0 没有 sparing 事件 --- 后加在更新内核
  8. CXL 内核宏用 CXL_RAS_UC_*/CXL_RAS_CE_* 命名 --- 不是 CXL_AER_UE_*
  9. arm_event 仅解 PEI 段 --- 不解 SMMU/GIC/CCI/CCN 专用段
  10. hwpoison 是 page flag 而非 enum --- 配合 mf_action_page_type 字符串一起用
相关推荐
运维行者_1 小时前
通过Applications Manager的TCP监控确保无缝网络连接
运维·服务器·网络·数据库·人工智能
路人蛃1 小时前
【深入理解计算机系统】第二章第一节(信息存储)笔记
服务器·网络·笔记·计算机网络·系统架构
xiaoye-duck1 小时前
《Linux系统编程》Linux 进程间通信之 System V 共享内存:IPC 底层原理与实战
linux
一勺菠萝丶1 小时前
Linux 服务器临时用户创建与删除教程
linux·运维·服务器
lunzi_08261 小时前
《图解HTTP》--第5章-与HTTP协作的Web服务器
服务器·前端·http
曲幽1 小时前
你的FastAPI又在服务器上“跑不起来”了?来,今天咱把打包这件事彻底聊透
linux·windows·python·docker·fastapi·web·pyinstaller·nssm·services
2023自学中1 小时前
imx6ull 开发板,RTMP 推流本地视频 到虚拟机
linux·音视频·嵌入式·开发板
YOLO数据集集合2 小时前
YOLOv11+DeepSeek多技术融合电网缺陷巡检平台|绝缘子破损瓷瓶故障AI识别、前后端一体化电力运维管理系统落地开发
运维·人工智能·yolo
_可乐无糖2 小时前
踩完坑之后的总结:Windows安装docker
运维·windows·docker·容器