From 93d0b2ac856d4527caf5c48dc931a8286cf3d75a Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 5 Jan 2006 13:51:06 +0000 Subject: [PATCH] - Separate UP and MP spinlock functions. - Optimize UP spinlock functions so they don't call ntoskrnl anymore and only raise/lower irql. - Implemented Queued Spinlocks and In-Stack Queued Spinlocks for UP machines. * Implemented KeAcquireInStackQueuedSpinLock, KeReleaseInStackQueuedSpinLock, KeAcquireQueuedSpinLock, KeReleaseQueuedSpinLock, KeTryToAcquireQueuedSpinLock, KeTryToAcquireQueuedSpinLockRaiseToSynch, KeAcquireQueuedSpinLockRaisetoSynch. svn path=/trunk/; revision=20575 --- reactos/hal/halx86/generic/generic.xml | 1 - reactos/hal/halx86/mp/halmp.xml | 1 + reactos/hal/halx86/{generic => mp}/spinlock.c | 0 reactos/hal/halx86/up/halup.xml | 1 + reactos/hal/halx86/up/spinlock.c | 166 ++++++++++++++++++ 5 files changed, 168 insertions(+), 1 deletion(-) rename reactos/hal/halx86/{generic => mp}/spinlock.c (100%) create mode 100644 reactos/hal/halx86/up/spinlock.c diff --git a/reactos/hal/halx86/generic/generic.xml b/reactos/hal/halx86/generic/generic.xml index 2566f0e6f0c..8d4ea809d5c 100644 --- a/reactos/hal/halx86/generic/generic.xml +++ b/reactos/hal/halx86/generic/generic.xml @@ -18,7 +18,6 @@ pci.c portio.c reboot.c - spinlock.c sysbus.c sysinfo.c time.c diff --git a/reactos/hal/halx86/mp/halmp.xml b/reactos/hal/halx86/mp/halmp.xml index 660cb138879..b2facb92013 100644 --- a/reactos/hal/halx86/mp/halmp.xml +++ b/reactos/hal/halx86/mp/halmp.xml @@ -20,5 +20,6 @@ mpsirql.c processor_mp.c resource_mp.c + spinlock.c halmp.rc diff --git a/reactos/hal/halx86/generic/spinlock.c b/reactos/hal/halx86/mp/spinlock.c similarity index 100% rename from reactos/hal/halx86/generic/spinlock.c rename to reactos/hal/halx86/mp/spinlock.c diff --git a/reactos/hal/halx86/up/halup.xml b/reactos/hal/halx86/up/halup.xml index eb550f562e1..d07deb6b956 100644 --- a/reactos/hal/halx86/up/halup.xml +++ b/reactos/hal/halx86/up/halup.xml @@ -11,5 +11,6 @@ hal_generic_pc ntoskrnl halinit_up.c + spinlock.c halup.rc diff --git a/reactos/hal/halx86/up/spinlock.c b/reactos/hal/halx86/up/spinlock.c new file mode 100644 index 00000000000..4ff00d3303a --- /dev/null +++ b/reactos/hal/halx86/up/spinlock.c @@ -0,0 +1,166 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntoskrnl/hal/halx86/up/spinlock.c + * PURPOSE: Implements spinlocks + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + +/* INCLUDES ****************************************************************/ + +#include +#define NDEBUG +#include + +#undef KeAcquireSpinLock +#undef KeReleaseSpinLock + +/* FUNCTIONS ***************************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +KeAcquireSpinLock(PKSPIN_LOCK SpinLock, + PKIRQL OldIrql) +{ + /* Call the fastcall function */ + *OldIrql = KfAcquireSpinLock(SpinLock); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +NTAPI +KeReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL NewIrql) +{ + /* Call the fastcall function */ + KfReleaseSpinLock(SpinLock, NewIrql); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KfAcquireSpinLock(PKSPIN_LOCK SpinLock) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KfReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL OldIrql) +{ + /* Simply lower IRQL back */ + KfLowerIrql(OldIrql); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireQueuedSpinLockRaiseToSynch(IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeReleaseQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle, + IN KIRQL OldIrql) +{ + /* Simply lower IRQL back */ + KfLowerIrql(OldIrql); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply lower IRQL back */ + KfLowerIrql(LockHandle->OldIrql); +} + +/* + * @implemented + */ +BOOLEAN +FASTCALL +KeTryToAcquireQueuedSpinLockRaiseToSynch(IN PKLOCK_QUEUE_HANDLE LockHandle, + IN PKIRQL OldIrql) +{ + /* Simply raise to dispatch */ + *OldIrql = KfRaiseIrql(DISPATCH_LEVEL); + + /* Always return true on UP Machines */ + return TRUE; +} + +/* + * @implemented + */ +BOOLEAN +FASTCALL +KeTryToAcquireQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle, + IN PKIRQL OldIrql) +{ + /* Simply raise to dispatch */ + *OldIrql = KfRaiseIrql(DISPATCH_LEVEL); + + /* Always return true on UP Machines */ + return TRUE; +} + + +/* EOF */