IPI

Linuxを参考に、IPIのIRQをヘッダに足してみる。

Index: hub.h
===================================================================
RCS file: /cvs/src/sys/arch/sgi/xbow/hub.h,v
retrieving revision 1.7
diff -u -p -r1.7 hub.h
--- hub.h	8 Nov 2009 22:44:16 -0000	1.7
+++ hub.h	22 May 2010 12:08:57 -0000
@@ -145,7 +145,11 @@
 /* 35-0 available */
 
 /** Level 0 interrupt */
-/* 63-7 available */
+/* 63-11 available */
+#define HUBPI_ISR0_CPU_CALL_B		10
+#define HUBPI_ISR0_CPU_CALL_A		9
+#define HUBPI_ISR0_CPU_RESCHED_B	8
+#define HUBPI_ISR0_CPU_RESCHED_A	7
 /* IPI interrupts */
 #define	HUBPI_ISR0_IPI_B		6
 #define	HUBPI_ISR0_IPI_A		5

しかし、元々IPI_A、IPI_Bというのがあるような…?なんでIRQLinuxと一致しとらんのかちょっとよく分かってない。
一つづつ試すしか無いのか。

LinuxではIPIの初期化・割り込み発生を直接HUBへの書き込みで設定していたが、OpenBSDには既に汎用化された関数が定義されてるのでこれを使ってみる。
やり方はIP30(Octane)の時と同じ。

+int
+hw_ipi_intr_establish(int (*func)(void *), u_long cpuid)
+{
+	printf("%s %s %d\n", __FILE__, __func__, __LINE__);
+	int irq = cpuid == 0 ? HUBPI_ISR0_CPU_CALL_A : HUBPI_ISR0_CPU_CALL_B;
+	return xbow_intr_establish(func, (void *)cpuid, irq,
+	    IPL_IPI, NULL, &curcpu()->ci_ipiih);
+	printf("%s %s %d\n", __FILE__, __func__, __LINE__);
+	return 0;
+};
+
+void
+hw_ipi_intr_set(u_long cpuid)
+{
+	printf("%s %s %d\n", __FILE__, __func__, __LINE__);
+	int irq = cpuid == 0 ? HUBPI_ISR0_CPU_CALL_A : HUBPI_ISR0_CPU_CALL_B;
+	xbow_intr_set(irq);
+	printf("%s %s %d\n", __FILE__, __func__, __LINE__);
+}
+
+void
+hw_ipi_intr_clear(u_long cpuid)
+{
+	printf("%s %s %d\n", __FILE__, __func__, __LINE__);
+	int irq = cpuid == 0 ? HUBPI_ISR0_CPU_CALL_A : HUBPI_ISR0_CPU_CALL_B;
+	xbow_intr_clear(irq);
+	printf("%s %s %d\n", __FILE__, __func__, __LINE__);
+}
+
+#endif

テストしてみる。
…割り込み掛からない。

原因は2通り考えられる:
・割り込みの起こし方が間違っている。hw_ipi_intr_set()側。
・割り込みの有効化方法が間違っている。hw_ipi_intr_establish()側。

どちらだか今の所分かっていない。
Linuxと同じく、一度低レベルな方法(直接HUBへアクセス)でためしてみるべきか。

追記:
HUBPI_ISR0_IPI_A|Bで再チャレンジしてみたが、やはり割り込みがかからない。
未だ理由は良く分からない。