Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenspinlock.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS HAL 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: hal/halx86/up/spinlock.c 00005 * PURPOSE: Spinlock and Queued Spinlock Support 00006 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 /* This file is compiled twice. Once for UP and once for MP */ 00012 00013 #include <hal.h> 00014 #define NDEBUG 00015 #include <debug.h> 00016 00017 #include <internal/spinlock.h> 00018 00019 #undef KeAcquireSpinLock 00020 #undef KeReleaseSpinLock 00021 00022 /* GLOBALS *******************************************************************/ 00023 00024 ULONG_PTR HalpSystemHardwareFlags; 00025 KSPIN_LOCK HalpSystemHardwareLock; 00026 00027 /* FUNCTIONS *****************************************************************/ 00028 00029 #ifdef _M_IX86 00030 00031 /* 00032 * @implemented 00033 */ 00034 KIRQL 00035 FASTCALL 00036 KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) 00037 { 00038 KIRQL OldIrql; 00039 00040 /* Raise to sync */ 00041 KeRaiseIrql(SYNCH_LEVEL, &OldIrql); 00042 00043 /* Acquire the lock and return */ 00044 KxAcquireSpinLock(SpinLock); 00045 return OldIrql; 00046 } 00047 00048 /* 00049 * @implemented 00050 */ 00051 KIRQL 00052 FASTCALL 00053 KfAcquireSpinLock(PKSPIN_LOCK SpinLock) 00054 { 00055 KIRQL OldIrql; 00056 00057 /* Raise to dispatch and acquire the lock */ 00058 KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); 00059 KxAcquireSpinLock(SpinLock); 00060 return OldIrql; 00061 } 00062 00063 /* 00064 * @implemented 00065 */ 00066 VOID 00067 FASTCALL 00068 KfReleaseSpinLock(PKSPIN_LOCK SpinLock, 00069 KIRQL OldIrql) 00070 { 00071 /* Release the lock and lower IRQL back */ 00072 KxReleaseSpinLock(SpinLock); 00073 KeLowerIrql(OldIrql); 00074 } 00075 00076 /* 00077 * @implemented 00078 */ 00079 KIRQL 00080 FASTCALL 00081 KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) 00082 { 00083 KIRQL OldIrql; 00084 00085 /* Raise to dispatch */ 00086 KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); 00087 00088 /* Acquire the lock */ 00089 KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK 00090 return OldIrql; 00091 } 00092 00093 /* 00094 * @implemented 00095 */ 00096 KIRQL 00097 FASTCALL 00098 KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) 00099 { 00100 KIRQL OldIrql; 00101 00102 /* Raise to synch */ 00103 KeRaiseIrql(SYNCH_LEVEL, &OldIrql); 00104 00105 /* Acquire the lock */ 00106 KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK 00107 return OldIrql; 00108 } 00109 00110 /* 00111 * @implemented 00112 */ 00113 VOID 00114 FASTCALL 00115 KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, 00116 IN PKLOCK_QUEUE_HANDLE LockHandle) 00117 { 00118 /* Set up the lock */ 00119 LockHandle->LockQueue.Next = NULL; 00120 LockHandle->LockQueue.Lock = SpinLock; 00121 00122 /* Raise to dispatch */ 00123 KeRaiseIrql(DISPATCH_LEVEL, &LockHandle->OldIrql); 00124 00125 /* Acquire the lock */ 00126 KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK 00127 } 00128 00129 /* 00130 * @implemented 00131 */ 00132 VOID 00133 FASTCALL 00134 KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, 00135 IN PKLOCK_QUEUE_HANDLE LockHandle) 00136 { 00137 /* Set up the lock */ 00138 LockHandle->LockQueue.Next = NULL; 00139 LockHandle->LockQueue.Lock = SpinLock; 00140 00141 /* Raise to synch */ 00142 KeRaiseIrql(SYNCH_LEVEL, &LockHandle->OldIrql); 00143 00144 /* Acquire the lock */ 00145 KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK 00146 } 00147 00148 /* 00149 * @implemented 00150 */ 00151 VOID 00152 FASTCALL 00153 KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, 00154 IN KIRQL OldIrql) 00155 { 00156 /* Release the lock */ 00157 KxReleaseSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK 00158 00159 /* Lower IRQL back */ 00160 KeLowerIrql(OldIrql); 00161 } 00162 00163 /* 00164 * @implemented 00165 */ 00166 VOID 00167 FASTCALL 00168 KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) 00169 { 00170 /* Simply lower IRQL back */ 00171 KxReleaseSpinLock(LockHandle->LockQueue.Lock); // HACK 00172 KeLowerIrql(LockHandle->OldIrql); 00173 } 00174 00175 /* 00176 * @implemented 00177 */ 00178 BOOLEAN 00179 FASTCALL 00180 KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, 00181 IN PKIRQL OldIrql) 00182 { 00183 #ifdef CONFIG_SMP 00184 ASSERT(FALSE); // FIXME: Unused 00185 while (TRUE); 00186 #endif 00187 00188 /* Simply raise to synch */ 00189 KeRaiseIrql(SYNCH_LEVEL, OldIrql); 00190 00191 /* Add an explicit memory barrier to prevent the compiler from reordering 00192 memory accesses across the borders of spinlocks */ 00193 KeMemoryBarrierWithoutFence(); 00194 00195 /* Always return true on UP Machines */ 00196 return TRUE; 00197 } 00198 00199 /* 00200 * @implemented 00201 */ 00202 LOGICAL 00203 FASTCALL 00204 KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, 00205 OUT PKIRQL OldIrql) 00206 { 00207 #ifdef CONFIG_SMP 00208 ASSERT(FALSE); // FIXME: Unused 00209 while (TRUE); 00210 #endif 00211 00212 /* Simply raise to dispatch */ 00213 KeRaiseIrql(DISPATCH_LEVEL, OldIrql); 00214 00215 /* Add an explicit memory barrier to prevent the compiler from reordering 00216 memory accesses across the borders of spinlocks */ 00217 KeMemoryBarrierWithoutFence(); 00218 00219 /* Always return true on UP Machines */ 00220 return TRUE; 00221 } 00222 00223 #endif 00224 00225 VOID 00226 NTAPI 00227 HalpAcquireCmosSpinLock(VOID) 00228 { 00229 ULONG_PTR Flags; 00230 00231 /* Get flags and disable interrupts */ 00232 Flags = __readeflags(); 00233 _disable(); 00234 00235 /* Acquire the lock */ 00236 KxAcquireSpinLock(&HalpSystemHardwareLock); 00237 00238 /* We have the lock, save the flags now */ 00239 HalpSystemHardwareFlags = Flags; 00240 } 00241 00242 VOID 00243 NTAPI 00244 HalpReleaseCmosSpinLock(VOID) 00245 { 00246 ULONG_PTR Flags; 00247 00248 /* Get the flags */ 00249 Flags = HalpSystemHardwareFlags; 00250 00251 /* Release the lock */ 00252 KxReleaseSpinLock(&HalpSystemHardwareLock); 00253 00254 /* Restore the flags */ 00255 __writeeflags(Flags); 00256 } 00257 Generated on Tue May 22 2012 04:32:41 for ReactOS by
1.7.6.1
|