From b5c2ba80f70ce4dafdc32e326124fda6de0ef428 Mon Sep 17 00:00:00 2001 From: "Chloe M." Date: Tue, 23 Jun 2026 22:20:11 +0000 Subject: [PATCH] stos: ke: Add initial support for spinlocks Signed-off-by: Chloe M. --- paw/stos/head/ke/spinlock.h | 48 +++++++++++++++++++++++++++++++++ paw/stos/ke/Makefile | 1 + paw/stos/ke/synch/spinlock.c | 52 ++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 paw/stos/head/ke/spinlock.h create mode 100644 paw/stos/ke/synch/spinlock.c diff --git a/paw/stos/head/ke/spinlock.h b/paw/stos/head/ke/spinlock.h new file mode 100644 index 0000000..061a088 --- /dev/null +++ b/paw/stos/head/ke/spinlock.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Spinlock primitive + * Author: Chloe M. + */ + +#ifndef _KE_SPINLOCK_H_ +#define _KE_SPINLOCK_H_ 1 + +#include +#include + +/* + * Represents a spinlock that may be acquired for mutual + * exclusion of threads. + * + * @Data: Spinlock data (must be zero on init) + */ +typedef struct { + UQUAD Data; +} SPINLOCK; + +/* + * Initialize a spinlock + * + * @Lock: Spinlock to initialize + * @Name: Name of spinlock + */ +VOID KeSpinLockInit(SPINLOCK *Lock, const CHAR *Name); + +/* + * Acquire a spinlock + * + * @Lock: Lock to acquire + * @IrqMut: If true, mututate IRQ state upon acquisition + */ +VOID KeSpinLockAcquire(SPINLOCK *Lock, BOOLEAN IrqMut); + +/* + * Release a spinlock + * + * @Lock: Spinlock to release + */ +VOID KeSpinLockRelease(SPINLOCK *Lock); + +#endif /* !_KE_SPINLOCK_H_ */ diff --git a/paw/stos/ke/Makefile b/paw/stos/ke/Makefile index 2857632..df70295 100644 --- a/paw/stos/ke/Makefile +++ b/paw/stos/ke/Makefile @@ -17,6 +17,7 @@ CFILES += $(shell find ../drivers -name "*.c") CFILES += $(shell find ../mm -name "*.c") CFILES += $(shell find ../ex -name "*.c") CFILES += $(shell find bpal -name "*.c") +CFILES += $(shell find synch -name "*.c") DFILES = $(CFILES:.c=.d) OFILES = $(CFILES:.c=.o) diff --git a/paw/stos/ke/synch/spinlock.c b/paw/stos/ke/synch/spinlock.c new file mode 100644 index 0000000..5f7ab35 --- /dev/null +++ b/paw/stos/ke/synch/spinlock.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2026, Chloe M. + * Provided under the BSD-3 clause. + * + * Description: Spinlock primitive + * Author: Chloe M. + */ + +#include +#include + +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); +}