3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: hal/halx86/up/spinlock.c
5 * PURPOSE: Spinlock and Queued Spinlock Support
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
15 #undef KeAcquireSpinLock
16 #undef KeReleaseSpinLock
18 /* FUNCTIONS *****************************************************************/
24 KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock
)
29 KeRaiseIrql(SYNCH_LEVEL
, &OldIrql
);
31 /* Acquire the lock and return */
32 KxAcquireSpinLock(SpinLock
);
41 KeAcquireSpinLockRaiseToDpc(PKSPIN_LOCK SpinLock
)
45 /* Raise to dispatch */
46 KeRaiseIrql(DISPATCH_LEVEL
, &OldIrql
);
48 /* Acquire the lock and return */
49 KxAcquireSpinLock(SpinLock
);
58 KeReleaseSpinLock(PKSPIN_LOCK SpinLock
,
61 /* Release the lock and lower IRQL back */
62 KxReleaseSpinLock(SpinLock
);
70 KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber
)
74 /* Raise to dispatch */
75 KeRaiseIrql(DISPATCH_LEVEL
, &OldIrql
);
77 /* Acquire the lock */
78 KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue
[LockNumber
].Lock
); // HACK
86 KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber
)
91 KeRaiseIrql(SYNCH_LEVEL
, &OldIrql
);
93 /* Acquire the lock */
94 KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue
[LockNumber
].Lock
); // HACK
102 KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock
,
103 IN PKLOCK_QUEUE_HANDLE LockHandle
)
105 /* Set up the lock */
106 LockHandle
->LockQueue
.Next
= NULL
;
107 LockHandle
->LockQueue
.Lock
= SpinLock
;
109 /* Raise to dispatch */
110 KeRaiseIrql(DISPATCH_LEVEL
, &LockHandle
->OldIrql
);
112 /* Acquire the lock */
113 KxAcquireSpinLock(LockHandle
->LockQueue
.Lock
); // HACK
121 KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock
,
122 IN PKLOCK_QUEUE_HANDLE LockHandle
)
124 /* Set up the lock */
125 LockHandle
->LockQueue
.Next
= NULL
;
126 LockHandle
->LockQueue
.Lock
= SpinLock
;
129 KeRaiseIrql(SYNCH_LEVEL
, &LockHandle
->OldIrql
);
131 /* Acquire the lock */
132 KxAcquireSpinLock(LockHandle
->LockQueue
.Lock
); // HACK
140 KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber
,
143 /* Release the lock */
144 KxReleaseSpinLock(KeGetCurrentPrcb()->LockQueue
[LockNumber
].Lock
); // HACK
146 /* Lower IRQL back */
147 KeLowerIrql(OldIrql
);
155 KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle
)
157 /* Simply lower IRQL back */
158 KxReleaseSpinLock(LockHandle
->LockQueue
.Lock
); // HACK
159 KeLowerIrql(LockHandle
->OldIrql
);
167 KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber
,
171 /* Simply raise to dispatch */
172 KeRaiseIrql(DISPATCH_LEVEL
, OldIrql
);
174 /* Add an explicit memory barrier to prevent the compiler from reordering
175 memory accesses across the borders of spinlocks */
176 KeMemoryBarrierWithoutFence();
178 /* Always return true on UP Machines */
190 KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber
,
194 /* Simply raise to dispatch */
195 KeRaiseIrql(DISPATCH_LEVEL
, OldIrql
);
197 /* Add an explicit memory barrier to prevent the compiler from reordering
198 memory accesses across the borders of spinlocks */
199 KeMemoryBarrierWithoutFence();
201 /* Always return true on UP Machines */