← Documents Documentation/firmware-guide/acpi/apei/output_format.rst GitHub 원문 ↗

Linux 6.18.37 · Firmware

APEI output format

APEI printk record의 processor·memory·PCIe·AER grammar 전문 번역입니다.

Source pathDocumentation/firmware-guide/acpi/apei/output_format.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

output_format.rst:1-150

APEI printk record는 전체 severity 아래 여러 section을 두고 각 section의 flags·FRU·type과 processor·memory·PCIe payload를 출력한다. 대괄호 field는 optional이므로 line 위치가 아니라 field name과 section context로 parse해야 한다.

별표 표기는 ordered enum index, 샵 표기는 bitmask의 set bit 목록이다. PCIe AER status는 section severity에 따라 uncorrectable 또는 correctable mapping을 선택해야 한다.

상세 field semantics는 UEFI CPER Appendix N이 기준이며, log의 raw integer와 unknown label을 모두 보존해야 새 firmware value에도 parser가 견고하게 동작한다.

APEI log 해석 요약
Record·section 경계 식별Severity·flags·FRU 읽기Section type 선택Optional type-specific field parseEnum index·bitmask label decodeUEFI CPER 정의와 raw value 대조

Record 경계에서 CPER field 의미까지 내려가는 순서다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. SPDX-License-Identifier: GPL-2.0
2
3 ==================
4 APEI output format
5 ==================
6
7 APEI uses printk as hardware error reporting interface, the output
8 format is as follow::
9
10 <error record> :=
11 APEI generic hardware error status
12 severity: <integer>, <severity string>
13 section: <integer>, severity: <integer>, <severity string>
14 flags: <integer>
15 <section flags strings>
16 fru_id: <uuid string>
17 fru_text: <string>
18 section_type: <section type string>
19 <section data>
20
21 <severity string>* := recoverable | fatal | corrected | info
22
23 <section flags strings># :=
24 [primary][, containment warning][, reset][, threshold exceeded]\
25 [, resource not accessible][, latent error]
26
27 <section type string> := generic processor error | memory error | \
28 PCIe error | unknown, <uuid string>
29
30 <section data> :=
31 <generic processor section data> | <memory section data> | \
32 <pcie section data> | <null>
33
34 <generic processor section data> :=
35 [processor_type: <integer>, <proc type string>]
36 [processor_isa: <integer>, <proc isa string>]
37 [error_type: <integer>
38 <proc error type strings>]
39 [operation: <integer>, <proc operation string>]
40 [flags: <integer>
41 <proc flags strings>]
42 [level: <integer>]
43 [version_info: <integer>]
44 [processor_id: <integer>]
45 [target_address: <integer>]
46 [requestor_id: <integer>]
47 [responder_id: <integer>]
48 [IP: <integer>]
49
50 <proc type string>* := IA32/X64 | IA64
51
52 <proc isa string>* := IA32 | IA64 | X64
53
54 <processor error type strings># :=
55 [cache error][, TLB error][, bus error][, micro-architectural error]
56
57 <proc operation string>* := unknown or generic | data read | data write | \
58 instruction execution
59
60 <proc flags strings># :=
61 [restartable][, precise IP][, overflow][, corrected]
62
63 <memory section data> :=
64 [error_status: <integer>]
65 [physical_address: <integer>]
66 [physical_address_mask: <integer>]
67 [node: <integer>]
68 [card: <integer>]
69 [module: <integer>]
70 [bank: <integer>]
71 [device: <integer>]
72 [row: <integer>]
73 [column: <integer>]
74 [bit_position: <integer>]
75 [requestor_id: <integer>]
76 [responder_id: <integer>]
77 [target_id: <integer>]
78 [error_type: <integer>, <mem error type string>]
79
80 <mem error type string>* :=
81 unknown | no error | single-bit ECC | multi-bit ECC | \
82 single-symbol chipkill ECC | multi-symbol chipkill ECC | master abort | \
83 target abort | parity error | watchdog timeout | invalid address | \
84 mirror Broken | memory sparing | scrub corrected error | \
85 scrub uncorrected error
86
87 <pcie section data> :=
88 [port_type: <integer>, <pcie port type string>]
89 [version: <integer>.<integer>]
90 [command: <integer>, status: <integer>]
91 [device_id: <integer>:<integer>:<integer>.<integer>
92 slot: <integer>
93 secondary_bus: <integer>
94 vendor_id: <integer>, device_id: <integer>
95 class_code: <integer>]
96 [serial number: <integer>, <integer>]
97 [bridge: secondary_status: <integer>, control: <integer>]
98 [aer_status: <integer>, aer_mask: <integer>
99 <aer status string>
100 [aer_uncor_severity: <integer>]
101 aer_layer=<aer layer string>, aer_agent=<aer agent string>
102 aer_tlp_header: <integer> <integer> <integer> <integer>]
103
104 <pcie port type string>* := PCIe end point | legacy PCI end point | \
105 unknown | unknown | root port | upstream switch port | \
106 downstream switch port | PCIe to PCI/PCI-X bridge | \
107 PCI/PCI-X to PCIe bridge | root complex integrated endpoint device | \
108 root complex event collector
109
110 if section severity is fatal or recoverable
111 <aer status string># :=
112 unknown | unknown | unknown | unknown | Data Link Protocol | \
113 unknown | unknown | unknown | unknown | unknown | unknown | unknown | \
114 Poisoned TLP | Flow Control Protocol | Completion Timeout | \
115 Completer Abort | Unexpected Completion | Receiver Overflow | \
116 Malformed TLP | ECRC | Unsupported Request
117 else
118 <aer status string># :=
119 Receiver Error | unknown | unknown | unknown | unknown | unknown | \
120 Bad TLP | Bad DLLP | RELAY_NUM Rollover | unknown | unknown | unknown | \
121 Replay Timer Timeout | Advisory Non-Fatal
122 fi
123
124 <aer layer string> :=
125 Physical Layer | Data Link Layer | Transaction Layer
126
127 <aer agent string> :=
128 Receiver ID | Requester ID | Completer ID | Transmitter ID
129
130 Where, [] designate corresponding content is optional
131
132 All <field string> description with * has the following format::
133
134 field: <integer>, <field string>
135
136 Where value of <integer> should be the position of "string" in <field
137 string> description. Otherwise, <field string> will be "unknown".
138
139 All <field strings> description with # has the following format::
140
141 field: <integer>
142 <field strings>
143
144 Where each string in <fields strings> corresponding to one set bit of
145 <integer>. The bit position is the position of "string" in <field
146 strings> description.
147
148 For more detailed explanation of every field, please refer to UEFI
149 specification version 2.3 or later, section Appendix N: Common
150 Platform Error Record.
151

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

APEI printk record envelope

1-28

APEI는 hardware error reporting interface로 `printk`를 사용한다. 하나의 generic hardware error record는 전체 severity와 하나 이상의 section으로 구성되며, 각 section에는 독립 severity·flags·FRU 식별자·section type·type별 data가 들어간다.

Record 첫 줄은 `APEI generic hardware error status`이고, 다음 줄의 `severity`는 integer와 문자열을 함께 표시한다. 이어지는 `section: <integer>`는 section 번호이며 그 section의 severity를 별도로 기록한다.

Section flags는 bitmask와 설정된 bit의 문자열 목록으로 출력된다. 가능한 의미는 primary, containment warning, reset, threshold exceeded, resource not accessible, latent error다. `fru_id`는 UUID, `fru_text`는 사람이 읽는 문자열이다.

Section type은 generic processor error, memory error, PCIe error 또는 `unknown, <uuid string>` 중 하나다. Type을 알면 뒤의 section data를 processor·memory·PCIe grammar로 해석하고, 알 수 없거나 payload가 없으면 null로 처리한다.

APEI error record 계층
LevelField의미
Recordseverity전체 hardware error severity
SectionsectionRecord 안의 section 번호
Sectionseverity해당 section의 독립 severity
SectionflagsSection property bitmask
Sectionfru_id·fru_textField Replaceable Unit 식별 정보
Sectionsection_typePayload grammar 선택
Sectionsection dataProcessor·memory·PCIe type별 내용

전체 record와 section마다 출력되는 field의 순서와 역할이다.

공통 문자열 집합
분류가능한 문자열
Severityrecoverable | fatal | corrected | info
Section flagsprimary | containment warning | reset | threshold exceeded | resource not accessible | latent error
Section typegeneric processor error | memory error | PCIe error | unknown + UUID

Severity와 section flag가 integer를 사람이 읽는 label로 바꾸는 정의다.

APEI record parse
Generic hardware error status 시작 줄 확인Record severity 읽기Section 번호·severity·flags 읽기FRU ID·text와 section_type 확인Type에 맞는 processor·memory·PCIe grammar 선택Optional field와 enum·bitmask 문자열 해석

Text log를 record envelope에서 type-specific payload로 내려가며 해석한다.

.. SPDX-License-Identifier: GPL-2.0

==================
APEI output format
==================

APEI uses printk as hardware error reporting interface, the output
format is as follow::

        <error record> :=
        APEI generic hardware error status
        severity: <integer>, <severity string>
        section: <integer>, severity: <integer>, <severity string>
        flags: <integer>
        <section flags strings>
        fru_id: <uuid string>
        fru_text: <string>
        section_type: <section type string>
        <section data>

        <severity string>* := recoverable | fatal | corrected | info

        <section flags strings># :=
        [primary][, containment warning][, reset][, threshold exceeded]\
        [, resource not accessible][, latent error]

        <section type string> := generic processor error | memory error | \
        PCIe error | unknown, <uuid string>

Generic processor section

29-59

Generic processor section의 모든 대괄호 field는 optional이다. `processor_type`은 IA32/X64 또는 IA64 계열을, `processor_isa`는 IA32·IA64·X64 instruction set을 integer index와 문자열로 나타낸다.

`error_type`은 cache, TLB, bus, micro-architectural error를 bitmask와 여러 줄의 문자열로 표시한다. `operation`은 unknown or generic, data read, data write, instruction execution 중 하나다.

Processor `flags`는 restartable, precise IP, overflow, corrected bit를 나타낸다. 나머지 optional scalar는 level, version_info, processor_id, target_address, requestor_id, responder_id와 instruction pointer인 `IP`다.

Processor section field
Field값 형식의미
processor_typeinteger + proc type stringProcessor family
processor_isainteger + proc ISA stringInstruction set
error_typeinteger + bit stringsCache·TLB·bus·microarchitecture 오류
operationinteger + operation string오류 발생 operation
flagsinteger + bit stringsRestart·IP precision·overflow·correction 상태
levelintegerError level
version_infointegerProcessor version 정보
processor_idintegerProcessor 식별자
target_addressintegerTarget address
requestor_id·responder_idintegerTransaction endpoint 식별자
IPintegerInstruction pointer

Optional processor payload를 classification·identifier·address로 나눈다.

Processor enum·bitmask
Field문자열 순서
proc typeIA32/X64 | IA64
proc ISAIA32 | IA64 | X64
error type bitscache error | TLB error | bus error | micro-architectural error
operationunknown or generic | data read | data write | instruction execution
flags bitsrestartable | precise IP | overflow | corrected

Integer index 또는 설정 bit에 대응하는 문자열 집합이다.


        <section data> :=
        <generic processor section data> | <memory section data> | \
        <pcie section data> | <null>

        <generic processor section data> :=
        [processor_type: <integer>, <proc type string>]
        [processor_isa: <integer>, <proc isa string>]
        [error_type: <integer>
        <proc error type strings>]
        [operation: <integer>, <proc operation string>]
        [flags: <integer>
        <proc flags strings>]
        [level: <integer>]
        [version_info: <integer>]
        [processor_id: <integer>]
        [target_address: <integer>]
        [requestor_id: <integer>]
        [responder_id: <integer>]
        [IP: <integer>]

        <proc type string>* := IA32/X64 | IA64

        <proc isa string>* := IA32 | IA64 | X64

        <processor error type strings># :=
        [cache error][, TLB error][, bus error][, micro-architectural error]

        <proc operation string>* := unknown or generic | data read | data write | \
        instruction execution

Memory section

60-87

Memory section도 각 field가 optional이다. `error_status`, `physical_address`, `physical_address_mask`가 error 상태와 address 범위를 나타내며, node·card·module·bank·device·row·column·bit_position이 memory topology와 정확한 location을 기술한다.

`requestor_id`, `responder_id`, `target_id`는 transaction participant를 식별한다. 마지막 `error_type`은 integer와 memory error type 문자열 하나를 함께 출력한다.

Memory error type은 unknown과 no error부터 single-bit·multi-bit ECC, chipkill ECC, abort, parity, timeout, invalid address, mirror·sparing, scrub result까지 순서가 정해진 enum이다. 원문의 `mirror Broken` 대소문자는 source에 그대로 보존한다.

Memory section field
분류Field의미
상태error_statusMemory error status bits
Addressphysical_address·physical_address_mask오류 physical 범위
Topologynode·card·module·bank·deviceMemory hierarchy 위치
DRAM 위치row·column·bit_positionCell·bit 단위 location
Transactionrequestor_id·responder_id·target_id요청·응답·대상 식별자
Classificationerror_type + stringMemory error 종류

Address·topology·transaction·classification field를 구분한다.

Memory error type 순서
Index문자열
0unknown
1no error
2single-bit ECC
3multi-bit ECC
4single-symbol chipkill ECC
5multi-symbol chipkill ECC
6master abort
7target abort
8parity error
9watchdog timeout
10invalid address
11mirror Broken
12memory sparing
13scrub corrected error
14scrub uncorrected error

Integer가 index로 선택하는 16개 문자열이다.

        <proc flags strings># :=
        [restartable][, precise IP][, overflow][, corrected]

        <memory section data> :=
        [error_status: <integer>]
        [physical_address: <integer>]
        [physical_address_mask: <integer>]
        [node: <integer>]
        [card: <integer>]
        [module: <integer>]
        [bank: <integer>]
        [device: <integer>]
        [row: <integer>]
        [column: <integer>]
        [bit_position: <integer>]
        [requestor_id: <integer>]
        [responder_id: <integer>]
        [target_id: <integer>]
        [error_type: <integer>, <mem error type string>]

        <mem error type string>* :=
        unknown | no error | single-bit ECC | multi-bit ECC | \
        single-symbol chipkill ECC | multi-symbol chipkill ECC | master abort | \
        target abort | parity error | watchdog timeout | invalid address | \
        mirror Broken | memory sparing | scrub corrected error | \
        scrub uncorrected error

        <pcie section data> :=

PCIe section과 port type

88-118

PCIe section은 `port_type`, PCIe version, command·status와 상세 device identity를 optional field로 출력한다. `device_id` 첫 줄은 segment:bus:device.function 형식이며 이어 slot, secondary_bus, vendor_id, device_id와 class_code가 붙는다.

추가 field에는 두 integer로 된 serial number와 bridge secondary_status·control이 있다. AER block은 aer_status·aer_mask, decoded status string, optional aer_uncor_severity, layer·agent, 네 DWORD의 TLP header를 포함한다.

`device_id`라는 label은 BDF tuple을 시작하는 바깥 field와 vendor_id 옆의 PCI device ID에 다시 등장하므로 현재 nested block 문맥으로 구분해야 한다. AER 역시 한 줄 record가 아니며 유효 field에 따라 여러 후속 줄이 선택적으로 붙는다.

PCIe section field
BlockField형식·의미
Portport_typeinteger + PCIe port type string
Protocolversionmajor.minor
Controlcommand·statusPCI command와 status
Devicedevice_idsegment:bus:device.function
Deviceslot·secondary_busPhysical slot과 secondary bus
Devicevendor_id·device_id·class_codePCI identity
Serialserial number두 integer
Bridgesecondary_status·controlBridge register 상태
AERaer_status·aer_maskAER bitmask
AERaer_uncor_severityUncorrectable severity mask
AERaer_layer·aer_agent오류 layer와 transaction agent
AERaer_tlp_headerTLP header DWORD 4개

Device identity, bridge와 AER payload의 nested 구조다.

PCIe port type index
IndexPort type
0PCIe end point
1legacy PCI end point
2unknown
3unknown
4root port
5upstream switch port
6downstream switch port
7PCIe to PCI/PCI-X bridge
8PCI/PCI-X to PCIe bridge
9root complex integrated endpoint device
10root complex event collector

정의된 순서대로 integer가 port type 문자열을 선택한다.

        [port_type: <integer>, <pcie port type string>]
        [version: <integer>.<integer>]
        [command: <integer>, status: <integer>]
        [device_id: <integer>:<integer>:<integer>.<integer>
        slot: <integer>
        secondary_bus: <integer>
        vendor_id: <integer>, device_id: <integer>
        class_code: <integer>]
        [serial number: <integer>, <integer>]
        [bridge: secondary_status: <integer>, control: <integer>]
        [aer_status: <integer>, aer_mask: <integer>
        <aer status string>
        [aer_uncor_severity: <integer>]
        aer_layer=<aer layer string>, aer_agent=<aer agent string>
        aer_tlp_header: <integer> <integer> <integer> <integer>]

        <pcie port type string>* := PCIe end point | legacy PCI end point | \
        unknown | unknown | root port | upstream switch port | \
        downstream switch port | PCIe to PCI/PCI-X bridge | \
        PCI/PCI-X to PCIe bridge | root complex integrated endpoint device | \
        root complex event collector

        if section severity is fatal or recoverable
        <aer status string># :=
        unknown | unknown | unknown | unknown | Data Link Protocol | \
        unknown | unknown | unknown | unknown | unknown | unknown | unknown | \
        Poisoned TLP | Flow Control Protocol | Completion Timeout | \
        Completer Abort | Unexpected Completion | Receiver Overflow | \
        Malformed TLP | ECRC | Unsupported Request
        else
        <aer status string># :=

AER status·layer·agent decode

119-137

AER status 문자열은 section severity에 따라 서로 다른 bit table을 사용한다. Severity가 fatal 또는 recoverable이면 uncorrectable status mapping을, 그 밖의 corrected·info 문맥이면 correctable status mapping을 적용한다.

Fatal·recoverable AER status bit
Bit문자열
0-3unknown
4Data Link Protocol
5-11unknown
12Poisoned TLP
13Flow Control Protocol
14Completion Timeout
15Completer Abort
16Unexpected Completion
17Receiver Overflow
18Malformed TLP
19ECRC
20Unsupported Request

Bit 0부터 20까지의 uncorrectable status 문자열이며 unknown 자리도 index 보존에 필요하다.

Corrected·info AER status bit
Bit문자열
0Receiver Error
1-5unknown
6Bad TLP
7Bad DLLP
8RELAY_NUM Rollover
9-11unknown
12Replay Timer Timeout
13Advisory Non-Fatal

Correctable AER mapping에서 의미가 정의된 bit를 중심으로 정리한다.

`aer_layer`는 Physical, Data Link, Transaction Layer 중 하나다. `aer_agent`는 Receiver ID, Requester ID, Completer ID, Transmitter ID 중 하나로 error를 관찰하거나 유발한 protocol participant 역할을 나타낸다.

AER layer와 agent
Field가능한 문자열
aer_layerPhysical Layer | Data Link Layer | Transaction Layer
aer_agentReceiver ID | Requester ID | Completer ID | Transmitter ID

Protocol stack 위치와 transaction 역할을 별도 enum으로 해석한다.

        Receiver Error | unknown | unknown | unknown | unknown | unknown | \
        Bad TLP | Bad DLLP | RELAY_NUM Rollover | unknown | unknown | unknown | \
        Replay Timer Timeout | Advisory Non-Fatal
        fi

        <aer layer string> :=
        Physical Layer | Data Link Layer | Transaction Layer

        <aer agent string> :=
        Receiver ID | Requester ID | Completer ID | Transmitter ID

Where, [] designate corresponding content is optional

All <field string> description with * has the following format::

        field: <integer>, <field string>

Where value of <integer> should be the position of "string" in <field
string> description. Otherwise, <field string> will be "unknown".

Optional·enum·bitmask 표기 규칙

138-150

Grammar에서 대괄호 `[]`는 해당 내용이 optional임을 뜻한다. Field가 유효하지 않거나 error record에 포함되지 않으면 그 줄 전체가 생략될 수 있으므로 고정 line 수나 고정 위치만으로 parser를 작성하면 안 된다.

별표 `*`가 붙은 `<field string>`은 `field: <integer>, <field string>` 형식이다. Integer는 정의된 문자열 목록에서의 position이며 범위를 벗어나면 출력 문자열은 `unknown`이다.

샵 `#`가 붙은 `<field strings>`는 첫 줄에 `field: <integer>` bitmask를 출력하고 다음 줄에 설정된 각 bit에 대응하는 문자열들을 출력한다. Bit position은 정의된 문자열 목록에서의 position과 같다.

APEI grammar marker
Marker의미Parse 규칙
[]Optional contentField line이 없을 수 있음
*단일 enum stringInteger를 ordered list index로 해석
#복수 bit stringsInteger의 set bit마다 ordered label 출력
unknown정의 범위 밖 index·미정의 bitRaw integer를 보존하고 unknown 허용

원문 meta-notation이 parser에 요구하는 동작이다.

Field 문자열 decode
Field marker가 *인지 #인지 확인*이면 integer를 문자열 목록 index로 사용Index가 범위 밖이면 unknown#이면 integer의 set bit를 순회각 bit position의 문자열을 순서대로 출력Optional field 부재와 unknown label을 허용

Integer 값에서 enum 또는 bitmask label을 얻는 두 경로다.

각 field의 상세 의미는 UEFI specification 2.3 이상 Appendix N `Common Platform Error Record`를 참고한다. Kernel log parser는 이 grammar와 함께 실제 CPER field validity bit와 specification version을 대조해야 한다.


All <field strings> description with # has the following format::

        field: <integer>
        <field strings>

Where each string in <fields strings> corresponding to one set bit of
<integer>. The bit position is the position of "string" in <field
strings> description.

For more detailed explanation of every field, please refer to UEFI
specification version 2.3 or later, section Appendix N: Common
Platform Error Record.