1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-11 18:20:43 +09:00

Kernel: Track when a thread is in the middle of crashing

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.
This commit is contained in:
Brian Gianforcaro 2021-09-07 00:17:45 -07:00 committed by Andreas Kling
parent f56bdd2bb7
commit 0718afa773
Notes: sideshowbarker 2024-07-18 04:32:38 +09:00
3 changed files with 15 additions and 0 deletions

View file

@ -20,6 +20,11 @@ void __assertion_failed(const char* msg, const char* file, unsigned line, const
[[noreturn]] void abort() [[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. // Switch back to the current process's page tables if there are any.
// Otherwise stack walking will be a disaster. // Otherwise stack walking will be a disaster.
if (Process::has_current()) if (Process::has_current())

View file

@ -10,6 +10,7 @@
#include <Kernel/IO.h> #include <Kernel/IO.h>
#include <Kernel/KSyms.h> #include <Kernel/KSyms.h>
#include <Kernel/Panic.h> #include <Kernel/Panic.h>
#include <Kernel/Thread.h>
namespace Kernel { namespace Kernel {
@ -25,6 +26,11 @@ namespace Kernel {
void __panic(const char* file, unsigned int line, const char* function) 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); critical_dmesgln("at {}:{} in {}", file, line, function);
dump_backtrace(PrintToScreen::Yes); dump_backtrace(PrintToScreen::Yes);
if (kernel_command_line().boot_mode() == BootMode::SelfTest) if (kernel_command_line().boot_mode() == BootMode::SelfTest)

View file

@ -1186,6 +1186,9 @@ public:
void set_idle_thread() { m_is_idle_thread = true; } void set_idle_thread() { m_is_idle_thread = true; }
bool is_idle_thread() const { return m_is_idle_thread; } 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() ALWAYS_INLINE u32 enter_profiler()
{ {
return m_nested_profiler_calls.fetch_add(1, AK::MemoryOrder::memory_order_acq_rel); return m_nested_profiler_calls.fetch_add(1, AK::MemoryOrder::memory_order_acq_rel);
@ -1343,6 +1346,7 @@ private:
bool m_initialized { false }; bool m_initialized { false };
bool m_in_block { false }; bool m_in_block { false };
bool m_is_idle_thread { false }; bool m_is_idle_thread { false };
bool m_is_crashing { false };
Atomic<bool> m_have_any_unmasked_pending_signals { false }; Atomic<bool> m_have_any_unmasked_pending_signals { false };
Atomic<u32> m_nested_profiler_calls { 0 }; Atomic<u32> m_nested_profiler_calls { 0 };