1つしかないものに複数人で書き込むような設計はダメだとあれほど(ry
割り込み許可(GICD_CTLRのbit0に1を書く)は1つしかない。
誰が書き込むのか。
それを考えると、
- GICマスタ : GICを管理する人
- GICスレーブ : 上記以外の人
という風にしようと思い立つ。GICマスタが割り込み許可を出すわけだ。
GICスレーブは、誰かが割り込み許可を出してくれるのを待つ格好になる。
GICマスタとGICスレーブの差って?
とはいえ、GICスレーブはそれでいいのだろうか。
何らかの要因でGICマスタが立ち上がらなかったらどうするのだろう。
というか、デバッグしている最中とかだと普通にあり得る。
と考えると、GICスレーブは、誰かが割り込み許可を出してくれるのを待つが、ある程度の時間で諦めて、ダメだったらGICマスタとして動作する。のが、正解ではないか、と思い当たる。
また、各割り込み番号に対する設定は、各々のコアから、その割り込み番号を使用する段になってから行えば良い。ただし使用する割り込み番号は、ちゃんと設計して重ならないようにしてね。ここに、マスタとスレーブの差はない。
概要まとめ
- GICマスタは、割り込み許可を行う。
- GICスレーブは、ある程度の時間、割り込み許可になるのを待つが、ダメだったら割り込み許可を行う。
- 各割り込み番号の設定は、各々のコアから、使用する段になって設定する。割り込み番号は重複しないように。
Example(各割り込み番号の設定)
すみません。権利関係の問題で載せられません。
まさにIT土○。
代わりにレジスタ設定の概要を書きます。
- GICD_IGROUPRnを設定する。
- GICD_ICFGRnを設定する。
- GICD_ITARGETSRnを設定する。
- GICD_IPRIORITYRnを設定する。
- GICD_ISENABLERnを設定する。
※要スピンロック。以下を参考にさせていただきます。
Zircon のスピンロック実装(aarch64編)