diff options
Diffstat (limited to 'Kernel/Arch/x86')
-rw-r--r-- | Kernel/Arch/x86/CPU.h | 2 | ||||
-rw-r--r-- | Kernel/Arch/x86/common/CrashHandler.cpp | 45 | ||||
-rw-r--r-- | Kernel/Arch/x86/common/Interrupts.cpp | 34 |
3 files changed, 48 insertions, 33 deletions
diff --git a/Kernel/Arch/x86/CPU.h b/Kernel/Arch/x86/CPU.h index caa946fd28..e3f944d7cc 100644 --- a/Kernel/Arch/x86/CPU.h +++ b/Kernel/Arch/x86/CPU.h @@ -36,8 +36,6 @@ inline u32 get_iopl_from_eflags(u32 eflags) DescriptorTablePointer const& get_gdtr(); DescriptorTablePointer const& get_idtr(); -void handle_crash(RegisterState const&, char const* description, int signal, bool out_of_memory = false); - #define LSW(x) ((u32)(x)&0xFFFF) #define MSW(x) (((u32)(x) >> 16) & 0xFFFF) #define LSB(x) ((x)&0xFF) diff --git a/Kernel/Arch/x86/common/CrashHandler.cpp b/Kernel/Arch/x86/common/CrashHandler.cpp new file mode 100644 index 0000000000..df0ba7c214 --- /dev/null +++ b/Kernel/Arch/x86/common/CrashHandler.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <Kernel/Arch/CPU.h> +#include <Kernel/Arch/RegisterState.h> + +#include <Kernel/Panic.h> +#include <Kernel/Process.h> +#include <Kernel/Thread.h> + +namespace Kernel { + +void handle_crash(Kernel::RegisterState const& regs, char const* description, int signal, bool out_of_memory) +{ + auto* current_thread = Thread::current(); + if (!current_thread) + PANIC("{} with !Thread::current()", description); + + auto crashed_in_kernel = (regs.cs & 3) == 0; + if (!crashed_in_kernel && current_thread->has_signal_handler(signal) && !current_thread->should_ignore_signal(signal) && !current_thread->is_signal_masked(signal)) { + current_thread->send_urgent_signal_to_self(signal); + return; + } + + auto& process = current_thread->process(); + + // If a process crashed while inspecting another process, + // make sure we switch back to the right page tables. + Memory::MemoryManager::enter_process_address_space(process); + + dmesgln("CRASH: CPU #{} {} in ring {}", Processor::current_id(), description, (regs.cs & 3)); + dump_registers(regs); + + if (crashed_in_kernel) { + process.address_space().dump_regions(); + PANIC("Crash in ring 0"); + } + + process.crash(signal, regs.ip(), out_of_memory); +} + +} diff --git a/Kernel/Arch/x86/common/Interrupts.cpp b/Kernel/Arch/x86/common/Interrupts.cpp index a29c6ecdb4..02592b7ec5 100644 --- a/Kernel/Arch/x86/common/Interrupts.cpp +++ b/Kernel/Arch/x86/common/Interrupts.cpp @@ -23,6 +23,7 @@ #include <LibC/mallocdefs.h> +#include <Kernel/Arch/CPU.h> #include <Kernel/Arch/PageFault.h> #include <Kernel/Arch/Processor.h> #include <Kernel/Arch/RegisterState.h> @@ -174,7 +175,7 @@ static EntropySource s_entropy_source_interrupts { EntropySource::Static::Interr // clang-format on -static void dump(RegisterState const& regs) +void dump_registers(RegisterState const& regs) { #if ARCH(I386) u16 ss; @@ -216,35 +217,6 @@ static void dump(RegisterState const& regs) #endif } -void handle_crash(RegisterState const& regs, char const* description, int signal, bool out_of_memory) -{ - auto* current_thread = Thread::current(); - if (!current_thread) - PANIC("{} with !Thread::current()", description); - - auto crashed_in_kernel = (regs.cs & 3) == 0; - if (!crashed_in_kernel && current_thread->has_signal_handler(signal) && !current_thread->should_ignore_signal(signal) && !current_thread->is_signal_masked(signal)) { - current_thread->send_urgent_signal_to_self(signal); - return; - } - - auto& process = current_thread->process(); - - // If a process crashed while inspecting another process, - // make sure we switch back to the right page tables. - Memory::MemoryManager::enter_process_address_space(process); - - dmesgln("CRASH: CPU #{} {} in ring {}", Processor::current_id(), description, (regs.cs & 3)); - dump(regs); - - if (crashed_in_kernel) { - process.address_space().dump_regions(); - PANIC("Crash in ring 0"); - } - - process.crash(signal, regs.ip(), out_of_memory); -} - EH_ENTRY_NO_CODE(6, illegal_instruction); void illegal_instruction_handler(TrapFrame* trap) { @@ -295,7 +267,7 @@ void page_fault_handler(TrapFrame* trap) regs.exception_code & 2 ? "write" : "read", VirtualAddress(fault_address)); - dump(regs); + dump_registers(regs); } bool faulted_in_kernel = !(regs.cs & 3); |