前回の続き。
ここでは、以下のPLICの図を参考にしながらPLIC経由で割り込みが挿入されたときの流れを説明する。
ここでの要点は以下の3つにまとめられる。
- 複数の割込み信号が挿入された場合、どのような基準で選択されるのか
- HARTはどのように割り込み要因を検出するのか
- HARTはどのように割り込み処理を完了するのか
1. 割込み信号受付のためのゲートウェイ
まず、外部から割込み信号がPLICに挿入されると、それはゲートウェイと呼ばれるユニットにより受け付けられる(どうもゲートウェイの構造はハードウェアの定義を示しているように見えるが、PLICはあくまで仕様なのでそのままハードウェアにしなくてもいいような気がする)。
ゲートウェイに到着した割り込みは、HART側により割り込み完了(Complete)がされるまで保持される。後述するがこのゲートウェイによる保持は、PLICのclaimレジスタを叩くことによって解除される。
ちなみに、後述するPLICFaninに通知情報を送信する前に、Priorityレジスタを参照することで、当該割り込み要因の優先度情報も引き出しておく。
仕様書には、レベルトリガとエッジトリガの2種類の場合について解説があるが、基本的にレベルトリガであったとしても立ち上がりのエッジを検出して割り込み挿入と判断する。したがって、レベルトリガであったとして、割り込み処理中にレベル信号が下がってしまったとしても、ゲートウェイ中で割り込み要求は保持される。
2. 割り込みをHARTに通知するための選択回路
次に、各割り込みソースがどのHARTに通知されるのかということへ進む。
これには大きく分けて3つのステップがある。各HARTにおいて、
- 各割り込みソースが当該HARTに受け付けられるのかを判定する。これはEnableレジスタにより設定される。
- 当該HARTにおいて割り込みソースを選択する。これは各割り込みソースの優先度をもとに、最大優先度のものを選択する。
- HARTの割込みスレッショルドに応じて、HARTに通知を行うかどうかを決定する。これにはThresholdレジスタを使用する
これにより、HARTにより一つの割り込みが選択される。選択されていなかった割込み要因は、Pendingビットが設定される。
※ 後述するがここのFanInの選択回路は、SiFiveの実装の場合理解するのに少し時間がかかる。No-Delayで割り込みが通知されるのかと思いきや、外部割り込みが挿入されたサイクルでは、Pendingビットがすべて0のためどの割り込みも選択されない。その結果外部割込みが挿入されたすべてのPendingビットが1になり、次のサイクルで改めて選択が行われるという2段階での選択回路になっているからだ。
3. HARTによる割り込み要因の取得方法・完了方法
SiFiveの実装では、PLICはHARTに対して直接割込み要因のIDを通知していない。割込み要因はPLICのレジスタを触ることによって取得することになる。これを管理しているのがclaimレジスタである。claimレジスタを触ることにより、HARTはどの割り込み要因で割り込みが挿入されたかどうかを知ることができる。
ターゲット(HART) | オフセット | サイズ | 説明 |
---|---|---|---|
0 | 0x200004 | 32 | HART0向けのclaim/completeレジスタ |
1 | 0x201004 | 32 | HART1向けのclaim/completeレジスタ |
2 | 0x202004 | 32 | HART2向けのclaim/completeレジスタ |
… | … | … | |
15871 | 0x3fff004 | 32 | HART15871向けのclaim/completeレジスタ |
さらに、このレジスタをWriteすることによって当該割込み要因がCompleteする。Completeすることによって、同じ割込み要因からさらに新しい割り込みが挿入することができるようになる。
まとめると、HARTは以下のような手順に則ってPLICからの割り込みを処理する。