From 6299a692530af2e8aec401256b3c63ecd2dfd09e Mon Sep 17 00:00:00 2001 From: James Mintram Date: Sat, 2 Apr 2022 23:55:20 +0100 Subject: [PATCH] Kernel: Make handle_crash available to aarch64 --- Kernel/Arch/CPU.h | 3 ++ Kernel/Arch/aarch64/CrashHandler.cpp | 16 +++++++++ Kernel/Arch/aarch64/RegisterState.h | 4 +++ Kernel/Arch/x86/CPU.h | 2 -- Kernel/Arch/x86/common/CrashHandler.cpp | 45 +++++++++++++++++++++++++ Kernel/Arch/x86/common/Interrupts.cpp | 34 ++----------------- Kernel/CMakeLists.txt | 3 ++ Kernel/Memory/MemoryManager.cpp | 1 + 8 files changed, 75 insertions(+), 33 deletions(-) create mode 100644 Kernel/Arch/aarch64/CrashHandler.cpp create mode 100644 Kernel/Arch/x86/common/CrashHandler.cpp diff --git a/Kernel/Arch/CPU.h b/Kernel/Arch/CPU.h index 43ba63583d..57cbc72199 100644 --- a/Kernel/Arch/CPU.h +++ b/Kernel/Arch/CPU.h @@ -21,4 +21,7 @@ namespace Kernel { struct RegisterState; +void dump_registers(RegisterState const& regs); +void handle_crash(RegisterState const&, char const* description, int signal, bool out_of_memory = false); + } diff --git a/Kernel/Arch/aarch64/CrashHandler.cpp b/Kernel/Arch/aarch64/CrashHandler.cpp new file mode 100644 index 0000000000..9b1d93a63a --- /dev/null +++ b/Kernel/Arch/aarch64/CrashHandler.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2018-2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Kernel { + +void handle_crash(Kernel::RegisterState const&, char const*, int, bool) +{ +} + +} diff --git a/Kernel/Arch/aarch64/RegisterState.h b/Kernel/Arch/aarch64/RegisterState.h index b10c01939b..3f14084c09 100644 --- a/Kernel/Arch/aarch64/RegisterState.h +++ b/Kernel/Arch/aarch64/RegisterState.h @@ -6,8 +6,12 @@ #pragma once +namespace Kernel { + struct RegisterState { }; struct DebugRegisterState { }; + +} 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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +#include +#include +#include + +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 +#include #include #include #include @@ -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); diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index d6ed90323f..43f7755835 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -320,7 +320,9 @@ if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64") set(KERNEL_SOURCES ${KERNEL_SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ASM_wrapper.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CrashHandler.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPU.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPUID.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Interrupts.cpp @@ -388,6 +390,7 @@ if (NOT "${SERENITY_ARCH}" STREQUAL "aarch64") else() set(SOURCES Arch/aarch64/BootPPMParser.cpp + Arch/aarch64/CrashHandler.cpp Arch/aarch64/GPIO.cpp Arch/aarch64/Framebuffer.cpp Arch/aarch64/Mailbox.cpp diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp index b00fcbda91..0fe253488e 100644 --- a/Kernel/Memory/MemoryManager.cpp +++ b/Kernel/Memory/MemoryManager.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include