From 9cddf9485d5ae31ba3c024df48ae79f1c23d44c4 Mon Sep 17 00:00:00 2001 From: apio Date: Wed, 12 Oct 2022 19:20:14 +0200 Subject: [PATCH] ELFLoader: Make check_elf_image return how much memory the executable will use on success --- kernel/include/sys/elf/ELFLoader.h | 4 ++-- kernel/src/sys/elf/ELFLoader.cpp | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/kernel/include/sys/elf/ELFLoader.h b/kernel/include/sys/elf/ELFLoader.h index 22116bd5..26b869e0 100644 --- a/kernel/include/sys/elf/ELFLoader.h +++ b/kernel/include/sys/elf/ELFLoader.h @@ -8,6 +8,6 @@ namespace ELFLoader ELFImage* load_elf_from_vfs(VFS::Node* node); // This function assumes check_elf_image has been called first. ELFImage* load_elf_from_filesystem(const char* filename); void release_elf_image(ELFImage* image); - int check_elf_image(VFS::Node* node); - int check_elf_image_from_filesystem(const char* filename); + long check_elf_image(VFS::Node* node); + long check_elf_image_from_filesystem(const char* filename); } \ No newline at end of file diff --git a/kernel/src/sys/elf/ELFLoader.cpp b/kernel/src/sys/elf/ELFLoader.cpp index 00438fd0..4ca64147 100644 --- a/kernel/src/sys/elf/ELFLoader.cpp +++ b/kernel/src/sys/elf/ELFLoader.cpp @@ -43,7 +43,7 @@ ELFImage* ELFLoader::load_elf_from_filesystem(const char* filename) return result; } -int ELFLoader::check_elf_image_from_filesystem(const char* filename) +long ELFLoader::check_elf_image_from_filesystem(const char* filename) { VFS::Node* node = VFS::resolve_path(filename); @@ -105,7 +105,7 @@ ELFImage* ELFLoader::load_elf_from_vfs(VFS::Node* node) return image; } -int ELFLoader::check_elf_image(VFS::Node* node) +long ELFLoader::check_elf_image(VFS::Node* node) { Elf64_Ehdr elf_ehdr; if (VFS::read(node, 0, sizeof(elf_ehdr), (char*)&elf_ehdr) < 0) @@ -145,6 +145,7 @@ int ELFLoader::check_elf_image(VFS::Node* node) } int i; int loadable_sections = 0; + long memusage = 0; Elf64_Phdr phdr; for (VFS::read(node, elf_ehdr.e_phoff, sizeof(Elf64_Phdr), (char*)&phdr), i = 0; i < elf_ehdr.e_phnum; i++, VFS::read(node, elf_ehdr.e_phoff + (i * elf_ehdr.e_phentsize), sizeof(Elf64_Phdr), (char*)&phdr)) @@ -162,6 +163,7 @@ int ELFLoader::check_elf_image(VFS::Node* node) return -1; } loadable_sections++; + memusage += Utilities::get_blocks_from_size(PAGE_SIZE, phdr.p_memsz) * PAGE_SIZE; } } if (!loadable_sections) @@ -169,7 +171,7 @@ int ELFLoader::check_elf_image(VFS::Node* node) kwarnln("No loadable sections"); return -1; } - return 0; + return memusage; } void ELFLoader::release_elf_image(ELFImage* image)