diff --git a/Kernel/Debug.h.in b/Kernel/Debug.h.in index aa2b30d043c..78820e6848d 100644 --- a/Kernel/Debug.h.in +++ b/Kernel/Debug.h.in @@ -166,6 +166,10 @@ #cmakedefine01 LOCK_DEBUG #endif +#ifndef LOCK_IN_CRITICAL_DEBUG +#cmakedefine01 LOCK_IN_CRITICAL_DEBUG +#endif + #ifndef LOCK_RESTORE_DEBUG #cmakedefine01 LOCK_RESTORE_DEBUG #endif diff --git a/Kernel/Locking/Mutex.cpp b/Kernel/Locking/Mutex.cpp index 829001958ba..14ad0f70eda 100644 --- a/Kernel/Locking/Mutex.cpp +++ b/Kernel/Locking/Mutex.cpp @@ -18,6 +18,8 @@ void Mutex::lock(Mode mode, [[maybe_unused]] LockLocation const& location) // NOTE: This may be called from an interrupt handler (not an IRQ handler) // and also from within critical sections! VERIFY(!Processor::current_in_irq()); + if constexpr (LOCK_IN_CRITICAL_DEBUG) + VERIFY_INTERRUPTS_ENABLED(); VERIFY(mode != Mode::Unlocked); auto current_thread = Thread::current(); @@ -143,6 +145,8 @@ void Mutex::unlock() { // NOTE: This may be called from an interrupt handler (not an IRQ handler) // and also from within critical sections! + if constexpr (LOCK_IN_CRITICAL_DEBUG) + VERIFY_INTERRUPTS_ENABLED(); VERIFY(!Processor::current_in_irq()); auto current_thread = Thread::current(); SpinlockLocker lock(m_lock); @@ -198,6 +202,8 @@ void Mutex::unlock() void Mutex::block(Thread& current_thread, Mode mode, SpinlockLocker>& lock, u32 requested_locks) { + if constexpr (LOCK_IN_CRITICAL_DEBUG) + VERIFY_INTERRUPTS_ENABLED(); auto& blocked_thread_list = thread_list_for_mode(mode); VERIFY(!blocked_thread_list.contains(current_thread)); blocked_thread_list.append(current_thread); diff --git a/Meta/CMake/all_the_debug_macros.cmake b/Meta/CMake/all_the_debug_macros.cmake index 7ce59d775ab..896b1803f82 100644 --- a/Meta/CMake/all_the_debug_macros.cmake +++ b/Meta/CMake/all_the_debug_macros.cmake @@ -101,6 +101,7 @@ set(LEXER_DEBUG ON) set(LINE_EDITOR_DEBUG ON) set(LOCAL_SOCKET_DEBUG ON) set(LOCK_DEBUG ON) +set(LOCK_IN_CRITICAL_DEBUG ON) set(LOCK_RESTORE_DEBUG ON) set(LOCK_TRACE_DEBUG ON) set(LOOKUPSERVER_DEBUG ON)