OpenBSD/sgi on octane2 - ipi割り込み その3
void mips64_ipi_init(void) { unsigned cpu = cpu_number(); int ret; ret = xheart_intr_establish(mips64_ipi_intr, NULL, HEART_INTR_IPI(cpu), IPL_HIGH, "ipi"); if (ret) panic("xheart_intr_establish failed:%d\n", ret); }
間違えて引数に割り込み番号じゃなくて割り込み番号のビットに1を立てた値を渡してたのでこれを修正。
--- ../xbow/xheart.c (リビジョン 371) +++ ../xbow/xheart.c (作業コピー) @@ -297,7 +300,7 @@ /* XXX this assumes we run on cpu0 */ heart = PHYS_TO_XKPHYS(HEART_PIU_BASE, CCA_NC); - *(volatile uint64_t *)(heart + HEART_IMR(0)) |= 1UL << intrbit; + *(volatile uint64_t *)(heart + HEART_IMR(cpu)) |= 1ULL << intrbit;
ULだと32bitなので桁が足りないから64bitへ。
この状態で、
mips64_send_ipi(0, MIPS64_IPI_NOP);
を実行したらspurious interrupt, source 43が画面に出続けるようになった。
OK!割り込みはかかるようになった!
なんでハンドラがちゃんと呼ばれてないのかはよく考えないといかんな。
追記:
int 46へ割り込んでるつもりなのに43から割り込みが来てるからハンドラが無いらしい。
cpu間で割り込みした時はどうなるのかも見ておきたいと思って、cpu1を再び有効にして割り込みを初期化させたがうまく行ってない。
あ、そうか。xheart.cの中でcpu0にしか対応してないコードが残ってるか。そうかもしれない。