CHAPTER 03
3. Redistributor discovery, wake와 PPI를 PE별로 검증한다
각 PE의 GICR frame을 GICR_TYPER affinity로 찾고 ProcessorSleep/ChildrenAsleep handshake를 완료한 뒤 SGI/PPI bank와 LPI table을 설정합니다.
frame discovery
연속 frame의 GICR_TYPER Affinity_Value를 MPIDR과 매칭합니다.
wake handshake
ProcessorSleep을 내린 뒤 ChildrenAsleep이 0이 될 때까지 기다립니다.
banked state
SGI/PPI enable, priority와 config는 해당 redistributor의 SGI frame에 있습니다.
CPU hotplug
offline 시 sleep, online 시 wake와 private interrupt 복원이 필요합니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| GICR_TYPER | Redistributor | affinity, Last, VLPIS | 각 online PE와 1:1 | 잘못된 frame 매칭 |
| GICR_WAKER | Redistributor | ProcessorSleep/ChildrenAsleep | wake 후 둘 다 0 | 전원/handshake timeout |
| GICR_IGROUPR0 | SGI frame | SGI/PPI group | timer/SGI 정책 일치 | EL/group routing 오류 |
| GICR_ISENABLER0 | SGI frame | private enable | CPU별 예상 bit | 다른 CPU frame 수정 |
| GICR_ICFGR1/IPRIORITYR | SGI frame | PPI trigger/priority | firmware 기술과 일치 | timer interrupt masking |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| CPU1만 timer 없음 | CPU1 online | GICR frame/PPI enable | CPU0/1 register diff | per-CPU redistributor |
| ChildrenAsleep 고정 | rail/clock 요청 | power controller와 WAKER 순서 | firmware wake와 비교 | redistributor power |
| hotplug 후 PPI 손실 | 재부팅 시 정상 | online restore callback | offline/online snapshot diff | CPU hotplug lifecycle |
| SGI target 불일치 | sender write 성공 | target affinity와 RSS | MPIDR/SGI1R decode | affinity encoding |
| LPI만 특정 CPU 실패 | SPI/PPI 정상 | property/pending table와 redistributor | LPI table base diff | LPI setup |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | 모든 GICR_TYPER와 MPIDR을 표로 만듭니다. | PE↔frame map | discovery 검증 |
| 2 | WAKER write와 ChildrenAsleep 변화 시간을 잽니다. | wake latency | power handshake |
| 3 | PPI enable/priority를 CPU별로 dump합니다. | banked state 차이 | restore 검증 |
| 4 | CPU hotplug를 반복하며 timer/SGI/LPI를 각각 발생시킵니다. | 종류별 count | lifecycle 검증 |
주의현재 CPU의 GICR frame을 찾았다는 이유로 다른 CPU frame에도 같은 offset을 쓰지 않습니다. affinity 매칭이 먼저입니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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