|
@@ -15,7 +15,6 @@
|
|
#include <sched.h>
|
|
#include <sched.h>
|
|
|
|
|
|
|
|
|
|
-#ifdef __i386
|
|
|
|
|
|
|
|
|
|
|
|
typedef volatile int lock_t;
|
|
typedef volatile int lock_t;
|
|
@@ -30,12 +29,20 @@ typedef volatile int lock_t;
|
|
inline static int tsl(lock_t* lock)
|
|
inline static int tsl(lock_t* lock)
|
|
{
|
|
{
|
|
volatile char val;
|
|
volatile char val;
|
|
|
|
+#ifdef __i386
|
|
|
|
|
|
val=1;
|
|
val=1;
|
|
asm volatile(
|
|
asm volatile(
|
|
" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"
|
|
" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"
|
|
);
|
|
);
|
|
return val;
|
|
return val;
|
|
|
|
+#elif defined __sparc64
|
|
|
|
+ asm volatile(
|
|
|
|
+ "ldstub [%1], %0 \n\t"
|
|
|
|
+ "membar #StoreStore | #StoreLoad \n\t"
|
|
|
|
+ : "=r"(val) : "r"(lock):"memory"
|
|
|
|
+ );
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -54,13 +61,22 @@ inline static void release_lock(lock_t* lock)
|
|
{
|
|
{
|
|
char val;
|
|
char val;
|
|
|
|
|
|
|
|
+#ifdef __i386
|
|
val=0;
|
|
val=0;
|
|
asm volatile(
|
|
asm volatile(
|
|
" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"
|
|
" xchg %b0, %1" : "=q" (val), "=m" (*lock) : "0" (val) : "memory"
|
|
|
|
+ ); /* hmm, maybe lock; movb $0, [%1] would be faster ???*/
|
|
|
|
+#elif defined __sparc64
|
|
|
|
+ asm volatile(
|
|
|
|
+ "membar #LoadStore | #StoreStore \n\t" /*is this really needed?*/
|
|
|
|
+ "stb %%g0, [%0] \n\t"
|
|
|
|
+ : /*no output*/
|
|
|
|
+ : "r" (lock)
|
|
|
|
+ : "memory"
|
|
);
|
|
);
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
#endif
|