Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257/* * PROJECT: ReactOS HAL * LICENSE: GPL - See COPYING in the top level directory * FILE: hal/halx86/generic/spinlock.c * PURPOSE: Spinlock and Queued Spinlock Support * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */
/* INCLUDES ******************************************************************/
/* This file is compiled twice. Once for UP and once for MP */
#include <hal.h>#define NDEBUG#include <debug.h>
#include <internal/spinlock.h>
#undef KeAcquireSpinLock#undef KeReleaseSpinLock
/* GLOBALS *******************************************************************/
ULONG_PTR HalpSystemHardwareFlags;KSPIN_LOCK HalpSystemHardwareLock;
/* FUNCTIONS *****************************************************************/
#ifdef _M_IX86
#ifdef _MINIHAL_VOIDFASTCALLKefAcquireSpinLockAtDpcLevel( IN PKSPIN_LOCK SpinLock){#if DBG /* To be on par with HAL/NTOSKRNL */ *SpinLock = (KSPIN_LOCK)KeGetCurrentThread() | 1;#endif}#endif /* defined(_MINIHAL_) */
/* * @implemented */KIRQLFASTCALLKeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock){ KIRQL OldIrql;
/* Raise to sync */ KeRaiseIrql(SYNCH_LEVEL, &OldIrql);
/* Acquire the lock and return */ KxAcquireSpinLock(SpinLock); return OldIrql;}
/* * @implemented */KIRQLFASTCALLKfAcquireSpinLock(PKSPIN_LOCK SpinLock){ KIRQL OldIrql;
/* Raise to dispatch and acquire the lock */ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); KxAcquireSpinLock(SpinLock); return OldIrql;}
/* * @implemented */VOIDFASTCALLKfReleaseSpinLock(PKSPIN_LOCK SpinLock, KIRQL OldIrql){ /* Release the lock and lower IRQL back */ KxReleaseSpinLock(SpinLock); KeLowerIrql(OldIrql);}
/* * @implemented */KIRQLFASTCALLKeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber){ KIRQL OldIrql;
/* Raise to dispatch */ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
/* Acquire the lock */ KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK return OldIrql;}
/* * @implemented */KIRQLFASTCALLKeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber){ KIRQL OldIrql;
/* Raise to synch */ KeRaiseIrql(SYNCH_LEVEL, &OldIrql);
/* Acquire the lock */ KxAcquireSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK return OldIrql;}
/* * @implemented */VOIDFASTCALLKeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle){ /* Set up the lock */ LockHandle->LockQueue.Next = NULL; LockHandle->LockQueue.Lock = SpinLock;
/* Raise to dispatch */ KeRaiseIrql(DISPATCH_LEVEL, &LockHandle->OldIrql);
/* Acquire the lock */ KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK}
/* * @implemented */VOIDFASTCALLKeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle){ /* Set up the lock */ LockHandle->LockQueue.Next = NULL; LockHandle->LockQueue.Lock = SpinLock;
/* Raise to synch */ KeRaiseIrql(SYNCH_LEVEL, &LockHandle->OldIrql);
/* Acquire the lock */ KxAcquireSpinLock(LockHandle->LockQueue.Lock); // HACK}
/* * @implemented */VOIDFASTCALLKeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN KIRQL OldIrql){ /* Release the lock */ KxReleaseSpinLock(KeGetCurrentPrcb()->LockQueue[LockNumber].Lock); // HACK
/* Lower IRQL back */ KeLowerIrql(OldIrql);}
/* * @implemented */VOIDFASTCALLKeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle){ /* Simply lower IRQL back */ KxReleaseSpinLock(LockHandle->LockQueue.Lock); // HACK KeLowerIrql(LockHandle->OldIrql);}
#ifndef _MINIHAL_/* * @implemented */BOOLEANFASTCALLKeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN PKIRQL OldIrql){ PKSPIN_LOCK Lock = KeGetCurrentPrcb()->LockQueue[LockNumber].Lock;
/* KM tests demonstrate that this raises IRQL even if locking fails */ KeRaiseIrql(SYNCH_LEVEL, OldIrql); /* HACK */ return KeTryToAcquireSpinLockAtDpcLevel(Lock);}
/* * @implemented */LOGICALFASTCALLKeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, OUT PKIRQL OldIrql){ PKSPIN_LOCK Lock = KeGetCurrentPrcb()->LockQueue[LockNumber].Lock;
/* KM tests demonstrate that this raises IRQL even if locking fails */ KeRaiseIrql(DISPATCH_LEVEL, OldIrql); /* HACK */ return KeTryToAcquireSpinLockAtDpcLevel(Lock);}#endif /* !defined(_MINIHAL_) */
#endif /* defined(_M_IX86) */
VOIDNTAPIHalpAcquireCmosSpinLock(VOID){ ULONG_PTR Flags;
/* Get flags and disable interrupts */ Flags = __readeflags(); _disable();
/* Acquire the lock */ KxAcquireSpinLock(&HalpSystemHardwareLock);
/* We have the lock, save the flags now */ HalpSystemHardwareFlags = Flags;}
VOIDNTAPIHalpReleaseCmosSpinLock(VOID){ ULONG_PTR Flags;
/* Get the flags */ Flags = HalpSystemHardwareFlags;
/* Release the lock */ KxReleaseSpinLock(&HalpSystemHardwareLock);
/* Restore the flags */ __writeeflags(Flags);}