diff options
Diffstat (limited to 'kernel/sync/cpu_state.h')
| -rw-r--r-- | kernel/sync/cpu_state.h | 35 |
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 |
