IPI
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というのがあるような…?なんでIRQがLinuxと一致しとらんのかちょっとよく分かってない。
一つづつ試すしか無いのか。
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で再チャレンジしてみたが、やはり割り込みがかからない。
未だ理由は良く分からない。