Skip to content

Commit

Permalink
Kernel: Track when a thread is in the middle of crashing
Browse files Browse the repository at this point in the history
There are certain checks that we should skip if the system is crashing.
The system can avoid stack overflow during crash, or even triple
faulting while while handling issues that can causes recursive panics
or aborts.
  • Loading branch information
bgianfo authored and awesomekling committed Sep 7, 2021
1 parent f56bdd2 commit 0718afa
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Kernel/Arch/x86/common/CPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ void __assertion_failed(const char* msg, const char* file, unsigned line, const

[[noreturn]] void abort()
{
// Avoid lock ranking checks on crashing paths, just try to get some debugging messages out.
auto thread = Thread::current();
if (thread)
thread->set_crashing();

// Switch back to the current process's page tables if there are any.
// Otherwise stack walking will be a disaster.
if (Process::has_current())
Expand Down
6 changes: 6 additions & 0 deletions Kernel/Panic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <Kernel/IO.h>
#include <Kernel/KSyms.h>
#include <Kernel/Panic.h>
#include <Kernel/Thread.h>

namespace Kernel {

Expand All @@ -25,6 +26,11 @@ namespace Kernel {

void __panic(const char* file, unsigned int line, const char* function)
{
// Avoid lock ranking checks on crashing paths, just try to get some debugging messages out.
auto thread = Thread::current();
if (thread)
thread->set_crashing();

critical_dmesgln("at {}:{} in {}", file, line, function);
dump_backtrace(PrintToScreen::Yes);
if (kernel_command_line().boot_mode() == BootMode::SelfTest)
Expand Down
4 changes: 4 additions & 0 deletions Kernel/Thread.h
Original file line number Diff line number Diff line change
Expand Up @@ -1186,6 +1186,9 @@ class Thread
void set_idle_thread() { m_is_idle_thread = true; }
bool is_idle_thread() const { return m_is_idle_thread; }

void set_crashing() { m_is_crashing = true; }
[[nodiscard]] bool is_crashing() const { return m_is_crashing; }

ALWAYS_INLINE u32 enter_profiler()
{
return m_nested_profiler_calls.fetch_add(1, AK::MemoryOrder::memory_order_acq_rel);
Expand Down Expand Up @@ -1343,6 +1346,7 @@ class Thread
bool m_initialized { false };
bool m_in_block { false };
bool m_is_idle_thread { false };
bool m_is_crashing { false };
Atomic<bool> m_have_any_unmasked_pending_signals { false };
Atomic<u32> m_nested_profiler_calls { 0 };

Expand Down

0 comments on commit 0718afa

Please sign in to comment.