コンテンツにスキップ

Apple 割り込みコントローラー (AIC)

2025/3/9時点のaicの翻訳


AICはApple Interrupt Controllerです。これらは色々雑多なリバースエンジニアリングノートです。

Appleは特定のSET/CLRレジスタペアスタイルを好んで使用します:

  • SET:現在の状態を読み取り、セットビットに1を書き込む(reads current state, writes set bits set to 1)
  • CLR: 現在の状態を読み取り、クリアビットに1を書き込む(reads current state, writes clear bits set to 1)
レジスタ
0000~ グローバルなもの
  0004: NR_IRQ?
  0010: GLOBAL_CFG? (impl bits: f8fffff1)
2000~ 割り込み acks, IPIs等

3000~ IRQ_TGT (各レジスタに1つ, 各レジスタにCPUのビットフィールド)
4000~ SW_GEN_SET (ビットフィールド)
4080~ SW_GEN_CLR (ビットフィールド)
4100~ IRQ_MASK_SET (ビットフィールド)
4180~ IRQ_MASK_CLR
4200~ HW_IRQ_MON (現在の割り込みライン状態?)

8020 MSR CNTPCT_EL0の下位32bits (システムタイマー)
8028 MSR CNTPCT_EL0の上位32bits (システムタイマー)

現在のCPUコアのコア毎の状態のミラーアクセス:
2004 IRQ_REASON
2008 IPI_SEND - IPIを送信、ビット0から31未満は他のIPIをCPUに送信、ビット31は『自分自身』のIPIをこのCPUに送信
200c IPI_ACK - IPIを取得、ビット0は『他』のIPIを取得、ビット31は 『自分自身』のIPIを取得
2024 IPI_MASK_SET - IPI用のマスクビットはIPI_ACK用のビットと同じタイプと位置に対応
2028 IPI_MASK_CLR

TODO コア毎のステートオフセットへの直接アクセスの文書化
使い方

IPIの流れ:

  • IPI_SENDへのビットを書き込む
  • ARM IRQをアサート
  • IRQ_REASONを読み込む
    • IPIはIPI_MASKでマスク
    • ARM IRQをアサート解除
  • IPI_ACKにビットを書き込む
  • IPI_MASK_CLRにビットを書き込む
    • IPIをマスク解除
    • IPI_ACKがクリアされなかった場合ARM IRQはここで再アサート

HW irqの流れ:

  • IRQ_TGTのターゲットビットフィールドを設定
  • IRQ_MASK_CLRにビットを書き込み
  • (後で) HW IRQをアサート
  • IRQ_REASONを読み込む
    • IRQ_MASK は自動的に設定
    • ARM IRQをアサート解除
  • (特定のハードウェアではIRQのクリア)
  • IRQ_MASK_CLRにビットを書き込む
    • IRQはマスクされていない
    • ハードウェアラインがクリアされなかった場合、ARM irqはここで再度アサート

ターゲットは11個?CPU 0-7と補助的なもの?

SW_GENで設定されたビットはハードウェアIRQラインとORされます。

タイマー

システムタイマーはARM64の標準的なMSRのものでAICをバイパスします。FIQ に直接配線されています。