CHAPTER 03
3. register snapshot을 access semantics와 함께 저장한다
enable, raw status, masked status, ownership, error와 completion을 사건 전·직후·timeout에 읽습니다. W1C, read-to-clear, latch, self-clear와 reserved bit 규칙을 먼저 표로 만들고 수집 순서를 정합니다.
side effect
register read 자체가 상태를 소비할 수 있습니다.
W1C
1을 쓴 bit만 clear하므로 blind read-modify-write가 새 event를 지울 수 있습니다.
snapshot group
서로 연관된 register를 가능한 짧은 간격에 읽고 timestamp를 붙입니다.
identity
IP version과 합성 option이 확정돼야 field 해석표를 고를 수 있습니다.
기록 항목과 판정 기준
| 항목 | 수집 방법 | 필수 metadata | 통과 기준 | 누락 시 위험 |
|---|---|---|---|---|
| IP identity | ID/version register | release, integration option | datasheet와 일치 | 다른 offset/bit 적용 |
| access type | databook | RO/RW/W1C/RC/self-clear | 수집 code에 반영 | 상태를 관찰 중 파괴 |
| raw/masked | MMIO snapshot | timestamp, CPU, context | 둘의 차이 설명 가능 | mask 문제 누락 |
| ownership/index | descriptor/queue dump | base, head, tail, owner | 한 시점의 일관된 ring | stale/부분 snapshot |
| error context | status+address+ID | fault source와 first error | 첫 오류 보존 | 후속 오류가 원인처럼 보임 |
실패한 실험을 바로잡는 표
| 증상 | 문제점 | 다시 고정할 변수 | 재시험 | 유효한 결론 |
|---|---|---|---|---|
| 읽을 때마다 status 0 | read-to-clear 가능 | access semantics | mirror/debug register 사용 | 관찰 방법 오류 |
| dump 후 현상 사라짐 | 수집이 상태 변경 | W1C/RC와 timing | read-only 최소 capture | Heisenbug |
| enable 정상인데 event 없음 | 정적 설정만 봄 | raw status/owner | 사건 전후 delta | runtime 경계 |
| ring dump가 모순 | 여러 시점 혼합 | freeze/snapshot 시간 | 짧은 critical capture | 비원자 관측 |
| reboot마다 offset 의미 다름 | IP option/revision 차이 | identity register | revision별 decode | 해석표 오류 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | 읽을 register마다 access type과 side effect를 적습니다. | semantics manifest | 안전한 수집 |
| 2 | baseline/event/timeout 세 snapshot 형식을 고정합니다. | 동일 컬럼 | diff 가능 |
| 3 | W1C clear 값을 별도 기록하고 readback합니다. | ack 증거 | event loss 방지 |
| 4 | descriptor 주소를 IOVA/PA/object와 연결합니다. | 주소 ledger | ownership 검증 |
주의vendor databook이 없는 register의 reserved bit에 값을 쓰지 않습니다. 공개 driver 정의에서 확인 가능한 field만 사용합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Linux ftrace
trace_marker, function graph와 event tracing
Linux DMA API HOWTO
DMA mapping, ownership과 cache synchronization
Linux PCIe AER
PCIe hierarchy error source와 recovery
Linux fault injection
allocation, I/O와 driver 오류 경로 검증