Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
164ff0c135
|
|||
|
f538d035e2
|
@@ -150,21 +150,23 @@ typedef enum _KTHREAD_STATE
|
||||
typedef enum _KSPIN_LOCK_QUEUE_LEVEL
|
||||
{
|
||||
DispatcherLock,
|
||||
UnusedSpareLock,
|
||||
ExpansionLock,
|
||||
PfnLock,
|
||||
SystemSpaceLock,
|
||||
VacbLock,
|
||||
MasterLock,
|
||||
NonPagedPoolLock,
|
||||
NonPagedAllocPoolLock,
|
||||
IoCancelLock,
|
||||
WorkQueueLock,
|
||||
IoVpbLock,
|
||||
IoDatabaseLock,
|
||||
IoCompletionLock,
|
||||
FsStructLock,
|
||||
FileSystemLock,
|
||||
AfdWorkQueueLock,
|
||||
BcbLock,
|
||||
MmNonPagedPoolLock,
|
||||
NonPagedPoolLock,
|
||||
ReservedSystemLock,
|
||||
TimerTableLock,
|
||||
MaximumLock
|
||||
} KSPIN_LOCK_QUEUE_LEVEL, *PKSPIN_LOCK_QUEUE_LEVEL;
|
||||
|
||||
|
||||
@@ -17,12 +17,73 @@ namespace KE
|
||||
{
|
||||
class SpinLock
|
||||
{
|
||||
private:
|
||||
STATIC KSPIN_LOCK DispatcherLockQueue;
|
||||
STATIC KSPIN_LOCK ExpansionLockQueue;
|
||||
STATIC KSPIN_LOCK FileSystemLockQueue;
|
||||
STATIC KSPIN_LOCK IoCancelLockQueue;
|
||||
STATIC KSPIN_LOCK IoCompletionLockQueue;
|
||||
STATIC KSPIN_LOCK IoDatabaseLockQueue;
|
||||
STATIC KSPIN_LOCK IoVpbLockQueue;
|
||||
STATIC KSPIN_LOCK MasterLockQueue;
|
||||
STATIC KSPIN_LOCK NonPagedAllocLockQueue;
|
||||
STATIC KSPIN_LOCK NonPagedPoolLockQueue;
|
||||
STATIC KSPIN_LOCK PfnLockQueue;
|
||||
STATIC KSPIN_LOCK SystemSpaceLockQueue;
|
||||
STATIC KSPIN_LOCK TimerTableLockQueue;
|
||||
STATIC KSPIN_LOCK VacbLockQueue;
|
||||
STATIC KSPIN_LOCK WorkLockQueue;
|
||||
|
||||
public:
|
||||
STATIC XTFASTCALL VOID AcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
STATIC XTFASTCALL VOID AcquireSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
STATIC XTAPI VOID InitializeAllLocks();
|
||||
STATIC XTAPI VOID InitializeLockQueues();
|
||||
STATIC XTAPI VOID InitializeSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
STATIC XTFASTCALL VOID ReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_LEVEL LockLevel);
|
||||
STATIC XTFASTCALL VOID ReleaseSpinLock(IN OUT PKSPIN_LOCK SpinLock);
|
||||
STATIC XTFASTCALL BOOLEAN TestSpinLock(IN PKSPIN_LOCK SpinLock);
|
||||
};
|
||||
|
||||
class QueuedSpinLockGuard
|
||||
{
|
||||
private:
|
||||
KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel;
|
||||
|
||||
public:
|
||||
QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel)
|
||||
{
|
||||
QueuedLockLevel = LockLevel;
|
||||
KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel);
|
||||
}
|
||||
|
||||
~QueuedSpinLockGuard()
|
||||
{
|
||||
KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel);
|
||||
}
|
||||
|
||||
QueuedSpinLockGuard(const QueuedSpinLockGuard&) = delete;
|
||||
QueuedSpinLockGuard& operator=(const QueuedSpinLockGuard&) = delete;
|
||||
};
|
||||
|
||||
class SpinLockGuard
|
||||
{
|
||||
private:
|
||||
PKSPIN_LOCK SpinLock;
|
||||
|
||||
public:
|
||||
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
KE::SpinLock::AcquireSpinLock(SpinLock);
|
||||
}
|
||||
|
||||
~SpinLockGuard()
|
||||
{
|
||||
KE::SpinLock::ReleaseSpinLock(SpinLock);
|
||||
}
|
||||
|
||||
SpinLockGuard(const SpinLockGuard&) = delete;
|
||||
SpinLockGuard& operator=(const SpinLockGuard&) = delete;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -12,12 +12,6 @@
|
||||
/* Kernel initialization block passed by boot loader */
|
||||
PKERNEL_INITIALIZATION_BLOCK KE::BootInformation::InitializationBlock = {};
|
||||
|
||||
/* Kernel boot resources list */
|
||||
LIST_ENTRY KE::SystemResources::ResourcesListHead;
|
||||
|
||||
/* Kernel boot resources lock */
|
||||
KSPIN_LOCK KE::SystemResources::ResourcesLock;
|
||||
|
||||
/* Kernel initial process */
|
||||
EPROCESS KE::KProcess::InitialProcess;
|
||||
|
||||
@@ -26,3 +20,54 @@ ETHREAD KE::KThread::InitialThread = {};
|
||||
|
||||
/* Kernel UBSAN active frame flag */
|
||||
BOOLEAN KE::KUbsan::ActiveFrame = FALSE;
|
||||
|
||||
/* Kernel dispatcher lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::DispatcherLockQueue;
|
||||
|
||||
/* Kernel expansion lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::ExpansionLockQueue;
|
||||
|
||||
/* Kernel file system structures lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::FileSystemLockQueue;
|
||||
|
||||
/* Kernel IO cancel lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::IoCancelLockQueue;
|
||||
|
||||
/* Kernel IO completion lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::IoCompletionLockQueue;
|
||||
|
||||
/* Kernel IO database lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::IoDatabaseLockQueue;
|
||||
|
||||
/* Kernel IO VPB lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::IoVpbLockQueue;
|
||||
|
||||
/* Kernel cache master lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::MasterLockQueue;
|
||||
|
||||
/* Kernel non-paged allocator lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::NonPagedAllocLockQueue;
|
||||
|
||||
/* Kernel non-paged pool lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::NonPagedPoolLockQueue;
|
||||
|
||||
/* Kernel PFN lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::PfnLockQueue;
|
||||
|
||||
/* Kernel system space lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::SystemSpaceLockQueue;
|
||||
|
||||
/* Kernel Timer table lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::TimerTableLockQueue;
|
||||
|
||||
/* Kernel VACB lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::VacbLockQueue;
|
||||
|
||||
/* Kernel work queue lock queue */
|
||||
KSPIN_LOCK KE::SpinLock::WorkLockQueue;
|
||||
|
||||
/* Kernel boot resources list */
|
||||
LIST_ENTRY KE::SystemResources::ResourcesListHead;
|
||||
|
||||
/* Kernel boot resources lock */
|
||||
KSPIN_LOCK KE::SystemResources::ResourcesLock;
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* FILE: xtoskrnl/ke/spinlock.cc
|
||||
* DESCRIPTION: Spinlocks support
|
||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||
* Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#include <xtos.hh>
|
||||
@@ -56,6 +57,78 @@ KE::SpinLock::AcquireSpinLock(IN OUT PKSPIN_LOCK SpinLock)
|
||||
AR::CpuFunc::ReadWriteBarrier();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes all kernel spinlocks.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
KE::SpinLock::InitializeAllLocks()
|
||||
{
|
||||
/* Initialize all spin locks */
|
||||
InitializeSpinLock(&DispatcherLockQueue);
|
||||
InitializeSpinLock(&PfnLockQueue);
|
||||
InitializeSpinLock(&SystemSpaceLockQueue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes spinlock queues for current processor.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
KE::SpinLock::InitializeLockQueues()
|
||||
{
|
||||
PKPROCESSOR_CONTROL_BLOCK ControlBlock;
|
||||
|
||||
/* Get current processor control block */
|
||||
ControlBlock = KE::Processor::GetCurrentProcessorControlBlock();
|
||||
|
||||
/* Initialize PCB lock queues */
|
||||
ControlBlock->LockQueue[DispatcherLock].Lock = &DispatcherLockQueue;
|
||||
ControlBlock->LockQueue[DispatcherLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[ExpansionLock].Lock = &ExpansionLockQueue;
|
||||
ControlBlock->LockQueue[ExpansionLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[PfnLock].Lock = &PfnLockQueue;
|
||||
ControlBlock->LockQueue[PfnLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[SystemSpaceLock].Lock = &SystemSpaceLockQueue;
|
||||
ControlBlock->LockQueue[SystemSpaceLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[VacbLock].Lock = &VacbLockQueue;
|
||||
ControlBlock->LockQueue[VacbLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[MasterLock].Lock = &MasterLockQueue;
|
||||
ControlBlock->LockQueue[MasterLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[NonPagedAllocPoolLock].Lock = &NonPagedAllocLockQueue;
|
||||
ControlBlock->LockQueue[NonPagedAllocPoolLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[IoCancelLock].Lock = &IoCancelLockQueue;
|
||||
ControlBlock->LockQueue[IoCancelLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[WorkQueueLock].Lock = &WorkLockQueue;
|
||||
ControlBlock->LockQueue[WorkQueueLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[IoVpbLock].Lock = &IoVpbLockQueue;
|
||||
ControlBlock->LockQueue[IoVpbLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[IoDatabaseLock].Lock = &IoDatabaseLockQueue;
|
||||
ControlBlock->LockQueue[IoDatabaseLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[IoCompletionLock].Lock = &IoCompletionLockQueue;
|
||||
ControlBlock->LockQueue[IoCompletionLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[FileSystemLock].Lock = &FileSystemLockQueue;
|
||||
ControlBlock->LockQueue[FileSystemLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[AfdWorkQueueLock].Lock = NULLPTR;
|
||||
ControlBlock->LockQueue[AfdWorkQueueLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[BcbLock].Lock = NULLPTR;
|
||||
ControlBlock->LockQueue[BcbLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[NonPagedPoolLock].Lock = &NonPagedPoolLockQueue;
|
||||
ControlBlock->LockQueue[NonPagedPoolLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[ReservedSystemLock].Lock = NULLPTR;
|
||||
ControlBlock->LockQueue[ReservedSystemLock].Next = NULLPTR;
|
||||
ControlBlock->LockQueue[TimerTableLock].Lock = &TimerTableLockQueue;
|
||||
ControlBlock->LockQueue[TimerTableLock].Next = NULLPTR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a kernel spinlock object.
|
||||
*
|
||||
@@ -112,3 +185,29 @@ KE::SpinLock::ReleaseSpinLock(IN OUT PKSPIN_LOCK SpinLock)
|
||||
/* Add an explicit memory barrier */
|
||||
AR::CpuFunc::ReadWriteBarrier();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a kernel spin lock.
|
||||
*
|
||||
* @param SpinLock
|
||||
* Supplies a pointer to the kernel spin lock.
|
||||
*
|
||||
* @return This routine returns TRUE if the lock is free, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTFASTCALL
|
||||
BOOLEAN
|
||||
TestSpinLock(IN PKSPIN_LOCK SpinLock)
|
||||
{
|
||||
/* Check if the lock is free */
|
||||
if(*SpinLock)
|
||||
{
|
||||
/* Spinlock is busy, yield processor and return FALSE */
|
||||
AR::CpuFunc::YieldProcessor();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Spinlock is free, return TRUE */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user