]> rtime.felk.cvut.cz Git - l4.git/blobdiff - kernel/fiasco/src/kern/ia32/spin_lock-ia32.cpp
update
[l4.git] / kernel / fiasco / src / kern / ia32 / spin_lock-ia32.cpp
index 75853b8747951a54e2ae4b09ac6b17583d0c8a1b..8e488d91ffd89ca3d02fa63540002d21345c7ad2 100644 (file)
@@ -10,28 +10,34 @@ public:
 //--------------------------------------------------------------------------
 IMPLEMENTATION [(ia32|ux|amd64) && mp]:
 
-PRIVATE inline
+PRIVATE template<typename Lock_t> inline
 void
-Spin_lock::lock_arch()
+Spin_lock<Lock_t>::lock_arch()
 {
-  unsigned long dummy, tmp;
-  __asm__ __volatile__ (
-      "1: mov %[lock], %[tmp]  \n"
-      "   test $2, %[tmp]      \n" // Arch_lock == #2
-      "   jz 2f                \n"
-      "   pause                \n"
-      "   jmp 1b               \n"
-      "2: mov %[tmp], %[d]     \n"
-      "   or $2, %[d]          \n"
-      "   lock; cmpxchg %[d], %[lock]  \n"
-      "   jnz 1b                \n"
-      : [d] "=&r" (dummy), [tmp] "=&a" (tmp), [lock] "+m" (_lock)
-      );
+  Lock_t dummy, tmp;
+#define L(z)                       \
+  __asm__ __volatile__ (           \
+      "1: mov %[lock], %[tmp]  \n" \
+      "   test $2, %[tmp]      \n" /* Arch_lock == #2 */ \
+      "   jz 2f                \n" \
+      "   pause                \n" \
+      "   jmp 1b               \n" \
+      "2: mov %[tmp], %[d]     \n" \
+      "   or $2, %[d]          \n" \
+      "   lock; cmpxchg %[d], %[lock]  \n" \
+      "   jnz 1b                \n" \
+      : [d] "=&"#z (dummy), [tmp] "=&a" (tmp), [lock] "+m" (_lock))
+
+  if (sizeof(Lock_t) > sizeof(char))
+    L(r);
+  else
+    L(q);
+#undef L
 }
 
-PRIVATE inline
+PRIVATE template<typename Lock_t> inline
 void
-Spin_lock::unlock_arch()
+Spin_lock<Lock_t>::unlock_arch()
 {
   _lock &= ~Arch_lock;
 }