CHAPTER 01
1. INTID 종류, pending·active와 trigger를 구분한다
SGI 0~15, PPI 16~31, SPI 32 이상, extended PPI/SPI와 LPI는 배치와 제어 bank가 다릅니다. inactive, pending, active, active+pending 네 상태와 level/edge source clear 순서를 함께 봅니다.
SGI
PE 사이 software interrupt이며 target affinity와 source PE를 구분합니다.
PPI
각 PE의 private interrupt로 timer와 maintenance interrupt에 많이 쓰입니다.
SPI
shared peripheral source이며 GICD에서 enable, trigger, priority와 route를 설정합니다.
LPI
메모리 기반 property/pending table과 ITS translation을 쓰며 GICD ISPENDR 방식으로 다루지 않습니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| GICD_TYPER | Distributor | 구현 INTID 수와 기능 | firmware interrupt 상한과 일치 | 존재하지 않는 INTID 접근 |
| GICD_IGROUPR/IGRPMODR | Distributor | Security group | EL과 group enable 정책 일치 | Group0/1 routing 오류 |
| GICD_ISENABLER | Distributor | SPI enable | target source bit 1 | device status 있으나 GIC가 차단 |
| GICD_ICFGR | Distributor | edge/level | DT/ACPI trigger와 전기 신호 일치 | 잘못된 trigger로 storm/loss |
| GICD_ISPENDR/ISACTIVER | Distributor | pending/active snapshot | 사건에 따라 상태 이동 | EOI/source clear 순서 오류 |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| device status 1, pending 0 | 장치 source 발생 | enable/trigger/wire | software pending 주입 | GIC 입력 경계 |
| pending 1, CPU 미진입 | GIC source 수신 | route/priority/group | PMR 완화와 affinity 변경 | delivery policy |
| active 고정 | CPU acknowledge | EOI/deactivate | EOImode와 DIR trace | CPU interface 완료 |
| level IRQ storm | handler 실행 | device source clear | mask 후 status clear 순서 비교 | 장치 clear 경계 |
| edge IRQ 손실 | 일부 edge 도착 | pulse width/ack/mask window | software trigger와 외부 pin 비교 | 전기 또는 masking race |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | device raw status와 GIC pending/active를 동시 저장합니다. | 동일 사건 snapshot | 입력 경계 판정 |
| 2 | DT/ACPI trigger와 ICFGR, 실제 pin 파형을 대조합니다. | 세 값의 일치 | trigger 검증 |
| 3 | handler enter/source clear/EOI 시간을 trace합니다. | 상태 수명 | storm/loss 분석 |
| 4 | software generated interrupt로 장치 바깥 경로를 시험합니다. | CPU delivery 성공 | 경계 분할 |
주의level interrupt는 GIC pending bit만 지워 해결하지 않습니다. 장치의 level 원인을 먼저 제거해야 다시 pending되지 않습니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Arm GICv3/v4 overview
GICD, GICR, CPU interface, interrupt state와 routing
Linux GICv3 driver
GIC 초기화, irqdomain, handle_irq와 affinity
Linux GICv3 ITS driver
LPI와 MSI DeviceID/EventID translation
Linux IRQ domain
firmware hwirq와 Linux virq mapping