From ecfe121a8ca8526276a013ed78c6575b3f3abb13 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 28 Mar 2016 17:37:37 +0200 Subject: [PATCH] Add assertions to Signal::DispatchHandler callers. --- kernel/scheduler.cpp | 1 + kernel/signal.cpp | 3 +++ kernel/x86-family/interrupt.cpp | 13 ++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/kernel/scheduler.cpp b/kernel/scheduler.cpp index 088d0ce7..e46229c6 100644 --- a/kernel/scheduler.cpp +++ b/kernel/scheduler.cpp @@ -322,6 +322,7 @@ static void RealSwitch(struct interrupt_context* intctx, bool yielded) { // We're already this thread, so run the signal handler. Interrupt::Enable(); + assert(Interrupt::IsEnabled()); Signal::DispatchHandler(intctx, NULL); } else diff --git a/kernel/signal.cpp b/kernel/signal.cpp index fb1b83b6..58a6481d 100644 --- a/kernel/signal.cpp +++ b/kernel/signal.cpp @@ -818,6 +818,7 @@ void Thread::HandleSigreturn(struct interrupt_context* intctx) lock.Reset(); + assert(Interrupt::IsEnabled()); HandleSignal(intctx); } @@ -825,11 +826,13 @@ namespace Signal { void DispatchHandler(struct interrupt_context* intctx, void* /*user*/) { + assert(Interrupt::IsEnabled()); return CurrentThread()->HandleSignal(intctx); } void ReturnHandler(struct interrupt_context* intctx, void* /*user*/) { + assert(Interrupt::IsEnabled()); return CurrentThread()->HandleSigreturn(intctx); } diff --git a/kernel/x86-family/interrupt.cpp b/kernel/x86-family/interrupt.cpp index 6b3903cf..cc241290 100644 --- a/kernel/x86-family/interrupt.cpp +++ b/kernel/x86-family/interrupt.cpp @@ -132,6 +132,13 @@ static struct interrupt_handler Signal__DispatchHandler_handler; static struct interrupt_handler Signal__ReturnHandler_handler; static struct interrupt_handler Scheduler__ThreadExitCPU_handler; +// Temporarily to see if this is the source of the assertion failure. +void DispatchHandlerWrap(struct interrupt_context* intctx, void* user) +{ + assert(Interrupt::IsEnabled()); + return Signal::DispatchHandler(intctx, user); +} + void RegisterHandler(unsigned int index, struct interrupt_handler* handler) { assert(index < NUM_INTERRUPTS); @@ -239,7 +246,7 @@ void Init() Scheduler__InterruptYieldCPU_handler.handler = Scheduler::InterruptYieldCPU; RegisterHandler(129, &Scheduler__InterruptYieldCPU_handler); - Signal__DispatchHandler_handler.handler = Signal::DispatchHandler; + Signal__DispatchHandler_handler.handler = DispatchHandlerWrap; RegisterHandler(130, &Signal__DispatchHandler_handler); Signal__ReturnHandler_handler.handler = Signal::ReturnHandler; RegisterHandler(131, &Signal__ReturnHandler_handler); @@ -295,7 +302,10 @@ void UserCrashHandler(struct interrupt_context* intctx) CurrentThread()->DeliverSignalUnlocked(SIGSEGV); kthread_mutex_unlock(&CurrentProcess()->signal_lock); if ( handled ) + { + assert(Interrupt::IsEnabled()); return Signal::DispatchHandler(intctx, NULL); + } } // Issue a diagnostic message to the kernel log concerning the crash. @@ -310,6 +320,7 @@ void UserCrashHandler(struct interrupt_context* intctx) CurrentProcess()->ExitThroughSignal(SIGSEGV); // Deliver signals to this thread so it can exit correctly. + assert(Interrupt::IsEnabled()); Signal::DispatchHandler(intctx, NULL); }