From 56d0bc31ce6ac76ac3c3fca4820c3e6d441c5a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 26 May 2021 17:03:55 +0200 Subject: [PATCH] [HAL] Hack KeTryToAcquireQueuedSpinlock & KeTryToAcquireQueuedSpinLockRaiseToSynch into a somewhat working implementation --- hal/halx86/generic/spinlock.c | 37 +++++++++++------------------------ 1 file changed, 11 insertions(+), 26 deletions(-) diff --git a/hal/halx86/generic/spinlock.c b/hal/halx86/generic/spinlock.c index 2a2082ca131..4ffce2e665e 100644 --- a/hal/halx86/generic/spinlock.c +++ b/hal/halx86/generic/spinlock.c @@ -172,6 +172,7 @@ KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) KeLowerIrql(LockHandle->OldIrql); } +#ifndef _MINIHAL_ /* * @implemented */ @@ -180,20 +181,12 @@ FASTCALL KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, IN PKIRQL OldIrql) { -#ifdef CONFIG_SMP - ERROR_DBGBREAK("FIXME: Unused\n"); // FIXME: Unused - return FALSE; -#endif + PKSPIN_LOCK Lock = KeGetCurrentPrcb()->LockQueue[LockNumber].Lock; - /* Simply raise to synch */ + /* KM tests demonstrate that this raises IRQL even if locking fails */ KeRaiseIrql(SYNCH_LEVEL, OldIrql); - - /* Add an explicit memory barrier to prevent the compiler from reordering - memory accesses across the borders of spinlocks */ - KeMemoryBarrierWithoutFence(); - - /* Always return true on UP Machines */ - return TRUE; + /* HACK */ + return KeTryToAcquireSpinLockAtDpcLevel(Lock); } /* @@ -204,23 +197,15 @@ FASTCALL KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, OUT PKIRQL OldIrql) { -#ifdef CONFIG_SMP - ERROR_DBGBREAK("FIXME: Unused\n"); // FIXME: Unused - return FALSE; -#endif + PKSPIN_LOCK Lock = KeGetCurrentPrcb()->LockQueue[LockNumber].Lock; - /* Simply raise to dispatch */ + /* KM tests demonstrate that this raises IRQL even if locking fails */ KeRaiseIrql(DISPATCH_LEVEL, OldIrql); - - /* Add an explicit memory barrier to prevent the compiler from reordering - memory accesses across the borders of spinlocks */ - KeMemoryBarrierWithoutFence(); - - /* Always return true on UP Machines */ - return TRUE; + /* HACK */ + return KeTryToAcquireSpinLockAtDpcLevel(Lock); } - -#endif +#endif /* !defined(_MINIHAL_) */ +#endif /* defined(_M_IX86) */ VOID NTAPI