Author: tkreuzer
Date: Fri Jan  1 00:45:36 2010
New Revision: 44840
URL: 
http://svn.reactos.org/svn/reactos?rev=44840&view=rev
Log:
[HAL]
Replace the asm implementations of HalpAcquireSystemHardwareSpinLock and
HalpReleaseCmosSpinLock with C implementations. The old ones didn't work on SMP, as
they were only compiled once as UP.
Modified:
    branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/systimer.S
    branches/ros-amd64-bringup/reactos/hal/halx86/generic/cmos.c
    branches/ros-amd64-bringup/reactos/hal/halx86/generic/i386/systimer.S
Modified: branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/systimer.S
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/hal/h…
==============================================================================
--- branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/systimer.S [iso-8859-1]
(original)
+++ branches/ros-amd64-bringup/reactos/hal/halx86/generic/amd64/systimer.S [iso-8859-1]
Fri Jan  1 00:45:36 2010
@@ -14,9 +14,6 @@
 .data
-_UnhandledMsg:
-    .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx!!!\n"
-
 .global _MsgUnimplemented
 _MsgUnimplemented:
 .asciz "WARNING:  %s at %s:%d is UNIMPLEMENTED!\n"
@@ -26,18 +23,6 @@
 .text
 .code64
-
-.global _HalpReleaseCmosSpinLock
-.func HalpReleaseCmosSpinLock
-_HalpReleaseCmosSpinLock:
-
-.endfunc
-
-.global _HalpAcquireSystemHardwareSpinLock
-.func HalpAcquireSystemHardwareSpinLock
-_HalpAcquireSystemHardwareSpinLock:
-
-.endfunc
 .global _HalpCalibrateStallExecution@0
 .func HalpCalibrateStallExecution@0
Modified: branches/ros-amd64-bringup/reactos/hal/halx86/generic/cmos.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/hal/h…
==============================================================================
--- branches/ros-amd64-bringup/reactos/hal/halx86/generic/cmos.c [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/hal/halx86/generic/cmos.c [iso-8859-1] Fri Jan  1
00:45:36 2010
@@ -5,6 +5,7 @@
  * PURPOSE:         CMOS Access Routines (Real Time Clock and LastKnownGood)
  * PROGRAMMERS:     Alex Ionescu (alex.ionescu(a)reactos.org)
  *                  Eric Kohl (ekohl(a)abo.rhein-zeitung.de)
+ *                  Timo Kreuzer (timo.kreuzer(a)reactos.org)
  */
 /* INCLUDES ******************************************************************/
@@ -17,8 +18,50 @@
 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, short wait and try again */
+        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
Modified: branches/ros-amd64-bringup/reactos/hal/halx86/generic/i386/systimer.S
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/hal/h…
==============================================================================
--- branches/ros-amd64-bringup/reactos/hal/halx86/generic/i386/systimer.S [iso-8859-1]
(original)
+++ branches/ros-amd64-bringup/reactos/hal/halx86/generic/i386/systimer.S [iso-8859-1] Fri
Jan  1 00:45:36 2010
@@ -17,82 +17,11 @@
 _HalpLastPerfCounterHigh:   .long 0
 _HalpPerfCounterLow:        .long 0
 _HalpPerfCounterHigh:       .long 0
-_HalpSystemHardwareFlags:   .long 0
 _UnhandledMsg:
     .asciz "\n\x7\x7!!! Unhandled or Unexpected Code at line: %lx!!!\n"
 /* FUNCTIONS *****************************************************************/
-
-.global _HalpReleaseCmosSpinLock@0
-.func HalpReleaseCmosSpinLock@0
-_HalpReleaseCmosSpinLock@0:
-
-#ifdef CONFIG_SMP
-    /* Save clobbered register */
-    push eax
-
-    /* Push saved EFLAGS */
-    push _HalpSystemHardwareFlags
-
-    /* Release the lock */
-    lea eax, _HalpSystemHardwareLock
-    RELEASE_SPINLOCK(eax)
-
-    /* Restore EFLAGS */
-    popf
-
-    /* Return */
-    pop eax
-    ret
-#else
-    /* Restore EFLAGS and return */
-    push _HalpSystemHardwareFlags
-    popf
-    ret
-#endif
-
-.endfunc
-
-.global _HalpAcquireSystemHardwareSpinLock@0
-.func HalpAcquireSystemHardwareSpinLock@0
-_HalpAcquireSystemHardwareSpinLock@0:
-
-#ifdef CONFIG_SMP
-    /* Save clobbered register */
-    push eax
-
-HardwareLock:
-    /* Save EFLAGS and disable interrupts */
-    pushf
-    cli
-
-    /* This is the CMOS lock, acquire it */
-    lea eax, _HalpSystemHardwareLock
-    ACQUIRE_SPINLOCK(eax, CmosSpin)
-
-    /* We have it, return the flags */
-    pop _HalpSystemHardwareFlags
-    pop eax
-    ret
-
-CmosSpin:
-
-    /* Restore EFLAGS */
-    pushf _HalpSystemHardwareLock
-    popf
-
-    /* Spin */
-    SPIN_ON_LOCK(eax, HardwareLock)
-#else
-    /* Save EFLAGS, disable interrupts and return */
-    pushf
-    cli
-    pop _HalpSystemHardwareFlags
-    ret
-#endif
-
-.endfunc
 .global _HalpCalibrateStallExecution@0
 .func HalpCalibrateStallExecution@0