OpenBSD/sgi on octane2 - mutex.cへのスピンロック実装

OpenBSD/sgiのmutex.cは何と単なるスタブだ。
だからちゃんと実装してあげなきゃならない。

Index: ../../sgi/sgi/mutex.c
===================================================================
RCS file: /cvs/src/sys/arch/sgi/sgi/mutex.c,v
retrieving revision 1.4
diff -r1.4 mutex.c
1c1
< /*    $OpenBSD: mutex.c,v 1.4 2009/04/27 21:48:56 kettenis Exp $      */
---
> /*    $OpenBSD: mutex.c,v 1.2 2007/05/14 17:32:17 miod Exp $  */
34,37d33
< #ifdef MULTIPROCESSOR
< #error This code needs more work
< #endif
<
56a53,69
> #ifdef MULTIPROCESSOR
>       int tmp0, tmp1;
>
>         asm volatile (
>               "sync\n"
>               "1:\n"
>               "ll     %0, %2\n"
>               "nop\n"
>               "bnez   %0, 1b\n"
>               "li     %1, 1\n"
>               "sc     %1, %2\n"
>               "beqz   %1, 1b\n"
>               "nop\n"
>               "sync\n"
>               : "+r"(tmp0), "+r"(tmp1)
>               : "m"(mtx->mtx_lock));
> #else
58a72,74
> #endif
>
>       mtx->mtx_owner = curcpu();
63a80
>
64a82
>
65a84
>
67a87
>       mtx->mtx_owner = NULL;

インラインアセンブリを使ってll/scを用いた単純なスピンロックを実装した。
CPUが1つの時はこれで動いているが、複数の時もきちんと動くかは今後確かめていく必要がある。