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 */