summaryrefslogtreecommitdiff
path: root/kernel/sync/cpu_state.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sync/cpu_state.h')
-rw-r--r--kernel/sync/cpu_state.h35
1 files changed, 35 insertions, 0 deletions
diff --git a/kernel/sync/cpu_state.h b/kernel/sync/cpu_state.h
new file mode 100644
index 0000000..1f7dde0
--- /dev/null
+++ b/kernel/sync/cpu_state.h
@@ -0,0 +1,35 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Copyright (C) 2026 Richard Qin */
+
+#pragma once
+
+/*
+ * Per-CPU Interrupt Nesting Tracker
+ *
+ * Tracks spinlock nesting depth on each CPU to ensure interrupts
+ * are only restored when the last spinlock is released.
+ *
+ * BSS-segment global array; zero-initialized by entry.S BSS clear.
+ * Reference: docs/specs/spinlock.md §3.1
+ */
+
+#include <lume/types.h>
+#include <lume/config.h>
+
+namespace sync {
+
+struct CpuSyncState {
+ int lock_depth; // Number of spinlocks held by this CPU
+ bool intr_was_on; // Were interrupts enabled before the first lock?
+};
+
+inline constexpr uint64 kInvalidCpuId = ~0ULL;
+
+// BSS-segment global array, zero-initialized by entry.S
+extern CpuSyncState g_cpu_sync_states[kMaxCpus];
+
+// Internal API — called only by Spinlock::acquire/release
+void push_intr();
+void pop_intr();
+
+} // namespace sync