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/ha... ============================================================================== --- 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/ha... ============================================================================== --- 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@reactos.org) * Eric Kohl (ekohl@abo.rhein-zeitung.de) + * Timo Kreuzer (timo.kreuzer@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/ha... ============================================================================== --- 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