割込みのエミュレーション
tkojima0107 opened this issue · comments
MIPS R3000には8つの割込みを利用できる。うち2つはSW割込み、残り6つはHW割込み。
SW割込みに関してはCP0のstatusレジスタにSWが1を書き込むことで発生する(CPU側は毎サイクルビットが立っていないかをチェックする)。
一方でHW割込みにはGEYSERでは
- HW3 DMAC
- HW5 Router
に対応する。
vmipsでのHW割り込みの実装は
vmips.ccで
intc->connectLine(IRQ2, デバイス);
としてHWを接続
IRQ2~IRQ7はdeviceint.hで定義されている
割り込みをかけるHWはDeviceIntを継承する必要あり
多分devideintのassertIntを呼ぶと割り込みがかかるんだと思う
Routerの割り込みを実装していて気が付いたが、
assertIntをかけると割り込み信号がHighになった状態を作るが、終わったらdeassertIntで下げる状態も作らないと割り込みから復帰しても即また割り込みがかかってしまう。
それから、DeviceIntを継承したクラスは純粋仮想関数のdescriptor_str()を実装する必要がある。
これは割り込みモジュール名を返すだけでよい。
一つ紛らわしかったのが、
SW0 == IRQ0
..
HW0 == IRQ2
..
HW5 == IRQ7
となっていたのに気がつかず, ルーターようにIRQ5をつなげてしまったいた。
でも、無事DMAC、router共に割り込みをかけることができたため閉じます