- 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"