From 22c0da4ef9db00bbda381463ebaf830fe4086e7d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 26 Jul 2011 14:00:08 +0000 Subject: [PATCH] [NTOSKRNL] - Inline KeDisableInterrupts - Make ExInterlocked* functions portable svn path=/trunk/; revision=52897 --- reactos/ntoskrnl/CMakeLists.txt | 4 +- reactos/ntoskrnl/ex/amd64/fastinterlck.c | 114 ----- reactos/ntoskrnl/ex/fastinterlck.c | 460 ------------------- reactos/ntoskrnl/ex/{i386 => }/interlocked.c | 100 ++-- reactos/ntoskrnl/include/internal/amd64/ke.h | 25 + reactos/ntoskrnl/include/internal/arm/ke.h | 25 + reactos/ntoskrnl/include/internal/i386/ke.h | 25 + reactos/ntoskrnl/include/internal/ke.h | 6 - reactos/ntoskrnl/ke/arm/cpu.c | 27 +- reactos/ntoskrnl/ke/i386/cpu.c | 16 - reactos/ntoskrnl/ntoskrnl-generic.rbuild | 8 +- 11 files changed, 129 insertions(+), 681 deletions(-) delete mode 100644 reactos/ntoskrnl/ex/amd64/fastinterlck.c delete mode 100644 reactos/ntoskrnl/ex/fastinterlck.c rename reactos/ntoskrnl/ex/{i386 => }/interlocked.c (82%) diff --git a/reactos/ntoskrnl/CMakeLists.txt b/reactos/ntoskrnl/CMakeLists.txt index 84c5778f89c..f970b480d41 100644 --- a/reactos/ntoskrnl/CMakeLists.txt +++ b/reactos/ntoskrnl/CMakeLists.txt @@ -83,12 +83,12 @@ list(APPEND SOURCE ex/event.c ex/evtpair.c ex/exintrin.c - ex/fastinterlck.c ex/fmutex.c ex/handle.c ex/harderr.c ex/hdlsterm.c ex/init.c + ex/interlocked.c ex/keyedevt.c ex/locale.c ex/lookas.c @@ -277,7 +277,6 @@ if(ARCH MATCHES i386) list(APPEND SOURCE config/i386/cmhardwr.c ex/i386/fastinterlck_asm.S - ex/i386/interlocked.c ex/i386/ioport.S ke/i386/abios.c ke/i386/cpu.c @@ -305,7 +304,6 @@ if(ARCH MATCHES i386) elseif(ARCH MATCHES amd64) list(APPEND SOURCE config/i386/cmhardwr.c - ex/amd64/fastinterlck.c ke/amd64/boot.S ke/amd64/context.c ke/amd64/cpu.c diff --git a/reactos/ntoskrnl/ex/amd64/fastinterlck.c b/reactos/ntoskrnl/ex/amd64/fastinterlck.c deleted file mode 100644 index b9ca32aab1b..00000000000 --- a/reactos/ntoskrnl/ex/amd64/fastinterlck.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: ntoskrnl/ex/fastinterlck.c - * PURPOSE: Portable Ex*Interlocked and REGISTER routines for amd64 - * PROGRAMMERS: ReactOS Portable Systems Group - * Timo Kreuzer - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include - -#undef ExInterlockedAddLargeInteger -#undef ExInterlockedAddUlong -#undef ExInterlockedExtendZone -#undef ExInterlockedInsertHeadList -#undef ExInterlockedInsertTailList -#undef ExInterlockedPopEntryList -#undef ExInterlockedPushEntryList -#undef ExInterlockedRemoveHeadList -#undef ExpInterlockedFlushSList -#undef ExpInterlockedPopEntrySList -#undef ExpInterlockedPushEntrySList - -/* FUNCTIONS ******************************************************************/ - -LARGE_INTEGER -ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend, - IN LARGE_INTEGER Increment, - IN PKSPIN_LOCK Lock) -{ - LARGE_INTEGER Int; - Int.QuadPart = _InterlockedExchangeAdd64(&Addend->QuadPart, - Increment.QuadPart); - return Int; -} - -ULONG -ExInterlockedAddUlong(IN PULONG Addend, - IN ULONG Increment, - PKSPIN_LOCK Lock) -{ - return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment); -} - -PLIST_ENTRY -ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink; - InsertHeadList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PLIST_ENTRY -ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink; - InsertTailList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PSINGLE_LIST_ENTRY -ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PSINGLE_LIST_ENTRY FirstEntry; - KeAcquireSpinLock(Lock, &OldIrql); - FirstEntry = PopEntryList(ListHead); - KeReleaseSpinLock(Lock, OldIrql); - return FirstEntry; -} - -PSINGLE_LIST_ENTRY -ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PSINGLE_LIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - OldHead = ListHead->Next; - PushEntryList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PLIST_ENTRY -ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = RemoveHeadList(ListHead); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - diff --git a/reactos/ntoskrnl/ex/fastinterlck.c b/reactos/ntoskrnl/ex/fastinterlck.c deleted file mode 100644 index d16968a0ea0..00000000000 --- a/reactos/ntoskrnl/ex/fastinterlck.c +++ /dev/null @@ -1,460 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: ntoskrnl/ex/fastinterlck.c - * PURPOSE: Portable Ex*Interlocked and REGISTER routines for non-x86 - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#if defined(_ARM_) || defined(_PPC_) || defined(NTOS_USE_GENERICS) - -#include -#define NDEBUG -#include - -#undef ExInterlockedPushEntrySList -#undef ExInterlockedPopEntrySList -#undef ExInterlockedAddULong -#undef ExInterlockedIncrementLong -#undef ExInterlockedDecrementLong -#undef ExInterlockedAddLargeStatistic - -/* FUNCTIONS ******************************************************************/ - -PSLIST_ENTRY -NTAPI -InterlockedPushEntrySList(IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry) -{ - - PSINGLE_LIST_ENTRY FirstEntry, NextEntry; - PSINGLE_LIST_ENTRY Entry = (PVOID)ListEntry, Head = (PVOID)ListHead; - - FirstEntry = Head->Next; - do - { - Entry->Next = FirstEntry; - NextEntry = FirstEntry; - FirstEntry = (PVOID)_InterlockedCompareExchange((PLONG)Head, - (LONG)Entry, - (LONG)FirstEntry); - } while (FirstEntry != NextEntry); - - return FirstEntry; -} - -PSLIST_ENTRY -NTAPI -InterlockedPopEntrySList(IN PSLIST_HEADER ListHead) -{ - PSINGLE_LIST_ENTRY FirstEntry, NextEntry, Head = (PVOID)ListHead; - - FirstEntry = Head->Next; - do - { - if (!FirstEntry) return NULL; - - NextEntry = FirstEntry; - FirstEntry = (PVOID)_InterlockedCompareExchange((PLONG)Head, - (LONG)FirstEntry->Next, - (LONG)FirstEntry); - } while (FirstEntry != NextEntry); - - return FirstEntry; -} - -PSINGLE_LIST_ENTRY -FASTCALL -ExInterlockedFlushSList(IN PSLIST_HEADER ListHead) -{ - return (PVOID)_InterlockedExchange((PLONG)&ListHead->Next.Next, (LONG)NULL); -} - -PSLIST_ENTRY -FASTCALL -ExInterlockedPushEntrySList(IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - return InterlockedPushEntrySList(ListHead, ListEntry); -} - -PSINGLE_LIST_ENTRY -NTAPI -ExInterlockedPopEntrySList(IN PSLIST_HEADER ListHead, - IN PKSPIN_LOCK Lock) -{ - return InterlockedPopEntrySList(ListHead); -} - -ULONG -FASTCALL -ExfInterlockedAddUlong(IN PULONG Addend, - IN ULONG Increment, - PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - KeAcquireSpinLock(Lock, &OldIrql); - *Addend += Increment; - KeReleaseSpinLock(Lock, OldIrql); - return *Addend; -} - -LONGLONG -FASTCALL -ExfInterlockedCompareExchange64(IN OUT LONGLONG volatile *Destination, - IN PLONGLONG Exchange, - IN PLONGLONG Comparand) -{ - LONGLONG Result; - - Result = *Destination; - if (*Destination == *Comparand) *Destination = *Exchange; - return Result; -} - -PLIST_ENTRY -FASTCALL -ExfInterlockedInsertHeadList(IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink; - InsertHeadList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PLIST_ENTRY -FASTCALL -ExfInterlockedInsertTailList(IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink; - InsertTailList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PSINGLE_LIST_ENTRY -FASTCALL -ExfInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ - UNIMPLEMENTED; - return NULL; -} - -PSINGLE_LIST_ENTRY -FASTCALL -ExfInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - UNIMPLEMENTED; - return NULL; -} - -PLIST_ENTRY -FASTCALL -ExfInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ - return ExInterlockedRemoveHeadList(ListHead, Lock); -} - -LARGE_INTEGER -NTAPI -ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend, - IN LARGE_INTEGER Increment, - IN PKSPIN_LOCK Lock) -{ - LARGE_INTEGER Integer = {{0}}; - UNIMPLEMENTED; - return Integer; -} - -ULONG -NTAPI -ExInterlockedAddUlong(IN PULONG Addend, - IN ULONG Increment, - PKSPIN_LOCK Lock) -{ - return (ULONG)_InterlockedExchangeAdd((PLONG)Addend, Increment); -} - -INTERLOCKED_RESULT -NTAPI -ExInterlockedIncrementLong(IN PLONG Addend, - IN PKSPIN_LOCK Lock) -{ - return _InterlockedIncrement(Addend); -} - -INTERLOCKED_RESULT -NTAPI -ExInterlockedDecrementLong(IN PLONG Addend, - IN PKSPIN_LOCK Lock) -{ - return _InterlockedDecrement(Addend); -} - -ULONG -NTAPI -ExInterlockedExchangeUlong(IN PULONG Target, - IN ULONG Value, - IN PKSPIN_LOCK Lock) -{ - return (ULONG)_InterlockedExchange((PLONG)Target, Value); -} - -PLIST_ENTRY -NTAPI -ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = ListEntry->Flink; - InsertHeadList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PLIST_ENTRY -NTAPI -ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = ListEntry->Blink; - InsertTailList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PSINGLE_LIST_ENTRY -NTAPI -ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PSINGLE_LIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - OldHead = PopEntryList(ListHead); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PSINGLE_LIST_ENTRY -NTAPI -ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PSINGLE_LIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - OldHead = ListHead->Next; - PushEntryList(ListHead, ListEntry); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -PLIST_ENTRY -NTAPI -ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - PLIST_ENTRY OldHead = NULL; - KeAcquireSpinLock(Lock, &OldIrql); - if (!IsListEmpty(ListHead)) OldHead = RemoveHeadList(ListHead); - KeReleaseSpinLock(Lock, OldIrql); - return OldHead; -} - -VOID -FASTCALL -ExInterlockedAddLargeStatistic(IN PLONGLONG Addend, - IN ULONG Increment) -{ - UNIMPLEMENTED; -} - -LONGLONG -FASTCALL -ExInterlockedCompareExchange64(IN OUT LONGLONG volatile *Destination, - IN PLONGLONG Exchange, - IN PLONGLONG Comparand, - IN PKSPIN_LOCK Lock) -{ - KIRQL OldIrql; - LONGLONG Result; - - KeAcquireSpinLock(Lock, &OldIrql); - Result = *Destination; - if (*Destination == *Comparand) *Destination = *Exchange; - KeReleaseSpinLock(Lock, OldIrql); - return Result; -} - -VOID -NTAPI -READ_REGISTER_BUFFER_UCHAR(IN PUCHAR Register, - IN PUCHAR Buffer, - IN ULONG Count) -{ - PUCHAR registerBuffer = Register; - PUCHAR readBuffer = Buffer; - ULONG readCount; - - for (readCount = Count; readCount--; readBuffer++, registerBuffer++) - { - *readBuffer = *(volatile UCHAR * const)registerBuffer; - } -} - -VOID -NTAPI -READ_REGISTER_BUFFER_ULONG(IN PULONG Register, - IN PULONG Buffer, - IN ULONG Count) -{ - PULONG registerBuffer = Register; - PULONG readBuffer = Buffer; - ULONG readCount; - - for (readCount = Count; readCount--; readBuffer++, registerBuffer++) - { - *readBuffer = *(volatile ULONG * const)registerBuffer; - } -} - -VOID -NTAPI -READ_REGISTER_BUFFER_USHORT(IN PUSHORT Register, - IN PUSHORT Buffer, - IN ULONG Count) -{ - PUSHORT registerBuffer = Register; - PUSHORT readBuffer = Buffer; - ULONG readCount; - - for (readCount = Count; readCount--; readBuffer++, registerBuffer++) - { - *readBuffer = *(volatile USHORT * const)registerBuffer; - } -} - -UCHAR -NTAPI -READ_REGISTER_UCHAR(IN PUCHAR Register) -{ - return *(volatile UCHAR * const)Register; -} - -ULONG -NTAPI -READ_REGISTER_ULONG(IN PULONG Register) -{ - return *(volatile ULONG * const)Register; -} - -USHORT -NTAPI -READ_REGISTER_USHORT(IN PUSHORT Register) -{ - return *(volatile USHORT * const)Register; -} - -VOID -NTAPI -WRITE_REGISTER_BUFFER_UCHAR(IN PUCHAR Register, - IN PUCHAR Buffer, - IN ULONG Count) -{ - PUCHAR registerBuffer = Register; - PUCHAR writeBuffer = Buffer; - ULONG writeCount; - for (writeCount = Count; writeCount--; writeBuffer++, registerBuffer++) - { - *(volatile UCHAR * const)registerBuffer = *writeBuffer; - } - KeFlushWriteBuffer(); -} - -VOID -NTAPI -WRITE_REGISTER_BUFFER_ULONG(IN PULONG Register, - IN PULONG Buffer, - IN ULONG Count) -{ - PULONG registerBuffer = Register; - PULONG writeBuffer = Buffer; - ULONG writeCount; - for (writeCount = Count; writeCount--; writeBuffer++, registerBuffer++) - { - *(volatile ULONG * const)registerBuffer = *writeBuffer; - } - KeFlushWriteBuffer(); -} - -VOID -NTAPI -WRITE_REGISTER_BUFFER_USHORT(IN PUSHORT Register, - IN PUSHORT Buffer, - IN ULONG Count) -{ - PUSHORT registerBuffer = Register; - PUSHORT writeBuffer = Buffer; - ULONG writeCount; - for (writeCount = Count; writeCount--; writeBuffer++, registerBuffer++) - { - *(volatile USHORT * const)registerBuffer = *writeBuffer; - } - KeFlushWriteBuffer(); -} - -VOID -NTAPI -WRITE_REGISTER_UCHAR(IN PUCHAR Register, - IN UCHAR Value) -{ - *(volatile UCHAR * const)Register = Value; - KeFlushWriteBuffer(); -} - -VOID -NTAPI -WRITE_REGISTER_ULONG(IN PULONG Register, - IN ULONG Value) -{ - *(volatile ULONG * const)Register = Value; - KeFlushWriteBuffer(); -} - -VOID -NTAPI -WRITE_REGISTER_USHORT(IN PUSHORT Register, - IN USHORT Value) -{ - *(volatile USHORT * const)Register = Value; - KeFlushWriteBuffer(); -} - -#endif diff --git a/reactos/ntoskrnl/ex/i386/interlocked.c b/reactos/ntoskrnl/ex/interlocked.c similarity index 82% rename from reactos/ntoskrnl/ex/i386/interlocked.c rename to reactos/ntoskrnl/ex/interlocked.c index 2e17271e047..65b3872bee2 100644 --- a/reactos/ntoskrnl/ex/i386/interlocked.c +++ b/reactos/ntoskrnl/ex/interlocked.c @@ -27,41 +27,35 @@ /* FUNCTIONS ****************************************************************/ -#if defined(_M_IX86 ) || defined(_M_AMD64) FORCEINLINE -ULONG_PTR +BOOLEAN _ExiDisableInteruptsAndAcquireSpinlock( IN OUT PKSPIN_LOCK Lock) { - UINT_PTR EFlags; - - /* Save flags */ - EFlags = __readeflags(); + BOOLEAN Enabled; /* Disable interrupts */ - _disable(); + Enabled = KeDisableInterrupts(); /* Acquire the spinlock (inline) */ KxAcquireSpinLock(Lock); - return EFlags; + return Enabled; } FORCEINLINE VOID _ExiReleaseSpinLockAndRestoreInterupts( IN OUT PKSPIN_LOCK Lock, - ULONG_PTR EFlags) + BOOLEAN Enable) { /* Release the spinlock */ KxReleaseSpinLock(Lock); - /* Restore flags */ - __writeeflags(EFlags); + /* Restore interrupts */ + KeRestoreInterrupts(Enable); } -#else -#error Unimplemented -#endif + LARGE_INTEGER NTAPI @@ -71,10 +65,10 @@ ExInterlockedAddLargeInteger( IN OUT PKSPIN_LOCK Lock) { LARGE_INTEGER OldValue; - ULONG_PTR LockHandle; + BOOLEAN Enable; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the old value */ OldValue.QuadPart = Addend->QuadPart; @@ -83,7 +77,7 @@ ExInterlockedAddLargeInteger( Addend->QuadPart += Increment.QuadPart; /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old value */ return OldValue; @@ -96,11 +90,11 @@ ExInterlockedAddUlong( IN ULONG Increment, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; ULONG OldValue; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the old value */ OldValue = *Addend; @@ -109,7 +103,7 @@ ExInterlockedAddUlong( *Addend += Increment; /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old value */ return OldValue; @@ -122,11 +116,11 @@ ExInterlockedInsertHeadList( IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PLIST_ENTRY FirstEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the first entry */ FirstEntry = ListHead->Flink; @@ -135,7 +129,7 @@ ExInterlockedInsertHeadList( InsertHeadList(ListHead, ListEntry); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old first entry or NULL for empty list */ return (FirstEntry == ListHead) ? NULL : FirstEntry; @@ -148,11 +142,11 @@ ExInterlockedInsertTailList( IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PLIST_ENTRY LastEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the last entry */ LastEntry = ListHead->Blink; @@ -161,7 +155,7 @@ ExInterlockedInsertTailList( InsertTailList(ListHead, ListEntry); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old last entry or NULL for empty list */ return (LastEntry == ListHead) ? NULL : LastEntry; @@ -173,11 +167,11 @@ ExInterlockedRemoveHeadList( IN OUT PLIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PLIST_ENTRY ListEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Check if the list is empty */ if (IsListEmpty(ListHead)) @@ -192,7 +186,7 @@ ExInterlockedRemoveHeadList( } /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the entry */ return ListEntry; @@ -204,17 +198,17 @@ ExInterlockedPopEntryList( IN OUT PSINGLE_LIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PSINGLE_LIST_ENTRY ListEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Pop the first entry from the list */ ListEntry = PopEntryList(ListHead); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the entry */ return ListEntry; @@ -227,11 +221,11 @@ ExInterlockedPushEntryList( IN OUT PSINGLE_LIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PSINGLE_LIST_ENTRY OldListEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the old top entry */ OldListEntry = ListHead->Next; @@ -240,7 +234,7 @@ ExInterlockedPushEntryList( PushEntryList(ListHead, ListEntry); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the entry */ return OldListEntry; @@ -293,11 +287,11 @@ ExfInterlockedAddUlong( IN ULONG Increment, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; ULONG OldValue; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the old value */ OldValue = *Addend; @@ -306,7 +300,7 @@ ExfInterlockedAddUlong( *Addend += Increment; /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old value */ return OldValue; @@ -319,11 +313,11 @@ ExfInterlockedInsertHeadList( IN PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PLIST_ENTRY FirstEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the first entry */ FirstEntry = ListHead->Flink; @@ -332,7 +326,7 @@ ExfInterlockedInsertHeadList( InsertHeadList(ListHead, ListEntry); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old first entry or NULL for empty list */ return (FirstEntry == ListHead) ? NULL : FirstEntry; @@ -345,11 +339,11 @@ ExfInterlockedInsertTailList( IN PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PLIST_ENTRY LastEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the last entry */ LastEntry = ListHead->Blink; @@ -358,7 +352,7 @@ ExfInterlockedInsertTailList( InsertTailList(ListHead, ListEntry); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* Return the old last entry or NULL for empty list */ return (LastEntry == ListHead) ? NULL : LastEntry; @@ -371,11 +365,11 @@ ExfInterlockedRemoveHeadList( IN OUT PLIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PLIST_ENTRY ListEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Check if the list is empty */ if (IsListEmpty(ListHead)) @@ -390,7 +384,7 @@ ExfInterlockedRemoveHeadList( } /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* return the entry */ return ListEntry; @@ -402,17 +396,17 @@ ExfInterlockedPopEntryList( IN OUT PSINGLE_LIST_ENTRY ListHead, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PSINGLE_LIST_ENTRY ListEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Pop the first entry from the list */ ListEntry = PopEntryList(ListHead); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* return the entry */ return ListEntry; @@ -425,11 +419,11 @@ ExfInterlockedPushEntryList( IN PSINGLE_LIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock) { - ULONG_PTR LockHandle; + BOOLEAN Enable; PSINGLE_LIST_ENTRY OldListEntry; /* Disable interrupts and acquire the spinlock */ - LockHandle = _ExiDisableInteruptsAndAcquireSpinlock(Lock); + Enable = _ExiDisableInteruptsAndAcquireSpinlock(Lock); /* Save the old top entry */ OldListEntry = ListHead->Next; @@ -438,7 +432,7 @@ ExfInterlockedPushEntryList( PushEntryList(ListHead, ListEntry); /* Release the spinlock and restore interrupts */ - _ExiReleaseSpinLockAndRestoreInterupts(Lock, LockHandle); + _ExiReleaseSpinLockAndRestoreInterupts(Lock, Enable); /* return the entry */ return OldListEntry; diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index bbad6b89771..f0ab9086abb 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -134,6 +134,31 @@ extern ULONG KeI386CpuStep; #define KeGetTrapFrameInterruptState(TrapFrame) \ BooleanFlagOn((TrapFrame)->EFlags, EFLAGS_INTERRUPT_MASK) +/* Diable interrupts and return whether they were enabled before */ +BOOLEAN +NTAPI +KeDisableInterrupts(VOID) +{ + ULONG Flags; + BOOLEAN Return; + + /* Get EFLAGS and check if the interrupt bit is set */ + Flags = __readeflags(); + Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE; + + /* Disable interrupts */ + _disable(); + return Return; +} + +/* Restore previous interrupt state */ +FORCEINLINE +VOID +KeRestoreInterrupts(BOOLEAN WereEnabled) +{ + if (WereEnabled) _enable(); +} + // // Invalidates the TLB entry for a specified address // diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h index 3fbe4eb3ad9..1b5f72c6a94 100644 --- a/reactos/ntoskrnl/include/internal/arm/ke.h +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -65,6 +65,31 @@ // //#define KeGetTrapFrameInterruptState(TrapFrame) +FORCEINLINE +BOOLEAN +KeDisableInterrupts(VOID) +{ + ARM_STATUS_REGISTER Flags; + + // + // Get current interrupt state and disable interrupts + // + Flags = KeArmStatusRegisterGet(); + _disable(); + + // + // Return previous interrupt state + // + return Flags.IrqDisable; +} + +FORCEINLINE +VOID +KeRestoreInterrupts(BOOLEAN WereEnabled) +{ + if (WereEnabled) _enable(); +} + // // Invalidates the TLB entry for a specified address // diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 8abc50f0fd1..4f5ffc603d4 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -164,6 +164,31 @@ typedef struct _KV8086_STACK_FRAME KV86_FRAME V86Frame; } KV8086_STACK_FRAME, *PKV8086_STACK_FRAME; +/* Diable interrupts and return whether they were enabled before */ +FORCEINLINE +BOOLEAN +KeDisableInterrupts(VOID) +{ + ULONG Flags; + BOOLEAN Return; + + /* Get EFLAGS and check if the interrupt bit is set */ + Flags = __readeflags(); + Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE; + + /* Disable interrupts */ + _disable(); + return Return; +} + +/* Restore previous interrupt state */ +FORCEINLINE +VOID +KeRestoreInterrupts(BOOLEAN WereEnabled) +{ + if (WereEnabled) _enable(); +} + // // Registers an interrupt handler with an IDT vector // diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 86ea126aec5..1dbb1f48e28 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -1033,12 +1033,6 @@ VOID NTAPI KeThawExecution(IN BOOLEAN Enable); -BOOLEAN -NTAPI -KeDisableInterrupts( - VOID -); - VOID FASTCALL KeAcquireQueuedSpinLockAtDpcLevel( diff --git a/reactos/ntoskrnl/ke/arm/cpu.c b/reactos/ntoskrnl/ke/arm/cpu.c index 37d8a1569fd..5b458517cf1 100644 --- a/reactos/ntoskrnl/ke/arm/cpu.c +++ b/reactos/ntoskrnl/ke/arm/cpu.c @@ -90,23 +90,6 @@ KeInvalidateAllCaches(VOID) return TRUE; } -BOOLEAN -NTAPI -KeDisableInterrupts(VOID) -{ - ARM_STATUS_REGISTER Flags; - - // - // Get current interrupt state and disable interrupts - // - Flags = KeArmStatusRegisterGet(); - _disable(); - - // - // Return previous interrupt state - // - return Flags.IrqDisable; -} /* PUBLIC FUNCTIONS ***********************************************************/ @@ -130,17 +113,17 @@ KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors) { KIRQL OldIrql; - + // // Raise the IRQL for the TB Flush // OldIrql = KeRaiseIrqlToSynchLevel(); - + // // Flush the TB for the Current CPU // KeFlushCurrentTb(); - + // // Return to Original IRQL // @@ -168,7 +151,7 @@ NTAPI KeQueryActiveProcessors(VOID) { PAGED_CODE(); - + // // Simply return the number of active processors // @@ -186,7 +169,7 @@ KeSaveStateForHibernate(IN PKPROCESSOR_STATE State) // Capture the context // RtlCaptureContext(&State->ContextFrame); - + // // Capture the control state // diff --git a/reactos/ntoskrnl/ke/i386/cpu.c b/reactos/ntoskrnl/ke/i386/cpu.c index 0fd2dcc459d..74c1043fe0a 100644 --- a/reactos/ntoskrnl/ke/i386/cpu.c +++ b/reactos/ntoskrnl/ke/i386/cpu.c @@ -1173,22 +1173,6 @@ KiI386PentiumLockErrataFixup(VOID) MmSetPageProtect(NULL, NewIdt, PAGE_READONLY); } -BOOLEAN -NTAPI -KeDisableInterrupts(VOID) -{ - ULONG Flags; - BOOLEAN Return; - - /* Get EFLAGS and check if the interrupt bit is set */ - Flags = __readeflags(); - Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE; - - /* Disable interrupts */ - _disable(); - return Return; -} - BOOLEAN NTAPI KeInvalidateAllCaches(VOID) diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index 6e40777ae0d..ab24126b800 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -218,16 +218,10 @@ - interlocked.c fastinterlck_asm.S ioport.S - - - fastinterlck.c - - atom.c callback.c dbgctrl.c @@ -235,12 +229,12 @@ event.c evtpair.c exintrin.c - fastinterlck.c fmutex.c handle.c harderr.c hdlsterm.c init.c + interlocked.c keyedevt.c locale.c lookas.c