stos: ke: Add initial support for spinlocks
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 2026, Chloe M.
|
||||
* Provided under the BSD-3 clause.
|
||||
*
|
||||
* Description: Spinlock primitive
|
||||
* Author: Chloe M.
|
||||
*/
|
||||
|
||||
#include <ke/spinlock.h>
|
||||
#include <hal/prim.h>
|
||||
|
||||
VOID KeSpinLockInit(SPINLOCK *Lock, const CHAR *Name)
|
||||
{
|
||||
if (Lock == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
Lock->Data = 0;
|
||||
}
|
||||
|
||||
VOID
|
||||
KeSpinLockAcquire(SPINLOCK *Lock, BOOLEAN IrqMut)
|
||||
{
|
||||
IRQL LastIrql;
|
||||
|
||||
if (Lock == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (IrqMut) {
|
||||
LastIrql = HalRaiseIrql(IRQL_CRITICAL);
|
||||
}
|
||||
|
||||
/* Acquire the lock */
|
||||
while (HalCpuAswap(&Lock->Data, 1)) {
|
||||
HalCpuSpinWait();
|
||||
}
|
||||
|
||||
if (IrqMut) {
|
||||
HalLowerIrql(LastIrql);
|
||||
}
|
||||
}
|
||||
|
||||
VOID
|
||||
KeSpinLockRelease(SPINLOCK *Lock)
|
||||
{
|
||||
if (Lock == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
HalCpuAswap(&Lock->Data, 0);
|
||||
}
|
||||
Reference in New Issue
Block a user