diff --git a/Kernel/Arch/i386/CPU.h b/Kernel/Arch/i386/CPU.h index a5d4a98712..1c53a48660 100644 --- a/Kernel/Arch/i386/CPU.h +++ b/Kernel/Arch/i386/CPU.h @@ -837,6 +837,14 @@ public: return *this; } + void set_interrupt_flag_on_destruction(bool flag) + { + if (flag) + m_prev_flags |= 0x200; + else + m_prev_flags &= ~0x200; + } + private: u32 m_prev_flags { 0 }; bool m_valid { false }; diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 8f21bef644..2cbe53f3a4 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -876,6 +876,11 @@ Thread::BlockResult Thread::wait_on(WaitQueue& queue, const char* reason, timeva // The WaitQueue was already requested to wake someone when // nobody was waiting. So return right away as we shouldn't // be waiting + + // The API contract guarantees we return with interrupts enabled, + // regardless of how we got called + critical.set_interrupt_flag_on_destruction(true); + return BlockResult::NotBlocked; }