diff --git a/LibELF/LibELF/LoadableELF.cpp b/LibELF/LibELF/LoadableELF.cpp index 106c3142..9af8c1fa 100644 --- a/LibELF/LibELF/LoadableELF.cpp +++ b/LibELF/LibELF/LoadableELF.cpp @@ -124,6 +124,8 @@ namespace LibELF dprintln("Invalid program header"); return BAN::Error::from_errno(EINVAL); } + + m_virtual_page_count += BAN::Math::div_round_up((pheader.p_vaddr % PAGE_SIZE) + pheader.p_memsz, PAGE_SIZE); } return {}; diff --git a/LibELF/include/LibELF/LoadableELF.h b/LibELF/include/LibELF/LoadableELF.h index a11aa863..ed8dc416 100644 --- a/LibELF/include/LibELF/LoadableELF.h +++ b/LibELF/include/LibELF/LoadableELF.h @@ -33,6 +33,8 @@ namespace LibELF BAN::ErrorOr> clone(Kernel::PageTable&); + size_t virtual_page_count() const { return m_virtual_page_count; } + private: LoadableELF(Kernel::PageTable&, BAN::RefPtr); BAN::ErrorOr initialize(); @@ -42,6 +44,7 @@ namespace LibELF Kernel::PageTable& m_page_table; ElfNativeFileHeader m_file_header; BAN::Vector m_program_headers; + size_t m_virtual_page_count = 0; }; } \ No newline at end of file diff --git a/kernel/include/kernel/Memory/MemoryRegion.h b/kernel/include/kernel/Memory/MemoryRegion.h index c1a5f936..6d1a7b0d 100644 --- a/kernel/include/kernel/Memory/MemoryRegion.h +++ b/kernel/include/kernel/Memory/MemoryRegion.h @@ -37,6 +37,8 @@ namespace Kernel size_t size() const { return m_size; } vaddr_t vaddr() const { return m_vaddr; } + size_t virtual_page_count() const { return BAN::Math::div_round_up(m_size, PAGE_SIZE); } + // Returns error if no memory was available // Returns true if page was succesfully allocated // Returns false if page was already allocated diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index ff6f77a3..bb826821 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -83,6 +83,8 @@ namespace Kernel bool is_userspace() const { return m_is_userspace; } + size_t virtual_page_count() const { return m_stack->size() / PAGE_SIZE; } + #if __enable_sse void save_sse() { asm volatile("fxsave %0" :: "m"(m_sse_storage)); } void load_sse() { asm volatile("fxrstor %0" :: "m"(m_sse_storage)); }