mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 06:17:34 +00:00
Kernel: Work using copies of specific region data during a coredump
This limits our interaction with the "real" region tree (and therefore its lock) to the time where we actually read from the user address space.
This commit is contained in:
parent
066c5acee1
commit
32a03cffeb
2 changed files with 148 additions and 75 deletions
|
@ -8,8 +8,10 @@
|
|||
#pragma once
|
||||
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <Kernel/Forward.h>
|
||||
#include <Kernel/Library/NonnullLockRefPtr.h>
|
||||
#include <Kernel/Memory/Region.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
|
@ -21,7 +23,47 @@ public:
|
|||
ErrorOr<void> write();
|
||||
|
||||
private:
|
||||
Coredump(NonnullLockRefPtr<Process>, NonnullLockRefPtr<OpenFileDescription>);
|
||||
class FlatRegionData {
|
||||
public:
|
||||
explicit FlatRegionData(Memory::Region const& region, NonnullOwnPtr<KString> 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<KString> m_name;
|
||||
size_t m_page_count;
|
||||
size_t m_size;
|
||||
VirtualAddress m_vaddr;
|
||||
};
|
||||
|
||||
Coredump(NonnullLockRefPtr<Process>, NonnullLockRefPtr<OpenFileDescription>, Vector<FlatRegionData>);
|
||||
static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path);
|
||||
|
||||
ErrorOr<void> write_elf_header();
|
||||
|
@ -38,6 +80,7 @@ private:
|
|||
NonnullLockRefPtr<Process> m_process;
|
||||
NonnullLockRefPtr<OpenFileDescription> m_description;
|
||||
size_t m_num_program_headers { 0 };
|
||||
Vector<FlatRegionData> m_regions;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue