CHAPTER 04
4. ICC_* CPU interface의 acknowledge, priority와 EOI를 읽는다
system register interface enable, group enable, PMR/BPR, running priority, IAR acknowledge와 EOIR/DIR의 역할을 exception entry와 연결합니다.
SRE
ICC_SRE_ELx가 system register CPU interface 접근을 허용해야 합니다.
PMR
interrupt priority mask이며 현재 실행 우선순위와 preemption 판단에 영향을 줍니다.
IAR
읽는 순간 최고 우선순위 pending INTID를 acknowledge해 active로 바꿉니다.
EOImode
priority drop과 deactivate가 EOIR 하나 또는 EOIR+DIR로 분리될 수 있습니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| ICC_SRE_EL1 | CPU interface | system register enable | SRE=1 | trap/legacy interface |
| ICC_IGRPEN1_EL1 | CPU interface | Group1 enable | kernel IRQ policy상 1 | CPU별 delivery 차단 |
| ICC_PMR_EL1 | CPU interface | priority threshold | 예상 IRQ priority 허용 | 모든 IRQ masking |
| ICC_IAR1_EL1 | CPU interface | acknowledged INTID | device 사건 INTID와 일치 | spurious 1023/특수 INTID |
| ICC_EOIR1_EL1/DIR | CPU interface | priority drop/deactivate | handler 후 active clear | active 고정/storm |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| pending인데 IAR spurious | GICD pending | group/route/PMR | PMR/IGRPEN snapshot | CPU interface policy |
| IAR는 맞고 handler 없음 | exception entry | irqdomain mapping | hwirq→virq lookup | Linux dispatch |
| nested IRQ가 안 됨 | 첫 IRQ 처리 | PMR/BPR/DAIF | priority 다른 두 IRQ 주입 | preemption policy |
| EOI 후 즉시 재진입 | handler와 EOI | level source clear | device mask/clear 순서 변경 | 장치 원인 유지 |
| active가 안 지워짐 | EOIR write | EOImode/DIR | ICC_CTLR와 deactivate trace | 완료 방식 불일치 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | CPU별 SRE, IGRPEN, PMR, BPR을 저장합니다. | CPU interface 기준선 | 정책 확인 |
| 2 | IAR INTID와 device status를 사건 번호로 연결합니다. | source attribution | 번호 검증 |
| 3 | EOIR/DIR 전후 active 상태를 capture합니다. | deactivate 완료 | EOImode 확인 |
| 4 | 두 priority IRQ로 nesting과 latency를 측정합니다. | preemption 순서 | priority 검증 |
주의ICC_IAR read는 단순 관찰이 아니라 acknowledge side effect가 있습니다. debugger에서 임의로 읽으면 handler가 받아야 할 interrupt를 소비할 수 있습니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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