マルチプロセッサシステムでGICを使うときの注意点

aarch64向け自作OS*1マルチプロセッサ対応をするとき,セカンダリのCPUが一生タイマ割り込みを起こしてくれなくてウンウン唸りながらGICv2のドキュメントを眺めていたところ...

  • If the GIC is implemented as part of a multiprocessor system:

    • Some registers are banked to provide a separate copy for each connected processor. These include the registers associated with PPIs and SGIs, and the GICD_NSACRn, when implemented.

(ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification, Page 4-77)

知らなかったそんなの...

Register Bankingといって,同じアドレスに複数のレジスタマッピングされていることがあるらしい.MMIOだし,完全にCPU間で共有されているものだと思っていました.

ということで,GICの初期化処理はプロセッサごとに行う必要があります.