- Implemented Ke386TestAndClearBit and Ke386TestAndSetBit.  
- Fixed some interlocked functions.
Modified: trunk/reactos/ntoskrnl/ex/i386/interlck.c
Modified: trunk/reactos/ntoskrnl/include/internal/i386/ke.h

Modified: trunk/reactos/ntoskrnl/ex/i386/interlck.c
--- trunk/reactos/ntoskrnl/ex/i386/interlck.c	2005-01-01 11:11:52 UTC (rev 12687)
+++ trunk/reactos/ntoskrnl/ex/i386/interlck.c	2005-01-01 11:18:54 UTC (rev 12688)
@@ -1,16 +1,32 @@
-/* $Id: interlck.c,v 1.10 2004/12/12 17:48:20 hbirr Exp $
+/* $Id$
  *
  * reactos/ntoskrnl/ex/i386/interlck.c
  *
  */
 #include <ntoskrnl.h>
 
+#ifdef LOCK
+#undef LOCK
+#endif
+
+#if defined(__GNUC__)
+
 #ifdef MP
-#define	LOCK	"lock "
+#define LOCK "lock ; "
 #else
-#define LOCK	" "
+#define LOCK ""
 #endif
 
+#elif defined(_MSC_VER)
+
+#ifdef MP
+#define LOCK lock
+#else
+#define LOCK 
+#endif
+
+#endif
+
 #if defined(__GNUC__)
 
 /*
@@ -21,6 +37,7 @@
 
 __asm__("\n\t.global @Exfi386InterlockedIncrementLong@4\n\t"
 	"@Exfi386InterlockedIncrementLong@4:\n\t"
+	LOCK
 	"addl $1,(%ecx)\n\t"
 	"lahf\n\t"
 	"andl $0xC000, %eax\n\t"
@@ -35,7 +52,7 @@
 INTERLOCKED_RESULT FASTCALL
 Exfi386InterlockedIncrementLong(IN PLONG Addend)
 {
-	__asm add ecx, 1
+        __asm LOCK add dword ptr [ecx], 1
 	__asm lahf
 	__asm and eax, 0xC000
 	__asm ret
@@ -56,6 +73,7 @@
 
 __asm__("\n\t.global @Exfi386InterlockedDecrementLong@4\n\t"
 	"@Exfi386InterlockedDecrementLong@4:\n\t"
+	LOCK
 	"subl $1,(%ecx)\n\t"
 	"lahf\n\t"
 	"andl $0xC000, %eax\n\t"
@@ -70,7 +88,7 @@
 INTERLOCKED_RESULT FASTCALL
 Exfi386InterlockedDecrementLong(IN PLONG Addend)
 {
-	__asm sub ecx, 1
+	__asm LOCK sub dword ptr [ecx], 1
 	__asm lahf
 	__asm and eax, 0xC000
 	__asm ret
@@ -92,7 +110,8 @@
 
 __asm__("\n\t.global @Exfi386InterlockedExchangeUlong@8\n\t"
 	"@Exfi386InterlockedExchangeUlong@8:\n\t"
-	LOCK"xchgl %edx,(%ecx)\n\t"
+	LOCK
+	"xchgl %edx,(%ecx)\n\t"
 	"movl  %edx,%eax\n\t"
 	"ret\n\t");
 
@@ -106,7 +125,7 @@
 Exfi386InterlockedExchangeUlong(IN PULONG Target,
 				IN ULONG Value)
 {
-	__asm xchg [ecx], edx
+	__asm LOCK xchg [ecx], edx
 	__asm mov  eax, edx
 	__asm ret
 }
@@ -124,6 +143,7 @@
 __asm__("\n\t.global _Exi386InterlockedIncrementLong@4\n\t"
 	"_Exi386InterlockedIncrementLong@4:\n\t"
 	"movl 4(%esp),%eax\n\t"
+	LOCK
 	"addl $1,(%eax)\n\t"
 	"lahf\n\t"
 	"andl $0xC000, %eax\n\t"
@@ -136,7 +156,7 @@
 Exi386InterlockedIncrementLong(IN PLONG Addend)
 {
 	__asm mov eax, Addend
-	__asm add [eax], 1
+	__asm LOCK add dword ptr [eax], 1
 	__asm lahf
 	__asm and eax, 0xC000
 	__asm ret 4
@@ -155,6 +175,7 @@
 __asm__("\n\t.global _Exi386InterlockedDecrementLong@4\n\t"
 	"_Exi386InterlockedDecrementLong@4:\n\t"
 	"movl 4(%esp),%eax\n\t"
+	LOCK
 	"subl $1,(%eax)\n\t"
 	"lahf\n\t"
 	"andl $0xC000, %eax\n\t"
@@ -167,7 +188,7 @@
 Exi386InterlockedDecrementLong(IN PLONG Addend)
 {
 	__asm mov eax, Addend
-	__asm sub [eax], 1
+	__asm LOCK sub dword ptr [eax], 1
 	__asm lahf
 	__asm and eax, 0xC000
 	__asm ret 4
@@ -188,7 +209,8 @@
 	"_Exi386InterlockedExchangeUlong@8:\n\t"
 	"movl 4(%esp),%edx\n\t"
 	"movl 8(%esp),%eax\n\t"
-	LOCK"xchgl %eax,(%edx)\n\t"
+	LOCK
+	"xchgl %eax,(%edx)\n\t"
 	"ret $8\n\t");
 
 #elif defined(_MSC_VER)
@@ -200,7 +222,7 @@
 {
 	__asm mov edx, Value
 	__asm mov eax, Target
-	__asm xchg [edx], eax
+	__asm LOCK xchg [edx], eax
 	__asm ret 8
 }
 
@@ -231,7 +253,8 @@
 __asm__("\n\t.global @InterlockedIncrement@4\n\t"
 	"@InterlockedIncrement@4:\n\t"
 	"movl $1,%eax\n\t"
-	LOCK"xaddl %eax,(%ecx)\n\t"
+	LOCK
+	"xaddl %eax,(%ecx)\n\t"
 	"incl %eax\n\t"
 	"ret\n\t");
 
@@ -244,7 +267,7 @@
 InterlockedIncrement(PLONG Addend)
 {
 	__asm mov eax, 1
-	__asm xadd [ecx], eax
+	__asm LOCK xadd [ecx], eax
 	__asm inc eax
 	__asm ret
 }
@@ -268,7 +291,8 @@
 __asm__("\n\t.global @InterlockedDecrement@4\n\t"
 	"@InterlockedDecrement@4:\n\t"
 	"movl $-1,%eax\n\t"
-	LOCK"xaddl %eax,(%ecx)\n\t"
+	LOCK
+	"xaddl %eax,(%ecx)\n\t"
 	"decl %eax\n\t"
 	"ret\n\t");
 
@@ -282,7 +306,7 @@
 InterlockedDecrement(PLONG Addend)
 {
 	__asm mov eax, -1
-	__asm xadd [ecx], eax
+	__asm LOCK xadd [ecx], eax
 	__asm dec eax
 	__asm ret
 }
@@ -307,7 +331,8 @@
 
 __asm__("\n\t.global @InterlockedExchange@8\n\t"
 	"@InterlockedExchange@8:\n\t"
-	LOCK"xchgl %edx,(%ecx)\n\t"
+	LOCK
+	"xchgl %edx,(%ecx)\n\t"
 	"movl  %edx,%eax\n\t"
 	"ret\n\t");
 
@@ -320,7 +345,7 @@
 InterlockedExchange(PLONG Target,
 		    LONG Value)
 {
-	__asm xchg [ecx], edx
+	__asm LOCK xchg [ecx], edx
 	__asm mov eax, edx
 	__asm ret
 }
@@ -343,7 +368,8 @@
 
 __asm__("\n\t.global @InterlockedExchangeAdd@8\n\t"
 	"@InterlockedExchangeAdd@8:\n\t"
-	LOCK"xaddl %edx,(%ecx)\n\t"
+	LOCK
+	"xaddl %edx,(%ecx)\n\t"
 	"movl %edx,%eax\n\t"
 	"ret\n\t");
 
@@ -356,7 +382,7 @@
 InterlockedExchangeAdd(PLONG Addend,
 		       LONG Value)
 {
-	__asm xadd [ecx], edx
+	__asm LOCK xadd [ecx], edx
 	__asm mov eax, edx
 	__asm ret
 }
@@ -380,7 +406,8 @@
 __asm__("\n\t.global @InterlockedCompareExchange@12\n\t"
 	"@InterlockedCompareExchange@12:\n\t"
 	"movl 4(%esp),%eax\n\t"
-	LOCK"cmpxchg %edx,(%ecx)\n\t"
+	LOCK
+	"cmpxchg %edx,(%ecx)\n\t"
 	"ret $4\n\t");
 
 #elif defined(_MSC_VER)
@@ -392,7 +419,7 @@
 			   LONG Comperand)
 {
 	__asm mov eax, Comperand
-	__asm cmpxchg [ecx], edx
+	__asm LOCK cmpxchg [ecx], edx
 	__asm ret 4
 }
 
@@ -418,7 +445,8 @@
 	"\n1:\t"
 	"movl (%esi),%eax\n\t"
 	"movl 4(%esi),%edx\n\t"
-	LOCK"cmpxchg8b (%esi)\n\t"
+	LOCK
+	"cmpxchg8b (%esi)\n\t"
 	"jnz 1b\n\t"
 	"popl %esi\n\t"
 	"popl %ebx\n\t"
@@ -447,7 +475,8 @@
 	"movl 12(%esp),%edx\n\t"
 	"movl (%edx),%eax\n\t"
 	"movl 4(%edx),%edx\n\t"
-	LOCK"cmpxchg8b (%esi)\n\t"
+	LOCK
+	"cmpxchg8b (%esi)\n\t"
 	"popl %esi\n\t"
 	"popl %ebx\n\t"
 	"ret  $4\n\t");

Modified: trunk/reactos/ntoskrnl/include/internal/i386/ke.h
--- trunk/reactos/ntoskrnl/include/internal/i386/ke.h	2005-01-01 11:11:52 UTC (rev 12687)
+++ trunk/reactos/ntoskrnl/include/internal/i386/ke.h	2005-01-01 11:18:54 UTC (rev 12688)
@@ -192,6 +192,13 @@
 VOID
 NtEarlyInitVdm(VOID);
 
+#ifdef MP
+#define LOCK "lock ; "
+#else
+#define LOCK ""
+#endif
+
+
 #if defined(__GNUC__)
 #define Ke386DisableInterrupts() __asm__("cli\n\t");
 #define Ke386EnableInterrupts()  __asm__("sti\n\t");
@@ -219,6 +226,33 @@
 #define Ke386GetCr4()            _Ke386GetCr(4)
 #define Ke386SetCr4(X)           _Ke386SetCr(4,X)
 
+static inline LONG Ke386TestAndClearBit(ULONG BitPos, volatile PULONG Addr)
+{
+	LONG OldBit;
+
+	__asm__ __volatile__(LOCK 
+	                     "btrl %2,%1\n\t"
+	                     "sbbl %0,%0\n\t"
+		             :"=r" (OldBit),"=m" (*Addr)
+		             :"Ir" (BitPos) 
+			     : "memory");
+	return OldBit;
+}
+
+static inline LONG Ke386TestAndSetBit(ULONG BitPos, volatile PULONG Addr)
+{
+	LONG OldBit;
+
+	__asm__ __volatile__(LOCK
+	                     "btsl %2,%1\n\t"
+	                     "sbbl %0,%0\n\t"
+		             :"=r" (OldBit),"=m" (*Addr)
+		             :"Ir" (BitPos) 
+			     : "memory");
+	return OldBit;
+}
+
+
 static inline void Ki386Cpuid(ULONG Op, PULONG Eax, PULONG Ebx, PULONG Ecx, PULONG Edx)
 {
     __asm__("cpuid"