/* * Copyright (c) 2019-2020, Jesse Buhagiar * Copyright (c) 2020, Itamar S. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Kernel { class Coredump { public: static ErrorOr> try_create(NonnullLockRefPtr, StringView output_path); static SpinlockProtected, LockRank::None>& directory_path(); ~Coredump() = default; ErrorOr write(); private: class FlatRegionData { public: explicit FlatRegionData(Memory::Region const& region, NonnullOwnPtr name) : m_access(region.access()) , m_is_executable(region.is_executable()) , m_is_kernel(region.is_kernel()) , m_is_readable(region.is_readable()) , m_is_writable(region.is_writable()) , m_name(move(name)) , m_page_count(region.page_count()) , m_size(region.size()) , m_vaddr(region.vaddr()) { } auto access() const { return m_access; } auto name() const { return m_name->view(); } auto is_executable() const { return m_is_executable; } auto is_kernel() const { return m_is_kernel; } auto is_readable() const { return m_is_readable; } auto is_writable() const { return m_is_writable; } auto page_count() const { return m_page_count; } auto size() const { return m_size; } auto vaddr() const { return m_vaddr; } bool looks_like_userspace_heap_region() const; bool is_consistent_with_region(Memory::Region const& region) const; private: Memory::Region::Access m_access; bool m_is_executable; bool m_is_kernel; bool m_is_readable; bool m_is_writable; NonnullOwnPtr m_name; size_t m_page_count; size_t m_size; VirtualAddress m_vaddr; }; Coredump(NonnullLockRefPtr, NonnullLockRefPtr, Vector); static ErrorOr> try_create_target_file(Process const&, StringView output_path); ErrorOr write_elf_header(); ErrorOr write_program_headers(size_t notes_size); ErrorOr write_regions(); ErrorOr write_notes_segment(ReadonlyBytes); ErrorOr create_notes_segment_data(auto&) const; ErrorOr create_notes_process_data(auto&) const; ErrorOr create_notes_threads_data(auto&) const; ErrorOr create_notes_regions_data(auto&) const; ErrorOr create_notes_metadata_data(auto&) const; NonnullLockRefPtr m_process; NonnullLockRefPtr m_description; size_t m_num_program_headers { 0 }; Vector m_regions; }; }