diff --git a/reactos/hal/halx86/directory.rbuild b/reactos/hal/halx86/directory.rbuild index 4d5a2199bd5..e10afdc1dc9 100644 --- a/reactos/hal/halx86/directory.rbuild +++ b/reactos/hal/halx86/directory.rbuild @@ -4,6 +4,7 @@ + diff --git a/reactos/hal/halx86/generic/cmos.c b/reactos/hal/halx86/generic/cmos.c index abcf18f970a..fcede5dac6d 100644 --- a/reactos/hal/halx86/generic/cmos.c +++ b/reactos/hal/halx86/generic/cmos.c @@ -16,54 +16,10 @@ /* GLOBALS *******************************************************************/ -KSPIN_LOCK HalpSystemHardwareLock; UCHAR HalpCmosCenturyOffset; -ULONG HalpSystemHardwareFlags; /* PRIVATE FUNCTIONS *********************************************************/ -VOID -NTAPI -HalpAcquireSystemHardwareSpinLock(VOID) -{ - ULONG Flags; - - /* Get flags and disable interrupts */ - Flags = __readeflags(); - _disable(); - - /* Try to acquire the lock */ - while (InterlockedBitTestAndSet((PLONG)&HalpSystemHardwareLock, 0)) - { - /* Lock is held, spin until it's free */ - while (*(volatile ULONG*)HalpSystemHardwareLock & 1) - YieldProcessor(); - } - - /* We have the lock, save the flags now */ - HalpSystemHardwareFlags = Flags; -} - -VOID -NTAPI -HalpReleaseCmosSpinLock(VOID) -{ - ULONG Flags; - - /* Get the flags */ - Flags = HalpSystemHardwareFlags; - - /* Release lock and check if we owned it */ - if (!InterlockedBitTestAndReset((PLONG)&HalpSystemHardwareLock, 0)) - { - /* The spin lock was not owned! */ - KeBugCheckEx(SPIN_LOCK_NOT_OWNED, 0, 0, 0, 0); - } - - /* Restore the flags */ - __writeeflags(Flags); -} - FORCEINLINE UCHAR HalpReadCmos(IN UCHAR Reg) diff --git a/reactos/hal/halx86/up/spinlock.c b/reactos/hal/halx86/generic/spinlock.c similarity index 70% rename from reactos/hal/halx86/up/spinlock.c rename to reactos/hal/halx86/generic/spinlock.c index ef0672688fc..6febfdafcd0 100644 --- a/reactos/hal/halx86/up/spinlock.c +++ b/reactos/hal/halx86/generic/spinlock.c @@ -4,6 +4,7 @@ * FILE: hal/halx86/up/spinlock.c * PURPOSE: Spinlock and Queued Spinlock Support * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * Timo Kreuzer (timo.kreuzer@reactos.org) */ /* INCLUDES ******************************************************************/ @@ -15,106 +16,20 @@ #define NDEBUG #include +#include + #undef KeAcquireSpinLock #undef KeReleaseSpinLock -// -// This is duplicated from ke_x.h -// -#ifdef CONFIG_SMP -// -// Spinlock Acquisition at IRQL >= DISPATCH_LEVEL -// -FORCEINLINE -VOID -KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock) -{ - /* Make sure that we don't own the lock already */ - if (((KSPIN_LOCK)KeGetCurrentThread() | 1) == *SpinLock) - { - /* We do, bugcheck! */ - KeBugCheckEx(SPIN_LOCK_ALREADY_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0); - } +/* GLOBALS *******************************************************************/ - for (;;) - { - /* Try to acquire it */ - if (InterlockedBitTestAndSet((PLONG)SpinLock, 0)) - { - /* Value changed... wait until it's locked */ - while (*(volatile KSPIN_LOCK *)SpinLock == 1) - { -#ifdef DBG - /* On debug builds, we use a much slower but useful routine */ - //Kii386SpinOnSpinLock(SpinLock, 5); - - /* FIXME: Do normal yield for now */ - YieldProcessor(); -#else - /* Otherwise, just yield and keep looping */ - YieldProcessor(); -#endif - } - } - else - { -#ifdef DBG - /* On debug builds, we OR in the KTHREAD */ - *SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1; -#endif - /* All is well, break out */ - break; - } - } -} - -// -// Spinlock Release at IRQL >= DISPATCH_LEVEL -// -FORCEINLINE -VOID -KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock) -{ -#ifdef DBG - /* Make sure that the threads match */ - if (((KSPIN_LOCK)KeGetCurrentThread() | 1) != *SpinLock) - { - /* They don't, bugcheck */ - KeBugCheckEx(SPIN_LOCK_NOT_OWNED, (ULONG_PTR)SpinLock, 0, 0, 0); - } -#endif - /* Clear the lock */ - InterlockedAnd((PLONG)SpinLock, 0); -} - -#else - -// -// Spinlock Acquire at IRQL >= DISPATCH_LEVEL -// -FORCEINLINE -VOID -KxAcquireSpinLock(IN PKSPIN_LOCK SpinLock) -{ - /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */ - UNREFERENCED_PARAMETER(SpinLock); -} - -// -// Spinlock Release at IRQL >= DISPATCH_LEVEL -// -FORCEINLINE -VOID -KxReleaseSpinLock(IN PKSPIN_LOCK SpinLock) -{ - /* On UP builds, spinlocks don't exist at IRQL >= DISPATCH */ - UNREFERENCED_PARAMETER(SpinLock); -} - -#endif +ULONG HalpSystemHardwareFlags; +KSPIN_LOCK HalpSystemHardwareLock; /* FUNCTIONS *****************************************************************/ +#ifdef _M_IX86 + /* * @implemented */ @@ -347,3 +262,39 @@ KeLowerIrql(KIRQL NewIrql) /* Call the fastcall function */ KfLowerIrql(NewIrql); } + +#endif + +VOID +NTAPI +HalpAcquireSystemHardwareSpinLock(VOID) +{ + ULONG Flags; + + /* Get flags and disable interrupts */ + Flags = __readeflags(); + _disable(); + + /* Acquire the lock */ + KxAcquireSpinLock(&HalpSystemHardwareLock); + + /* We have the lock, save the flags now */ + HalpSystemHardwareFlags = Flags; +} + +VOID +NTAPI +HalpReleaseCmosSpinLock(VOID) +{ + ULONG Flags; + + /* Get the flags */ + Flags = HalpSystemHardwareFlags; + + /* Release the lock */ + KxReleaseSpinLock(&HalpSystemHardwareLock); + + /* Restore the flags */ + __writeeflags(Flags); +} + diff --git a/reactos/hal/halx86/hal_generic_mp.rbuild b/reactos/hal/halx86/hal_generic_mp.rbuild new file mode 100644 index 00000000000..ef15e7dcaa6 --- /dev/null +++ b/reactos/hal/halx86/hal_generic_mp.rbuild @@ -0,0 +1,18 @@ + + + + + include + include + + + + spinlock.c + + + + irq.S + + + + diff --git a/reactos/hal/halx86/hal_generic_up.rbuild b/reactos/hal/halx86/hal_generic_up.rbuild index 81f8e7e5457..b9c40a2b4b0 100644 --- a/reactos/hal/halx86/hal_generic_up.rbuild +++ b/reactos/hal/halx86/hal_generic_up.rbuild @@ -5,11 +5,13 @@ include include + + spinlock.c + processor.c irq.S - spinlock.c diff --git a/reactos/hal/halx86/halmps.rbuild b/reactos/hal/halx86/halmps.rbuild index 35c2556ba2e..c462e7911a6 100644 --- a/reactos/hal/halx86/halmps.rbuild +++ b/reactos/hal/halx86/halmps.rbuild @@ -9,6 +9,7 @@ hal_generic + hal_generic_mp ntoskrnl apic.c @@ -22,7 +23,6 @@ mps.S mpsboot.asm - spinlock.c diff --git a/reactos/hal/halx86/mp/i386/spinlock.c b/reactos/hal/halx86/mp/i386/spinlock.c deleted file mode 100644 index 40be47d6daa..00000000000 --- a/reactos/hal/halx86/mp/i386/spinlock.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/hal/x86/spinlock.c - * PURPOSE: Implements spinlocks - * PROGRAMMER: David Welch (welch@cwcom.net) - * Eric Kohl (ekohl@rz-online.de) - * UPDATE HISTORY: - * 09/06/2000 Created - */ - -/* - * NOTE: On a uniprocessor machine spinlocks are implemented by raising - * the irq level - */ - -/* INCLUDES ****************************************************************/ - -#include -#define NDEBUG -#include - -/* Hmm, needed for KDBG := 1. Why? */ -#undef KeGetCurrentIrql - -/* FUNCTIONS ***************************************************************/ - -#undef KeAcquireSpinLock -VOID NTAPI -KeAcquireSpinLock ( - PKSPIN_LOCK SpinLock, - PKIRQL OldIrql - ) -/* - * FUNCTION: Acquires a spinlock - * ARGUMENTS: - * SpinLock = Spinlock to acquire - * OldIrql (OUT) = Caller supplied storage for the previous irql - */ -{ - *OldIrql = KfAcquireSpinLock(SpinLock); -} - -KIRQL FASTCALL -KeAcquireSpinLockRaiseToSynch ( - PKSPIN_LOCK SpinLock - ) -{ - KIRQL OldIrql; - - OldIrql = KfRaiseIrql(CLOCK2_LEVEL); - KiAcquireSpinLock(SpinLock); - - return OldIrql; -} - -#undef KeReleaseSpinLock -VOID NTAPI -KeReleaseSpinLock ( - PKSPIN_LOCK SpinLock, - KIRQL NewIrql - ) -/* - * FUNCTION: Releases a spinlock - * ARGUMENTS: - * SpinLock = Spinlock to release - * NewIrql = Irql level before acquiring the spinlock - */ -{ - KfReleaseSpinLock(SpinLock, NewIrql); -} - -LOGICAL -FASTCALL -KeTryToAcquireQueuedSpinLock( - KSPIN_LOCK_QUEUE_NUMBER LockNumber, - PKIRQL OldIrql) -{ - UNIMPLEMENTED; - - return FALSE; -} - - -BOOLEAN -FASTCALL -KeTryToAcquireQueuedSpinLockRaiseToSynch( - KSPIN_LOCK_QUEUE_NUMBER LockNumber, - PKIRQL OldIrql) -{ - UNIMPLEMENTED; - - return FALSE; -} - -KIRQL FASTCALL -KfAcquireSpinLock ( - PKSPIN_LOCK SpinLock - ) -{ - KIRQL OldIrql; - - ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); - - OldIrql = KfRaiseIrql(DISPATCH_LEVEL); - KiAcquireSpinLock(SpinLock); - - return OldIrql; -} - -VOID FASTCALL -KfReleaseSpinLock ( - PKSPIN_LOCK SpinLock, - KIRQL NewIrql - ) -/* - * FUNCTION: Releases a spinlock - * ARGUMENTS: - * SpinLock = Spinlock to release - * NewIrql = Irql level before acquiring the spinlock - */ -{ - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL || KeGetCurrentIrql() == SYNCH_LEVEL); - KiReleaseSpinLock(SpinLock); - KfLowerIrql(NewIrql); -} - - -/* - * @unimplemented - */ -VOID -FASTCALL -KeAcquireInStackQueuedSpinLock( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -VOID -FASTCALL -KeAcquireInStackQueuedSpinLockRaiseToSynch( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle - ) -{ - UNIMPLEMENTED; -} - - -/* - * @unimplemented - */ -VOID -FASTCALL -KeReleaseInStackQueuedSpinLock( - IN PKLOCK_QUEUE_HANDLE LockHandle - ) -{ - UNIMPLEMENTED; -} - -/* - * @unimplemented - */ -KIRQL -FASTCALL -KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number) -{ - UNIMPLEMENTED; - return 0; -} - -/* - * @unimplemented - */ -KIRQL -FASTCALL -KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) -{ - UNIMPLEMENTED; - return 0; -} - -/* - * @unimplemented - */ -VOID -FASTCALL -KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number, - IN KIRQL OldIrql) -{ - UNIMPLEMENTED; -} - -/* EOF */